)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4dd2d25afe45c4a6b872658273489fdcc123a232","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In some rare cases, an empty key file can get created within the fernet"},{"line_number":10,"context_line":"key repository. When keystone tries to load the keys from disk, it will"},{"line_number":11,"context_line":"fail with an invalid fernet key ValueError."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"This change adds a check for empty files with a valid numerical name"},{"line_number":14,"context_line":"within the key repository when rotating keys and loading keys. If an"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3fa0c359_1f86a3ba","line":11,"updated":"2018-02-21 22:58:54.000000000","message":"Getting into a state like this is what worries me, but I\u0027m not sure how keystone would initiate this since there aren\u0027t any disk issues according to the bug report.","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"}],"keystone/common/token_utils.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4dd2d25afe45c4a6b872658273489fdcc123a232","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                except ValueError:  # nosec : name isn\u0027t a number"},{"line_number":218,"context_line":"                    pass"},{"line_number":219,"context_line":"                else:"},{"line_number":220,"context_line":"                    if os.path.getsize(path) \u003e 0:  # Handle empty files"},{"line_number":221,"context_line":"                        key_files[key_id] \u003d path"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        LOG.info(\u0027Starting key rotation with %(count)s key files: \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_5f0f4b87","line":220,"updated":"2018-02-21 22:58:54.000000000","message":"Key repositories are pretty important, especially in real deployments. Chances are operators would want to know if something like this happens so that they can go investigate why that have empty keys in their key repository.\n\nWe can help them by adding some logging here INFO or WARNING feels appropriate, but I\u0027ll let others weigh in.","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"5486cfef459433286480564defb8c73b8f2f4b83","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                except ValueError:  # nosec : name isn\u0027t a number"},{"line_number":218,"context_line":"                    pass"},{"line_number":219,"context_line":"                else:"},{"line_number":220,"context_line":"                    if os.path.getsize(path) \u003e 0:  # Handle empty files"},{"line_number":221,"context_line":"                        key_files[key_id] \u003d path"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        LOG.info(\u0027Starting key rotation with %(count)s key files: \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_0a28a3df","line":220,"in_reply_to":"3fa0c359_5f0f4b87","updated":"2018-02-21 23:35:54.000000000","message":"Done","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"4674149d5e8e15a46b2e817ef620f4125d85fb44","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                except ValueError:  # nosec : name isn\u0027t a number"},{"line_number":218,"context_line":"                    pass"},{"line_number":219,"context_line":"                else:"},{"line_number":220,"context_line":"                    if os.path.getsize(path) \u003e 0:  # Handle empty files"},{"line_number":221,"context_line":"                        key_files[key_id] \u003d path"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        LOG.info(\u0027Starting key rotation with %(count)s key files: \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_8a76f3a3","line":220,"in_reply_to":"3fa0c359_5f0f4b87","updated":"2018-02-21 23:07:25.000000000","message":"Good point, I\u0027d want to know when I was getting empty files written into the key repo","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c4395cf8f1f5e27d177e23e706875dce6b3955d8","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                else:"},{"line_number":220,"context_line":"                    if os.path.getsize(path) \u003d\u003d 0:"},{"line_number":221,"context_line":"                        LOG.warning(\u0027Empty key file discovered in %s\u0027,"},{"line_number":222,"context_line":"                                    self.key_repository)"},{"line_number":223,"context_line":"                        continue"},{"line_number":224,"context_line":"                    key_files[key_id] \u003d path"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_3f5d8a46","line":222,"updated":"2018-02-22 16:32:39.000000000","message":"Or just even something like:\n\n  LOG.warning(\"Ignoring empty key found in key repository: %s\", path)\n\nIf I were an operator, I think it\u0027d be useful to know what keystone is doing with it (ignoring it) and which file is empty.","commit_id":"588c2b3349fa9286f5b385f0af76bf93fce8af84"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"dcc960e03e1cc7130ca54b001afcb9159d1e2fe9","unresolved":false,"context_lines":[{"line_number":219,"context_line":"                else:"},{"line_number":220,"context_line":"                    if os.path.getsize(path) \u003d\u003d 0:"},{"line_number":221,"context_line":"                        LOG.warning(\u0027Empty key file discovered in %s\u0027,"},{"line_number":222,"context_line":"                                    self.key_repository)"},{"line_number":223,"context_line":"                        continue"},{"line_number":224,"context_line":"                    key_files[key_id] \u003d path"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_1841c439","line":222,"in_reply_to":"3fa0c359_3f5d8a46","updated":"2018-02-22 17:44:12.000000000","message":"Done","commit_id":"588c2b3349fa9286f5b385f0af76bf93fce8af84"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"0ff5f27b04ddbf4bf0310a23eea714fe8524774c","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        # determine the number of the new primary key"},{"line_number":235,"context_line":"        current_primary_key \u003d max(key_files.keys())"},{"line_number":236,"context_line":"        LOG.info(\u0027Current primary key is: %s\u0027, current_primary_key)"},{"line_number":237,"context_line":"        new_primary_key \u003d current_primary_key + 1"},{"line_number":238,"context_line":"        LOG.info(\u0027Next primary key will be: %s\u0027, new_primary_key)"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa0c359_028e4078","line":236,"updated":"2018-02-22 09:45:54.000000000","message":"the code works well. But the Log maybe not.\n\nFor example, now there four key: 0 1 2 3 and the 3 is empty.\nThen when rotate the key, Log says that  \"Current primary key is: 2, Next primary key will be 3\". Maybe it is  a little misleading for admin.\n\nHow about something like \"the primary key is 3, but it\u0027s empty, renew it instead of create a new one.\"","commit_id":"588c2b3349fa9286f5b385f0af76bf93fce8af84"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a75c5c2a2d8389748668858ab0103f2901c066dd","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                        # ignore this file since it\u0027s not a key."},{"line_number":293,"context_line":"                        pass"},{"line_number":294,"context_line":"                    else:"},{"line_number":295,"context_line":"                        key \u003d key_file.read()"},{"line_number":296,"context_line":"                        if len(key) \u003d\u003d 0:"},{"line_number":297,"context_line":"                            LOG.warning(\u0027Ignoring empty key found in key \u0027"},{"line_number":298,"context_line":"                                        \u0027repository: %s\u0027, path)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_cf3a33cc","line":295,"updated":"2018-04-06 16:38:09.000000000","message":"Since we reuse this logic in two places, we could pull it into a method. We can do that in a follow up though.","commit_id":"90c04f39a051255815cc0c021626d6350abc4d2e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"addeffff4a56957893ca0457643340c9939d5eaf","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                        # ignore this file since it\u0027s not a key."},{"line_number":293,"context_line":"                        pass"},{"line_number":294,"context_line":"                    else:"},{"line_number":295,"context_line":"                        key \u003d key_file.read()"},{"line_number":296,"context_line":"                        if len(key) \u003d\u003d 0:"},{"line_number":297,"context_line":"                            LOG.warning(\u0027Ignoring empty key found in key \u0027"},{"line_number":298,"context_line":"                                        \u0027repository: %s\u0027, path)"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_5b129bb6","line":295,"in_reply_to":"bf659307_a1b02b8d","updated":"2018-05-16 20:06:57.000000000","message":"Done","commit_id":"90c04f39a051255815cc0c021626d6350abc4d2e"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"adb22c6a8e933c7bdfbfed89fa981643f4d5cdee","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                        # ignore this file since it\u0027s not a key."},{"line_number":293,"context_line":"                        pass"},{"line_number":294,"context_line":"                    else:"},{"line_number":295,"context_line":"                        key \u003d key_file.read()"},{"line_number":296,"context_line":"                        if len(key) \u003d\u003d 0:"},{"line_number":297,"context_line":"                            LOG.warning(\u0027Ignoring empty key found in key \u0027"},{"line_number":298,"context_line":"                                        \u0027repository: %s\u0027, path)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_a1b02b8d","line":295,"in_reply_to":"bf659307_cf3a33cc","updated":"2018-04-07 11:05:25.000000000","message":"+1 same logic different methods.","commit_id":"90c04f39a051255815cc0c021626d6350abc4d2e"}],"keystone/tests/unit/token/test_fernet_provider.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4dd2d25afe45c4a6b872658273489fdcc123a232","unresolved":false,"context_lines":[{"line_number":685,"context_line":"            CONF.fernet_tokens.max_active_keys,"},{"line_number":686,"context_line":"            \u0027fernet_tokens\u0027"},{"line_number":687,"context_line":"        )"},{"line_number":688,"context_line":"        keys \u003d key_utils.load_keys()"},{"line_number":689,"context_line":"        self.assertEqual(2, len(keys))"},{"line_number":690,"context_line":"        key_utils.rotate_keys()"},{"line_number":691,"context_line":"        self.assertTrue(os.path.isfile(empty_file))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_bfe0cf98","line":688,"updated":"2018-02-21 22:58:54.000000000","message":"This is what would have failed before because 2 was empty, right?","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"4674149d5e8e15a46b2e817ef620f4125d85fb44","unresolved":false,"context_lines":[{"line_number":685,"context_line":"            CONF.fernet_tokens.max_active_keys,"},{"line_number":686,"context_line":"            \u0027fernet_tokens\u0027"},{"line_number":687,"context_line":"        )"},{"line_number":688,"context_line":"        keys \u003d key_utils.load_keys()"},{"line_number":689,"context_line":"        self.assertEqual(2, len(keys))"},{"line_number":690,"context_line":"        key_utils.rotate_keys()"},{"line_number":691,"context_line":"        self.assertTrue(os.path.isfile(empty_file))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_0a3c23c6","line":688,"in_reply_to":"3fa0c359_bfe0cf98","updated":"2018-02-21 23:07:25.000000000","message":"Yeah, I should add comments here stating this is where we would hit the ValueError","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4dd2d25afe45c4a6b872658273489fdcc123a232","unresolved":false,"context_lines":[{"line_number":690,"context_line":"        key_utils.rotate_keys()"},{"line_number":691,"context_line":"        self.assertTrue(os.path.isfile(empty_file))"},{"line_number":692,"context_line":"        keys \u003d key_utils.load_keys()"},{"line_number":693,"context_line":"        self.assertEqual(3, len(keys))"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"    def test_non_numeric_files(self):"},{"line_number":696,"context_line":"        self.useFixture("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_9f9ab311","line":693,"updated":"2018-02-21 22:58:54.000000000","message":"We could add another assertion that the file the was empty isn\u0027t empty anymore.","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"5486cfef459433286480564defb8c73b8f2f4b83","unresolved":false,"context_lines":[{"line_number":690,"context_line":"        key_utils.rotate_keys()"},{"line_number":691,"context_line":"        self.assertTrue(os.path.isfile(empty_file))"},{"line_number":692,"context_line":"        keys \u003d key_utils.load_keys()"},{"line_number":693,"context_line":"        self.assertEqual(3, len(keys))"},{"line_number":694,"context_line":""},{"line_number":695,"context_line":"    def test_non_numeric_files(self):"},{"line_number":696,"context_line":"        self.useFixture("}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa0c359_ea1a17c4","line":693,"in_reply_to":"3fa0c359_9f9ab311","updated":"2018-02-21 23:35:54.000000000","message":"Done","commit_id":"09c925c658960a00fe807dabc2f015f0de095fbe"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6747be141f68d1f4a5aeec1f5fd03116839bebdf","unresolved":false,"context_lines":[{"line_number":748,"context_line":"        self.assertValidFernetKey(keys)"},{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    def test_empty_files(self):"},{"line_number":751,"context_line":"        self.useFixture("},{"line_number":752,"context_line":"            ksfixtures.KeyRepository("},{"line_number":753,"context_line":"                self.config_fixture,"},{"line_number":754,"context_line":"                \u0027fernet_tokens\u0027,"},{"line_number":755,"context_line":"                CONF.fernet_tokens.max_active_keys"},{"line_number":756,"context_line":"            )"},{"line_number":757,"context_line":"        )"},{"line_number":758,"context_line":"        empty_file \u003d os.path.join(CONF.fernet_tokens.key_repository, \u00272\u0027)"},{"line_number":759,"context_line":"        with open(empty_file, \u0027w\u0027):"},{"line_number":760,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_8a61f707","line":757,"range":{"start_line":751,"start_character":0,"end_line":757,"end_character":9},"updated":"2018-02-22 22:20:07.000000000","message":"I ran this locally and removed this and the test still passes, since the CONF.fernet_tokens.max_active_keys is the default anyway. This might have been required when we first implemented this but I don\u0027t think it is anymore.","commit_id":"1c73a7545fcf18cd11dce3cc41b2a94c5d583b7f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6747be141f68d1f4a5aeec1f5fd03116839bebdf","unresolved":false,"context_lines":[{"line_number":765,"context_line":"        )"},{"line_number":766,"context_line":"        keys \u003d key_utils.load_keys()"},{"line_number":767,"context_line":"        self.assertEqual(2, len(keys))"},{"line_number":768,"context_line":"        self.assertValidFernetKey(keys)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa0c359_6d15a53c","line":768,"updated":"2018-02-22 22:20:07.000000000","message":"This assertion is a little confusing, but I wonder if it was meant to be called with an individual key. It only appears to be validating the first key in the list of keys.\n\nhttp://paste.openstack.org/raw/682571/ validates each key in the repository.","commit_id":"1c73a7545fcf18cd11dce3cc41b2a94c5d583b7f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"adb22c6a8e933c7bdfbfed89fa981643f4d5cdee","unresolved":false,"context_lines":[{"line_number":646,"context_line":"            \u0027fernet_tokens\u0027"},{"line_number":647,"context_line":"        )"},{"line_number":648,"context_line":"        # We can load the keys without getting a ValueError"},{"line_number":649,"context_line":"        keys \u003d key_utils.load_keys()"},{"line_number":650,"context_line":"        self.assertEqual(2, len(keys))"},{"line_number":651,"context_line":"        # Rotate the keys to overwrite the empty file"},{"line_number":652,"context_line":"        key_utils.rotate_keys()"},{"line_number":653,"context_line":"        self.assertTrue(os.path.isfile(empty_file))"}],"source_content_type":"text/x-python","patch_set":7,"id":"bf659307_e1b6238b","line":650,"range":{"start_line":649,"start_character":0,"end_line":650,"end_character":38},"updated":"2018-04-07 11:05:25.000000000","message":"The assert here looks like being covered in another testcase added. Good as it is.","commit_id":"90c04f39a051255815cc0c021626d6350abc4d2e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"addeffff4a56957893ca0457643340c9939d5eaf","unresolved":false,"context_lines":[{"line_number":646,"context_line":"            \u0027fernet_tokens\u0027"},{"line_number":647,"context_line":"        )"},{"line_number":648,"context_line":"        # We can load the keys without getting a ValueError"},{"line_number":649,"context_line":"        keys \u003d key_utils.load_keys()"},{"line_number":650,"context_line":"        self.assertEqual(2, len(keys))"},{"line_number":651,"context_line":"        # Rotate the keys to overwrite the empty file"},{"line_number":652,"context_line":"        key_utils.rotate_keys()"},{"line_number":653,"context_line":"        self.assertTrue(os.path.isfile(empty_file))"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_1b0c2393","line":650,"range":{"start_line":649,"start_character":0,"end_line":650,"end_character":38},"in_reply_to":"bf659307_e1b6238b","updated":"2018-05-16 20:06:57.000000000","message":"Done","commit_id":"90c04f39a051255815cc0c021626d6350abc4d2e"}],"releasenotes/notes/bug-1728907-bab6769ab46bd8aa.yaml":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"0ff5f27b04ddbf4bf0310a23eea714fe8524774c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In some rare cases, an empty key file can get created within the fernet"},{"line_number":5,"context_line":"    key repository. When keystone tries to load the keys from disk, it will"},{"line_number":6,"context_line":"    fail with an invalid fernet key ValueError. This change adds a check for"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa0c359_7c89ea72","line":3,"updated":"2018-02-22 09:45:54.000000000","message":"better to add the bug link as well\n[`bug 1728907 \u003chttp.....\u003e`_]","commit_id":"588c2b3349fa9286f5b385f0af76bf93fce8af84"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"dcc960e03e1cc7130ca54b001afcb9159d1e2fe9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In some rare cases, an empty key file can get created within the fernet"},{"line_number":5,"context_line":"    key repository. When keystone tries to load the keys from disk, it will"},{"line_number":6,"context_line":"    fail with an invalid fernet key ValueError. This change adds a check for"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"3fa0c359_f843b83d","line":3,"in_reply_to":"3fa0c359_7c89ea72","updated":"2018-02-22 17:44:12.000000000","message":"Done","commit_id":"588c2b3349fa9286f5b385f0af76bf93fce8af84"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a75c5c2a2d8389748668858ab0103f2901c066dd","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    [`bug 1728907 \u003chttps://bugs.launchpad.net/keystone/+bug/1728907\u003e`_]"},{"line_number":5,"context_line":"    In some rare cases, an empty key file can get created within the fernet"},{"line_number":6,"context_line":"    key repository. When keystone tries to load the keys from disk, it will"},{"line_number":7,"context_line":"    fail with an invalid fernet key ValueError. This change adds a check for"},{"line_number":8,"context_line":"    empty files with a valid numerical name within the key repository when"},{"line_number":9,"context_line":"    rotating keys and loading keys. If an empty file exists, it will be"},{"line_number":10,"context_line":"    ignored when loading, reported as a warning in the log, and overwritten"},{"line_number":11,"context_line":"    with a valid key upon rotation."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"bf659307_cfad53eb","line":9,"range":{"start_line":7,"start_character":48,"end_line":9,"end_character":34},"updated":"2018-04-06 16:38:09.000000000","message":"This doesn\u0027t make a whole lot of sense in the context of a release note. After linking to the bug report, we could just say something along the lines of:\n\n  Keystone handles empty key files when loading and rotating\n  fernet keys.","commit_id":"90c04f39a051255815cc0c021626d6350abc4d2e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"addeffff4a56957893ca0457643340c9939d5eaf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    [`bug 1728907 \u003chttps://bugs.launchpad.net/keystone/+bug/1728907\u003e`_]"},{"line_number":5,"context_line":"    In some rare cases, an empty key file can get created within the fernet"},{"line_number":6,"context_line":"    key repository. When keystone tries to load the keys from disk, it will"},{"line_number":7,"context_line":"    fail with an invalid fernet key ValueError. This change adds a check for"},{"line_number":8,"context_line":"    empty files with a valid numerical name within the key repository when"},{"line_number":9,"context_line":"    rotating keys and loading keys. If an empty file exists, it will be"},{"line_number":10,"context_line":"    ignored when loading, reported as a warning in the log, and overwritten"},{"line_number":11,"context_line":"    with a valid key upon rotation."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"5f7c97a3_3b11dfad","line":9,"range":{"start_line":7,"start_character":48,"end_line":9,"end_character":34},"in_reply_to":"bf659307_cfad53eb","updated":"2018-05-16 20:06:57.000000000","message":"Done","commit_id":"90c04f39a051255815cc0c021626d6350abc4d2e"}]}
