)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":29,"context_line":"fixes according to review comments."},{"line_number":30,"context_line":"Service type-related constants were moved to plugins/common/constants.py"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: I1d00d6f848937410bccd91c852ff0871a86d7bb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAMH%2F%2F7kg%3D","line":32,"updated":"2012-11-15 11:45:24.000000000","message":"I think we should re-organize the commit message before we merge.\n\nhttp://wiki.openstack.org/GitCommitMessages\n\nI don\u0027t like it very much. :)","commit_id":"21e2974e88f6d3ad6afe30c16a155ea5f4d37feb"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":29,"context_line":"fixes according to review comments."},{"line_number":30,"context_line":"Service type-related constants were moved to plugins/common/constants.py"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"Change-Id: I1d00d6f848937410bccd91c852ff0871a86d7bb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAAMH%2F%2F7jw%3D","line":32,"in_reply_to":"AAAAMH%2F%2F7kg%3D","updated":"2012-11-15 11:57:34.000000000","message":"ok, sure!","commit_id":"21e2974e88f6d3ad6afe30c16a155ea5f4d37feb"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"7. Service plugin\u0027s REST calls get corresponding plugin\u0027s common prefix"},{"line_number":18,"context_line":"8. Add UTs for new extension framework functionality and for QuantumManager"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I1d00d6f848937410bccd91c852ff0871a86d7bb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAMH%2F%2F7iI%3D","line":20,"updated":"2012-11-15 12:20:56.000000000","message":"First line should be overall description of the patch. It is in a standalone paragraph.","commit_id":"2db1c7649e9a58bf1fe7de9a5c45882f973cb95f"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":17,"context_line":"7. Service plugin\u0027s REST calls get corresponding plugin\u0027s common prefix"},{"line_number":18,"context_line":"8. Add UTs for new extension framework functionality and for QuantumManager"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: I1d00d6f848937410bccd91c852ff0871a86d7bb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAAMH%2F%2F7hI%3D","line":20,"in_reply_to":"AAAAMH%2F%2F7iI%3D","updated":"2012-11-15 12:36:30.000000000","message":"ok, will fix","commit_id":"2db1c7649e9a58bf1fe7de9a5c45882f973cb95f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":"7. Service plugin\u0027s REST calls get corresponding plugin\u0027s common prefix"},{"line_number":18,"context_line":"8. Add UTs for new extension framework functionality and for QuantumManager"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implemets: blueprint quantum-service-framework"},{"line_number":21,"context_line":"Change-Id: I1d00d6f848937410bccd91c852ff0871a86d7bb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAAMH%2F%2F4OA%3D","line":20,"updated":"2012-11-18 15:29:24.000000000","message":"Typo - Implemets","commit_id":"81215b1ad0a571268b7d7b8af005544b58ee36c0"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":17,"context_line":"7. Service plugin\u0027s REST calls get corresponding plugin\u0027s common prefix"},{"line_number":18,"context_line":"8. Add UTs for new extension framework functionality and for QuantumManager"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Implemets: blueprint quantum-service-framework"},{"line_number":21,"context_line":"Change-Id: I1d00d6f848937410bccd91c852ff0871a86d7bb8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAAMH%2F%2F35Q%3D","line":20,"in_reply_to":"AAAAMH%2F%2F4OA%3D","updated":"2012-11-19 08:41:08.000000000","message":"Done","commit_id":"81215b1ad0a571268b7d7b8af005544b58ee36c0"}],"etc/quantum.conf":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"core_plugin \u003d quantum.plugins.sample.SamplePlugin.FakePlugin"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Advanced service modules"},{"line_number":44,"context_line":"# service_plugins \u003d  "},{"line_number":45,"context_line":" "},{"line_number":46,"context_line":"# Paste configuration file"},{"line_number":47,"context_line":"api_paste_config \u003d api-paste.ini"}],"source_content_type":"text/plain","patch_set":4,"id":"AAAAMH%2F%2F%2BGU%3D","line":44,"updated":"2012-11-13 17:42:26.000000000","message":"whitespaces - please remove\nIn addition it should be service_plugins \u003d \u0027\u0027\n\nOther than that looks good to me.","commit_id":"9784eb264267c1b435724716bc32778c7d4edefc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":41,"context_line":"core_plugin \u003d quantum.plugins.sample.SamplePlugin.FakePlugin"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Advanced service modules"},{"line_number":44,"context_line":"# service_plugins \u003d  "},{"line_number":45,"context_line":" "},{"line_number":46,"context_line":"# Paste configuration file"},{"line_number":47,"context_line":"api_paste_config \u003d api-paste.ini"}],"source_content_type":"text/plain","patch_set":4,"id":"AAAAMH%2F%2F9MA%3D","line":44,"in_reply_to":"AAAAMH%2F%2F%2BGU%3D","updated":"2012-11-14 10:46:33.000000000","message":"sure. pep8 doesn\u0027t check these files.","commit_id":"9784eb264267c1b435724716bc32778c7d4edefc"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"core_plugin \u003d quantum.plugins.sample.SamplePlugin.FakePlugin"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Advanced service modules"},{"line_number":44,"context_line":"# service_plugins \u003d "},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# Paste configuration file"},{"line_number":47,"context_line":"api_paste_config \u003d api-paste.ini"}],"source_content_type":"text/plain","patch_set":5,"id":"AAAAMH%2F%2F9JQ%3D","line":44,"updated":"2012-11-14 11:55:47.000000000","message":"can we remove the trailing whitespace?","commit_id":"0e4531b99cb5126e2c93dbe096de31bf0e65b81b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":41,"context_line":"core_plugin \u003d quantum.plugins.sample.SamplePlugin.FakePlugin"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"# Advanced service modules"},{"line_number":44,"context_line":"# service_plugins \u003d "},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# Paste configuration file"},{"line_number":47,"context_line":"api_paste_config \u003d api-paste.ini"}],"source_content_type":"text/plain","patch_set":5,"id":"AAAAMH%2F%2F9IY%3D","line":44,"in_reply_to":"AAAAMH%2F%2F9JQ%3D","updated":"2012-11-14 12:04:13.000000000","message":"Done","commit_id":"0e4531b99cb5126e2c93dbe096de31bf0e65b81b"}],"quantum/api/v2/base.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"    def get_plugin_type(self):"},{"line_number":130,"context_line":"        if hasattr(self._plugin, \"get_plugin_type\"):"},{"line_number":131,"context_line":"            return self._plugin.get_plugin_type()"},{"line_number":132,"context_line":"        return constants.CORE"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _is_native_bulk_supported(self):"},{"line_number":135,"context_line":"        native_bulk_attr_name \u003d (\"_%s__native_bulk_support\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5uw%3D","line":132,"updated":"2012-11-16 11:22:30.000000000","message":"Seems this is not covered by unit tests?\n\nquantum.api.v2.base                               267     52     94     13    82%   92-93, 130-132, 162-167, 223-226, 229-252, 283-287, 306-310, 337-338, 360-363, 422-424, 427-432, 447, 459, 464, 468-469, 478-480","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    def get_plugin_type(self):"},{"line_number":130,"context_line":"        if hasattr(self._plugin, \"get_plugin_type\"):"},{"line_number":131,"context_line":"            return self._plugin.get_plugin_type()"},{"line_number":132,"context_line":"        return constants.CORE"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _is_native_bulk_supported(self):"},{"line_number":135,"context_line":"        native_bulk_attr_name \u003d (\"_%s__native_bulk_support\""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5t8%3D","line":132,"in_reply_to":"AAAAMH%2F%2F5uw%3D","updated":"2012-11-16 12:58:12.000000000","message":"right, going to add UT specifically for the controller.","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"}],"quantum/common/config.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"    cfg.StrOpt(\u0027policy_file\u0027, default\u003d\"policy.json\"),"},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027svc_plugins\u0027,"},{"line_number":45,"context_line":"               default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fv0%3D","line":43,"updated":"2012-11-12 10:15:41.000000000","message":"We\u0027d need a bug fix to remove the default setting for core_plugin\n\nHowever, I do not see a lot of differences between the core plugin and the service plugins (from API dispatch and loading perspective).\nIf each plugin declares its service type, we do not even need to describe it in Quantum.conf.\nSo there is probably a cause for having just a \u0027plugins\u0027 ListOpt and treat the core plugin as one of those","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":"    cfg.StrOpt(\u0027policy_file\u0027, default\u003d\"policy.json\"),"},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027svc_plugins\u0027,"},{"line_number":45,"context_line":"               default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2FoM%3D","line":43,"in_reply_to":"AAAAMH%2F%2F%2Fu8%3D","updated":"2012-11-12 14:44:26.000000000","message":"Agreed. We\u0027ll change this in a different patch.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    cfg.StrOpt(\u0027policy_file\u0027, default\u003d\"policy.json\"),"},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027svc_plugins\u0027,"},{"line_number":45,"context_line":"               default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fu8%3D","line":43,"in_reply_to":"AAAAMH%2F%2F%2Fv0%3D","updated":"2012-11-12 11:08:14.000000000","message":"Actually I was trying to minimize changes to core infrastructure and core plugins.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"74bf189b3a1a2abc29086d3d7616c8c3d2166ce2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027svc_plugins\u0027,"},{"line_number":45,"context_line":"               default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Fu3s%3D","line":44,"updated":"2012-11-09 16:25:22.000000000","message":"ListOpt is more appropriate here.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7cfa6edf24299eaa6ff5bbb5be709a9ca3aaabb1","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027svc_plugins\u0027,"},{"line_number":45,"context_line":"               default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Fuz4%3D","line":44,"updated":"2012-11-09 16:23:10.000000000","message":"consider service_plugins?","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027svc_plugins\u0027,"},{"line_number":45,"context_line":"               default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F1I%3D","line":44,"in_reply_to":"AAAALn%2F%2Ftp4%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027svc_plugins\u0027,"},{"line_number":45,"context_line":"               default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Ftp4%3D","line":44,"in_reply_to":"AAAALn%2F%2Fu3s%3D","updated":"2012-11-11 11:30:15.000000000","message":"I agree with Mark.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027service_plugins\u0027,"},{"line_number":45,"context_line":"                default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Fkk%3D","line":44,"updated":"2012-11-12 16:32:39.000000000","message":"Can you please add a comment to quantum.conf file with the default value. This helps users who try and look in the configuration files.","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    cfg.StrOpt(\u0027auth_strategy\u0027, default\u003d\u0027keystone\u0027),"},{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027service_plugins\u0027,"},{"line_number":45,"context_line":"                default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BkA%3D","line":44,"in_reply_to":"AAAAMH%2F%2F%2Fkk%3D","updated":"2012-11-13 13:51:06.000000000","message":"Done","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027service_plugins\u0027,"},{"line_number":45,"context_line":"                default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027allow_bulk\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2F2ik%3D","line":45,"updated":"2012-11-20 00:52:18.000000000","message":"The default value should probably be []","commit_id":"355f0e2cf0a3c8b8cc6248b9278edc0d848d8335"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027service_plugins\u0027,"},{"line_number":45,"context_line":"                default\u003d\u0027\u0027),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027allow_bulk\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2F2SM%3D","line":45,"in_reply_to":"AAAAMH%2F%2F2ik%3D","updated":"2012-11-20 07:21:25.000000000","message":"Done","commit_id":"355f0e2cf0a3c8b8cc6248b9278edc0d848d8335"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":"    cfg.StrOpt(\u0027core_plugin\u0027,"},{"line_number":43,"context_line":"               default\u003d\u0027quantum.plugins.sample.SamplePlugin.FakePlugin\u0027),"},{"line_number":44,"context_line":"    cfg.ListOpt(\u0027service_plugins\u0027,"},{"line_number":45,"context_line":"                default\u003d[\u0027\u0027]),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027base_mac\u0027, default\u003d\"fa:16:3e:00:00:00\"),"},{"line_number":47,"context_line":"    cfg.IntOpt(\u0027mac_generation_retries\u0027, default\u003d16),"},{"line_number":48,"context_line":"    cfg.BoolOpt(\u0027allow_bulk\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAMH%2F%2F2Rc%3D","line":45,"updated":"2012-11-20 07:44:38.000000000","message":"I think it should be just [ ].","commit_id":"e2493f569c6ca8610fda601d410c8a863cfea1c2"}],"quantum/extensions/extensions.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7cfa6edf24299eaa6ff5bbb5be709a9ca3aaabb1","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.openstack.common import importutils"},{"line_number":33,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":34,"context_line":"from quantum import wsgi"},{"line_number":35,"context_line":"from quantum import plugins"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.api.extensions\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Fuz0%3D","line":35,"updated":"2012-11-09 16:23:10.000000000","message":"Please look at HACKING.rst for the order of the includes. This should be above line 34","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from quantum.openstack.common import importutils"},{"line_number":33,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":34,"context_line":"from quantum import wsgi"},{"line_number":35,"context_line":"from quantum import plugins"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.api.extensions\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F1U%3D","line":35,"in_reply_to":"AAAALn%2F%2Fuz0%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # extended resources"},{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d plugins.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fvg%3D","line":267,"updated":"2012-11-12 10:15:41.000000000","message":"This could be avoided if QuantumPluginBaseV2 provided this method, returning plugin.CORE.\n\nIMO it\u0027s acceptable for an abstract class to have some non-abstract methods, so QuantumPluginBaseV2 might provide this method.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # extended resources"},{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d plugins.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2FoI%3D","line":267,"in_reply_to":"AAAAMH%2F%2F%2Fu4%3D","updated":"2012-11-12 14:44:26.000000000","message":"ok","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # extended resources"},{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d plugins.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fu4%3D","line":267,"in_reply_to":"AAAAMH%2F%2F%2Fvg%3D","updated":"2012-11-12 11:08:14.000000000","message":"I see. But in fact that will make an implied assumption that controller is always a plugin of some kind, while it might not necessarily be the case.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":288,"context_line":"                            controller\u003dresource.controller,"},{"line_number":289,"context_line":"                            member\u003dresource.member_actions,"},{"line_number":290,"context_line":"                            parent_resource\u003dresource.parent,"},{"line_number":291,"context_line":"                            path_prefix\u003dplugins.COMMON_PREFIXES[plugin_type])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        # extended actions"},{"line_number":294,"context_line":"        action_controllers \u003d self._action_ext_controllers(application,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fvc%3D","line":291,"updated":"2012-11-12 10:15:41.000000000","message":"Just to be resilient, consider plugins.COMMON_PREFIXES.get(\u0027plugin_type\u0027, \u0027\u0027)","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                            controller\u003dresource.controller,"},{"line_number":289,"context_line":"                            member\u003dresource.member_actions,"},{"line_number":290,"context_line":"                            parent_resource\u003dresource.parent,"},{"line_number":291,"context_line":"                            path_prefix\u003dplugins.COMMON_PREFIXES[plugin_type])"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        # extended actions"},{"line_number":294,"context_line":"        action_controllers \u003d self._action_ext_controllers(application,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fu0%3D","line":291,"in_reply_to":"AAAAMH%2F%2F%2Fvc%3D","updated":"2012-11-12 11:08:14.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"74bf189b3a1a2abc29086d3d7616c8c3d2166ce2","unresolved":false,"context_lines":[{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def _plugins_support(self, extension):"},{"line_number":553,"context_line":"        alias \u003d extension.get_alias()"},{"line_number":554,"context_line":"        supports_extension \u003d False"},{"line_number":555,"context_line":"        for plugin in self.plugins.values():"},{"line_number":556,"context_line":"            supports_extension \u003d (hasattr(plugin,"},{"line_number":557,"context_line":"                                  \"supported_extension_aliases\") and"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Fu04%3D","line":554,"updated":"2012-11-09 16:25:22.000000000","message":"supports_extension \u003d any(\n    (hasattr(plugin, \"supported_extension_aliases\") and \n     alias in plugin.supported_extensions_aliases)\n    for plugin in self.plugins.values())","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def _plugins_support(self, extension):"},{"line_number":553,"context_line":"        alias \u003d extension.get_alias()"},{"line_number":554,"context_line":"        supports_extension \u003d False"},{"line_number":555,"context_line":"        for plugin in self.plugins.values():"},{"line_number":556,"context_line":"            supports_extension \u003d (hasattr(plugin,"},{"line_number":557,"context_line":"                                  \"supported_extension_aliases\") and"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F1Q%3D","line":554,"in_reply_to":"AAAALn%2F%2Fu04%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # extended resources"},{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F9Io%3D","line":267,"updated":"2012-11-14 11:55:47.000000000","message":"Do we need  controller to support get_plugin_type() or the controller\u0027s plugin attr to support get_plugin_type() ?\n\nwe have ServicePluginBase class, can we force it to the base for adv service plugin?","commit_id":"0e4531b99cb5126e2c93dbe096de31bf0e65b81b"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # extended resources"},{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F9HU%3D","line":267,"in_reply_to":"AAAAMH%2F%2F9Ic%3D","updated":"2012-11-14 12:31:50.000000000","message":"In general, quantum extension resource has a controller, which has a plugin attr.\nwe defined a ServicePluginBase class, which should be regarded as adv service plugin base. Since ServicePluginBase has a get_plugin_type(), so I think the hasattr() should be called on plugin instead of controller.\n\nIt is a generic extension framework,  and it is embodying something, we must coding according some rule so that they can be put together. :)\n\nTo imagine we have a extension resource which has a controller without the get_plugin_type() but the controller has a plugin which is a lbaas plugin.\nwhat is the mess?\n\nsee https://review.openstack.org/#/c/15954/, it is a such case.","commit_id":"0e4531b99cb5126e2c93dbe096de31bf0e65b81b"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":264,"context_line":"        # extended resources"},{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAMH%2F%2F9Ic%3D","line":267,"in_reply_to":"AAAAMH%2F%2F9Io%3D","updated":"2012-11-14 12:04:13.000000000","message":"That\u0027s generic extension framework code unrelated to service or core plugins. Controller is not necessarily a plugin hence we don\u0027t want to enforce this.","commit_id":"0e4531b99cb5126e2c93dbe096de31bf0e65b81b"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"},{"line_number":271,"context_line":"                      resource.collection)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2F8F0%3D","line":268,"updated":"2012-11-15 00:38:59.000000000","message":"sorry, I have to re-speak out my comment at\nhttps://review.openstack.org/#/c/15733/5/quantum/extensions/extensions.py\n\nI see u have changed the base.controller, but its get_plugin_type is calling plugin\u0027s same method. why not change here to call plugin\u0027s method directly?\n\nwe have a lots of adv service plugins in dict returned by manager\u0027s get_service_plugins().\nthey  must have this method get_plugin_type().  if controller has this method too and return different values, it will result in mess.\n\nAlso, I hope we should make sure the adv service plugins based on ServicePluginBase. I think ( correct me if I am wrong) we should make it as one part of our framework.","commit_id":"622f8477366c9f20250bb5bfb5da6f6e3f52aee8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":266,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":267,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":268,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"},{"line_number":271,"context_line":"                      resource.collection)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2F7tk%3D","line":268,"in_reply_to":"AAAAMH%2F%2F8F0%3D","updated":"2012-11-15 10:15:39.000000000","message":"I\u0027ll post here what was discussed on irc:\n1. why not change here to call plugin\u0027s method directly?\n\nplugin is protected member of base.Controller. There\u0027s not need at the moment to make it public neither by itself nor by providing get_plugin() method. Hence indirect call.\n\n2.  I hope we should make sure the adv service plugins based on ServicePluginBase\nWe will, but that would be enforced in extension, not in the framework.\nFramework allows any class to be a controller, and that fact is utilized by unit tests which depend on that.\n\nAs a consequence:\nwe need to check hasattr(resource.controller, \"get_plugin_type\") on a controller (because controller may not necessarily be base.Controller) and we need to check hasattr(plugin, \"get_plugin_type\") in controller\u0027s get_plugin_type() method because controller._plugin is not necessarily a service plugin. It could be core which doesn\u0027t implement ServicePluginBase\n\nTherefore i\u0027m going to leave this part of change as is","commit_id":"622f8477366c9f20250bb5bfb5da6f6e3f52aee8"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        # extended resources"},{"line_number":270,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":271,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":272,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":273,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5vM%3D","line":271,"updated":"2012-11-16 11:22:30.000000000","message":"Consider path_prefix \u003d \u0027\u0027 for line 271","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":268,"context_line":""},{"line_number":269,"context_line":"        # extended resources"},{"line_number":270,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":271,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":272,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":273,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":274,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5uA%3D","line":271,"in_reply_to":"AAAAMH%2F%2F5vM%3D","updated":"2012-11-16 12:58:12.000000000","message":"Done","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":270,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":271,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":272,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":273,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"},{"line_number":276,"context_line":"                      resource.collection)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5vE%3D","line":273,"updated":"2012-11-16 11:22:30.000000000","message":"Consider adding another line for path_prefix \u003d constants.COMMON_PREFIXES.get(plugin_type, \u0027\u0027)","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        for resource in self.ext_mgr.get_resources():"},{"line_number":271,"context_line":"            plugin_type \u003d constants.CORE"},{"line_number":272,"context_line":"            if hasattr(resource.controller, \"get_plugin_type\"):"},{"line_number":273,"context_line":"                plugin_type \u003d resource.controller.get_plugin_type()"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"},{"line_number":276,"context_line":"                      resource.collection)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5uE%3D","line":273,"in_reply_to":"AAAAMH%2F%2F5vE%3D","updated":"2012-11-16 12:58:12.000000000","message":"Done","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":293,"context_line":"                            controller\u003dresource.controller,"},{"line_number":294,"context_line":"                            member\u003dresource.member_actions,"},{"line_number":295,"context_line":"                            parent_resource\u003dresource.parent,"},{"line_number":296,"context_line":"                            path_prefix\u003dconstants.COMMON_PREFIXES.get("},{"line_number":297,"context_line":"                            plugin_type, \u0027\u0027))"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        # extended actions"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5vA%3D","line":296,"updated":"2012-11-16 11:22:30.000000000","message":"Consider replacing with path_prefix \u003d path_prefix\n\nThe three comments for this module are more or less syntactic sugar. The only relevant different is that we don\u0027t query COMMON_PREFIXES if the controller does not have a plugin type. This would spare us a dict lookup when the extension has not plugin.\n\nAgain this is a nit-pick - I just would like to hear your opinion about it. This is my pedantry friday :)","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                            controller\u003dresource.controller,"},{"line_number":294,"context_line":"                            member\u003dresource.member_actions,"},{"line_number":295,"context_line":"                            parent_resource\u003dresource.parent,"},{"line_number":296,"context_line":"                            path_prefix\u003dconstants.COMMON_PREFIXES.get("},{"line_number":297,"context_line":"                            plugin_type, \u0027\u0027))"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"        # extended actions"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5uI%3D","line":296,"in_reply_to":"AAAAMH%2F%2F5vA%3D","updated":"2012-11-16 12:58:12.000000000","message":"agree.","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":277,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"},{"line_number":278,"context_line":"                      resource.collection)"},{"line_number":279,"context_line":"            for action, method in resource.collection_actions.iteritems():"},{"line_number":280,"context_line":"                path_prefix \u003d \"\""},{"line_number":281,"context_line":"                parent \u003d resource.parent"},{"line_number":282,"context_line":"                conditions \u003d dict(method\u003d[method])"},{"line_number":283,"context_line":"                path \u003d \"/%s/%s\" % (resource.collection, action)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F5n0%3D","line":280,"updated":"2012-11-16 14:49:30.000000000","message":"This overwrites the previous value of path_prefix","commit_id":"50c704b9d72ed88add3dd757cc9fd64f056e49b4"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            LOG.debug(_(\u0027Extended resource: %s\u0027),"},{"line_number":278,"context_line":"                      resource.collection)"},{"line_number":279,"context_line":"            for action, method in resource.collection_actions.iteritems():"},{"line_number":280,"context_line":"                path_prefix \u003d \"\""},{"line_number":281,"context_line":"                parent \u003d resource.parent"},{"line_number":282,"context_line":"                conditions \u003d dict(method\u003d[method])"},{"line_number":283,"context_line":"                path \u003d \"/%s/%s\" % (resource.collection, action)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAMH%2F%2F5no%3D","line":280,"in_reply_to":"AAAAMH%2F%2F5n0%3D","updated":"2012-11-16 14:50:29.000000000","message":"Done","commit_id":"50c704b9d72ed88add3dd757cc9fd64f056e49b4"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":295,"context_line":"                            controller\u003dresource.controller,"},{"line_number":296,"context_line":"                            member\u003dresource.member_actions,"},{"line_number":297,"context_line":"                            parent_resource\u003dresource.parent,"},{"line_number":298,"context_line":"                            path_prefix\u003dplugin_prefix)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # extended actions"},{"line_number":301,"context_line":"        action_controllers \u003d self._action_ext_controllers(application,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F5hM%3D","line":298,"updated":"2012-11-16 16:01:26.000000000","message":"According to mapper.resource() doc path_prefix won\u0027t be generated as “\u003cparent collection name\u003e/:\u003cparent member name\u003e_id” if it is specified. So I think parent_prefix should \nbe created and passed here too: path_prefix\u003dplugin_prefix+parent_prefix.","commit_id":"4f4230b186163f8fa6dea9f0f0dc8ff36ea100b0"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":295,"context_line":"                            controller\u003dresource.controller,"},{"line_number":296,"context_line":"                            member\u003dresource.member_actions,"},{"line_number":297,"context_line":"                            parent_resource\u003dresource.parent,"},{"line_number":298,"context_line":"                            path_prefix\u003dplugin_prefix)"},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # extended actions"},{"line_number":301,"context_line":"        action_controllers \u003d self._action_ext_controllers(application,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAMH%2F%2F5es%3D","line":298,"in_reply_to":"AAAAMH%2F%2F5hM%3D","updated":"2012-11-16 16:06:59.000000000","message":"good catch. I\u0027ll add UT and code for this","commit_id":"4f4230b186163f8fa6dea9f0f0dc8ff36ea100b0"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":569,"context_line":"            supports_extension \u003d (alias in"},{"line_number":570,"context_line":"                                  ENABLED_EXTS[plugin_provider][\u0027ext_alias\u0027])"},{"line_number":571,"context_line":"        if not supports_extension:"},{"line_number":572,"context_line":"            LOG.warn(\"extension %s not supported by any of loaded plugins\","},{"line_number":573,"context_line":"                     alias)"},{"line_number":574,"context_line":"        return supports_extension"},{"line_number":575,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAMH%2F%2F4N8%3D","line":572,"updated":"2012-11-18 15:29:24.000000000","message":"Should use the _() format to try and help translators in the future.","commit_id":"81215b1ad0a571268b7d7b8af005544b58ee36c0"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":569,"context_line":"            supports_extension \u003d (alias in"},{"line_number":570,"context_line":"                                  ENABLED_EXTS[plugin_provider][\u0027ext_alias\u0027])"},{"line_number":571,"context_line":"        if not supports_extension:"},{"line_number":572,"context_line":"            LOG.warn(\"extension %s not supported by any of loaded plugins\","},{"line_number":573,"context_line":"                     alias)"},{"line_number":574,"context_line":"        return supports_extension"},{"line_number":575,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAMH%2F%2F35Y%3D","line":572,"in_reply_to":"AAAAMH%2F%2F4N8%3D","updated":"2012-11-19 08:41:08.000000000","message":"Done","commit_id":"81215b1ad0a571268b7d7b8af005544b58ee36c0"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":580,"context_line":"        for plugin in self.plugins.values():"},{"line_number":581,"context_line":"            if isinstance(plugin, extension.get_plugin_interface()):"},{"line_number":582,"context_line":"                return True"},{"line_number":583,"context_line":"        LOG.warn(\"Loaded plugins do not implement extension %s interface\""},{"line_number":584,"context_line":"                 % extension.get_alias())"},{"line_number":585,"context_line":"        return False"},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAMH%2F%2F4N4%3D","line":583,"updated":"2012-11-18 15:29:24.000000000","message":"Ditto","commit_id":"81215b1ad0a571268b7d7b8af005544b58ee36c0"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":580,"context_line":"        for plugin in self.plugins.values():"},{"line_number":581,"context_line":"            if isinstance(plugin, extension.get_plugin_interface()):"},{"line_number":582,"context_line":"                return True"},{"line_number":583,"context_line":"        LOG.warn(\"Loaded plugins do not implement extension %s interface\""},{"line_number":584,"context_line":"                 % extension.get_alias())"},{"line_number":585,"context_line":"        return False"},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAMH%2F%2F35U%3D","line":583,"in_reply_to":"AAAAMH%2F%2F4N4%3D","updated":"2012-11-19 08:41:08.000000000","message":"Done","commit_id":"81215b1ad0a571268b7d7b8af005544b58ee36c0"}],"quantum/manager.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"from distutils import core"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Copyright 2011 Nicira Networks, Inc"},{"line_number":5,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Ftpw%3D","line":2,"updated":"2012-11-11 11:30:15.000000000","message":"This should not be in the comments section.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"from distutils import core"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Copyright 2011 Nicira Networks, Inc"},{"line_number":5,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F0Y%3D","line":2,"in_reply_to":"AAAALn%2F%2Ftpw%3D","updated":"2012-11-12 08:06:25.000000000","message":"This looks like rebase result. Will fix.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.plugin \u003d plugin_klass()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        # core plugin as a part of plugin collection simplifies"},{"line_number":64,"context_line":"        # checking extensions"},{"line_number":65,"context_line":"        self.service_plugins \u003d {CORE: self.plugin}"},{"line_number":66,"context_line":"        self._load_service_plugins()"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2FvM%3D","line":64,"updated":"2012-11-12 10:15:41.000000000","message":"I agree, and we might reflect this also in the configuration file. This will simply all the plugin management code, I believe.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.plugin \u003d plugin_klass()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        # core plugin as a part of plugin collection simplifies"},{"line_number":64,"context_line":"        # checking extensions"},{"line_number":65,"context_line":"        self.service_plugins \u003d {CORE: self.plugin}"},{"line_number":66,"context_line":"        self._load_service_plugins()"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2FoE%3D","line":64,"in_reply_to":"AAAAMH%2F%2F%2FuE%3D","updated":"2012-11-12 14:44:26.000000000","message":"Agreed. Would you mind adding a TODO in the code for this?","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self.plugin \u003d plugin_klass()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        # core plugin as a part of plugin collection simplifies"},{"line_number":64,"context_line":"        # checking extensions"},{"line_number":65,"context_line":"        self.service_plugins \u003d {CORE: self.plugin}"},{"line_number":66,"context_line":"        self._load_service_plugins()"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2FuE%3D","line":64,"in_reply_to":"AAAAMH%2F%2F%2FvM%3D","updated":"2012-11-12 11:32:22.000000000","message":"I think I\u0027ll postpone this for now leaving Core plugin as separate field in QuantumManager and in configuration","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"74bf189b3a1a2abc29086d3d7616c8c3d2166ce2","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self._load_service_plugins()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _load_service_plugins(self):"},{"line_number":69,"context_line":"        plugin_providers \u003d cfg.CONF.svc_plugins.split(\",\")"},{"line_number":70,"context_line":"        LOG.debug(\"Loading service plugins: %s\" % plugin_providers)"},{"line_number":71,"context_line":"        for provider in plugin_providers:"},{"line_number":72,"context_line":"            if provider \u003d\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Fu20%3D","line":69,"updated":"2012-11-09 16:25:22.000000000","message":"This is not needed if we switch to ListOpt.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self._load_service_plugins()"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _load_service_plugins(self):"},{"line_number":69,"context_line":"        plugin_providers \u003d cfg.CONF.svc_plugins.split(\",\")"},{"line_number":70,"context_line":"        LOG.debug(\"Loading service plugins: %s\" % plugin_providers)"},{"line_number":71,"context_line":"        for provider in plugin_providers:"},{"line_number":72,"context_line":"            if provider \u003d\u003d \u0027\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F1E%3D","line":69,"in_reply_to":"AAAALn%2F%2Fu20%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _load_service_plugins(self):"},{"line_number":70,"context_line":"        plugin_providers \u003d cfg.CONF.service_plugins"},{"line_number":71,"context_line":"        LOG.debug(\"Loading service plugins: %s\" % plugin_providers)"},{"line_number":72,"context_line":"        for provider in plugin_providers:"},{"line_number":73,"context_line":"            if provider \u003d\u003d \u0027\u0027:"},{"line_number":74,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Fi0%3D","line":71,"updated":"2012-11-12 16:32:39.000000000","message":"Consider:\nLOG.debug(_(\"Loading service plugins: %(plugin_providers)s\"), plugin_providers)\nThis may be useful in the long run if and when we do translations.","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _load_service_plugins(self):"},{"line_number":70,"context_line":"        plugin_providers \u003d cfg.CONF.service_plugins"},{"line_number":71,"context_line":"        LOG.debug(\"Loading service plugins: %s\" % plugin_providers)"},{"line_number":72,"context_line":"        for provider in plugin_providers:"},{"line_number":73,"context_line":"            if provider \u003d\u003d \u0027\u0027:"},{"line_number":74,"context_line":"                continue"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Bjo%3D","line":71,"in_reply_to":"AAAAMH%2F%2F%2Fi0%3D","updated":"2012-11-13 13:51:06.000000000","message":"I\u0027ll make it \n\nLOG.debug(_(\"Loading service plugins: %s\" % plugin_providers))","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":73,"context_line":"            if provider \u003d\u003d \u0027\u0027:"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                LOG.info(\"Loading Plugin: %s\" % provider)"},{"line_number":77,"context_line":"                plugin_class \u003d importutils.import_class(provider)"},{"line_number":78,"context_line":"            except ClassNotFound:"},{"line_number":79,"context_line":"                LOG.exception(\"Error loading plugin\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Fiw%3D","line":76,"updated":"2012-11-12 16:32:39.000000000","message":"Ditto","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            if provider \u003d\u003d \u0027\u0027:"},{"line_number":74,"context_line":"                continue"},{"line_number":75,"context_line":"            try:"},{"line_number":76,"context_line":"                LOG.info(\"Loading Plugin: %s\" % provider)"},{"line_number":77,"context_line":"                plugin_class \u003d importutils.import_class(provider)"},{"line_number":78,"context_line":"            except ClassNotFound:"},{"line_number":79,"context_line":"                LOG.exception(\"Error loading plugin\")"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Bjk%3D","line":76,"in_reply_to":"AAAAMH%2F%2F%2Fiw%3D","updated":"2012-11-13 13:51:06.000000000","message":"Done","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":84,"context_line":"            # specifying more than one plugin"},{"line_number":85,"context_line":"            # for the same type is a fatal exception"},{"line_number":86,"context_line":"            if plugin_inst.get_plugin_type() in self.service_plugins:"},{"line_number":87,"context_line":"                raise Exception(\"Multiple plugins for service \""},{"line_number":88,"context_line":"                                \"%s were configured\""},{"line_number":89,"context_line":"                                % plugin_inst.get_plugin_type())"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Fio%3D","line":87,"updated":"2012-11-12 16:32:39.000000000","message":"Ditto","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            # specifying more than one plugin"},{"line_number":85,"context_line":"            # for the same type is a fatal exception"},{"line_number":86,"context_line":"            if plugin_inst.get_plugin_type() in self.service_plugins:"},{"line_number":87,"context_line":"                raise Exception(\"Multiple plugins for service \""},{"line_number":88,"context_line":"                                \"%s were configured\""},{"line_number":89,"context_line":"                                % plugin_inst.get_plugin_type())"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Bjg%3D","line":87,"in_reply_to":"AAAAMH%2F%2F%2Fio%3D","updated":"2012-11-13 13:51:06.000000000","message":"Done","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"            self.service_plugins[plugin_inst.get_plugin_type()] \u003d plugin_inst"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            LOG.debug(\"Successfully loaded %s plugin. Description: %s \""},{"line_number":94,"context_line":"                      % (plugin_inst.get_plugin_type(),"},{"line_number":95,"context_line":"                         plugin_inst.get_plugin_description()))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Fik%3D","line":93,"updated":"2012-11-12 16:32:39.000000000","message":"Ditto","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"            self.service_plugins[plugin_inst.get_plugin_type()] \u003d plugin_inst"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            LOG.debug(\"Successfully loaded %s plugin. Description: %s \""},{"line_number":94,"context_line":"                      % (plugin_inst.get_plugin_type(),"},{"line_number":95,"context_line":"                         plugin_inst.get_plugin_description()))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Bjc%3D","line":93,"in_reply_to":"AAAAMH%2F%2F%2Fik%3D","updated":"2012-11-13 13:51:06.000000000","message":"Done","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":27,"context_line":"from quantum.openstack.common import cfg"},{"line_number":28,"context_line":"from quantum.openstack.common import importutils"},{"line_number":29,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":30,"context_line":"from quantum.plugins.common.constants import CORE"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5vc%3D","line":30,"updated":"2012-11-16 11:22:30.000000000","message":"We don\u0027t have an official policy for importing symbols.\nHowever usually in Quantum the module is imported and the symbol referenced as module.symbol\n\nThis is just a heads-up. It\u0027s up to you whether you think it\u0027s worth addressing or not. For me it\u0027s not going to influence the opinion on the patch.","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from quantum.openstack.common import cfg"},{"line_number":28,"context_line":"from quantum.openstack.common import importutils"},{"line_number":29,"context_line":"from quantum.openstack.common import log as logging"},{"line_number":30,"context_line":"from quantum.plugins.common.constants import CORE"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5uM%3D","line":30,"in_reply_to":"AAAAMH%2F%2F5vc%3D","updated":"2012-11-16 12:58:12.000000000","message":"you\u0027re right. actually i\u0027ve fixed other places. thanks for noticing that one","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"            self.service_plugins[plugin_inst.get_plugin_type()] \u003d plugin_inst"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            LOG.debug(_(\"Successfully loaded %s plugin. Description: %s \" %"},{"line_number":94,"context_line":"                       (plugin_inst.get_plugin_type(),"},{"line_number":95,"context_line":"                        plugin_inst.get_plugin_description())))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2F3s4%3D","line":93,"updated":"2012-11-19 13:25:07.000000000","message":"Should use dict for string that has many %s.","commit_id":"14aeb7a49217e411408d8e1643401cf9c03bf9d6"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"            self.service_plugins[plugin_inst.get_plugin_type()] \u003d plugin_inst"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            LOG.debug(_(\"Successfully loaded %s plugin. Description: %s \" %"},{"line_number":94,"context_line":"                       (plugin_inst.get_plugin_type(),"},{"line_number":95,"context_line":"                        plugin_inst.get_plugin_description())))"},{"line_number":96,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2F3o0%3D","line":93,"in_reply_to":"AAAAMH%2F%2F3s4%3D","updated":"2012-11-19 14:14:31.000000000","message":"Done","commit_id":"14aeb7a49217e411408d8e1643401cf9c03bf9d6"}],"quantum/plugins/__init__.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LOAD_BALANCER \u003d \"LOAD_BALANCER\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2FvQ%3D","line":21,"updated":"2012-11-12 10:15:41.000000000","message":"This approach extremely easy to leverage, and also has the advantage of simplifying the configuration file. \n\nHowever, it also implies that Quantum has no control over the plugin types it loads. (which btw is handy for the \u0027dummy\u0027 plugin). One possible downside is that I can create two distinct APIs for the same class of service and loading both services using slightly different plugin types.\n\nFor instance LOAD_BALANCER and LOAD_BALANCER_B\n\nWould it be possible to enforce the plugin_type should in a specific list, or is this flexibility deliberate?","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LOAD_BALANCER \u003d \"LOAD_BALANCER\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fn4%3D","line":21,"in_reply_to":"AAAAMH%2F%2F%2Fug%3D","updated":"2012-11-12 14:44:26.000000000","message":"I don\u0027t think we want multiple plugins now.\nWe all agree to stay simple with a simple plugin.\n\nMy concern was about the fact that this mechanism is indirectly allowing for multiple, indpependent, APIs for the same kind of service. This would be concerning not from a technical perspective (we all understand that this is possible and will work easily as you say), but rather from an end user perspective. I believe users expect to Quantum to have one and only one LB API. \n\nNevertheless, as long as we are in agreement that we do not want multiple APIs, I am fine with keeping this mechanisms as it is and maybe enforce some kind of stricter checks, and/or allow multiple plugins later on.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LOAD_BALANCER \u003d \"LOAD_BALANCER\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fug%3D","line":21,"in_reply_to":"AAAAMH%2F%2F%2FvQ%3D","updated":"2012-11-12 11:08:14.000000000","message":"\"One possible downside is that I can create two distinct APIs for the same class of service and loading both services using slightly different plugin types.\"\nI think it\u0027s ok and in fact it\u0027s the reason for having COMMON_PREFIXES. Just add another for LOAD_BALANCER_B. In fact Extension framework is not quite ready for multiple plugins implementing the extension, but it\u0027s not difficult to add such feature using prefixes.\nI think we can postpone implementation of more flexible approach.\nAlthough I think that proposed change is reasonable minimum to start adding plugins.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"}],"quantum/plugins/cisco/tests/unit/test_cisco_extension.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":1257,"context_line":"def setup_extensions_middleware(extension_manager\u003dNone):"},{"line_number":1258,"context_line":"    extension_manager \u003d (extension_manager or"},{"line_number":1259,"context_line":"                         PluginAwareExtensionManager(EXTENSIONS_PATH,"},{"line_number":1260,"context_line":"                                                     {CORE: L2Network()}))"},{"line_number":1261,"context_line":"    app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"},{"line_number":1262,"context_line":"    return ExtensionMiddleware(app, ext_mgr\u003dextension_manager)"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Ft0I%3D","line":1260,"updated":"2012-11-10 22:11:50.000000000","message":"Just a heads up, l2network_plugin does not exist anymore. So you might not want to run this. This test should actually be removed (not relevant to this patch).","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":1257,"context_line":"def setup_extensions_middleware(extension_manager\u003dNone):"},{"line_number":1258,"context_line":"    extension_manager \u003d (extension_manager or"},{"line_number":1259,"context_line":"                         PluginAwareExtensionManager(EXTENSIONS_PATH,"},{"line_number":1260,"context_line":"                                                     {CORE: L2Network()}))"},{"line_number":1261,"context_line":"    app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"},{"line_number":1262,"context_line":"    return ExtensionMiddleware(app, ext_mgr\u003dextension_manager)"},{"line_number":1263,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F0w%3D","line":1260,"in_reply_to":"AAAALn%2F%2Ft0I%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":47,"context_line":"from quantum.plugins.cisco.l2network_plugin import L2Network"},{"line_number":48,"context_line":"from quantum.tests.unit.extension_stubs import StubBaseAppController"},{"line_number":49,"context_line":"from quantum import wsgi"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.plugins.cisco.tests.test_cisco_extensions\u0027)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2Fig%3D","line":50,"updated":"2012-11-12 16:32:39.000000000","message":"Do you need to change this file?","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":47,"context_line":"from quantum.plugins.cisco.l2network_plugin import L2Network"},{"line_number":48,"context_line":"from quantum.tests.unit.extension_stubs import StubBaseAppController"},{"line_number":49,"context_line":"from quantum import wsgi"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.plugins.cisco.tests.test_cisco_extensions\u0027)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BjM%3D","line":50,"in_reply_to":"AAAAMH%2F%2F%2Fig%3D","updated":"2012-11-13 13:51:06.000000000","message":"no. It got into diff since i\u0027ve changed it and rolled the change back","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"unresolved":false,"context_lines":[{"line_number":48,"context_line":"from quantum.tests.unit.extension_stubs import StubBaseAppController"},{"line_number":49,"context_line":"from quantum import wsgi"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.plugins.cisco.tests.test_cisco_extensions\u0027)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAMH%2F%2F7Q8%3D","side":"PARENT","line":51,"updated":"2012-11-15 16:30:22.000000000","message":"It is stated in HACKING to put two blank lines after the last import. This looks like a nit","commit_id":"c8375cfad251176edfd44956a1d44e56126908b3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":48,"context_line":"from quantum.tests.unit.extension_stubs import StubBaseAppController"},{"line_number":49,"context_line":"from quantum import wsgi"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.plugins.cisco.tests.test_cisco_extensions\u0027)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAMH%2F%2F7Pw%3D","side":"PARENT","line":51,"in_reply_to":"AAAAMH%2F%2F7Q8%3D","updated":"2012-11-15 16:34:09.000000000","message":"that shouldn\u0027t got into diff at all. thanks.","commit_id":"c8375cfad251176edfd44956a1d44e56126908b3"}],"quantum/plugins/common/constants.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LOAD_BALANCER \u003d \"LOAD_BALANCER\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2FiY%3D","line":18,"updated":"2012-11-12 16:32:39.000000000","message":"Maybe consider have a PLUGIN_ prefix?","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LOAD_BALANCER \u003d \"LOAD_BALANCER\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BjI%3D","line":18,"in_reply_to":"AAAAMH%2F%2F%2FiY%3D","updated":"2012-11-13 13:51:06.000000000","message":"I think it\u0027s okay since they are under plugins.common.constants","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LOAD_BALANCER \u003d \"LOAD_BALANCER\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2F3sw%3D","line":21,"updated":"2012-11-19 13:25:07.000000000","message":"Since this patch just has DUMMY and CORE, please remove the LOAD_BALANCER.","commit_id":"14aeb7a49217e411408d8e1643401cf9c03bf9d6"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":18,"context_line":"# service type constants:"},{"line_number":19,"context_line":"CORE \u003d \"CORE\""},{"line_number":20,"context_line":"DUMMY \u003d \"DUMMY\""},{"line_number":21,"context_line":"LOAD_BALANCER \u003d \"LOAD_BALANCER\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"COMMON_PREFIXES \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAMH%2F%2F3os%3D","line":21,"in_reply_to":"AAAAMH%2F%2F3sw%3D","updated":"2012-11-19 14:14:31.000000000","message":"Done","commit_id":"14aeb7a49217e411408d8e1643401cf9c03bf9d6"}],"quantum/plugins/services/service_base.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"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 2012 OpenStack LLC."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2Fvo%3D","line":1,"updated":"2012-11-12 10:15:41.000000000","message":"QuantumPluginBaseV2 can also inherit from this class.\nThis will probably will save us a few tests for get_plugin_type","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"74bf189b3a1a2abc29086d3d7616c8c3d2166ce2","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":20,"context_line":"class ServicePluginBase(object):"},{"line_number":21,"context_line":"    extension_aliases \u003d []"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    #returns one of predefine service types. see __init__.py"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2FuzI%3D","line":20,"updated":"2012-11-09 16:25:22.000000000","message":"I think this should be an abstract base class.\n    __metaclass__ \u003d abc.ABCMeta","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":20,"context_line":"class ServicePluginBase(object):"},{"line_number":21,"context_line":"    extension_aliases \u003d []"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    #returns one of predefine service types. see __init__.py"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F0o%3D","line":20,"in_reply_to":"AAAALn%2F%2Ft0E%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":20,"context_line":"class ServicePluginBase(object):"},{"line_number":21,"context_line":"    extension_aliases \u003d []"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    #returns one of predefine service types. see __init__.py"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F0s%3D","line":20,"in_reply_to":"AAAALn%2F%2FuzI%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":20,"context_line":"class ServicePluginBase(object):"},{"line_number":21,"context_line":"    extension_aliases \u003d []"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    #returns one of predefine service types. see __init__.py"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Ft0E%3D","line":20,"in_reply_to":"AAAALn%2F%2FuzI%3D","updated":"2012-11-10 22:11:50.000000000","message":"In which case you would need to import abc as well...","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"74bf189b3a1a2abc29086d3d7616c8c3d2166ce2","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class ServicePluginBase(object):"},{"line_number":21,"context_line":"    extension_aliases \u003d []"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    #returns one of predefine service types. see __init__.py"},{"line_number":24,"context_line":"    def get_plugin_type(self):"},{"line_number":25,"context_line":"        pass"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2FuzE%3D","line":23,"updated":"2012-11-09 16:25:22.000000000","message":"@abc.abstractmethod","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":20,"context_line":"class ServicePluginBase(object):"},{"line_number":21,"context_line":"    extension_aliases \u003d []"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    #returns one of predefine service types. see __init__.py"},{"line_number":24,"context_line":"    def get_plugin_type(self):"},{"line_number":25,"context_line":"        pass"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F0k%3D","line":23,"in_reply_to":"AAAALn%2F%2FuzE%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"74bf189b3a1a2abc29086d3d7616c8c3d2166ce2","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def get_plugin_type(self):"},{"line_number":25,"context_line":"        pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    #returns string description of the plugin"},{"line_number":28,"context_line":"    def get_plugin_description(self):"},{"line_number":29,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2FuzA%3D","line":27,"updated":"2012-11-09 16:25:22.000000000","message":"@abc.abstractmethod","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def get_plugin_type(self):"},{"line_number":25,"context_line":"        pass"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    #returns string description of the plugin"},{"line_number":28,"context_line":"    def get_plugin_description(self):"},{"line_number":29,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F0g%3D","line":27,"in_reply_to":"AAAALn%2F%2FuzA%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":23,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":24,"context_line":"    supported_extension_aliases \u003d []"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    #returns one of predefine service types. see __init__.py"},{"line_number":27,"context_line":"    @abc.abstractmethod"},{"line_number":28,"context_line":"    def get_plugin_type(self):"},{"line_number":29,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMH%2F%2F9TQ%3D","line":26,"updated":"2012-11-14 08:03:43.000000000","message":"why is the comments abut a function written before function name?\nwhy not use \"\"\" \"\"\" after fucnction name?","commit_id":"9784eb264267c1b435724716bc32778c7d4edefc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":24,"context_line":"    supported_extension_aliases \u003d []"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    #returns one of predefine service types. see __init__.py"},{"line_number":27,"context_line":"    @abc.abstractmethod"},{"line_number":28,"context_line":"    def get_plugin_type(self):"},{"line_number":29,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMH%2F%2F9OU%3D","line":26,"in_reply_to":"AAAAMH%2F%2F9TQ%3D","updated":"2012-11-14 10:46:33.000000000","message":"Done","commit_id":"9784eb264267c1b435724716bc32778c7d4edefc"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":22,"context_line":"class ServicePluginBase(object):"},{"line_number":23,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":24,"context_line":"    supported_extension_aliases \u003d []"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2F8GM%3D","line":21,"updated":"2012-11-15 00:38:59.000000000","message":"change the # flavor class comment into \"\"\".","commit_id":"622f8477366c9f20250bb5bfb5da6f6e3f52aee8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":22,"context_line":"class ServicePluginBase(object):"},{"line_number":23,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":24,"context_line":"    supported_extension_aliases \u003d []"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2F7tg%3D","line":21,"in_reply_to":"AAAAMH%2F%2F8GM%3D","updated":"2012-11-15 10:15:39.000000000","message":"Done","commit_id":"622f8477366c9f20250bb5bfb5da6f6e3f52aee8"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":22,"context_line":"class ServicePluginBase(object):"},{"line_number":23,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":24,"context_line":"    supported_extension_aliases \u003d []"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2F8GI%3D","line":22,"updated":"2012-11-15 00:38:59.000000000","message":"does any place enforce this class requirement?","commit_id":"622f8477366c9f20250bb5bfb5da6f6e3f52aee8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"# defines base interface for any Advanced Service plugin"},{"line_number":22,"context_line":"class ServicePluginBase(object):"},{"line_number":23,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":24,"context_line":"    supported_extension_aliases \u003d []"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAMH%2F%2F7tY%3D","line":22,"in_reply_to":"AAAAMH%2F%2F8GI%3D","updated":"2012-11-15 10:15:39.000000000","message":"That will be enforced by extension. We don\u0027t need to enforce this in the framework.","commit_id":"622f8477366c9f20250bb5bfb5da6f6e3f52aee8"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"},{"line_number":27,"context_line":"    def get_plugin_type(self):"},{"line_number":28,"context_line":"        \"\"\" returns one of predefine service types. see __init__.py \"\"\""},{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2F2mY%3D","line":28,"updated":"2012-11-20 00:52:18.000000000","message":"Typo...\nAlso I wonder whether instead of __init__.py actually you refer to quantum/plugins/common/constants.py","commit_id":"355f0e2cf0a3c8b8cc6248b9278edc0d848d8335"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"},{"line_number":27,"context_line":"    def get_plugin_type(self):"},{"line_number":28,"context_line":"        \"\"\" returns one of predefine service types. see __init__.py \"\"\""},{"line_number":29,"context_line":"        pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAMH%2F%2F2SI%3D","line":28,"in_reply_to":"AAAAMH%2F%2F2mY%3D","updated":"2012-11-20 07:21:25.000000000","message":"Done","commit_id":"355f0e2cf0a3c8b8cc6248b9278edc0d848d8335"}],"quantum/tests/unit/test_db_plugin.py":[{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                              DB_PLUGIN_KLASS))"},{"line_number":68,"context_line":"        cfg.CONF.set_override(\"service_plugins\","},{"line_number":69,"context_line":"                              [\"quantum.plugins.services.\""},{"line_number":70,"context_line":"                               \"dummy.dummy_plugin.QuantumDummyPlugin\"])"},{"line_number":71,"context_line":"        QuantumManager._instance \u003d None"},{"line_number":72,"context_line":"        mgr \u003d QuantumManager.get_instance()"},{"line_number":73,"context_line":"        plugin \u003d mgr.get_service_plugins()[constants.DUMMY]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMH%2F%2F9TE%3D","line":70,"updated":"2012-11-14 08:03:43.000000000","message":"We often use cfg.CONF.set_override in setUp() and then cfg.CONF.reset() in tearDown()","commit_id":"9784eb264267c1b435724716bc32778c7d4edefc"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                                              DB_PLUGIN_KLASS))"},{"line_number":68,"context_line":"        cfg.CONF.set_override(\"service_plugins\","},{"line_number":69,"context_line":"                              [\"quantum.plugins.services.\""},{"line_number":70,"context_line":"                               \"dummy.dummy_plugin.QuantumDummyPlugin\"])"},{"line_number":71,"context_line":"        QuantumManager._instance \u003d None"},{"line_number":72,"context_line":"        mgr \u003d QuantumManager.get_instance()"},{"line_number":73,"context_line":"        plugin \u003d mgr.get_service_plugins()[constants.DUMMY]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAMH%2F%2F9Ro%3D","line":70,"in_reply_to":"AAAAMH%2F%2F9TE%3D","updated":"2012-11-14 10:46:33.000000000","message":"good point","commit_id":"9784eb264267c1b435724716bc32778c7d4edefc"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return os.path.join(ETCDIR, *p)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class QuantumManagerTestCase(unittest2.TestCase):"},{"line_number":61,"context_line":"    def setUp(self):"},{"line_number":62,"context_line":"        super(QuantumManagerTestCase, self).setUp()"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5ug%3D","line":60,"updated":"2012-11-16 11:22:30.000000000","message":"This test case might be worth being in a module of its own.","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return os.path.join(ETCDIR, *p)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class QuantumManagerTestCase(unittest2.TestCase):"},{"line_number":61,"context_line":"    def setUp(self):"},{"line_number":62,"context_line":"        super(QuantumManagerTestCase, self).setUp()"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAMH%2F%2F5t4%3D","line":60,"in_reply_to":"AAAAMH%2F%2F5ug%3D","updated":"2012-11-16 12:58:12.000000000","message":"Done","commit_id":"395735b07bdf0ff25effb40ac06476449aa0c000"}],"quantum/tests/unit/test_extensions.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":")"},{"line_number":43,"context_line":"import quantum.tests.unit.extensions"},{"line_number":44,"context_line":"from quantum import wsgi"},{"line_number":45,"context_line":"from quantum.plugins import CORE, DUMMY"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.tests.test_extensions\u0027)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Ftps%3D","line":45,"updated":"2012-11-11 11:30:15.000000000","message":"Would it not be better to have a file that has the plugin definitions instead of the __init__. It would be more readable.","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":42,"context_line":")"},{"line_number":43,"context_line":"import quantum.tests.unit.extensions"},{"line_number":44,"context_line":"from quantum import wsgi"},{"line_number":45,"context_line":"from quantum.plugins import CORE, DUMMY"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.tests.test_extensions\u0027)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2Ftzw%3D","line":45,"updated":"2012-11-10 22:11:50.000000000","message":"import order needs to be fixed","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":42,"context_line":")"},{"line_number":43,"context_line":"import quantum.tests.unit.extensions"},{"line_number":44,"context_line":"from quantum import wsgi"},{"line_number":45,"context_line":"from quantum.plugins import CORE, DUMMY"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.tests.test_extensions\u0027)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAMH%2F%2F%2F0c%3D","line":45,"in_reply_to":"AAAALn%2F%2Ftzw%3D","updated":"2012-11-12 08:06:25.000000000","message":"Done","commit_id":"302ff2ca059a0a799affa00177e6b0a226a3c721"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"unresolved":false,"context_lines":[{"line_number":43,"context_line":")"},{"line_number":44,"context_line":"import quantum.tests.unit.extensions"},{"line_number":45,"context_line":"from quantum import wsgi"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.tests.test_extensions\u0027)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2FiI%3D","line":46,"updated":"2012-11-12 16:32:39.000000000","message":"Can you please add in a test to test a case where the user defines a plugin more than once in the service plugins.","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d065428880d602b1eff5855c0228e4192462d8af","unresolved":false,"context_lines":[{"line_number":43,"context_line":")"},{"line_number":44,"context_line":"import quantum.tests.unit.extensions"},{"line_number":45,"context_line":"from quantum import wsgi"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"LOG \u003d logging.getLogger(\u0027quantum.tests.test_extensions\u0027)"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAMH%2F%2F%2BcE%3D","line":46,"in_reply_to":"AAAAMH%2F%2F%2FiI%3D","updated":"2012-11-13 13:51:06.000000000","message":"Done","commit_id":"ecabd44e8b7e983324b10daae1187997a379671d"}]}
