)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"ee40455483cb226e47fbec2bfb7375898e1c8452","unresolved":false,"context_lines":[{"line_number":23,"context_line":"__init__ method, similar to other plugins."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"* cisco.n1kv.n1kv_neutron_plugin: Removes \"policy_profile_binding\" and"},{"line_number":26,"context_line":"\"network_profile_binding\" as they don\u0027t exist in Neutron currently."},{"line_number":27,"context_line":"Removed override of api_extensions_path as it is loaded through"},{"line_number":28,"context_line":"cisco.network_plugin."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAATH%2F%2FYuk%3D","line":26,"updated":"2013-10-16 20:21:30.000000000","message":"those are cisco extensions that could be found in neutron/plugins/cisco/extensions.\nOr am I missing anything?","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6cbd56b0e1b6a87910b8a9f2f9c5ef6929c48b7f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"__init__ method, similar to other plugins."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"* cisco.n1kv.n1kv_neutron_plugin: Removes \"policy_profile_binding\" and"},{"line_number":26,"context_line":"\"network_profile_binding\" as they don\u0027t exist in Neutron currently."},{"line_number":27,"context_line":"Removed override of api_extensions_path as it is loaded through"},{"line_number":28,"context_line":"cisco.network_plugin."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAATH%2F%2FYqk%3D","line":26,"in_reply_to":"AAAATH%2F%2FYs8%3D","updated":"2013-10-16 20:39:14.000000000","message":"you\u0027re right","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"ab7da4625e1ac99317c67b9f8734ee5f9022656b","unresolved":false,"context_lines":[{"line_number":23,"context_line":"__init__ method, similar to other plugins."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"* cisco.n1kv.n1kv_neutron_plugin: Removes \"policy_profile_binding\" and"},{"line_number":26,"context_line":"\"network_profile_binding\" as they don\u0027t exist in Neutron currently."},{"line_number":27,"context_line":"Removed override of api_extensions_path as it is loaded through"},{"line_number":28,"context_line":"cisco.network_plugin."},{"line_number":29,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"AAAATH%2F%2FYs8%3D","line":26,"in_reply_to":"AAAATH%2F%2FYuk%3D","updated":"2013-10-16 20:31:51.000000000","message":"policy_profile and network_profile are aliases of extensions that exist in Neutron. policy_profile_binding and networking_profile_binding are not aliases of extensions that exist in Neutron.","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"}],"neutron/api/extensions.py":[{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"change_message_id":"5e207d37de27e58b331fe2b83dfaa8ff1bb4e1af","unresolved":false,"context_lines":[{"line_number":619,"context_line":"                                NeutronManager.get_service_plugins())"},{"line_number":620,"context_line":"        return cls._instance"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    def check_plugin_extensions_with_loaded_extensions(self):"},{"line_number":623,"context_line":"        missing_aliases \u003d set()"},{"line_number":624,"context_line":"        for plugin in self.plugins.values():"},{"line_number":625,"context_line":"            if not hasattr(plugin, \"supported_extension_aliases\"):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2FjGQ%3D","line":622,"updated":"2013-09-24 20:47:46.000000000","message":"Would a better name for this be \"check_plugin_extensions_against_loaded_extensions\" or \"check_if_plugin_extensions_loaded\"?\n\nAlso needs a docstring.","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"21eec60d083109339e50d7a77226e96e85497f92","unresolved":false,"context_lines":[{"line_number":619,"context_line":"                                NeutronManager.get_service_plugins())"},{"line_number":620,"context_line":"        return cls._instance"},{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    def check_plugin_extensions_with_loaded_extensions(self):"},{"line_number":623,"context_line":"        missing_aliases \u003d set()"},{"line_number":624,"context_line":"        for plugin in self.plugins.values():"},{"line_number":625,"context_line":"            if not hasattr(plugin, \"supported_extension_aliases\"):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2Fgb4%3D","line":622,"in_reply_to":"AAAAS3%2F%2FjGQ%3D","updated":"2013-09-25 15:09:34.000000000","message":"Sounds good.","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"c9cdfdaa0a65e3d13d16ccde1b8c7ceccd7115af","unresolved":false,"context_lines":[{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    def check_plugin_extensions_with_loaded_extensions(self):"},{"line_number":623,"context_line":"        missing_aliases \u003d set()"},{"line_number":624,"context_line":"        for plugin in self.plugins.values():"},{"line_number":625,"context_line":"            if not hasattr(plugin, \"supported_extension_aliases\"):"},{"line_number":626,"context_line":"                continue"},{"line_number":627,"context_line":"            for alias in plugin.supported_extension_aliases:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2FfB0%3D","line":624,"updated":"2013-09-25 22:14:17.000000000","message":"import itertools\n\nmissing_aliases \u003d set(itertools.chain.from_iterable([getattr(plugin,\"supported_extension_aliases\",[] for plugin in self.plugins.values()]))\n - set(self.extensions)\nif missing_alieses:\n   raise error","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"3c153dd4aa905fefd4b569f594728c129711ad2c","unresolved":false,"context_lines":[{"line_number":621,"context_line":""},{"line_number":622,"context_line":"    def check_plugin_extensions_with_loaded_extensions(self):"},{"line_number":623,"context_line":"        missing_aliases \u003d set()"},{"line_number":624,"context_line":"        for plugin in self.plugins.values():"},{"line_number":625,"context_line":"            if not hasattr(plugin, \"supported_extension_aliases\"):"},{"line_number":626,"context_line":"                continue"},{"line_number":627,"context_line":"            for alias in plugin.supported_extension_aliases:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2Fbrg%3D","line":624,"in_reply_to":"AAAAS3%2F%2FfB0%3D","updated":"2013-09-26 19:19:06.000000000","message":"Done","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"ee40455483cb226e47fbec2bfb7375898e1c8452","unresolved":false,"context_lines":[{"line_number":621,"context_line":"        return cls._instance"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    def check_if_plugin_extensions_loaded(self):"},{"line_number":624,"context_line":"        \"\"\"Check if an extension supported by a plugin has been loaded.\"\"\""},{"line_number":625,"context_line":"        plugin_extensions \u003d set(itertools.chain.from_iterable(["},{"line_number":626,"context_line":"            getattr(plugin, \"supported_extension_aliases\", [])"},{"line_number":627,"context_line":"            for plugin in self.plugins.values()]))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FZXg%3D","line":624,"updated":"2013-10-16 20:21:30.000000000","message":"Why is this needed? Is not it possible to not provide some extension even if plugin supports it?","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"ab7da4625e1ac99317c67b9f8734ee5f9022656b","unresolved":false,"context_lines":[{"line_number":621,"context_line":"        return cls._instance"},{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    def check_if_plugin_extensions_loaded(self):"},{"line_number":624,"context_line":"        \"\"\"Check if an extension supported by a plugin has been loaded.\"\"\""},{"line_number":625,"context_line":"        plugin_extensions \u003d set(itertools.chain.from_iterable(["},{"line_number":626,"context_line":"            getattr(plugin, \"supported_extension_aliases\", [])"},{"line_number":627,"context_line":"            for plugin in self.plugins.values()]))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FYsc%3D","line":624,"in_reply_to":"AAAATH%2F%2FZXg%3D","updated":"2013-10-16 20:31:51.000000000","message":"From the commit message, \"This guards against a common class of bugs in plugins, such as typographical errors in the `supported_extension_aliases` property.\" Furthermore, I would argue that all extensions which a plugin supports should be provided in Neutron.","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3fc5de91cfb221161dd15b70f51554703c652a0d","unresolved":false,"context_lines":[{"line_number":678,"context_line":"    return paths"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"def update_api_extensions_path(paths):"},{"line_number":682,"context_line":"    if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":683,"context_line":"        cfg.CONF.set_override(\u0027api_extensions_path\u0027, \u0027:\u0027.join(paths))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2FzrU%3D","line":681,"updated":"2013-10-28 18:33:15.000000000","message":"I would rename this method to set_api_extensions_path, because this is what it is. Update-* may give the impression that a path has been added. To this aim, it might be better to have an append logic.","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"77e1a68df136930a462898e91fe758626e7ca97f","unresolved":false,"context_lines":[{"line_number":678,"context_line":"    return paths"},{"line_number":679,"context_line":""},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"def update_api_extensions_path(paths):"},{"line_number":682,"context_line":"    if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":683,"context_line":"        cfg.CONF.set_override(\u0027api_extensions_path\u0027, \u0027:\u0027.join(paths))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fulw%3D","line":681,"in_reply_to":"AAAATn%2F%2FzrU%3D","updated":"2013-10-29 20:50:57.000000000","message":"Done","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3fc5de91cfb221161dd15b70f51554703c652a0d","unresolved":false,"context_lines":[{"line_number":679,"context_line":""},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"def update_api_extensions_path(paths):"},{"line_number":682,"context_line":"    if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":683,"context_line":"        cfg.CONF.set_override(\u0027api_extensions_path\u0027, \u0027:\u0027.join(paths))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fzr4%3D","line":682,"updated":"2013-10-28 18:33:15.000000000","message":"api_extensions_path is going to be in the cfg.CONF is it has been registered. What is this \u0027if\u0027 for?","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"77e1a68df136930a462898e91fe758626e7ca97f","unresolved":false,"context_lines":[{"line_number":679,"context_line":""},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"def update_api_extensions_path(paths):"},{"line_number":682,"context_line":"    if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":683,"context_line":"        cfg.CONF.set_override(\u0027api_extensions_path\u0027, \u0027:\u0027.join(paths))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fuls%3D","line":682,"in_reply_to":"AAAATn%2F%2Fzr4%3D","updated":"2013-10-29 20:50:57.000000000","message":"Removed","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"962ae90f128190106671214285a1c172e714f006","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _update_api_extensions_path(self, paths):"},{"line_number":235,"context_line":"        if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":236,"context_line":"            cfg.CONF.set_override(\u0027api_extensions_path\u0027, \u0027:\u0027.join(paths))"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    @classmethod"},{"line_number":239,"context_line":"    def register_dict_extend_funcs(cls, resource, funcs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FXi0%3D","line":236,"updated":"2013-10-17 05:41:21.000000000","message":"It is related to db_base_plugin. IMO it should be defined in api/extensions as a utility function. In addition, there is no need to define it in a class.","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"604b4fe60951099ef67b098276fc74a8b05e672d","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def _update_api_extensions_path(self, paths):"},{"line_number":235,"context_line":"        if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":236,"context_line":"            cfg.CONF.set_override(\u0027api_extensions_path\u0027, \u0027:\u0027.join(paths))"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    @classmethod"},{"line_number":239,"context_line":"    def register_dict_extend_funcs(cls, resource, funcs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FMRY%3D","line":236,"in_reply_to":"AAAATH%2F%2FXi0%3D","updated":"2013-10-21 17:05:59.000000000","message":"Done","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"}],"neutron/plugins/bigswitch/plugin.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40036a003bfbc960ff1d3bf484c2c83ddd703539","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":443,"context_line":"            cfg.CONF.set_override("},{"line_number":444,"context_line":"                \u0027api_extensions_path\u0027,"},{"line_number":445,"context_line":"                \u0027:\u0027.join(extensions.__path__ + [cfg.CONF.api_extensions_path]))"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        # \u0027servers\u0027 is the list of network controller REST end-points"},{"line_number":448,"context_line":"        # (used in order specified till one suceeds, and it is sticky"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fi0I%3D","line":445,"updated":"2013-10-15 01:23:06.000000000","message":"The logic at L.442-445 is common among plugins. It is better to make it a method which takes a plugin-specific extension path as an argument.","commit_id":"3c5d832fe6c9b0f31f88493b2cc9da6a273e7eac"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"d83ce616bebaf35e00854fb556b95cdf9c3742f8","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        if \u0027api_extensions_path\u0027 in cfg.CONF:"},{"line_number":443,"context_line":"            cfg.CONF.set_override("},{"line_number":444,"context_line":"                \u0027api_extensions_path\u0027,"},{"line_number":445,"context_line":"                \u0027:\u0027.join(extensions.__path__ + [cfg.CONF.api_extensions_path]))"},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"        # \u0027servers\u0027 is the list of network controller REST end-points"},{"line_number":448,"context_line":"        # (used in order specified till one suceeds, and it is sticky"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fd9A%3D","line":445,"in_reply_to":"AAAATH%2F%2Fi0I%3D","updated":"2013-10-15 19:44:00.000000000","message":"Done","commit_id":"3c5d832fe6c9b0f31f88493b2cc9da6a273e7eac"}],"neutron/plugins/cisco/n1kv/n1kv_neutron_plugin.py":[{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"change_message_id":"5e207d37de27e58b331fe2b83dfaa8ff1bb4e1af","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        c_cred.Store.initialize()"},{"line_number":164,"context_line":"        self._initialize_network_ranges()"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if \u0027api_extensions_path\u0027 in q_conf.CONF:"},{"line_number":167,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":168,"context_line":"            q_conf.CONF.set_override("},{"line_number":169,"context_line":"                \u0027api_extensions_path\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2FjEo%3D","line":166,"updated":"2013-09-24 20:47:46.000000000","message":"This could be potentially redundant with the code in network_plugin.py:\n\nif hasattr(self._model, \"supported_extension_aliases\"):\n            self.supported_extension_aliases.extend(\n                self._model.supported_extension_aliases)\n\nThe network_plugin.py scans supported_extension_aliases from the sub-plugins within Cisco and loads them in it\u0027s __init__ method. \n\nAre the extensions loaded before or after the plugins are initialized? If after init then this block can be safely removed.","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"change_message_id":"33bd181670941c66916c67036f8d309a83185870","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        c_cred.Store.initialize()"},{"line_number":164,"context_line":"        self._initialize_network_ranges()"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if \u0027api_extensions_path\u0027 in q_conf.CONF:"},{"line_number":167,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":168,"context_line":"            q_conf.CONF.set_override("},{"line_number":169,"context_line":"                \u0027api_extensions_path\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2Ffj4%3D","line":166,"in_reply_to":"AAAAS3%2F%2Ff7k%3D","updated":"2013-09-25 18:54:14.000000000","message":"In the Cisco plugin architecture, this is a sub plugin. The network_plugin is loaded by neutron and that in turn loads a model virt_phy_sw_2.py which will load all configured plugins as subplugins.","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"3c153dd4aa905fefd4b569f594728c129711ad2c","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        c_cred.Store.initialize()"},{"line_number":164,"context_line":"        self._initialize_network_ranges()"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if \u0027api_extensions_path\u0027 in q_conf.CONF:"},{"line_number":167,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":168,"context_line":"            q_conf.CONF.set_override("},{"line_number":169,"context_line":"                \u0027api_extensions_path\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2Fb6U%3D","line":166,"in_reply_to":"AAAAS3%2F%2Ffj4%3D","updated":"2013-09-26 19:19:06.000000000","message":"OK. I\u0027ve moved this section of code to the unit test framework, where the architecture does not apply as the N1KV plugin is loaded and tested separately in neutron/tests/unit/cisco/n1kv/test_n1kv_plugin.py. Otherwise, the network_plugin code path will suffice for setting the api_extensions_path.","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"a2e004a4d49777df40eef095802f27826a538fe2","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        c_cred.Store.initialize()"},{"line_number":164,"context_line":"        self._initialize_network_ranges()"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if \u0027api_extensions_path\u0027 in q_conf.CONF:"},{"line_number":167,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":168,"context_line":"            q_conf.CONF.set_override("},{"line_number":169,"context_line":"                \u0027api_extensions_path\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2Ff7k%3D","line":166,"in_reply_to":"AAAAS3%2F%2FgJU%3D","updated":"2013-09-25 17:14:23.000000000","message":"\u003e network_plugin will be loaded before this plugin anyways.\n\nAh, I lack context: What is the relationship between network_plugin and this plugin?","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":107,"name":"Arvind Somya","email":"arvind.somya@gmail.com","username":"asomya"},"change_message_id":"5f73ccc85c4cb3d3414d49ab1e72a21c180c2644","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        c_cred.Store.initialize()"},{"line_number":164,"context_line":"        self._initialize_network_ranges()"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if \u0027api_extensions_path\u0027 in q_conf.CONF:"},{"line_number":167,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":168,"context_line":"            q_conf.CONF.set_override("},{"line_number":169,"context_line":"                \u0027api_extensions_path\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2FgJU%3D","line":166,"in_reply_to":"AAAAS3%2F%2FgaY%3D","updated":"2013-09-25 16:05:16.000000000","message":"Sorry my mistake, I didn\u0027t phrase that correctly. This block can be removed as it is redundant with network_plugin.py. network_plugin will be loaded before this plugin anyways.\n\nSo the list of supported_extensions from this plugin will be bubbled up to network_plugin.py at the Cisco plugin\u0027s init time. Since your changes to the plugin manager check the extensions supported by the plugin to load them, I was wondering if it first inits the plugin and then checks for extensions or inspects the supported_extensions first, tries to load the extensions then inits the plugin.\n\nIf it inits first then this list would be available in network_plugin.py, if not then i was wondering if we need to add these extension aliases to network_plugin.py.","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"21eec60d083109339e50d7a77226e96e85497f92","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        c_cred.Store.initialize()"},{"line_number":164,"context_line":"        self._initialize_network_ranges()"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if \u0027api_extensions_path\u0027 in q_conf.CONF:"},{"line_number":167,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":168,"context_line":"            q_conf.CONF.set_override("},{"line_number":169,"context_line":"                \u0027api_extensions_path\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2FgaY%3D","line":166,"in_reply_to":"AAAAS3%2F%2FjEo%3D","updated":"2013-09-25 15:09:34.000000000","message":"Can you elaborate on how extending the list of supported_extension_aliases is redundant to modifying the config path (api_extensions_path) for which the extensions are loaded? I don\u0027t believe it is.","commit_id":"2e015124e805c051f56607ae13547932c45ebd53"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"6cbd56b0e1b6a87910b8a9f2f9c5ef6929c48b7f","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    # bulk operations."},{"line_number":149,"context_line":"    __native_bulk_support \u003d False"},{"line_number":150,"context_line":"    supported_extension_aliases \u003d [\"provider\", \"agent\","},{"line_number":151,"context_line":"                                   \"policy_profile_binding\","},{"line_number":152,"context_line":"                                   \"network_profile_binding\","},{"line_number":153,"context_line":"                                   \"n1kv_profile\", \"network_profile\","},{"line_number":154,"context_line":"                                   \"policy_profile\", \"external-net\", \"router\","}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FYqI%3D","side":"PARENT","line":151,"updated":"2013-10-16 20:39:14.000000000","message":"should it be then changed to \u0027policy_profile\u0027 and \u0027network_profile\u0027?","commit_id":"85e798decaecaefef2ed76728e268194c59a091e"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"dca8f2f097aeef9c6d4706a6eb5545cdfb349e9b","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    # bulk operations."},{"line_number":149,"context_line":"    __native_bulk_support \u003d False"},{"line_number":150,"context_line":"    supported_extension_aliases \u003d [\"provider\", \"agent\","},{"line_number":151,"context_line":"                                   \"policy_profile_binding\","},{"line_number":152,"context_line":"                                   \"network_profile_binding\","},{"line_number":153,"context_line":"                                   \"n1kv_profile\", \"network_profile\","},{"line_number":154,"context_line":"                                   \"policy_profile\", \"external-net\", \"router\","}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FXnA%3D","side":"PARENT","line":151,"in_reply_to":"AAAATH%2F%2FXyo%3D","updated":"2013-10-17 04:32:16.000000000","message":"sure, was not attentive. thanks.","commit_id":"85e798decaecaefef2ed76728e268194c59a091e"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"a5a25716752219fb9aa23fde81d97963f6f4deae","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    # bulk operations."},{"line_number":149,"context_line":"    __native_bulk_support \u003d False"},{"line_number":150,"context_line":"    supported_extension_aliases \u003d [\"provider\", \"agent\","},{"line_number":151,"context_line":"                                   \"policy_profile_binding\","},{"line_number":152,"context_line":"                                   \"network_profile_binding\","},{"line_number":153,"context_line":"                                   \"n1kv_profile\", \"network_profile\","},{"line_number":154,"context_line":"                                   \"policy_profile\", \"external-net\", \"router\","}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FXyo%3D","side":"PARENT","line":151,"in_reply_to":"AAAATH%2F%2FYn4%3D","updated":"2013-10-17 02:53:04.000000000","message":"This change is correct. There was some confusion between resources and extensions. The bindings are resources and should not be in this list. The extensions are \"network_profile\" (line 153) and \"policy_profile\" (line 154). Thanks.","commit_id":"85e798decaecaefef2ed76728e268194c59a091e"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"7541bc3132f89e6aa9d92d7553e9b44366963f40","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    # bulk operations."},{"line_number":149,"context_line":"    __native_bulk_support \u003d False"},{"line_number":150,"context_line":"    supported_extension_aliases \u003d [\"provider\", \"agent\","},{"line_number":151,"context_line":"                                   \"policy_profile_binding\","},{"line_number":152,"context_line":"                                   \"network_profile_binding\","},{"line_number":153,"context_line":"                                   \"n1kv_profile\", \"network_profile\","},{"line_number":154,"context_line":"                                   \"policy_profile\", \"external-net\", \"router\","}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FYn4%3D","side":"PARENT","line":151,"in_reply_to":"AAAATH%2F%2FYqI%3D","updated":"2013-10-16 20:49:33.000000000","message":"Those aliases already exist in this list. See two/three lines down.","commit_id":"85e798decaecaefef2ed76728e268194c59a091e"}],"neutron/plugins/cisco/network_plugin.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"45df54853df625f83ab28346a9b101c19477fcad","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                self._model.supported_extension_aliases)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if \u0027api_extensions_path\u0027 in config.CONF:"},{"line_number":85,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":86,"context_line":"            config.CONF.set_override("},{"line_number":87,"context_line":"                \u0027api_extensions_path\u0027,"},{"line_number":88,"context_line":"                \u0027:\u0027.join([path, config.CONF.api_extensions_path]))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FYKM%3D","line":85,"updated":"2013-09-27 20:22:08.000000000","message":"Does this actually produce a valid path?  Also if the extensions is left empty wouldn\u0027t we want to add it then too?","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"8a5fba50120646c7272f6a89a5632ca7e221d770","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                self._model.supported_extension_aliases)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        if \u0027api_extensions_path\u0027 in config.CONF:"},{"line_number":85,"context_line":"            path \u003d \u0027extensions:neutron/plugins/cisco/extensions\u0027"},{"line_number":86,"context_line":"            config.CONF.set_override("},{"line_number":87,"context_line":"                \u0027api_extensions_path\u0027,"},{"line_number":88,"context_line":"                \u0027:\u0027.join([path, config.CONF.api_extensions_path]))"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FXwg%3D","line":85,"in_reply_to":"AAAAS3%2F%2FYKM%3D","updated":"2013-09-27 22:41:27.000000000","message":"Good point. A safer alternative would be to import the extensions directory as a module and evaluate extensions.__path__.\n\n\"\u0027api_extensions_path\u0027 in config.CONF\" evaluates to true even if config.CONF.api_extensions_path is an empty string. i.e. \"\u0027api_extensions_path\u0027 in config.CONF\" tests that the configuration option has been registered.","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"}],"neutron/plugins/metaplugin/meta_neutron_plugin.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"45df54853df625f83ab28346a9b101c19477fcad","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                                            \u0027router\u0027, \u0027ext-gw-mode\u0027,"},{"line_number":56,"context_line":"                                            \u0027extraroute\u0027]"},{"line_number":57,"context_line":"        if cfg.CONF.META.supported_extension_aliases:"},{"line_number":58,"context_line":"            self.supported_extension_aliases +\u003d \\"},{"line_number":59,"context_line":"                cfg.CONF.META.supported_extension_aliases.split(\u0027,\u0027)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # Ignore config option overapping"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FYKY%3D","line":58,"updated":"2013-09-27 20:22:08.000000000","message":"Line continuations are not allowed per hacking rules.","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"8a5fba50120646c7272f6a89a5632ca7e221d770","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                                            \u0027router\u0027, \u0027ext-gw-mode\u0027,"},{"line_number":56,"context_line":"                                            \u0027extraroute\u0027]"},{"line_number":57,"context_line":"        if cfg.CONF.META.supported_extension_aliases:"},{"line_number":58,"context_line":"            self.supported_extension_aliases +\u003d \\"},{"line_number":59,"context_line":"                cfg.CONF.META.supported_extension_aliases.split(\u0027,\u0027)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # Ignore config option overapping"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FXwM%3D","line":58,"in_reply_to":"AAAAS3%2F%2FYKY%3D","updated":"2013-09-27 22:41:27.000000000","message":"OK.","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"}],"neutron/plugins/midonet/plugin.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"45df54853df625f83ab28346a9b101c19477fcad","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                      securitygroups_db.SecurityGroupDbMixin):"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    supported_extension_aliases \u003d [\u0027external-net\u0027, \u0027router\u0027, \u0027security-group\u0027,"},{"line_number":198,"context_line":"                                   \u0027agent\u0027, \u0027dhcp_agent_scheduler\u0027]"},{"line_number":199,"context_line":"    __native_bulk_support \u003d False"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FYKI%3D","line":198,"updated":"2013-09-27 20:22:08.000000000","message":"This a has been fixed is other change sets. This patch needs a rebase.","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"8a5fba50120646c7272f6a89a5632ca7e221d770","unresolved":false,"context_lines":[{"line_number":195,"context_line":"                      securitygroups_db.SecurityGroupDbMixin):"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    supported_extension_aliases \u003d [\u0027external-net\u0027, \u0027router\u0027, \u0027security-group\u0027,"},{"line_number":198,"context_line":"                                   \u0027agent\u0027, \u0027dhcp_agent_scheduler\u0027]"},{"line_number":199,"context_line":"    __native_bulk_support \u003d False"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FXwc%3D","line":198,"in_reply_to":"AAAAS3%2F%2FYKI%3D","updated":"2013-09-27 22:41:27.000000000","message":"I don\u0027t see the fix on the latest master. Fix https://review.openstack.org/#/c/45720/ was reverted by https://review.openstack.org/#/c/20693/. I can add that detail to the commit message.","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"}],"neutron/plugins/nec/extensions/packetfilter.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40036a003bfbc960ff1d3bf484c2c83ddd703539","unresolved":false,"context_lines":[{"line_number":121,"context_line":"PACKET_FILTER_ATTR_MAP \u003d {COLLECTION: PACKET_FILTER_ATTR_PARAMS}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"class Packetfilter(extensions.ExtensionDescriptor):"},{"line_number":125,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":126,"context_line":"        # When modules are re-loaded after an object is instantiated, super()"},{"line_number":127,"context_line":"        # no longer works. Cache super here, before module is re-loaded."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fi30%3D","line":124,"updated":"2013-10-15 01:23:06.000000000","message":"The following __init__ looks very tricky. The difference from other plugin-specific extensions is that PacketFilter class inherits extensions.ExtensionDescriptor, but is it better not to inherit it?\n\n  class PacketFilter(object):\n\nIn addition, nec plugin has router_provider extension in the same directory and it inherits ExtensionDesriptor too. Do we need to update it too?\n\nAfter I look at extension.py, the docstring of ExtensionDescriptors says \"you don\u0027t have to derive from this class to have a valid extension; it is purely a convenience\". Shouldn\u0027t we inherit EtensionDescriptor?\nIf so, the docstring of ExtensionDescriptor should be updated.","commit_id":"3c5d832fe6c9b0f31f88493b2cc9da6a273e7eac"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"d83ce616bebaf35e00854fb556b95cdf9c3742f8","unresolved":false,"context_lines":[{"line_number":121,"context_line":"PACKET_FILTER_ATTR_MAP \u003d {COLLECTION: PACKET_FILTER_ATTR_PARAMS}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"class Packetfilter(extensions.ExtensionDescriptor):"},{"line_number":125,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":126,"context_line":"        # When modules are re-loaded after an object is instantiated, super()"},{"line_number":127,"context_line":"        # no longer works. Cache super here, before module is re-loaded."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fd8w%3D","line":124,"in_reply_to":"AAAATH%2F%2Fi30%3D","updated":"2013-10-15 19:44:00.000000000","message":"Done. I had to add two methods that were previously inherited.","commit_id":"3c5d832fe6c9b0f31f88493b2cc9da6a273e7eac"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"40036a003bfbc960ff1d3bf484c2c83ddd703539","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def update_attributes_map(self, attributes):"},{"line_number":166,"context_line":"        self.as_super.update_attributes_map("},{"line_number":167,"context_line":"            attributes, extension_attrs_map\u003dPACKET_FILTER_ATTR_MAP)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def get_extended_resources(self, version):"},{"line_number":170,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fi1M%3D","line":167,"updated":"2013-10-15 01:23:06.000000000","message":"This extension only adds a new resource packet_filter, so update_attributes_map() is no longer needed. We can simply remove this. get_extended_resources does the job. I will check if nec plugin works after removing it.","commit_id":"3c5d832fe6c9b0f31f88493b2cc9da6a273e7eac"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"d83ce616bebaf35e00854fb556b95cdf9c3742f8","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def update_attributes_map(self, attributes):"},{"line_number":166,"context_line":"        self.as_super.update_attributes_map("},{"line_number":167,"context_line":"            attributes, extension_attrs_map\u003dPACKET_FILTER_ATTR_MAP)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def get_extended_resources(self, version):"},{"line_number":170,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fd8o%3D","line":167,"in_reply_to":"AAAATH%2F%2Fi1M%3D","updated":"2013-10-15 19:44:00.000000000","message":"Done","commit_id":"3c5d832fe6c9b0f31f88493b2cc9da6a273e7eac"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"962ae90f128190106671214285a1c172e714f006","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @classmethod"},{"line_number":160,"context_line":"    def get_actions(cls):"},{"line_number":161,"context_line":"        return []"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_request_extensions(cls):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FXkg%3D","line":161,"updated":"2013-10-17 05:41:21.000000000","message":"Looks unnecessary. See ExtensionManager for more detail.\nhttps://github.com/openstack/neutron/blob/master/neutron/api/extensions.py#L418","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"604b4fe60951099ef67b098276fc74a8b05e672d","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    @classmethod"},{"line_number":160,"context_line":"    def get_actions(cls):"},{"line_number":161,"context_line":"        return []"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_request_extensions(cls):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FMRU%3D","line":161,"in_reply_to":"AAAATH%2F%2FXkg%3D","updated":"2013-10-21 17:05:59.000000000","message":"After removing this method, I get the following error when running the unit tests:\n\nTraceback (most recent call last):\n  File \"/home/amir/quantum/neutron/tests/unit/nec/test_portbindings.py\", line 39, in setUp\n    super(TestNecPortBinding, self).setUp()\n  File \"/home/amir/quantum/neutron/tests/unit/nec/test_nec_plugin.py\", line 108, in setUp\n    super(NecPluginV2TestCase, self).setUp(self._plugin_name)\n  File \"/home/amir/quantum/neutron/tests/unit/test_db_plugin.py\", line 157, in setUp\n    self.ext_api \u003d test_extensions.setup_extensions_middleware(ext_mgr)\n  File \"/home/amir/quantum/neutron/tests/unit/test_extensions.py\", line 626, in setup_extensions_middleware\n    return extensions.ExtensionMiddleware(app, ext_mgr\u003dextension_manager)\n  File \"/home/amir/quantum/neutron/api/extensions.py\", line 300, in __init__\n    self.ext_mgr, mapper)\n  File \"/home/amir/quantum/neutron/api/extensions.py\", line 328, in _action_ext_controllers\n    for action in ext_mgr.get_actions():\nAttributeError: \u0027PacketfilterExtensionManager\u0027 object has no attribute \u0027get_actions\u0027","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"962ae90f128190106671214285a1c172e714f006","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_request_extensions(cls):"},{"line_number":165,"context_line":"        return []"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @classmethod"},{"line_number":168,"context_line":"    def get_extended_resources(cls, version):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FXkc%3D","line":165,"updated":"2013-10-17 05:41:21.000000000","message":"Ditto","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"604b4fe60951099ef67b098276fc74a8b05e672d","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_request_extensions(cls):"},{"line_number":165,"context_line":"        return []"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @classmethod"},{"line_number":168,"context_line":"    def get_extended_resources(cls, version):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FMPE%3D","line":165,"in_reply_to":"AAAATH%2F%2FXkc%3D","updated":"2013-10-21 17:05:59.000000000","message":"After removing this method, I get the following error when running the unit tests:\n\nTraceback (most recent call last):\n  File \"/home/amir/quantum/neutron/tests/unit/nec/test_packet_filter.py\", line 58, in setUp\n    super(TestNecPluginPacketFilter, self).setUp()\n  File \"/home/amir/quantum/neutron/tests/unit/nec/test_nec_plugin.py\", line 108, in setUp\n    super(NecPluginV2TestCase, self).setUp(self._plugin_name)\n  File \"/home/amir/quantum/neutron/tests/unit/test_db_plugin.py\", line 157, in setUp\n    self.ext_api \u003d test_extensions.setup_extensions_middleware(ext_mgr)\n  File \"/home/amir/quantum/neutron/tests/unit/test_extensions.py\", line 626, in setup_extensions_middleware\n    return extensions.ExtensionMiddleware(app, ext_mgr\u003dextension_manager)\n  File \"/home/amir/quantum/neutron/api/extensions.py\", line 308, in __init__\n    self.ext_mgr, mapper)\n  File \"/home/amir/quantum/neutron/api/extensions.py\", line 347, in _request_ext_controllers\n    for req_ext in ext_mgr.get_request_extensions():\nAttributeError: \u0027PacketfilterExtensionManager\u0027 object has no attribute \u0027get_request_extensions\u0027","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"962ae90f128190106671214285a1c172e714f006","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        return []"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @classmethod"},{"line_number":168,"context_line":"    def get_extended_resources(cls, version):"},{"line_number":169,"context_line":"        if version \u003d\u003d \"2.0\":"},{"line_number":170,"context_line":"            return PACKET_FILTER_ATTR_MAP"},{"line_number":171,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FXkY%3D","line":168,"updated":"2013-10-17 05:41:21.000000000","message":"get_extended_resources() is not a class method. See other extensions in neutron/extensions/*.\n\nI tested NEC plugin after applying all above comments.","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"604b4fe60951099ef67b098276fc74a8b05e672d","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        return []"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @classmethod"},{"line_number":168,"context_line":"    def get_extended_resources(cls, version):"},{"line_number":169,"context_line":"        if version \u003d\u003d \"2.0\":"},{"line_number":170,"context_line":"            return PACKET_FILTER_ATTR_MAP"},{"line_number":171,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATH%2F%2FMPQ%3D","line":168,"in_reply_to":"AAAATH%2F%2FXkY%3D","updated":"2013-10-21 17:05:59.000000000","message":"Done","commit_id":"d26174866592622e70f46d3f3822b8e03c87fd93"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"eb268969f467ebfe91949e0aa41ff2c9bcb9007a","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_request_extensions(cls):"},{"line_number":165,"context_line":"        return []"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def get_extended_resources(self, version):"},{"line_number":168,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2B38o%3D","line":165,"updated":"2013-11-19 04:18:42.000000000","message":"get_actions and get_request_extensions are unnecessary. Please remove them.","commit_id":"9f4339e23d9976f6802a2786d745f13abd8d7ba7"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a7b28f698a52db140e3663af6da61e802b5d7911","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_request_extensions(cls):"},{"line_number":165,"context_line":"        return []"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def get_extended_resources(self, version):"},{"line_number":168,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2Brk0%3D","line":165,"in_reply_to":"AAAATn%2F%2B0VU%3D","updated":"2013-11-21 16:51:12.000000000","message":"Sorry for bothering you. Patch set 19 looks good.\n\nI investigated the reason for more detail. It can be fixed by http://paste.openstack.org/show/53754/\n\nIn the current neutron, extension loading mechanism is a bit different in unit tests and normal operation. In the unit tests the extension manager for test is defined and the following is the same way as other extension do.\nhttps://github.com/openstack/neutron/blob/master/neutron/tests/unit/test_l3_plugin.py#L62","commit_id":"9f4339e23d9976f6802a2786d745f13abd8d7ba7"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"b166c8b82ca2d06ad83ae33089d888ac29eaeff6","unresolved":false,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    @classmethod"},{"line_number":164,"context_line":"    def get_request_extensions(cls):"},{"line_number":165,"context_line":"        return []"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def get_extended_resources(self, version):"},{"line_number":168,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2B0VU%3D","line":165,"in_reply_to":"AAAATn%2F%2B38o%3D","updated":"2013-11-19 18:58:19.000000000","message":"After rebasing to the latest master, I still receive the test failures as mentioned in my reply to a similar comment in patchset 15. I\u0027ve reverted the change so Packetfilter class will inherit from extensions.ExtensionDescriptor again.","commit_id":"9f4339e23d9976f6802a2786d745f13abd8d7ba7"}],"neutron/plugins/nec/nec_plugin.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"45df54853df625f83ab28346a9b101c19477fcad","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if \u0027api_extensions_path\u0027 in config.CONF:"},{"line_number":105,"context_line":"            config.CONF.set_override("},{"line_number":106,"context_line":"                \u0027api_extensions_path\u0027,"},{"line_number":107,"context_line":"                \u0027:\u0027.join([config.CONF.api_extensions_path,"},{"line_number":108,"context_line":"                          \u0027neutron/plugins/nec/extensions\u0027]))"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.setup_rpc()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FYJk%3D","line":107,"updated":"2013-09-27 20:22:08.000000000","message":"Again I don\u0027t think actually produces a valid path in production.","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"8a5fba50120646c7272f6a89a5632ca7e221d770","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if \u0027api_extensions_path\u0027 in config.CONF:"},{"line_number":105,"context_line":"            config.CONF.set_override("},{"line_number":106,"context_line":"                \u0027api_extensions_path\u0027,"},{"line_number":107,"context_line":"                \u0027:\u0027.join([config.CONF.api_extensions_path,"},{"line_number":108,"context_line":"                          \u0027neutron/plugins/nec/extensions\u0027]))"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.setup_rpc()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAS3%2F%2FXwY%3D","line":107,"in_reply_to":"AAAAS3%2F%2FYJk%3D","updated":"2013-09-27 22:41:27.000000000","message":"Ditto.","commit_id":"601f0d7488e0fa925c1bc3167d7499e8d131cf29"}],"neutron/plugins/nicira/NeutronPlugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3fc5de91cfb221161dd15b70f51554703c652a0d","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        }"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        neutron_extensions.update_api_extensions_path("},{"line_number":186,"context_line":"            [NVP_EXT_PATH, cfg.CONF.api_extensions_path])"},{"line_number":187,"context_line":"        self.nvp_opts \u003d cfg.CONF.NVP"},{"line_number":188,"context_line":"        self.nvp_sync_opts \u003d cfg.CONF.NVP_SYNC"},{"line_number":189,"context_line":"        self.cluster \u003d create_nvp_cluster(cfg.CONF,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fzq0%3D","line":186,"updated":"2013-10-28 18:33:15.000000000","message":"if cfg.CONF.api_extensions_path is empty, wouldn\u0027t this generate a path with a trailing :? Would that still be valid? Besides, you\u0027ve altered the previous logic that was of overriding the path only if it wasn\u0027t defined.","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"77e1a68df136930a462898e91fe758626e7ca97f","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        }"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        neutron_extensions.update_api_extensions_path("},{"line_number":186,"context_line":"            [NVP_EXT_PATH, cfg.CONF.api_extensions_path])"},{"line_number":187,"context_line":"        self.nvp_opts \u003d cfg.CONF.NVP"},{"line_number":188,"context_line":"        self.nvp_sync_opts \u003d cfg.CONF.NVP_SYNC"},{"line_number":189,"context_line":"        self.cluster \u003d create_nvp_cluster(cfg.CONF,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fuo8%3D","line":186,"in_reply_to":"AAAATn%2F%2Fzq0%3D","updated":"2013-10-29 20:50:57.000000000","message":"Fixed first issue by filtering empty paths. Second issue is functionally the same now that the logic is to append rather than to set (first extension loaded is extension used in case of duplicates).","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"}],"neutron/tests/unit/nicira/test_networkgw.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3fc5de91cfb221161dd15b70f51554703c652a0d","unresolved":false,"context_lines":[{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    supported_extension_aliases \u003d [\"network-gateway\"]"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    def __init__(self, **args):"},{"line_number":635,"context_line":"        super(TestNetworkGatewayPlugin, self).__init__(**args)"},{"line_number":636,"context_line":"        extensions.update_api_extensions_path("},{"line_number":637,"context_line":"            [NVP_EXT_PATH, cfg.CONF.api_extensions_path])"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2FzqM%3D","line":634,"updated":"2013-10-28 18:33:15.000000000","message":"not sure why this has been added, it shouldn\u0027t be necessary, unless something got screwed up in the process of changing how extensions are pulled in.","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"},{"author":{"_account_id":6670,"name":"Amir Sadoughi","email":"amir.sadoughi@rackspace.com","username":"amir-sadoughi"},"change_message_id":"77e1a68df136930a462898e91fe758626e7ca97f","unresolved":false,"context_lines":[{"line_number":631,"context_line":""},{"line_number":632,"context_line":"    supported_extension_aliases \u003d [\"network-gateway\"]"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    def __init__(self, **args):"},{"line_number":635,"context_line":"        super(TestNetworkGatewayPlugin, self).__init__(**args)"},{"line_number":636,"context_line":"        extensions.update_api_extensions_path("},{"line_number":637,"context_line":"            [NVP_EXT_PATH, cfg.CONF.api_extensions_path])"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAATn%2F%2Fuf4%3D","line":634,"in_reply_to":"AAAATn%2F%2FzqM%3D","updated":"2013-10-29 20:50:57.000000000","message":"The extension with alias \"network-gateway\" does not get loaded without the correct api_extensions_path. Thus, the ExtensionNotFound exception added in this changeset is thrown causing the test to fail. Changing the api_extensions_path allows the test to pass. (Removing the supported_extension_aliases list also causes the test to pass, but I think that defeats the purpose of the test.)","commit_id":"eaf0c7bee76ba081fffe1a7c4cd9565f057f9524"}]}
