)]}'
{"nova/keymgr/__init__.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"f93edfeb3cf0bcc1e4d5fdc25638bf2273dddb35","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def API():"},{"line_number":35,"context_line":"    keymgr_api_class \u003d CONF.keymgr_api_class"},{"line_number":36,"context_line":"    cls \u003d importutils.import_class(keymgr_api_class)"},{"line_number":37,"context_line":"    return cls()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FnHY%3D","line":36,"updated":"2013-07-15 21:08:57.000000000","message":"Please take a look at stevedore; we\u0027re slowly switching all the driver/extension/etc. loading over to use it…","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":7789,"name":"John Wood","email":"john.wood@rackspace.com","username":"woodster"},"change_message_id":"23dc53b11b166e6369ad7ef232aeeb3e631415ff","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def API():"},{"line_number":35,"context_line":"    keymgr_api_class \u003d CONF.keymgr_api_class"},{"line_number":36,"context_line":"    cls \u003d importutils.import_class(keymgr_api_class)"},{"line_number":37,"context_line":"    return cls()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2Fl4I%3D","line":36,"in_reply_to":"AAAAP3%2F%2Fm5I%3D","updated":"2013-07-16 04:48:45.000000000","message":"FWIW, we are using stevedore to manage crypto plugins in Barbican. The wiki describing this is located here: https://github.com/cloudkeep/barbican/wiki/Blueprint:-Plug-in-Encryption","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8af25904993588964582ac2fabe037d7b1ddd6c9","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def API():"},{"line_number":35,"context_line":"    keymgr_api_class \u003d CONF.keymgr_api_class"},{"line_number":36,"context_line":"    cls \u003d importutils.import_class(keymgr_api_class)"},{"line_number":37,"context_line":"    return cls()"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2Fm5I%3D","line":36,"in_reply_to":"AAAAP3%2F%2FnHY%3D","updated":"2013-07-15 21:53:51.000000000","message":"It doesn\u0027t look like much existing code uses stevedore yet... Is there an example of a similar driver (i.e., like this code) within that uses it?","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"}],"nova/keymgr/key.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"f93edfeb3cf0bcc1e4d5fdc25638bf2273dddb35","unresolved":false,"context_lines":[{"line_number":23,"context_line":"\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class Key:"},{"line_number":27,"context_line":"    \"\"\"Base class to represent all keys.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_algorithm(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FnHE%3D","line":26,"updated":"2013-07-15 21:08:57.000000000","message":"Please use new-style classes…","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8af25904993588964582ac2fabe037d7b1ddd6c9","unresolved":false,"context_lines":[{"line_number":23,"context_line":"\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class Key:"},{"line_number":27,"context_line":"    \"\"\"Base class to represent all keys.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_algorithm(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2Fm9g%3D","line":26,"in_reply_to":"AAAAP3%2F%2FnHE%3D","updated":"2013-07-15 21:53:51.000000000","message":"Done","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"f93edfeb3cf0bcc1e4d5fdc25638bf2273dddb35","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        raise NotImplementedError()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class SymmetricKey(Key):"},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    This class represents symmetric keys"},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FnHQ%3D","line":46,"updated":"2013-07-15 21:08:57.000000000","message":"Are we planning on only supporting symmetric key systems, or would an asymmetric key system be supported in the future?","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8af25904993588964582ac2fabe037d7b1ddd6c9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        raise NotImplementedError()"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class SymmetricKey(Key):"},{"line_number":47,"context_line":"    \"\"\""},{"line_number":48,"context_line":"    This class represents symmetric keys"},{"line_number":49,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2Fm9I%3D","line":46,"in_reply_to":"AAAAP3%2F%2FnHQ%3D","updated":"2013-07-15 21:53:51.000000000","message":"Asymmetric keys will be supported in the future.","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"275dd2ccc10043726ef7006183627d5a1826a341","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class Key(object):"},{"line_number":27,"context_line":"    \"\"\"Base class to represent all keys.\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_algorithm(self):"},{"line_number":30,"context_line":"        \"\"\"Returns this key\u0027s algorithm. For example, \"DSA\" would indicate"},{"line_number":31,"context_line":"        that this key is a DSA key."},{"line_number":32,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAP3%2F%2Ferc%3D","line":29,"updated":"2013-07-17 16:39:13.000000000","message":"Let me suggest using the standard abc module for defining this class and others like it.  You would import abc, add \"__metaclass__ \u003d abc.ABCMeta\" to the class, then decorate these methods with @abc.abstractmethod.  Then, you don\u0027t need to worry about including a raise in the methods (you would just do \"pass\" instead); the metaclass will enforce that the abstract class cannot be instantiated.","commit_id":"3c365135c1cdd335de4a78bb0fc5307d403cd442"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"54d86834963502e1d054c8e503de2f4f7f4f6ea2","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import abc"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"\"\"\"Base Key and SymmetricKey Classes"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2Fxg%3D","line":19,"updated":"2013-07-17 19:48:44.000000000","message":"Put the imports after the file docstring…","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5c1374756c6ee667b0c6888efe39fa1accf03f1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import abc"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"\"\"\"Base Key and SymmetricKey Classes"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2Fj0%3D","line":19,"in_reply_to":"AAAAQn%2F%2F%2Fxg%3D","updated":"2013-07-17 21:25:31.000000000","message":"Done","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"}],"nova/keymgr/key_mgr.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"f93edfeb3cf0bcc1e4d5fdc25638bf2273dddb35","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class KeyManager:"},{"line_number":22,"context_line":"    \"\"\"Base Key Manager Interface"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    A Key Manager is responsible for managing encryption keys for volumes. A"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2FnHM%3D","line":21,"updated":"2013-07-15 21:08:57.000000000","message":"Please use new-style classes…","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"8af25904993588964582ac2fabe037d7b1ddd6c9","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class KeyManager:"},{"line_number":22,"context_line":"    \"\"\"Base Key Manager Interface"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    A Key Manager is responsible for managing encryption keys for volumes. A"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2Fm9E%3D","line":21,"in_reply_to":"AAAAP3%2F%2FnHM%3D","updated":"2013-07-15 21:53:51.000000000","message":"Done","commit_id":"123611b45b472ee20fd3bae4cf240f4db704e84e"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"54d86834963502e1d054c8e503de2f4f7f4f6ea2","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2FxY%3D","line":18,"updated":"2013-07-17 19:48:44.000000000","message":"Here as well; this should be after the file docstring…","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5c1374756c6ee667b0c6888efe39fa1accf03f1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2Fjs%3D","line":18,"in_reply_to":"AAAAQn%2F%2F%2FxY%3D","updated":"2013-07-17 21:25:31.000000000","message":"Done","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"}],"nova/openstack/common/keymgr/__init__.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"45d7bccec61a5a28086cebe8517dc18631c70ff3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2013 The Johns Hopkins University/Applied Physics Laboratory"},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2Fjfw%3D","line":1,"updated":"2013-07-16 16:35:11.000000000","message":"This is in openstack/common; please include a link to the relevant oslo-incubator review.  (If you\u0027re not familiar with how oslo-incubator works, start with reading https://wiki.openstack.org/wiki/Oslo#Incubation)","commit_id":"d92b06b468cce49962d678d08d521597d5faa25f"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"45d7bccec61a5a28086cebe8517dc18631c70ff3","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def API():"},{"line_number":36,"context_line":"    keymgr_api_class \u003d CONF.keymgr_api_class"},{"line_number":37,"context_line":"    cls \u003d importutils.import_class(keymgr_api_class)"},{"line_number":38,"context_line":"    return cls()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2Fjeo%3D","line":37,"updated":"2013-07-16 16:35:11.000000000","message":"You are correct that stevedore isn\u0027t widely used in nova as of yet; the process of converting over to using it has been progressing somewhat slowly.  Right now, it looks like we\u0027re only using it for hooks and for V3 plugins.  I won\u0027t -1 just for not using stevedore; I\u0027m just making the suggestion that you look into how it could be used to support what you\u0027re doing here.","commit_id":"d92b06b468cce49962d678d08d521597d5faa25f"}],"nova/tests/keymgr/mock_key_mgr.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"54d86834963502e1d054c8e503de2f4f7f4f6ea2","unresolved":false,"context_lines":[{"line_number":29,"context_line":"\"\"\""},{"line_number":30,"context_line":"A mock implementation of a key manager. This module should NOT be used for"},{"line_number":31,"context_line":"anything but integration testing."},{"line_number":32,"context_line":"\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class MockKeyManager(key_mgr.KeyManager):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2FxM%3D","line":32,"updated":"2013-07-17 19:48:44.000000000","message":"I should have noticed where you were putting the file docstrings before.  I think they need to be at the beginning of the file to be officially docstrings.  In any case, to maintain consistency with all other nova *.py files, the docstring should always be immediately after the copyright header and before any imports.","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5c1374756c6ee667b0c6888efe39fa1accf03f1","unresolved":false,"context_lines":[{"line_number":29,"context_line":"\"\"\""},{"line_number":30,"context_line":"A mock implementation of a key manager. This module should NOT be used for"},{"line_number":31,"context_line":"anything but integration testing."},{"line_number":32,"context_line":"\"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class MockKeyManager(key_mgr.KeyManager):"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2Fj4%3D","line":32,"in_reply_to":"AAAAQn%2F%2F%2FxM%3D","updated":"2013-07-17 21:25:31.000000000","message":"Done","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"}],"nova/tests/keymgr/test_key.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5c1374756c6ee667b0c6888efe39fa1accf03f1","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova.keymgr import key"},{"line_number":22,"context_line":"from nova import test"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"\"\"\""},{"line_number":26,"context_line":"Test cases for the key classes."},{"line_number":27,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2Fjk%3D","line":24,"updated":"2013-07-17 21:25:31.000000000","message":"Here too.","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"}],"nova/tests/keymgr/test_key_mgr.py":[{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5c1374756c6ee667b0c6888efe39fa1accf03f1","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from nova import test"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":"Test cases for the key manager."},{"line_number":24,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2FjY%3D","line":21,"updated":"2013-07-17 21:25:31.000000000","message":"And here.","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"}],"nova/tests/keymgr/test_mock_key_mgr.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"275dd2ccc10043726ef7006183627d5a1826a341","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from nova import exception"},{"line_number":21,"context_line":"from nova.keymgr import key"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from nova.tests.keymgr import mock_key_mgr"},{"line_number":24,"context_line":"from nova.tests.keymgr import test_key_mgr"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAP3%2F%2Fer8%3D","line":23,"updated":"2013-07-17 16:39:13.000000000","message":"The blank line separating these sets of imports should be removed.  Both sets of imports are imports from the project.  See the section on imports in https://github.com/openstack-dev/hacking/blob/master/HACKING.rst","commit_id":"3c365135c1cdd335de4a78bb0fc5307d403cd442"},{"author":{"_account_id":6802,"name":"Joel Coffman","email":"jmc7tp@gmail.com","username":"joel-coffman"},"change_message_id":"d5c1374756c6ee667b0c6888efe39fa1accf03f1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from nova.tests.keymgr import mock_key_mgr"},{"line_number":24,"context_line":"from nova.tests.keymgr import test_key_mgr"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"\"\"\""},{"line_number":28,"context_line":"Test cases for the mock key manager."},{"line_number":29,"context_line":"\"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAQn%2F%2F%2FjM%3D","line":26,"updated":"2013-07-17 21:25:31.000000000","message":"Once more.","commit_id":"4e8185e41dee9e39344af92a13aef5a26eb0ed81"}],"nova/tests/openstack/__init__.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"45d7bccec61a5a28086cebe8517dc18631c70ff3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2013 The Johns Hopkins University/Applied Physics Laboratory"},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2Fjfo%3D","line":1,"updated":"2013-07-16 16:35:11.000000000","message":"oslo-incubator code is tested in oslo-incubator; we don\u0027t include tests for it within the project test suite.","commit_id":"d92b06b468cce49962d678d08d521597d5faa25f"}],"nova/tests/openstack/common/keymgr/test_mock_key_mgr.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"45d7bccec61a5a28086cebe8517dc18631c70ff3","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from nova import exception"},{"line_number":22,"context_line":"from nova.openstack.common.keymgr import key"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from nova.tests.openstack.common.keymgr import mock_key_mgr"},{"line_number":25,"context_line":"from nova.tests.openstack.common.keymgr import test_key_mgr"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAP3%2F%2Fjg0%3D","line":24,"updated":"2013-07-16 16:35:11.000000000","message":"The blank line separating these sets of imports should be removed…","commit_id":"d92b06b468cce49962d678d08d521597d5faa25f"}]}
