)]}'
{"etc/neutron/plugins/ml2/ml2_conf.ini":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# (ListOpt) Ordered list of extension driver entrypoints"},{"line_number":25,"context_line":"# to be loaded from the neutron.ml2.extension_drivers namespace."},{"line_number":26,"context_line":"# extension_drivers \u003d"},{"line_number":27,"context_line":"# Example: extension_drivers \u003d anewextensiondriver"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"[ml2_type_flat]"}],"source_content_type":"text/x-properties","patch_set":12,"id":"baada198_0688a2c4","line":26,"updated":"2014-08-04 18:11:57.000000000","message":"I wonder if this is the best way to describe extensions here. What if two mechanism drivers require extensions that conflict with each other? Would the last defined take over? Also would it make sense to have an extension list per mech driver? I fear this is too free-form","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# (ListOpt) Ordered list of extension driver entrypoints"},{"line_number":25,"context_line":"# to be loaded from the neutron.ml2.extension_drivers namespace."},{"line_number":26,"context_line":"# extension_drivers \u003d"},{"line_number":27,"context_line":"# Example: extension_drivers \u003d anewextensiondriver"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"[ml2_type_flat]"}],"source_content_type":"text/x-properties","patch_set":12,"id":"baada198_bde400a9","line":26,"in_reply_to":"baada198_0688a2c4","updated":"2014-08-07 01:09:36.000000000","message":"I\u0027m not clear about the conflict you are referring to. \n\nIn here, each mechanism can define extension driver that supports extended attribute to the core resources that they are going to support. Can you please elaborate on how conflict happens here?","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"c10faa8ed7a3bd49a8d5098cf79df1c081e0843c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# (ListOpt) Ordered list of extension driver entrypoints"},{"line_number":25,"context_line":"# to be loaded from the neutron.ml2.extension_drivers namespace."},{"line_number":26,"context_line":"# extension_drivers \u003d"},{"line_number":27,"context_line":"# Example: extension_drivers \u003d anewextensiondriver"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"[ml2_type_flat]"}],"source_content_type":"text/x-properties","patch_set":12,"id":"baada198_1c9cee0d","line":26,"in_reply_to":"baada198_6cde386c","updated":"2014-08-07 19:23:49.000000000","message":"When extended attribute is added to resources the attribute name must be unique to avoid name classing. As mentioned in other comment, developer can use \u003cnamespace\u003e:\u003cattribute_name\u003e for a attribute that its mechanism driver is going to support to avoid such a clash.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"35655f5229db799f8c280ab928ea85778b969423","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"# (ListOpt) Ordered list of extension driver entrypoints"},{"line_number":25,"context_line":"# to be loaded from the neutron.ml2.extension_drivers namespace."},{"line_number":26,"context_line":"# extension_drivers \u003d"},{"line_number":27,"context_line":"# Example: extension_drivers \u003d anewextensiondriver"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"[ml2_type_flat]"}],"source_content_type":"text/x-properties","patch_set":12,"id":"baada198_6cde386c","line":26,"in_reply_to":"baada198_bde400a9","updated":"2014-08-07 01:59:16.000000000","message":"I wonder if different drivers end up introducing overlapping extension attributes, name clashing etc.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"}],"neutron/api/extensions.py":[{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"21afc5fc1fea8c9a8d9130751cbba3a49f9e3c4b","unresolved":false,"context_lines":[{"line_number":679,"context_line":""},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"def append_api_extensions_path(paths):"},{"line_number":682,"context_line":"    paths \u003d list(set([cfg.CONF.api_extensions_path] + paths))"},{"line_number":683,"context_line":"    cfg.CONF.set_override(\u0027api_extensions_path\u0027,"},{"line_number":684,"context_line":"                          \u0027:\u0027.join([p for p in paths if p]))"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_921796a2","line":682,"updated":"2014-08-29 15:52:07.000000000","message":"Why do we need to make this a set?","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"a329abf6850d2787d09bca4491c47a9238c1cf89","unresolved":false,"context_lines":[{"line_number":679,"context_line":""},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"def append_api_extensions_path(paths):"},{"line_number":682,"context_line":"    paths \u003d list(set([cfg.CONF.api_extensions_path] + paths))"},{"line_number":683,"context_line":"    cfg.CONF.set_override(\u0027api_extensions_path\u0027,"},{"line_number":684,"context_line":"                          \u0027:\u0027.join([p for p in paths if p]))"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_38e5c137","line":682,"in_reply_to":"1abeadc6_921796a2","updated":"2014-08-29 16:34:50.000000000","message":"This is to avoid duplicate entries in the list.","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"1e0023e20ec25cae3112eab9367f826b9891fc02","unresolved":false,"context_lines":[{"line_number":679,"context_line":""},{"line_number":680,"context_line":""},{"line_number":681,"context_line":"def append_api_extensions_path(paths):"},{"line_number":682,"context_line":"    paths \u003d list(set([cfg.CONF.api_extensions_path] + paths))"},{"line_number":683,"context_line":"    cfg.CONF.set_override(\u0027api_extensions_path\u0027,"},{"line_number":684,"context_line":"                          \u0027:\u0027.join([p for p in paths if p]))"}],"source_content_type":"text/x-python","patch_set":22,"id":"fa98f980_81ec64c9","line":682,"updated":"2014-08-31 06:11:12.000000000","message":"sets are iterable, no need to convert back to a list","commit_id":"102d047cd581ad5fb0dd3e2cbeb5753113ea0d7b"}],"neutron/api/v2/base.py":[{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"f8be52609b0ff478db8399c633b14fdb941066e1","unresolved":false,"context_lines":[{"line_number":235,"context_line":"            obj_getter \u003d getattr(self._plugin,"},{"line_number":236,"context_line":"                                 self._plugin_handlers[self.LIST])"},{"line_number":237,"context_line":"        except AttributeError:"},{"line_number":238,"context_line":"            # The plugin does not support this attribute. Check more,"},{"line_number":239,"context_line":"            # for ML2 plugin. The attribute may be part of extension and"},{"line_number":240,"context_line":"            # could be implemented by mechanism driver."},{"line_number":241,"context_line":"            obj_getter \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2FVGo%3D","line":238,"updated":"2014-04-22 14:51:48.000000000","message":"I\u0027m not a specialist of this code, but it looks strange to add plugin specific code here.\nA more generic way to add handlers by the plugin would be better.","commit_id":"b76237cd9cd14e8aa8b5393023eee73c44b0bd27"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"57142af3fd0e31cf93173be476a92fdcb1bfbc1d","unresolved":false,"context_lines":[{"line_number":235,"context_line":"            obj_getter \u003d getattr(self._plugin,"},{"line_number":236,"context_line":"                                 self._plugin_handlers[self.LIST])"},{"line_number":237,"context_line":"        except AttributeError:"},{"line_number":238,"context_line":"            # The plugin does not support this attribute. Check more,"},{"line_number":239,"context_line":"            # for ML2 plugin. The attribute may be part of extension and"},{"line_number":240,"context_line":"            # could be implemented by mechanism driver."},{"line_number":241,"context_line":"            obj_getter \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2FTc4%3D","line":238,"in_reply_to":"AAAAXH%2F%2FVGo%3D","updated":"2014-04-22 16:41:18.000000000","message":"This is removed. No need of this change. I updated the latest change in the Patch2.","commit_id":"b76237cd9cd14e8aa8b5393023eee73c44b0bd27"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":755,"context_line":"                attributes.NETWORKS, res, network)"},{"line_number":756,"context_line":"        return self._fields(res, fields)"},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"    def _make_subnet_dict(self, subnet, fields\u003dNone, process_extensions\u003dTrue):"},{"line_number":759,"context_line":"        res \u003d {\u0027id\u0027: subnet[\u0027id\u0027],"},{"line_number":760,"context_line":"               \u0027name\u0027: subnet[\u0027name\u0027],"},{"line_number":761,"context_line":"               \u0027tenant_id\u0027: subnet[\u0027tenant_id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_604f5b93","line":758,"updated":"2014-08-14 02:30:56.000000000","message":"If there are no cases where you False will be passed, ypi could avoid adding this optional arg, and always call _apply_dict_extend_functions().","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":755,"context_line":"                attributes.NETWORKS, res, network)"},{"line_number":756,"context_line":"        return self._fields(res, fields)"},{"line_number":757,"context_line":""},{"line_number":758,"context_line":"    def _make_subnet_dict(self, subnet, fields\u003dNone, process_extensions\u003dTrue):"},{"line_number":759,"context_line":"        res \u003d {\u0027id\u0027: subnet[\u0027id\u0027],"},{"line_number":760,"context_line":"               \u0027name\u0027: subnet[\u0027name\u0027],"},{"line_number":761,"context_line":"               \u0027tenant_id\u0027: subnet[\u0027tenant_id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_da20fe9d","line":758,"in_reply_to":"7ac7a964_604f5b93","updated":"2014-08-14 19:15:57.000000000","message":"Will remove process_extensions.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":838,"context_line":"                    \u0027shared\u0027: n[\u0027shared\u0027],"},{"line_number":839,"context_line":"                    \u0027status\u0027: n.get(\u0027status\u0027, constants.NET_STATUS_ACTIVE)}"},{"line_number":840,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":841,"context_line":"            context.session.add(network)"},{"line_number":842,"context_line":"        return self._make_network_dict(network, process_extensions\u003dFalse)"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":"    def update_network(self, context, id, network):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_c024afc8","line":841,"updated":"2014-08-14 02:30:56.000000000","message":"Passing False here seems like a bug. Any extended attributes should be included in the result from create_network.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":838,"context_line":"                    \u0027shared\u0027: n[\u0027shared\u0027],"},{"line_number":839,"context_line":"                    \u0027status\u0027: n.get(\u0027status\u0027, constants.NET_STATUS_ACTIVE)}"},{"line_number":840,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":841,"context_line":"            context.session.add(network)"},{"line_number":842,"context_line":"        return self._make_network_dict(network, process_extensions\u003dFalse)"},{"line_number":843,"context_line":""},{"line_number":844,"context_line":"    def update_network(self, context, id, network):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_9aba06e0","line":841,"in_reply_to":"7ac7a964_c024afc8","updated":"2014-08-14 19:15:57.000000000","message":"This was introduced when fix for Bug 1201957 committed.\n\nhttps://bugs.launchpad.net/neutron/+bug/1201957\n\nhttps://review.openstack.org/#/c/39093/","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":852,"context_line":"            # also update shared in all the subnets for this network"},{"line_number":853,"context_line":"            subnets \u003d self._get_subnets_by_network(context, id)"},{"line_number":854,"context_line":"            for subnet in subnets:"},{"line_number":855,"context_line":"                subnet[\u0027shared\u0027] \u003d network[\u0027shared\u0027]"},{"line_number":856,"context_line":"        return self._make_network_dict(network)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def delete_network(self, context, id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_202c83ab","line":855,"updated":"2014-08-14 02:30:56.000000000","message":"The default of True here is correct.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":852,"context_line":"            # also update shared in all the subnets for this network"},{"line_number":853,"context_line":"            subnets \u003d self._get_subnets_by_network(context, id)"},{"line_number":854,"context_line":"            for subnet in subnets:"},{"line_number":855,"context_line":"                subnet[\u0027shared\u0027] \u003d network[\u0027shared\u0027]"},{"line_number":856,"context_line":"        return self._make_network_dict(network)"},{"line_number":857,"context_line":""},{"line_number":858,"context_line":"    def delete_network(self, context, id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_3a79f22f","line":855,"in_reply_to":"7ac7a964_202c83ab","updated":"2014-08-14 19:15:57.000000000","message":"correct.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":883,"context_line":"            context.session.delete(network)"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":"    def get_network(self, context, id, fields\u003dNone):"},{"line_number":886,"context_line":"        network \u003d self._get_network(context, id)"},{"line_number":887,"context_line":"        return self._make_network_dict(network, fields)"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    def get_networks(self, context, filters\u003dNone, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_601d9b73","line":886,"updated":"2014-08-14 02:30:56.000000000","message":"Default of True here is correct.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":883,"context_line":"            context.session.delete(network)"},{"line_number":884,"context_line":""},{"line_number":885,"context_line":"    def get_network(self, context, id, fields\u003dNone):"},{"line_number":886,"context_line":"        network \u003d self._get_network(context, id)"},{"line_number":887,"context_line":"        return self._make_network_dict(network, fields)"},{"line_number":888,"context_line":""},{"line_number":889,"context_line":"    def get_networks(self, context, filters\u003dNone, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_3aa01290","line":886,"in_reply_to":"7ac7a964_601d9b73","updated":"2014-08-14 19:15:57.000000000","message":"That\u0027s correct. And extension driver rely on that to update the result.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"11c4695a9f8d422d0baf8eb8e8d151372a03f350","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"                    last_ip\u003dpool[\u0027end\u0027])"},{"line_number":1068,"context_line":"                context.session.add(ip_range)"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"        return self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    def _update_subnet_dns_nameservers(self, context, id, s):"},{"line_number":1073,"context_line":"        old_dns_list \u003d self._get_dns_by_subnet(context, id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_5aca51a2","line":1070,"updated":"2014-08-13 19:46:43.000000000","message":"It seems to me that True should be passed here so that all extended attributes are returned.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"                    last_ip\u003dpool[\u0027end\u0027])"},{"line_number":1068,"context_line":"                context.session.add(ip_range)"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"        return self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    def _update_subnet_dns_nameservers(self, context, id, s):"},{"line_number":1073,"context_line":"        old_dns_list \u003d self._get_dns_by_subnet(context, id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_1af8b67b","line":1070,"in_reply_to":"9ab29df4_5aca51a2","updated":"2014-08-14 19:15:57.000000000","message":"I remove the False.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ab422ea469adb7d62bac6675ee31508cf50f68ef","unresolved":false,"context_lines":[{"line_number":1067,"context_line":"                    last_ip\u003dpool[\u0027end\u0027])"},{"line_number":1068,"context_line":"                context.session.add(ip_range)"},{"line_number":1069,"context_line":""},{"line_number":1070,"context_line":"        return self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1071,"context_line":""},{"line_number":1072,"context_line":"    def _update_subnet_dns_nameservers(self, context, id, s):"},{"line_number":1073,"context_line":"        old_dns_list \u003d self._get_dns_by_subnet(context, id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_dcc3c536","line":1070,"in_reply_to":"9ab29df4_5aca51a2","updated":"2014-08-13 23:00:51.000000000","message":"With process_extensions\u003dFalse, try not to break any existing logic (not to break anything).\n\nFor the create_subnet, in Ml2Plugin the process_creat_subnet in extension manager is called and update the result so create_subnet_precommit/postcommit will have the extended attributes and they are not relying on this part.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"40e0131ff33c52d7853f5fa71d7cf943dd3035d5","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_82df49d6","line":1180,"range":{"start_line":1180,"start_character":48,"end_line":1180,"end_character":72},"updated":"2014-08-12 00:10:13.000000000","message":"why process_extensions\u003dFalse here?","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_204ba3b1","line":1180,"in_reply_to":"7ac7a964_855c8c27","updated":"2014-08-14 02:30:56.000000000","message":"I\u0027m getting more and more convinced that extensions should always be processed in all calls to _make_\u003cresource\u003e_dict(). I can\u0027t think of any good reason ever not to include extended attributes, unless as an optimization where the dict is being used for a specific purpose and it is known for sure that the dict will not be returned to a client (or passed to an ML2 mechanism driver).","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_7a036a0f","line":1180,"in_reply_to":"7ac7a964_855c8c27","updated":"2014-08-14 19:15:57.000000000","message":"That\u0027s correct, nobody register extend dict hook for subnet. Okay, I\u0027ll remove the False from here and _make_subnet_dict will be called with True.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_c5cda45f","line":1180,"in_reply_to":"7ac7a964_855c8c27","updated":"2014-08-14 19:15:57.000000000","message":"Will remove the False in the call.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"f0be5bd926943343b7f71c0efd61a295c8de1ae8","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_855c8c27","line":1180,"in_reply_to":"7ac7a964_ff45d3b3","updated":"2014-08-13 23:32:57.000000000","message":"there happens to be no users who register extend dict hook for\nsubnets until you added one in this commit.  so you can consider\nprocess_extensions here has always been True here. :-)\n\nwhat\u0027s unclear to me is why you think it\u0027s dangerous to add extra attributes to\nupdate_subnet while on the other hand you seem to be sure it\u0027s safe to do\nthe same to get_subnet.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ab422ea469adb7d62bac6675ee31508cf50f68ef","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_5f0c0795","line":1180,"in_reply_to":"9ab29df4_371db874","updated":"2014-08-13 23:00:51.000000000","message":"Please refer to my comment above.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"11c4695a9f8d422d0baf8eb8e8d151372a03f350","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_371db874","line":1180,"in_reply_to":"baada198_67592729","updated":"2014-08-13 19:46:43.000000000","message":"If True doesn\u0027t break anything, I\u0027d prefer using True.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ab422ea469adb7d62bac6675ee31508cf50f68ef","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_ff45d3b3","line":1180,"in_reply_to":"baada198_67592729","updated":"2014-08-13 23:00:51.000000000","message":"Yes, the update for subnet is not the same as port and network. And I don\u0027t know the reason behind this.\n\nThat\u0027s why I keep the logic as before. With that it avoids introducing anything new here. And I don\u0027t know the affect of modifying it to Ture in the unit test code.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"dc82b93d79511cec57d1bf20dee063854fd6d17f","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_fd68a6bd","line":1180,"in_reply_to":"baada198_82df49d6","updated":"2014-08-12 00:22:27.000000000","message":"I tried to keep the update_subnet as it was beofore by setting process_extensions to False.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"b4545cbe1e8ea59695bdf215a72bcdbf3e471fd9","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_dbe02e29","line":1180,"in_reply_to":"baada198_bd02ae6f","updated":"2014-08-12 15:31:36.000000000","message":"What I meant in my previous comment was that the behavior of call to _make_subnet_dict with this change remains the same as before (basically update_subnet behave the same and this change doesn\u0027t cause any issue). However in the get_subnet the intension was to make Mechanism Driver to add any extended attribute, if existed and supported by the mechanism driver, to the result.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"8c25e47304e6b2252c165925e30e62549889d98e","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_67592729","line":1180,"in_reply_to":"baada198_dbe02e29","updated":"2014-08-13 05:12:53.000000000","message":"it\u0027s rather surprising if update_subnet behaves differently from update_network and update_port in this regard.\n\nnot many code calls ml2\u0027s update_subnet, i suppose.\nis it too difficult to check them for potential issues?","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"41b2350d284d6cab83bc3a574acaaccfabd0aadb","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                                                                 id, s)"},{"line_number":1178,"context_line":"            subnet \u003d self._get_subnet(context, id)"},{"line_number":1179,"context_line":"            subnet.update(s)"},{"line_number":1180,"context_line":"        result \u003d self._make_subnet_dict(subnet, process_extensions\u003dFalse)"},{"line_number":1181,"context_line":"        # Keep up with fields that changed"},{"line_number":1182,"context_line":"        if changed_dns:"},{"line_number":1183,"context_line":"            result[\u0027dns_nameservers\u0027] \u003d new_dns"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_bd02ae6f","line":1180,"in_reply_to":"baada198_fd68a6bd","updated":"2014-08-12 00:38:52.000000000","message":"it seems inconsistent with network and port.\n\nwhy you want to keep update_subnet, while you are changing get_subnet etc?","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"            context.session.delete(subnet)"},{"line_number":1209,"context_line":""},{"line_number":1210,"context_line":"    def get_subnet(self, context, id, fields\u003dNone):"},{"line_number":1211,"context_line":"        subnet \u003d self._get_subnet(context, id)"},{"line_number":1212,"context_line":"        return self._make_subnet_dict(subnet, fields)"},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":"    def get_subnets(self, context, filters\u003dNone, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_f31c276d","line":1211,"updated":"2014-08-14 02:30:56.000000000","message":"Default of True here is correct.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":1208,"context_line":"            context.session.delete(subnet)"},{"line_number":1209,"context_line":""},{"line_number":1210,"context_line":"    def get_subnet(self, context, id, fields\u003dNone):"},{"line_number":1211,"context_line":"        subnet \u003d self._get_subnet(context, id)"},{"line_number":1212,"context_line":"        return self._make_subnet_dict(subnet, fields)"},{"line_number":1213,"context_line":""},{"line_number":1214,"context_line":"    def get_subnets(self, context, filters\u003dNone, fields\u003dNone,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_356823ba","line":1211,"in_reply_to":"7ac7a964_f31c276d","updated":"2014-08-14 19:15:57.000000000","message":"Correct.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"                        subnet_id\u003dsubnet_id,"},{"line_number":1298,"context_line":"                    )"},{"line_number":1299,"context_line":"                    context.session.add(allocated)"},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"        return self._make_port_dict(port, process_extensions\u003dFalse)"},{"line_number":1302,"context_line":""},{"line_number":1303,"context_line":"    def update_port(self, context, id, port):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_809f1703","line":1300,"updated":"2014-08-14 02:30:56.000000000","message":"Passing False here seems to be a bug. All extended attributes should be returned from create_port().","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"165f17b0015a6bbd49b15e9ea8c5cac55494a673","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"                        subnet_id\u003dsubnet_id,"},{"line_number":1298,"context_line":"                    )"},{"line_number":1299,"context_line":"                    context.session.add(allocated)"},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"        return self._make_port_dict(port, process_extensions\u003dFalse)"},{"line_number":1302,"context_line":""},{"line_number":1303,"context_line":"    def update_port(self, context, id, port):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_55c75f45","line":1300,"in_reply_to":"7ac7a964_809f1703","updated":"2014-08-14 19:15:57.000000000","message":"It was changed in fixing bug#1174111\n\nhttps://bugs.launchpad.net/neutron/+bug/1174111\n\nhttps://github.com/openstack/neutron/commit/6f01194e9c30afc2656cef9b15fea5ae688e93d7","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":1326,"context_line":""},{"line_number":1327,"context_line":"            # Check if the IPs need to be updated"},{"line_number":1328,"context_line":"            if \u0027fixed_ips\u0027 in p:"},{"line_number":1329,"context_line":"                changed_ips \u003d True"},{"line_number":1330,"context_line":"                original \u003d self._make_port_dict(port, process_extensions\u003dFalse)"},{"line_number":1331,"context_line":"                added_ips, prev_ips \u003d self._update_ips_for_port("},{"line_number":1332,"context_line":"                    context, port[\"network_id\"], id, original[\"fixed_ips\"],"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_a0bb3371","line":1329,"updated":"2014-08-14 02:30:56.000000000","message":"Here passing False seems to be valid optimization, since original is used for a specific local purpose and is not returned to a client.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":1341,"context_line":"            # Remove all attributes in p which are not in the port DB model"},{"line_number":1342,"context_line":"            # and then update the port"},{"line_number":1343,"context_line":"            port.update(self._filter_non_model_columns(p, models_v2.Port))"},{"line_number":1344,"context_line":""},{"line_number":1345,"context_line":"        result \u003d self._make_port_dict(port)"},{"line_number":1346,"context_line":"        # Keep up with fields that changed"},{"line_number":1347,"context_line":"        if changed_ips:"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_e0ac4b38","line":1344,"updated":"2014-08-14 02:30:56.000000000","message":"Here the default is True, which is correct.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":1376,"context_line":"        query.delete()"},{"line_number":1377,"context_line":""},{"line_number":1378,"context_line":"    def get_port(self, context, id, fields\u003dNone):"},{"line_number":1379,"context_line":"        port \u003d self._get_port(context, id)"},{"line_number":1380,"context_line":"        return self._make_port_dict(port, fields)"},{"line_number":1381,"context_line":""},{"line_number":1382,"context_line":"    def _get_ports_query(self, context, filters\u003dNone, sorts\u003dNone, limit\u003dNone,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_40633f1a","line":1379,"updated":"2014-08-14 02:30:56.000000000","message":"The default of True is correct here.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":1413,"context_line":"        query \u003d self._get_ports_query(context, filters\u003dfilters,"},{"line_number":1414,"context_line":"                                      sorts\u003dsorts, limit\u003dlimit,"},{"line_number":1415,"context_line":"                                      marker_obj\u003dmarker_obj,"},{"line_number":1416,"context_line":"                                      page_reverse\u003dpage_reverse)"},{"line_number":1417,"context_line":"        items \u003d [self._make_port_dict(c, fields) for c in query]"},{"line_number":1418,"context_line":"        if limit and page_reverse:"},{"line_number":1419,"context_line":"            items.reverse()"}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_a07253e3","line":1416,"updated":"2014-08-14 02:30:56.000000000","message":"Default of True is correct here.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"2c464f605780d9ad87ee395e5fb0faa0f029bcf5","unresolved":false,"context_lines":[{"line_number":837,"context_line":"                    \u0027status\u0027: n.get(\u0027status\u0027, constants.NET_STATUS_ACTIVE)}"},{"line_number":838,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":839,"context_line":"            context.session.add(network)"},{"line_number":840,"context_line":"        return self._make_network_dict(network, process_extensions\u003dFalse)"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"    def update_network(self, context, id, network):"},{"line_number":843,"context_line":"        n \u003d network[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_99ba12e0","line":840,"updated":"2014-08-22 17:40:37.000000000","message":"The extended attribute values must be included in the result from create_network. I don\u0027t see how this can work as is. \n\nIt seems this \"process_extensions\u003dFalse\" either needs to be removed here, or you need to switch to calling dict extend functions directly from the plugin rather than registering them. I\u0027d strongly prefer the former, but we need to find out why Salvatore included this in https://review.openstack.org/#/c/39093/3/neutron/db/db_base_plugin_v2.py before removing it.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"aca3601fb32f2da0d632149b98b69444d8c1532c","unresolved":false,"context_lines":[{"line_number":837,"context_line":"                    \u0027status\u0027: n.get(\u0027status\u0027, constants.NET_STATUS_ACTIVE)}"},{"line_number":838,"context_line":"            network \u003d models_v2.Network(**args)"},{"line_number":839,"context_line":"            context.session.add(network)"},{"line_number":840,"context_line":"        return self._make_network_dict(network, process_extensions\u003dFalse)"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"    def update_network(self, context, id, network):"},{"line_number":843,"context_line":"        n \u003d network[\u0027network\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_12db867c","line":840,"in_reply_to":"1abeadc6_99ba12e0","updated":"2014-08-22 17:46:52.000000000","message":"Please ignore this comment. It was a draft from a while back that I didn\u0027t intend to send. I now see that how the extended attributes are added to the dictionaries on create.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"2c464f605780d9ad87ee395e5fb0faa0f029bcf5","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"                    )"},{"line_number":1297,"context_line":"                    context.session.add(allocated)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"        return self._make_port_dict(port, process_extensions\u003dFalse)"},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"    def update_port(self, context, id, port):"},{"line_number":1302,"context_line":"        p \u003d port[\u0027port\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_59207af7","line":1299,"updated":"2014-08-22 17:40:37.000000000","message":"Same here with create_port. We need to find out why Savlatore included \"process_extensions\u003dFalse\" here in https://review.openstack.org/#/c/27660/5/quantum/db/db_base_plugin_v2.py. Hopefully it can be removed.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"aca3601fb32f2da0d632149b98b69444d8c1532c","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"                    )"},{"line_number":1297,"context_line":"                    context.session.add(allocated)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"        return self._make_port_dict(port, process_extensions\u003dFalse)"},{"line_number":1300,"context_line":""},{"line_number":1301,"context_line":"    def update_port(self, context, id, port):"},{"line_number":1302,"context_line":"        p \u003d port[\u0027port\u0027]"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_72d3da5f","line":1299,"in_reply_to":"1abeadc6_59207af7","updated":"2014-08-22 17:46:52.000000000","message":"Please ignore this comment. It was a draft from a while back that I didn\u0027t intend to send.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"}],"neutron/plugins/ml2/config.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e136ab15d0a1819ef8ae7671c114a9ab489cde66","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                default\u003d[],"},{"line_number":35,"context_line":"                help\u003d_(\"An ordered list of extension driver \""},{"line_number":36,"context_line":"                       \"entrypoints to be loaded from the \""},{"line_number":37,"context_line":"                       \"neutron.ml2.extension_drivers namespace.\")),"},{"line_number":38,"context_line":"]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_c3165da7","line":37,"updated":"2014-08-25 22:48:40.000000000","message":"Following up on Bob\u0027s comments - I think that here one could specify a list of supported ML2 extensions aliases. This will tell the ML2 plugin which extensions drivers load an which not.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"a81e7d0bc91b82c2ebb613b6b9c96d941c2c5429","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                default\u003d[],"},{"line_number":35,"context_line":"                help\u003d_(\"An ordered list of extension driver \""},{"line_number":36,"context_line":"                       \"entrypoints to be loaded from the \""},{"line_number":37,"context_line":"                       \"neutron.ml2.extension_drivers namespace.\")),"},{"line_number":38,"context_line":"]"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_b4bb5574","line":37,"in_reply_to":"1abeadc6_c3165da7","updated":"2014-08-26 01:48:37.000000000","message":"Drivers in ML2 are python entry points. They are loaded explicitly. I see no reason we should start scanning directories looking for extension drivers, if that\u0027s what you mean, loading them all, and then trying to figure out which ones are actually needed.  I really don\u0027t understand what you think is wrong with loading extension_drivers in exactly the same way that we already load mechanism drivers and type drivers. Anything else just makes it harder for operators to understand.\n\nIf we want to reduce (eliminate in some but not all cases) the requirement for operators to explicitly configure which extension drivers to load, we could add a required_extension_drivers property to MechanismDriver, and merge all of these with the extension_drivers list from config. \n\nAlternatively, we could include a required_extension_aliases property on MechanismDriver that lists aliases it requires, and sanity-check at startup that the loaded extension drivers provide all the extension aliases required by all the mechanism drivers.\n\nWould either of the two suggestions above address your concerns, without needed to drastically change the model of how ML2 drivers are loaded?","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"}],"neutron/plugins/ml2/driver_api.py":[{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"f8be52609b0ff478db8399c633b14fdb941066e1","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        pass"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @abc.abstractproperty"},{"line_number":162,"context_line":"    def prime(self):"},{"line_number":163,"context_line":"        \"\"\"Return network data."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        Return the network data, that for the first time create_nework is"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2FUY8%3D","line":162,"updated":"2014-04-22 14:51:48.000000000","message":"I don\u0027t think we should use a new network descriptor. You should use \"current\". As described in the \"current\" method, this method should return the state of the network and ALL extensions.\nNot having the extension\u0027s informations in the dict returned by the method current is the root bug here.","commit_id":"b76237cd9cd14e8aa8b5393023eee73c44b0bd27"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"57142af3fd0e31cf93173be476a92fdcb1bfbc1d","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        pass"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    @abc.abstractproperty"},{"line_number":162,"context_line":"    def prime(self):"},{"line_number":163,"context_line":"        \"\"\"Return network data."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        Return the network data, that for the first time create_nework is"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2FTdU%3D","line":162,"in_reply_to":"AAAAXH%2F%2FUY8%3D","updated":"2014-04-22 16:41:18.000000000","message":"Referring to my reply in plugin.py to your comment, this won\u0027t be necessary. I also believe the \u0027original\u0027 should have all the information of a resource (network, port and subnet) but with current implementation, it doesn\u0027t. \nI brought this issue up and discussed the problem in the mailing list. The log is in here:\nhttp://lists.openstack.org/pipermail/openstack-dev/2014-April/031694.html\n\nAgain, based on my comment on plugin.py, the best solution is to revert the changes committed by Bug1201957 and pass the original resource parameter to _make_xxx_dict().","commit_id":"b76237cd9cd14e8aa8b5393023eee73c44b0bd27"},{"author":{"_account_id":9093,"name":"Chuck Carlino","email":"chuckjcarlino@gmail.com","username":"ChuckC"},"change_message_id":"0b6c6739ac91adeec353ffb38cde472a75fb56c3","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    def prime(self):"},{"line_number":163,"context_line":"        \"\"\"Return network data."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        Return the network data, that for the first time create_nework is"},{"line_number":166,"context_line":"        called."},{"line_number":167,"context_line":"        This data includes original network attributes, as well as the"},{"line_number":168,"context_line":"        extensions, if they exist."}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_fe9dd667","line":165,"updated":"2014-05-20 22:27:53.000000000","message":"I\u0027m having a bit of trouble parsing this description.  Does it mean \"Return the network data that was originally passed in the create_network call\"?\n\nSame question for subnet and port.","commit_id":"b7bac9ec42684dc62287c7481fd1fd8754716a7a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"a78d1c5044a4dc3cc464be2204e90b91ed4a6208","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    def prime(self):"},{"line_number":163,"context_line":"        \"\"\"Return network data."},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        Return the network data, that for the first time create_nework is"},{"line_number":166,"context_line":"        called."},{"line_number":167,"context_line":"        This data includes original network attributes, as well as the"},{"line_number":168,"context_line":"        extensions, if they exist."}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_6f94abe8","line":165,"in_reply_to":"7adec928_fe9dd667","updated":"2014-05-21 05:14:36.000000000","message":"That is correct. I will update the description.","commit_id":"b7bac9ec42684dc62287c7481fd1fd8754716a7a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":652,"context_line":""},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":655,"context_line":"class ExtensionDriver(object):"},{"line_number":656,"context_line":"    \"\"\"Define stable abstract interface for ML2 extension drivers."},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    An extension driver extends the core resources implemented by the"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_d394a78d","line":655,"updated":"2014-08-04 18:11:57.000000000","message":"Not sure what thoughts you put into implications related to policy checking, and how that would work. Could you elaborate?","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":652,"context_line":""},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":655,"context_line":"class ExtensionDriver(object):"},{"line_number":656,"context_line":"    \"\"\"Define stable abstract interface for ML2 extension drivers."},{"line_number":657,"context_line":""},{"line_number":658,"context_line":"    An extension driver extends the core resources implemented by the"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_ca6accb4","line":655,"in_reply_to":"baada198_d394a78d","updated":"2014-08-07 01:09:36.000000000","message":"If you are referring to API policy, basically policy enforcement for extended attribute should be handled by normal mechanism and nothing new needs to be done in here.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":667,"context_line":"    are available. Extensions that serve to introduce new general"},{"line_number":668,"context_line":"    features, if proven useful, should be incorporated into the next"},{"line_number":669,"context_line":"    new core API version. Vendor-specific or technology-specific"},{"line_number":670,"context_line":"    extensions that aren\u0027t of general use are discouraged, but can be"},{"line_number":671,"context_line":"    supported via ML2 extension drivers, avoiding the need to"},{"line_number":672,"context_line":"    implement a monolithic plugin when an API extension is required."},{"line_number":673,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_c636aa01","line":670,"updated":"2014-08-04 18:11:57.000000000","message":"Discouraged how? I find hard to interpret this note section. Maybe we\u0027d need to constraint the model in a way that the developer does not run the danger of screwing things up. I appreciate that flexibility is important but at the same time we\u0027d want to make sure that the approach is not misused. Having said that, I am not sure we can really do anything about this, so this \u0027disclaimer\u0027 is almost redundant.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":667,"context_line":"    are available. Extensions that serve to introduce new general"},{"line_number":668,"context_line":"    features, if proven useful, should be incorporated into the next"},{"line_number":669,"context_line":"    new core API version. Vendor-specific or technology-specific"},{"line_number":670,"context_line":"    extensions that aren\u0027t of general use are discouraged, but can be"},{"line_number":671,"context_line":"    supported via ML2 extension drivers, avoiding the need to"},{"line_number":672,"context_line":"    implement a monolithic plugin when an API extension is required."},{"line_number":673,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_8a97f49b","line":670,"in_reply_to":"baada198_c636aa01","updated":"2014-08-07 01:09:36.000000000","message":"Redundant note, will be removed.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        \"\"\""},{"line_number":776,"context_line":"        pass"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def extend_network_dict(self, session, result):"},{"line_number":779,"context_line":"        \"\"\"Add extended attributes to network dictionary."},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_135d3f16","line":778,"updated":"2014-08-04 18:11:57.000000000","message":"how is the extension of attributes going to work? It looks like there\u0027s the danger of causing clashes between overlapping extension attributes. Would it be better if we introduced an extension driver namespace where the extension attributes are introduced? That said, I loathe the idea as this will make core resources bloat very quickly :)","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        \"\"\""},{"line_number":776,"context_line":"        pass"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def extend_network_dict(self, session, result):"},{"line_number":779,"context_line":"        \"\"\"Add extended attributes to network dictionary."},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_6a6e202e","line":778,"in_reply_to":"baada198_135d3f16","updated":"2014-08-07 01:09:36.000000000","message":"If you mean more than one extension use same attribute name, as you pointed out namespace can be used to prevent that.\n\nAs matter of fact, currently this is being used for extended attribute \u003cnamespace\u003e:\u003cattributename\u003e.\n\nSo the namespace should be used when defining an new extended attribute and there is no additional mechanism needed to enable that.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"c10faa8ed7a3bd49a8d5098cf79df1c081e0843c","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        \"\"\""},{"line_number":776,"context_line":"        pass"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def extend_network_dict(self, session, result):"},{"line_number":779,"context_line":"        \"\"\"Add extended attributes to network dictionary."},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_1774c799","line":778,"in_reply_to":"baada198_4cba540c","updated":"2014-08-07 19:23:49.000000000","message":"That\u0027s correct.\nDo you want me to add comment on how an attribute should be defined as a guidline?","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"35655f5229db799f8c280ab928ea85778b969423","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        \"\"\""},{"line_number":776,"context_line":"        pass"},{"line_number":777,"context_line":""},{"line_number":778,"context_line":"    def extend_network_dict(self, session, result):"},{"line_number":779,"context_line":"        \"\"\"Add extended attributes to network dictionary."},{"line_number":780,"context_line":""},{"line_number":781,"context_line":"        :param session: database session"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_4cba540c","line":778,"in_reply_to":"baada198_6a6e202e","updated":"2014-08-07 01:59:16.000000000","message":"correct, but this is not prescribed by the framework you propose. It\u0027s my understanding that this is left to the developer, correct?","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10781,"name":"selvakumar","email":"selvakumar.s2@hpe.com","username":"selvakumar"},"change_message_id":"e4f81a89ab5b181cdc45b4408c656cc326a31315","unresolved":false,"context_lines":[{"line_number":798,"context_line":"        extended attributes defined by this driver to a subnet"},{"line_number":799,"context_line":"        dictionary to be used for mechanism driver calls and/or"},{"line_number":800,"context_line":"        returned as the result of a subnet operation."},{"line_number":801,"context_line":"        \"\"\""},{"line_number":802,"context_line":"        pass"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    def extend_port_dict(self, session, result):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_a98242fd","line":801,"updated":"2014-08-05 15:21:18.000000000","message":"Apart from basic resources like Network , Subnet and Port \nhow this driver api handle for other resources ? In case if we want to handle extended resource other than Layer 2 resources?","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":798,"context_line":"        extended attributes defined by this driver to a subnet"},{"line_number":799,"context_line":"        dictionary to be used for mechanism driver calls and/or"},{"line_number":800,"context_line":"        returned as the result of a subnet operation."},{"line_number":801,"context_line":"        \"\"\""},{"line_number":802,"context_line":"        pass"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    def extend_port_dict(self, session, result):"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_ca372cfd","line":801,"in_reply_to":"baada198_a98242fd","updated":"2014-08-07 01:09:36.000000000","message":"These are the core resources that Ml2Plugin implements and other resources that are not implemented by Ml2Plugin the extendability of resources not supported by Ml2Pluign.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"24715c638499c5c4997f9752e85eed95d002627d","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        Called inside transaction context on session to add any"},{"line_number":776,"context_line":"        extended attributes defined by this driver to a network"},{"line_number":777,"context_line":"        dictionary to be used for mechanism driver calls and/or"},{"line_number":778,"context_line":"        returned as the result of a network operation."},{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":"        pass"},{"line_number":781,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_4ceef122","line":778,"updated":"2014-08-13 15:52:58.000000000","message":"I\u0027m not sure why you\u0027ll need to call all these method from within a transaction.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ab422ea469adb7d62bac6675ee31508cf50f68ef","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        Called inside transaction context on session to add any"},{"line_number":776,"context_line":"        extended attributes defined by this driver to a network"},{"line_number":777,"context_line":"        dictionary to be used for mechanism driver calls and/or"},{"line_number":778,"context_line":"        returned as the result of a network operation."},{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":"        pass"},{"line_number":781,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_3fccab35","line":778,"in_reply_to":"9ab29df4_9a6789ea","updated":"2014-08-13 23:00:51.000000000","message":"These method will be called inside the transaction the sample code is in here:\n\n    def _ml2_md_extend_network_dict(self, result, netdb):\n        session \u003d db_api.get_session()\n        with session.begin(subtransactions\u003dTrue):\n            self.extension_manager.extend_network_dict(session, result)\n\n\nDoes it need to be updated?","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"504a8e9d91b09586a0475fff65f73623a4645fca","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        Called inside transaction context on session to add any"},{"line_number":776,"context_line":"        extended attributes defined by this driver to a network"},{"line_number":777,"context_line":"        dictionary to be used for mechanism driver calls and/or"},{"line_number":778,"context_line":"        returned as the result of a network operation."},{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":"        pass"},{"line_number":781,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"7ac7a964_e0228b00","line":778,"in_reply_to":"9ab29df4_faa9657c","updated":"2014-08-14 02:30:56.000000000","message":"Looking at the calls to _make_\u003cresource\u003e_dict() in neutron/db/db_base_plugin_v2.py and neutron/plugins/ml2/plugin.py, it seems  these are sometimes called inside a transaction and sometimes outside. If _ml2_md_extend_\u003cresource\u003e_dict() always starts a (sub)transaction, then the current docstring is accurate. I think this is fine, but an alternative would be not start a (sub)transaction in _ml2_md_extend_\u003cresource\u003e_dict(), not pass session to extend_\u003cresource\u003e_dict(), and change the docstring to say it may or may not be called inside a transaction. I think the current approach is preferable.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"26548541d0fd4b9c906442ba1b10160d5c59845b","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        Called inside transaction context on session to add any"},{"line_number":776,"context_line":"        extended attributes defined by this driver to a network"},{"line_number":777,"context_line":"        dictionary to be used for mechanism driver calls and/or"},{"line_number":778,"context_line":"        returned as the result of a network operation."},{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":"        pass"},{"line_number":781,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_faa9657c","line":778,"in_reply_to":"baada198_4ceef122","updated":"2014-08-13 19:48:31.000000000","message":"The extend attribute needs to be saved in the DB for later use and references. So they need to be inside transaction when accessing the DB to get the result.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"11c4695a9f8d422d0baf8eb8e8d151372a03f350","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        Called inside transaction context on session to add any"},{"line_number":776,"context_line":"        extended attributes defined by this driver to a network"},{"line_number":777,"context_line":"        dictionary to be used for mechanism driver calls and/or"},{"line_number":778,"context_line":"        returned as the result of a network operation."},{"line_number":779,"context_line":"        \"\"\""},{"line_number":780,"context_line":"        pass"},{"line_number":781,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_9a6789ea","line":778,"in_reply_to":"baada198_4ceef122","updated":"2014-08-13 19:46:43.000000000","message":"This should document whether or not a transaction is open at the point when the driver method gets called. This may be left over from when the ExtensionManager was called directly from the plugin code, within the transaction. Please check whether these methods are currently called from within a transaction, and document the method accordingly.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"}],"neutron/plugins/ml2/managers.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"6cb532553eda316c7fea59dfd5fb47cd659b20ab","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            LOG.info(_(\"Extended network dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":579,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_636d2999","line":581,"range":{"start_line":581,"start_character":8,"end_line":581,"end_character":26},"updated":"2014-08-01 04:41:23.000000000","message":"where is this used?","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ecf563a21409d9bf4054a53b13f070c46f3b7751","unresolved":false,"context_lines":[{"line_number":578,"context_line":"            LOG.info(_(\"Extended network dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":579,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_ddaa9483","line":581,"in_reply_to":"baada198_636d2999","updated":"2014-08-07 01:10:22.000000000","message":"I\u0027ll add in the Ml2Plugin to register these extend_*_dict using registration provided by by db_base_plugin_v2.","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"6cb532553eda316c7fea59dfd5fb47cd659b20ab","unresolved":false,"context_lines":[{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_a34ca140","line":584,"range":{"start_line":584,"start_character":23,"end_line":584,"end_character":42},"updated":"2014-08-01 04:41:23.000000000","message":"extend_subnet_dict?","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ecf563a21409d9bf4054a53b13f070c46f3b7751","unresolved":false,"context_lines":[{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_d3e8fc7d","line":584,"in_reply_to":"baada198_a34ca140","updated":"2014-08-07 01:10:22.000000000","message":"Done","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"6cb532553eda316c7fea59dfd5fb47cd659b20ab","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_8366bdba","line":588,"range":{"start_line":588,"start_character":8,"end_line":588,"end_character":24},"updated":"2014-08-01 04:41:23.000000000","message":"where is this used?","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ecf563a21409d9bf4054a53b13f070c46f3b7751","unresolved":false,"context_lines":[{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_7d84280e","line":588,"in_reply_to":"baada198_8366bdba","updated":"2014-08-07 01:10:22.000000000","message":"Same as line #581","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"6cb532553eda316c7fea59dfd5fb47cd659b20ab","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":592,"context_line":"            LOG.info(_(\"Extended port dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":593,"context_line":"                     {\u0027drv\u0027: driver.name})"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_43702573","line":591,"range":{"start_line":591,"start_character":23,"end_line":591,"end_character":42},"updated":"2014-08-01 04:41:23.000000000","message":"extend_port_dict?","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ecf563a21409d9bf4054a53b13f070c46f3b7751","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":592,"context_line":"            LOG.info(_(\"Extended port dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":593,"context_line":"                     {\u0027drv\u0027: driver.name})"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_b3e3889f","line":591,"in_reply_to":"baada198_43702573","updated":"2014-08-07 01:10:22.000000000","message":"Done","commit_id":"265c3618183fd5dc4cfcadb49f0a8d71d0bce017"},{"author":{"_account_id":10781,"name":"selvakumar","email":"selvakumar.s2@hpe.com","username":"selvakumar"},"change_message_id":"c3bea82cc746862f63c6060552050ee947ad54aa","unresolved":false,"context_lines":[{"line_number":489,"context_line":""},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"class ExtensionManager(stevedore.named.NamedExtensionManager):"},{"line_number":492,"context_line":"    \"\"\"Manage etension drivers using drivers.\"\"\""},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def __init__(self):"},{"line_number":495,"context_line":"        # Registered extension drivers, keyed by name."}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9b93165b","line":492,"updated":"2014-08-05 05:55:07.000000000","message":"typo .? etension -\u003eextension","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":489,"context_line":""},{"line_number":490,"context_line":""},{"line_number":491,"context_line":"class ExtensionManager(stevedore.named.NamedExtensionManager):"},{"line_number":492,"context_line":"    \"\"\"Manage etension drivers using drivers.\"\"\""},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"    def __init__(self):"},{"line_number":495,"context_line":"        # Registered extension drivers, keyed by name."}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_d3cabc9f","line":492,"in_reply_to":"baada198_9b93165b","updated":"2014-08-07 01:09:36.000000000","message":"Done","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":528,"context_line":"    def add_aliases(self, aliases):"},{"line_number":529,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":530,"context_line":"            exts \u003d driver.obj.extension_alias"},{"line_number":531,"context_line":"            LOG.info(_(\"Got %(ext)s extesnion from driver \u0027%(drv)s\u0027\"),"},{"line_number":532,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":533,"context_line":"            aliases +\u003d exts"},{"line_number":534,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_e1db984b","line":531,"updated":"2014-08-04 18:11:57.000000000","message":"typo","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":528,"context_line":"    def add_aliases(self, aliases):"},{"line_number":529,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":530,"context_line":"            exts \u003d driver.obj.extension_alias"},{"line_number":531,"context_line":"            LOG.info(_(\"Got %(ext)s extesnion from driver \u0027%(drv)s\u0027\"),"},{"line_number":532,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":533,"context_line":"            aliases +\u003d exts"},{"line_number":534,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_b3c54892","line":531,"in_reply_to":"baada198_e1db984b","updated":"2014-08-07 01:09:36.000000000","message":"Done","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":572,"context_line":"        self._call_on_ext_drivers(\"process_update_port\", session, data, result)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"    def extend_network_dict(self, session, result):"},{"line_number":575,"context_line":"        \"\"\"Notify all extension drivers to extent network dictionary.\"\"\""},{"line_number":576,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":577,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":578,"context_line":"            LOG.info(_(\"Extended network dict for driver \u0027%(drv)s\u0027\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_a1be0062","line":575,"updated":"2014-08-04 18:11:57.000000000","message":"typo","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":572,"context_line":"        self._call_on_ext_drivers(\"process_update_port\", session, data, result)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"    def extend_network_dict(self, session, result):"},{"line_number":575,"context_line":"        \"\"\"Notify all extension drivers to extent network dictionary.\"\"\""},{"line_number":576,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":577,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":578,"context_line":"            LOG.info(_(\"Extended network dict for driver \u0027%(drv)s\u0027\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_9305a4c3","line":575,"in_reply_to":"baada198_a1be0062","updated":"2014-08-07 01:09:36.000000000","message":"Done","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":579,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_01afac2b","line":582,"updated":"2014-08-04 18:11:57.000000000","message":"typo","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":579,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":580,"context_line":""},{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_5364ecb2","line":582,"in_reply_to":"baada198_01afac2b","updated":"2014-08-07 01:09:36.000000000","message":"Done","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_8162dc13","line":584,"updated":"2014-08-04 18:11:57.000000000","message":"network?","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":581,"context_line":"    def extend_subnet_dict(self, session, result):"},{"line_number":582,"context_line":"        \"\"\"Notify all extension drivers to extent subnet dictionary.\"\"\""},{"line_number":583,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":584,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":585,"context_line":"            LOG.info(_(\"Extended subnet dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_73273067","line":584,"in_reply_to":"baada198_8162dc13","updated":"2014-08-07 01:09:36.000000000","message":"Done","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":592,"context_line":"            LOG.info(_(\"Extended port dict for driver \u0027%(drv)s\u0027\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_21aaf019","line":589,"updated":"2014-08-04 18:11:57.000000000","message":"typo","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":586,"context_line":"                     {\u0027drv\u0027: driver.name})"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":592,"context_line":"            LOG.info(_(\"Extended port dict for driver \u0027%(drv)s\u0027\"),"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_b3d8e853","line":589,"in_reply_to":"baada198_21aaf019","updated":"2014-08-07 01:09:36.000000000","message":"Done","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":592,"context_line":"            LOG.info(_(\"Extended port dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":593,"context_line":"                     {\u0027drv\u0027: driver.name})"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_a165201e","line":591,"updated":"2014-08-04 18:11:57.000000000","message":"network?","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def extend_port_dict(self, session, result):"},{"line_number":589,"context_line":"        \"\"\"Notify all extension drivers to extent port dictionary.\"\"\""},{"line_number":590,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":591,"context_line":"            driver.obj.extend_network_dict(session, result)"},{"line_number":592,"context_line":"            LOG.info(_(\"Extended port dict for driver \u0027%(drv)s\u0027\"),"},{"line_number":593,"context_line":"                     {\u0027drv\u0027: driver.name})"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_f3e180fe","line":591,"in_reply_to":"baada198_a165201e","updated":"2014-08-07 01:09:36.000000000","message":"Done","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"9aa5b6b299b8e0494e9951b37183040f8e0bf92b","unresolved":false,"context_lines":[{"line_number":541,"context_line":"                LOG.exception("},{"line_number":542,"context_line":"                    _(\"Extension driver \u0027%(name)s\u0027 failed in %(method)s\"),"},{"line_number":543,"context_line":"                    {\u0027name\u0027: driver.name, \u0027method\u0027: method_name}"},{"line_number":544,"context_line":"                )"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def process_create_network(self, session, data, result):"},{"line_number":547,"context_line":"        \"\"\"Notify all extension drivers during network creation.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_956d256a","line":544,"updated":"2014-08-08 03:57:15.000000000","message":"why not fail on exceptions?","commit_id":"4109c0ddd14a12bd3cd535483b99c3618cba8fee"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"887ec1065cb1fe5ad3e6d6480042cd25863ad900","unresolved":false,"context_lines":[{"line_number":541,"context_line":"                LOG.exception("},{"line_number":542,"context_line":"                    _(\"Extension driver \u0027%(name)s\u0027 failed in %(method)s\"),"},{"line_number":543,"context_line":"                    {\u0027name\u0027: driver.name, \u0027method\u0027: method_name}"},{"line_number":544,"context_line":"                )"},{"line_number":545,"context_line":""},{"line_number":546,"context_line":"    def process_create_network(self, session, data, result):"},{"line_number":547,"context_line":"        \"\"\"Notify all extension drivers during network creation.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_3891b053","line":544,"in_reply_to":"baada198_956d256a","updated":"2014-08-08 05:15:49.000000000","message":"I should continue on calling other extension driver.","commit_id":"4109c0ddd14a12bd3cd535483b99c3618cba8fee"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"24715c638499c5c4997f9752e85eed95d002627d","unresolved":false,"context_lines":[{"line_number":514,"context_line":"        constructor."},{"line_number":515,"context_line":"        \"\"\""},{"line_number":516,"context_line":"        for ext in self:"},{"line_number":517,"context_line":"            self.extension_drivers[ext.name] \u003d ext"},{"line_number":518,"context_line":"            self.ordered_ext_drivers.append(ext)"},{"line_number":519,"context_line":"        LOG.info(_(\"Registered extension drivers: %s\"),"},{"line_number":520,"context_line":"                 [driver.name for driver in self.ordered_ext_drivers])"}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_0cb159e3","line":517,"updated":"2014-08-13 15:52:58.000000000","message":"Is this dict used anywhere else?\nIf not, perhaps you don\u0027t need it then","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"26548541d0fd4b9c906442ba1b10160d5c59845b","unresolved":false,"context_lines":[{"line_number":514,"context_line":"        constructor."},{"line_number":515,"context_line":"        \"\"\""},{"line_number":516,"context_line":"        for ext in self:"},{"line_number":517,"context_line":"            self.extension_drivers[ext.name] \u003d ext"},{"line_number":518,"context_line":"            self.ordered_ext_drivers.append(ext)"},{"line_number":519,"context_line":"        LOG.info(_(\"Registered extension drivers: %s\"),"},{"line_number":520,"context_line":"                 [driver.name for driver in self.ordered_ext_drivers])"}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_5ae7b1e4","line":517,"in_reply_to":"baada198_0cb159e3","updated":"2014-08-13 19:48:31.000000000","message":"I can remove this.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"24715c638499c5c4997f9752e85eed95d002627d","unresolved":false,"context_lines":[{"line_number":530,"context_line":"            exts \u003d driver.obj.extension_alias"},{"line_number":531,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":532,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":533,"context_line":"            aliases +\u003d exts"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"},{"line_number":536,"context_line":"        \"\"\"Helper method for calling a method across all extension drivers.\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"baada198_ecbb45bc","line":533,"updated":"2014-08-13 15:52:58.000000000","message":"please return aliases rather then leveraging parameters passed by ref.\nsounds safer to me.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"26548541d0fd4b9c906442ba1b10160d5c59845b","unresolved":false,"context_lines":[{"line_number":530,"context_line":"            exts \u003d driver.obj.extension_alias"},{"line_number":531,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":532,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":533,"context_line":"            aliases +\u003d exts"},{"line_number":534,"context_line":""},{"line_number":535,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"},{"line_number":536,"context_line":"        \"\"\"Helper method for calling a method across all extension drivers.\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"9ab29df4_7a039573","line":533,"in_reply_to":"baada198_ecbb45bc","updated":"2014-08-13 19:48:31.000000000","message":"I\u0027ll modify it to return the extension names.","commit_id":"1f4300d086c7960e85b2b227cf58fcaa7655210a"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"2c464f605780d9ad87ee395e5fb0faa0f029bcf5","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            LOG.info(_(\"Initializing extension driver \u0027%s\u0027\"), driver.name)"},{"line_number":523,"context_line":"            driver.obj.initialize()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def add_aliases(self):"},{"line_number":526,"context_line":"        exts \u003d []"},{"line_number":527,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":528,"context_line":"            exts +\u003d driver.obj.extension_alias"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_59931afa","line":525,"updated":"2014-08-22 17:40:37.000000000","message":"If this is returning the list of aliases rather than adding them to an existing list, the name \"add_aliases\" does not make sense. How about \"extension_aliases\"?","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"361afebf6040e6d65b22cc065858875281736a79","unresolved":false,"context_lines":[{"line_number":522,"context_line":"            LOG.info(_(\"Initializing extension driver \u0027%s\u0027\"), driver.name)"},{"line_number":523,"context_line":"            driver.obj.initialize()"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def add_aliases(self):"},{"line_number":526,"context_line":"        exts \u003d []"},{"line_number":527,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":528,"context_line":"            exts +\u003d driver.obj.extension_alias"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_f2fb6abe","line":525,"in_reply_to":"1abeadc6_59931afa","updated":"2014-08-22 17:56:20.000000000","message":"Good point. Will rename it.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"db33f18107bae3a58ff844c85dda2c865d3cc6d5","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":528,"context_line":"            exts +\u003d driver.obj.extension_alias"},{"line_number":529,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":530,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":531,"context_line":"        return exts"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_7372934a","line":530,"updated":"2014-08-19 13:27:38.000000000","message":"I\u0027ve realized that this mechanism is adding \"supported extensions\" without those being actual neutron extensions.\n\nIndeed if you query /extensions these do not appear (I\u0027m talking about the DFA extension, which is the only consumer of this framework so far). \n\nIndeed these attributes should not be returned in responses at all because the API should not recognize them. However, I apparently introduced a bug - and I\u0027m realizing that only now, which does not filter out \"unknown\" attributes in responses.\n\nSummarizing it is not ok to add extensions which are not part of those loaded by neutron, I think - mostly because you need users to know that there are such extensions enabled.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"89946b59c5e56b0878e53c99638c4dd18bbf7ee5","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":528,"context_line":"            exts +\u003d driver.obj.extension_alias"},{"line_number":529,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":530,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":531,"context_line":"        return exts"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_f597d445","line":530,"in_reply_to":"1abeadc6_54426aae","updated":"2014-08-22 18:58:07.000000000","message":"I\u0027m a bit confused by these comments. It seems to me that if ML2 is the core plugin and an extension driver is configured, that driver\u0027s extension alias should appear in neutron\u0027s /extensions query results, and that extension\u0027s core resource attribute values should all appear in the results from all operations on core resources. If the extension driver is not configured, then neither of these should occur. Is any of this not happening as I described with the current code? Is anyone disagreeing that this is how it should work?","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ef74d36c491b5e16cbc18f65b5e0e73dc1ddc8e6","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":528,"context_line":"            exts +\u003d driver.obj.extension_alias"},{"line_number":529,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":530,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":531,"context_line":"        return exts"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_54426aae","line":530,"in_reply_to":"1abeadc6_7372934a","updated":"2014-08-22 00:24:20.000000000","message":"* The extension driver defines the aliases and also give set the path to the extensions. \n\nFor example in the DFA case that you mentioned it look like this:\n\n _supported_extension_aliases \u003d [\"dfa\"]\t\n\ndef initialize(self):\t\n\t api_extensions.append_api_extensions_path(extensions.__path__)\n\n\nIn DFA case since it was a vendor specific extension I placed it under dfa/extensions not under neutron/extensions. If the guideline is that all the extensions have to be placed under neutron/extensions regardless of being vendor-specific or not, I would put the extension there.\n\n\n* Can you please elaborate on ...attribute should not returned in response.... ? \nDon\u0027t you think a mechanism driver may require to see the extended attribute in the response?","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"342b55725ff859e5e2ce058eaaf6e6ffde7eb7a1","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":528,"context_line":"            exts +\u003d driver.obj.extension_alias"},{"line_number":529,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":530,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":531,"context_line":"        return exts"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_a3a1a6f9","line":530,"in_reply_to":"1abeadc6_f597d445","updated":"2014-08-22 21:10:11.000000000","message":"That is all happening with the current code.\n\nThe add_aliases method in the extension drivers (its new name is extension_alias) add the alias to the Ml2Plugin and are loaded based on current extension API framework and the extension\u0027s core attribute values appears in the result.\n(I\u0027m using it on my setup and see all the results) \nAnd here is here is the \u0027neutron ext-list and ext-show\u0027\n\n(neutron) ext-list\n\n+--------------------------+-----------------------------------------------+\n\n| alias                    | name                                          |\n\n+--------------------------+-----------------------------------------------+\n\n| security-group           | security-group                                |\n\n| l3_agent_scheduler       | L3 Agent Scheduler                            |\n\n| extra_dhcp_opt           | Neutron Extra DHCP opts                       |\n\n| ext-gw-mode              | Neutron L3 Configurable external gateway mode |\n\n| binding                  | Port Binding                                  |\n\n| provider                 | Provider Network                              |\n\n| agent                    | agent                                         |\n\n| quotas                   | Quota management support                      |\n\n| dhcp_agent_scheduler     | DHCP Agent Scheduler                          |\n\n| multi-provider           | Multi Provider Network                        |\n\n| cisco_dfa_config_profile | Cisco DFA Config Profiles                     |\n\n| external-net             | Neutron external network                      |\n\n| router                   | Neutron L3 Router                             |\n\n| allowed-address-pairs    | Allowed Address Pairs                         |\n\n| dfa                      | Cisco DFA Config Profile Extension            |   \u003c\u003d\u003d\u003d This is loaded by extension driver\n\n| extraroute               | Neutron Extra Route                           |\n\n+--------------------------+-----------------------------------------------+\n\n\n$ neutron ext-show dfa\n\n+-------------+--------------------------------------------------------------------------------+\n\n| Field       | Value                                                                        |\n\n+-------------+--------------------------------------------------------------------------------+\n\n| alias       | dfa                                                                            |\n\n| description | Add new config profile attribute to network resource.   |\n\n| links          |                                                                                |\n\n| name        | Cisco DFA Config Profile Extension                            |\n\n| namespace | http://docs.openstack.org/ext/neutron/dfa/api/v2.0    |\n\n| updated     | 2014-02-12T13:33:25-00:00                                       |\n\n+-------------+---------------------------------------------------------------------------------+\n$","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e136ab15d0a1819ef8ae7671c114a9ab489cde66","unresolved":false,"context_lines":[{"line_number":601,"context_line":"        constructor."},{"line_number":602,"context_line":"        \"\"\""},{"line_number":603,"context_line":"        for ext in self:"},{"line_number":604,"context_line":"            self.extension_drivers[ext.name] \u003d ext"},{"line_number":605,"context_line":"            self.ordered_ext_drivers.append(ext)"},{"line_number":606,"context_line":"        LOG.info(_(\"Registered extension drivers: %s\"),"},{"line_number":607,"context_line":"                 [driver.name for driver in self.ordered_ext_drivers])"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_e38279c7","line":604,"updated":"2014-08-25 22:48:40.000000000","message":"Can you refresh my mind on why we need this dict?","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"dd8185d8a0e51d83e05e01562f3fd60050e563cc","unresolved":false,"context_lines":[{"line_number":601,"context_line":"        constructor."},{"line_number":602,"context_line":"        \"\"\""},{"line_number":603,"context_line":"        for ext in self:"},{"line_number":604,"context_line":"            self.extension_drivers[ext.name] \u003d ext"},{"line_number":605,"context_line":"            self.ordered_ext_drivers.append(ext)"},{"line_number":606,"context_line":"        LOG.info(_(\"Registered extension drivers: %s\"),"},{"line_number":607,"context_line":"                 [driver.name for driver in self.ordered_ext_drivers])"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_561f69b7","line":604,"in_reply_to":"1abeadc6_e38279c7","updated":"2014-08-26 04:21:44.000000000","message":"This one shouldn\u0027t be there it was removed in patch set 16. Don\u0027t know how it reappeared again. Will remove it.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e136ab15d0a1819ef8ae7671c114a9ab489cde66","unresolved":false,"context_lines":[{"line_number":604,"context_line":"            self.extension_drivers[ext.name] \u003d ext"},{"line_number":605,"context_line":"            self.ordered_ext_drivers.append(ext)"},{"line_number":606,"context_line":"        LOG.info(_(\"Registered extension drivers: %s\"),"},{"line_number":607,"context_line":"                 [driver.name for driver in self.ordered_ext_drivers])"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    def initialize(self):"},{"line_number":610,"context_line":"        # Initialize each driver in the list."}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_a35fa174","line":607,"updated":"2014-08-25 22:48:40.000000000","message":"How can we verify we did not forget a driver we really needed? Imagine you\u0027ve enabled the DFA mechanism but not its extension driver. In that case there might be a problem as the mech driver would expect a parameter in input which the api is not passing","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"a81e7d0bc91b82c2ebb613b6b9c96d941c2c5429","unresolved":false,"context_lines":[{"line_number":604,"context_line":"            self.extension_drivers[ext.name] \u003d ext"},{"line_number":605,"context_line":"            self.ordered_ext_drivers.append(ext)"},{"line_number":606,"context_line":"        LOG.info(_(\"Registered extension drivers: %s\"),"},{"line_number":607,"context_line":"                 [driver.name for driver in self.ordered_ext_drivers])"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    def initialize(self):"},{"line_number":610,"context_line":"        # Initialize each driver in the list."}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_af178053","line":607,"in_reply_to":"1abeadc6_a35fa174","updated":"2014-08-26 01:48:37.000000000","message":"See the suggested required_extension_aliases property in my comment on config.py.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"dd8185d8a0e51d83e05e01562f3fd60050e563cc","unresolved":false,"context_lines":[{"line_number":604,"context_line":"            self.extension_drivers[ext.name] \u003d ext"},{"line_number":605,"context_line":"            self.ordered_ext_drivers.append(ext)"},{"line_number":606,"context_line":"        LOG.info(_(\"Registered extension drivers: %s\"),"},{"line_number":607,"context_line":"                 [driver.name for driver in self.ordered_ext_drivers])"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    def initialize(self):"},{"line_number":610,"context_line":"        # Initialize each driver in the list."}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_96ed8191","line":607,"in_reply_to":"1abeadc6_a35fa174","updated":"2014-08-26 04:21:44.000000000","message":"There would be invalid attribute exception. For example when create_network is called, with extended attribute but the extension driver is not included we will get exception for unknown attribute.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e136ab15d0a1819ef8ae7671c114a9ab489cde66","unresolved":false,"context_lines":[{"line_number":610,"context_line":"        # Initialize each driver in the list."},{"line_number":611,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":612,"context_line":"            LOG.info(_(\"Initializing extension driver \u0027%s\u0027\"), driver.name)"},{"line_number":613,"context_line":"            driver.obj.initialize()"},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"    def add_aliases(self, aliases):"},{"line_number":616,"context_line":"        for driver in self.ordered_ext_drivers:"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_43cded5c","line":613,"updated":"2014-08-25 22:48:40.000000000","message":"do you think that driver initialize can perform actions to verify whether the extension it provides is supported by the plugin","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"dd8185d8a0e51d83e05e01562f3fd60050e563cc","unresolved":false,"context_lines":[{"line_number":610,"context_line":"        # Initialize each driver in the list."},{"line_number":611,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":612,"context_line":"            LOG.info(_(\"Initializing extension driver \u0027%s\u0027\"), driver.name)"},{"line_number":613,"context_line":"            driver.obj.initialize()"},{"line_number":614,"context_line":""},{"line_number":615,"context_line":"    def add_aliases(self, aliases):"},{"line_number":616,"context_line":"        for driver in self.ordered_ext_drivers:"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_a5496190","line":613,"in_reply_to":"1abeadc6_43cded5c","updated":"2014-08-26 04:21:44.000000000","message":"I don\u0027t think so. The extension driver is orthogonal to mechanism driver. What is the benefit to have this check into the extension driver?","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e136ab15d0a1819ef8ae7671c114a9ab489cde66","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        self._call_on_ext_drivers(\"process_update_subnet\", session, data,"},{"line_number":651,"context_line":"                                  result)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"    def process_create_port(self, session, data, result):"},{"line_number":654,"context_line":"        \"\"\"Notify all extension drivers during port creation.\"\"\""},{"line_number":655,"context_line":"        self._call_on_ext_drivers(\"process_create_port\", session, data, result)"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_634829cd","line":653,"updated":"2014-08-25 22:48:40.000000000","message":"So far we have not talked a lot about the necessity of ensuring that either all mech drivers or none support an extensions in order to avoid weirdly shaped responses which might give out details of the underlying implement - and be at least confusing to users.\n\nWe kind of agreed that this is a Kilo topic, and I\u0027ll be happy to discuss it more. However, I was wondering if you think it might be the case to leave the port resource out of the ext framework for Juno. This because this is the resource which will really give out details of underlying implementation and have attributes which might exist if the port is one a given host and not if it\u0027s on another host.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"dd8185d8a0e51d83e05e01562f3fd60050e563cc","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        self._call_on_ext_drivers(\"process_update_subnet\", session, data,"},{"line_number":651,"context_line":"                                  result)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"    def process_create_port(self, session, data, result):"},{"line_number":654,"context_line":"        \"\"\"Notify all extension drivers during port creation.\"\"\""},{"line_number":655,"context_line":"        self._call_on_ext_drivers(\"process_create_port\", session, data, result)"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_ec19817a","line":653,"in_reply_to":"1abeadc6_634829cd","updated":"2014-08-26 04:21:44.000000000","message":"We can take incremental approach improve the use of port methods defined in here.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"4572592287839271c12e548b13241510e61feb04","unresolved":false,"context_lines":[{"line_number":614,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":615,"context_line":"            exts +\u003d driver.obj.extension_alias"},{"line_number":616,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":617,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":618,"context_line":"        return exts"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_ab1422a0","line":617,"updated":"2014-08-29 15:08:12.000000000","message":"Don\u0027t you want to log driver.obj.extension_alias rather than the whole list, so the operator can see which extension came from which driver?\n\nIf not, you could just use list comprehension to build the list of aliases, and log it afterwards.","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"a329abf6850d2787d09bca4491c47a9238c1cf89","unresolved":false,"context_lines":[{"line_number":614,"context_line":"        for driver in self.ordered_ext_drivers:"},{"line_number":615,"context_line":"            exts +\u003d driver.obj.extension_alias"},{"line_number":616,"context_line":"            LOG.info(_(\"Got %(ext)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":617,"context_line":"                     {\u0027ext\u0027: exts, \u0027drv\u0027: driver.name})"},{"line_number":618,"context_line":"        return exts"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_52289e96","line":617,"in_reply_to":"1abeadc6_ab1422a0","updated":"2014-08-29 16:34:50.000000000","message":"Done","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"b64dfe064409cf618cb961dac09da812e76e41e9","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            alias \u003d driver.obj.extension_alias"},{"line_number":616,"context_line":"            exts.append(alias)"},{"line_number":617,"context_line":"            LOG.info(_(\"Got %(alias)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":618,"context_line":"                     {\u0027ext\u0027: alias, \u0027drv\u0027: driver.name})"},{"line_number":619,"context_line":"        return exts"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_4349b25e","line":618,"updated":"2014-08-29 16:43:24.000000000","message":"Change \u0027ext\u0027 to \u0027alias\u0027 to match log message.","commit_id":"99bd4563b2c2889910212973248a7784218ad5d8"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"72f99e01e9da52c921019c3f5fe214c3f9e93e5a","unresolved":false,"context_lines":[{"line_number":615,"context_line":"            alias \u003d driver.obj.extension_alias"},{"line_number":616,"context_line":"            exts.append(alias)"},{"line_number":617,"context_line":"            LOG.info(_(\"Got %(alias)s extension from driver \u0027%(drv)s\u0027\"),"},{"line_number":618,"context_line":"                     {\u0027ext\u0027: alias, \u0027drv\u0027: driver.name})"},{"line_number":619,"context_line":"        return exts"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def _call_on_ext_drivers(self, method_name, session, data, result):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_a3d52644","line":618,"in_reply_to":"1abeadc6_4349b25e","updated":"2014-08-29 16:52:49.000000000","message":"Done","commit_id":"99bd4563b2c2889910212973248a7784218ad5d8"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"f8be52609b0ff478db8399c633b14fdb941066e1","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"        session \u003d context.session"},{"line_number":383,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":384,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":385,"context_line":"            result \u003d super(Ml2Plugin, self).create_network(context, network)"},{"line_number":386,"context_line":"            network_id \u003d result[\u0027id\u0027]"},{"line_number":387,"context_line":"            self._process_l3_create(context, result, net_data)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2FUVk%3D","line":384,"updated":"2014-04-22 14:51:48.000000000","message":"May be you can add an optional parameter in db_base_plugin_v2.create_network(..., process_extensions\u003dtrue), to fetch network extension parameters.\nBut I still don\u0027t understand the reason why this has been disabled here :\nhttps://review.openstack.org/#/c/39093/3/neutron/db/db_base_plugin_v2.py","commit_id":"b76237cd9cd14e8aa8b5393023eee73c44b0bd27"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"57142af3fd0e31cf93173be476a92fdcb1bfbc1d","unresolved":false,"context_lines":[{"line_number":381,"context_line":""},{"line_number":382,"context_line":"        session \u003d context.session"},{"line_number":383,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":384,"context_line":"            self._ensure_default_security_group(context, tenant_id)"},{"line_number":385,"context_line":"            result \u003d super(Ml2Plugin, self).create_network(context, network)"},{"line_number":386,"context_line":"            network_id \u003d result[\u0027id\u0027]"},{"line_number":387,"context_line":"            self._process_l3_create(context, result, net_data)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAXH%2F%2FTjk%3D","line":384,"in_reply_to":"AAAAXH%2F%2FUVk%3D","updated":"2014-04-22 16:41:18.000000000","message":"I agree with you. but here are the issue:\n- It is set to false when fix for Bug 1201957 committed. \nI ask question regarding this fix but unfortunately haven\u0027t gotten any reply in link below and from mailing list:\nhttps://answers.launchpad.net/neutron/+question/245773.\n- Moreover, even by setting it to true, still extension won\u0027t exist in the \u0027network\u0027 object. Again the original parameter is replaced by network object which only support common attributes.\n\nI can modify the code:\n1. set process_extension \u003d True ( as long as don\u0027t get reply from submitter of Bug 1201957, I don\u0027t know what problem it could cause on his fix)\n2. Instead of passing network object to _make_network_dict() use \u0027n \u003d network[\u0027network\u0027]\u0027 .\nImplementing (1) + (2) can fix the issue and I can remove the new attribute that added to the driver.","commit_id":"b76237cd9cd14e8aa8b5393023eee73c44b0bd27"},{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"unresolved":false,"context_lines":[{"line_number":129,"context_line":"            if hasattr(mech_drv.obj, \u0027_supported_extension_aliases\u0027):"},{"line_number":130,"context_line":"                md_aliases \u003d mech_drv.obj._supported_extension_aliases"},{"line_number":131,"context_line":"                for mda in md_aliases:"},{"line_number":132,"context_line":"                    self._supported_extension_aliases.append(mda)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _setup_rpc(self):"},{"line_number":135,"context_line":"        self.notifier \u003d rpc.AgentNotifierApi(topics.AGENT)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAXH%2F%2FMY4%3D","line":132,"updated":"2014-04-23 12:34:18.000000000","message":"we might need something to manage extension supported by several MD. A first approach could be to forbid multiple MD to register the same extension.","commit_id":"0b3600c3c108d459c1b4ee40f783e76b239599b3"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"57142af3fd0e31cf93173be476a92fdcb1bfbc1d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            if hasattr(mech_drv.obj, \u0027_supported_extension_aliases\u0027):"},{"line_number":130,"context_line":"                md_aliases \u003d mech_drv.obj._supported_extension_aliases"},{"line_number":131,"context_line":"                for mda in md_aliases:"},{"line_number":132,"context_line":"                    self._supported_extension_aliases.append(mda)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def _setup_rpc(self):"},{"line_number":135,"context_line":"        self.notifier \u003d rpc.AgentNotifierApi(topics.AGENT)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAXX%2F%2F2qQ%3D","line":132,"in_reply_to":"AAAAXH%2F%2FMY4%3D","updated":"2014-04-25 19:11:14.000000000","message":"Good point. Need check here.","commit_id":"0b3600c3c108d459c1b4ee40f783e76b239599b3"},{"author":{"_account_id":5209,"name":"Ed Bak","email":"ed.bak2@hpe.com","username":"ed-bak2"},"change_message_id":"9cc4261501dd8c5d51efcd2a0c9606398ec49183","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # bulk support depends on the underlying drivers"},{"line_number":111,"context_line":"        self.__native_bulk_support \u003d self.mechanism_manager.native_bulk_support"},{"line_number":112,"context_line":"        \u0027\u0027\u0027"},{"line_number":113,"context_line":"        Check if any extension is supported in the mechanism dirvers."},{"line_number":114,"context_line":"        If so, add them to the aliases list in the plugin."},{"line_number":115,"context_line":"        \u0027\u0027\u0027"},{"line_number":116,"context_line":"        self._get_mech_driver_extensions_aliases()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_1f70e370","line":113,"updated":"2014-05-19 20:58:53.000000000","message":"typo:  dirvers","commit_id":"c453664ed672c923da8a8977a55bbf2438ca87a9"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"09e23b675c9279906515f3d144561af1e99c8257","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # bulk support depends on the underlying drivers"},{"line_number":111,"context_line":"        self.__native_bulk_support \u003d self.mechanism_manager.native_bulk_support"},{"line_number":112,"context_line":"        \u0027\u0027\u0027"},{"line_number":113,"context_line":"        Check if any extension is supported in the mechanism dirvers."},{"line_number":114,"context_line":"        If so, add them to the aliases list in the plugin."},{"line_number":115,"context_line":"        \u0027\u0027\u0027"},{"line_number":116,"context_line":"        self._get_mech_driver_extensions_aliases()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_2752f134","line":113,"in_reply_to":"7adec928_1f70e370","updated":"2014-06-11 15:22:04.000000000","message":"Done","commit_id":"c453664ed672c923da8a8977a55bbf2438ca87a9"},{"author":{"_account_id":5209,"name":"Ed Bak","email":"ed.bak2@hpe.com","username":"ed-bak2"},"change_message_id":"9cc4261501dd8c5d51efcd2a0c9606398ec49183","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                md_aliases \u003d mech_drv.obj._supported_extension_aliases"},{"line_number":131,"context_line":"                for mda in md_aliases:"},{"line_number":132,"context_line":"                    if mda not in self._supported_extension_aliases:"},{"line_number":133,"context_line":"                        self._supported_extension_aliases.append(mda)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def _setup_rpc(self):"},{"line_number":136,"context_line":"        self.notifier \u003d rpc.AgentNotifierApi(topics.AGENT)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_278af163","line":133,"updated":"2014-05-19 20:58:53.000000000","message":"You have lots of nested for loops and ifs.  The last few lines of code could be simplified using python sets.  Just add the two lists.  Use a set to remove the duplicates.\n\nself._supported_extension_aliases\u003dlist(set(supported_extension_aliases+md_aliases))","commit_id":"c453664ed672c923da8a8977a55bbf2438ca87a9"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"09e23b675c9279906515f3d144561af1e99c8257","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                md_aliases \u003d mech_drv.obj._supported_extension_aliases"},{"line_number":131,"context_line":"                for mda in md_aliases:"},{"line_number":132,"context_line":"                    if mda not in self._supported_extension_aliases:"},{"line_number":133,"context_line":"                        self._supported_extension_aliases.append(mda)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def _setup_rpc(self):"},{"line_number":136,"context_line":"        self.notifier \u003d rpc.AgentNotifierApi(topics.AGENT)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_5607ad81","line":133,"in_reply_to":"7adec928_278af163","updated":"2014-06-11 15:22:04.000000000","message":"Done","commit_id":"c453664ed672c923da8a8977a55bbf2438ca87a9"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"e163731f7bf27bb09ba1f374c078451021a053e7","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        LOG.info(_(\"Modular L2 Plugin initialization complete\"))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _get_mech_driver_extensions_aliases(self):"},{"line_number":128,"context_line":"        for mech_drv in self.mechanism_manager.ordered_mech_drivers:"},{"line_number":129,"context_line":"            if hasattr(mech_drv.obj, \u0027_supported_extension_aliases\u0027):"},{"line_number":130,"context_line":"                self._supported_extension_aliases \u003d list(set("}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_0af15895","line":127,"updated":"2014-05-21 02:11:02.000000000","message":"This method name implies that it\u0027s a read-only operation; however, it sets the _supported_extension_aliases attribute. Consider separating the assignment outside of this function.","commit_id":"b7bac9ec42684dc62287c7481fd1fd8754716a7a"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"6766f49d7f6540f1f8dd395beab3a340150d5949","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        LOG.info(_(\"Modular L2 Plugin initialization complete\"))"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"    def _get_mech_driver_extensions_aliases(self):"},{"line_number":128,"context_line":"        for mech_drv in self.mechanism_manager.ordered_mech_drivers:"},{"line_number":129,"context_line":"            if hasattr(mech_drv.obj, \u0027_supported_extension_aliases\u0027):"},{"line_number":130,"context_line":"                self._supported_extension_aliases \u003d list(set("}],"source_content_type":"text/x-python","patch_set":4,"id":"7adec928_723652b6","line":127,"in_reply_to":"7adec928_0af15895","updated":"2014-06-11 15:22:19.000000000","message":"Good point. I will change the name of the method to reflect what it does.","commit_id":"b7bac9ec42684dc62287c7481fd1fd8754716a7a"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9de777a2a4000e864b211fa4bc86e6cf90e0727a","unresolved":false,"context_lines":[{"line_number":592,"context_line":"                                            limit, marker, page_reverse)"},{"line_number":593,"context_line":"            for net in nets:"},{"line_number":594,"context_line":"                self._extend_network_dict_provider(context, net)"},{"line_number":595,"context_line":"                self.extension_manager.extend_network_dict(session, net)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"            nets \u003d self._filter_nets_provider(context, nets, filters)"},{"line_number":598,"context_line":"            nets \u003d self._filter_nets_l3(context, nets, filters)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_a197e0e9","line":595,"updated":"2014-08-04 18:11:57.000000000","message":"what about extending attributes when returning a list of object for subnet and ports? That said, I found this approach troubling. The fact that we explicitly extend the property dictionary seems to go against the use of:\n\nhttps://github.com/openstack/neutron/blob/master/neutron/db/db_base_plugin_v2.py#L87\n\nand\n\nhttps://github.com/openstack/neutron/blob/master/neutron/db/common_db_mixin.py#L143\n\nI don\u0027t like the sprinkling of these extend_* functions all over the ML2 plugin. We already have enough ensure_* and process_* calls all over the place. My fear is that ultimately the more this grows the greater the performance penalty we\u0027re gonna get.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"532c7da251074ae274e695782da731ec4e6a7295","unresolved":false,"context_lines":[{"line_number":592,"context_line":"                                            limit, marker, page_reverse)"},{"line_number":593,"context_line":"            for net in nets:"},{"line_number":594,"context_line":"                self._extend_network_dict_provider(context, net)"},{"line_number":595,"context_line":"                self.extension_manager.extend_network_dict(session, net)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"            nets \u003d self._filter_nets_provider(context, nets, filters)"},{"line_number":598,"context_line":"            nets \u003d self._filter_nets_l3(context, nets, filters)"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_1da6cc0d","line":595,"in_reply_to":"baada198_a197e0e9","updated":"2014-08-07 01:09:36.000000000","message":"To extend attributes for get_*(), for network and port resources the registration provided by db_base_plugin_v2 can be used but for subnet it is not the case because there is no call to _apply_dict_extend_functions() in _make_subnet_dict.\n\nTo extend the subnet attribute(s), either _make_subnet_dict has to be modified in db_base_plugin_v2 or add get_subnet method to the Ml2Plugin. I\u0027ll add the get_subnet method to the Ml2Plugin to support that.","commit_id":"084b937ccfb38eaa1f54c5ad5adb41e666c38c92"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"9aa5b6b299b8e0494e9951b37183040f8e0bf92b","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":599,"context_line":"            result \u003d super(Ml2Plugin, self).get_network(context, id, None)"},{"line_number":600,"context_line":"            self._extend_network_dict_provider(context, result)"},{"line_number":601,"context_line":"            self.extension_manager.extend_network_dict(session, result)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        return self._fields(result, fields)"},{"line_number":604,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_7545f1b2","line":601,"updated":"2014-08-08 03:57:15.000000000","message":"base get_network would do _apply_dict_extend_functions.\nwhy do you need this explicit call too?","commit_id":"4109c0ddd14a12bd3cd535483b99c3618cba8fee"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"887ec1065cb1fe5ad3e6d6480042cd25863ad900","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        with session.begin(subtransactions\u003dTrue):"},{"line_number":599,"context_line":"            result \u003d super(Ml2Plugin, self).get_network(context, id, None)"},{"line_number":600,"context_line":"            self._extend_network_dict_provider(context, result)"},{"line_number":601,"context_line":"            self.extension_manager.extend_network_dict(session, result)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        return self._fields(result, fields)"},{"line_number":604,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"baada198_38c6104b","line":601,"in_reply_to":"baada198_7545f1b2","updated":"2014-08-08 05:15:49.000000000","message":"Yes, it should be removed, no need for it. Somehow missed it :(","commit_id":"4109c0ddd14a12bd3cd535483b99c3618cba8fee"},{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"90fcbd7deeb18492606139393b1b726f1f4bea81","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":471,"context_line":"        attributes.PORTS, [\u0027_ml2_extend_port_dict_binding\u0027])"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    # Register extend dict methods for network and port resources."},{"line_number":474,"context_line":"    # Each mechanism driver that supports extend attribute for the resources"},{"line_number":475,"context_line":"    # can add those attribute to the result."},{"line_number":476,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_021f0e5b","line":473,"updated":"2014-08-08 11:45:59.000000000","message":"it might be a silly question, but why only for network and port resources? Why not subnets as well, since you implemented the method def extend_subnet_dict(self, session, result) in the extension manager.","commit_id":"68dbbabcda7f75177c3fe90ce39b5698f6a410c1"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ce45a012027e4d91058802c94fada882615910fe","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":471,"context_line":"        attributes.PORTS, [\u0027_ml2_extend_port_dict_binding\u0027])"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    # Register extend dict methods for network and port resources."},{"line_number":474,"context_line":"    # Each mechanism driver that supports extend attribute for the resources"},{"line_number":475,"context_line":"    # can add those attribute to the result."},{"line_number":476,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_ce6440b6","line":473,"in_reply_to":"baada198_021f0e5b","updated":"2014-08-10 03:01:58.000000000","message":"In order to make the callback works is that _make_*_dict (method in NeutronDbPluginV2) needs to call _apply_dict_extend_functions. But _make_subnet_dict does not call that function the way it is done for network/port.\n\nThe issue needs to be fixed in _make_subnet_dict, to have similar callback register for subnet.","commit_id":"68dbbabcda7f75177c3fe90ce39b5698f6a410c1"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"7c6353ba2251ad24a65c48638c6baeb2550297a5","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":471,"context_line":"        attributes.PORTS, [\u0027_ml2_extend_port_dict_binding\u0027])"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    # Register extend dict methods for network and port resources."},{"line_number":474,"context_line":"    # Each mechanism driver that supports extend attribute for the resources"},{"line_number":475,"context_line":"    # can add those attribute to the result."},{"line_number":476,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_f0ec5d94","line":473,"in_reply_to":"baada198_025b5523","updated":"2014-08-11 15:48:21.000000000","message":"I\u0027m looking into it and will make the change.","commit_id":"68dbbabcda7f75177c3fe90ce39b5698f6a410c1"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"d06a6846aeaa17915abdcf615822f9d930e76b9c","unresolved":false,"context_lines":[{"line_number":470,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("},{"line_number":471,"context_line":"        attributes.PORTS, [\u0027_ml2_extend_port_dict_binding\u0027])"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"    # Register extend dict methods for network and port resources."},{"line_number":474,"context_line":"    # Each mechanism driver that supports extend attribute for the resources"},{"line_number":475,"context_line":"    # can add those attribute to the result."},{"line_number":476,"context_line":"    db_base_plugin_v2.NeutronDbPluginV2.register_dict_extend_funcs("}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_025b5523","line":473,"in_reply_to":"baada198_ce6440b6","updated":"2014-08-11 10:32:40.000000000","message":"will you do that?","commit_id":"68dbbabcda7f75177c3fe90ce39b5698f6a410c1"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"c6c257c385a615bbaed9f40b4efe93d99005826a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                                    \"quotas\", \"security-group\", \"agent\","},{"line_number":100,"context_line":"                                    \"dhcp_agent_scheduler\","},{"line_number":101,"context_line":"                                    \"multi-provider\", \"allowed-address-pairs\","},{"line_number":102,"context_line":"                                    \"extra_dhcp_opt\"]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    @property"},{"line_number":105,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_ea4bb3ae","line":102,"updated":"2014-08-21 07:35:47.000000000","message":"some of the above extensions, currently \"hardcoded\" might need to become extension drivers. I do not think this is outside of the scope of this patch. On the other hand I do think that it provides a good validation for this framework.\n\nIt would be good to do that, instead of relying exclusively on cisco DFA and on the possibility of other outstanding patches to benefit from this.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ef74d36c491b5e16cbc18f65b5e0e73dc1ddc8e6","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                                    \"quotas\", \"security-group\", \"agent\","},{"line_number":100,"context_line":"                                    \"dhcp_agent_scheduler\","},{"line_number":101,"context_line":"                                    \"multi-provider\", \"allowed-address-pairs\","},{"line_number":102,"context_line":"                                    \"extra_dhcp_opt\"]"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    @property"},{"line_number":105,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_d463da3f","line":102,"in_reply_to":"1abeadc6_ea4bb3ae","updated":"2014-08-22 00:24:20.000000000","message":"Agreed. Instead of hard coding it in the plugin, then can be added as extension drivers and loaded when needed.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"c6c257c385a615bbaed9f40b4efe93d99005826a","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                    db.add_network_segment(session, network_id, segment)"},{"line_number":560,"context_line":"            else:"},{"line_number":561,"context_line":"                segment \u003d self.type_manager.allocate_tenant_segment(session)"},{"line_number":562,"context_line":"                db.add_network_segment(session, network_id, segment)"},{"line_number":563,"context_line":"            self._extend_network_dict_provider(context, result)"},{"line_number":564,"context_line":"            mech_context \u003d driver_context.NetworkContext(self, context,"},{"line_number":565,"context_line":"                                                         result)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_8a5ddf7b","line":562,"updated":"2014-08-21 07:35:47.000000000","message":"The line below is for instance doing something the extension framwork should do","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ef74d36c491b5e16cbc18f65b5e0e73dc1ddc8e6","unresolved":false,"context_lines":[{"line_number":559,"context_line":"                    db.add_network_segment(session, network_id, segment)"},{"line_number":560,"context_line":"            else:"},{"line_number":561,"context_line":"                segment \u003d self.type_manager.allocate_tenant_segment(session)"},{"line_number":562,"context_line":"                db.add_network_segment(session, network_id, segment)"},{"line_number":563,"context_line":"            self._extend_network_dict_provider(context, result)"},{"line_number":564,"context_line":"            mech_context \u003d driver_context.NetworkContext(self, context,"},{"line_number":565,"context_line":"                                                         result)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_14e8f27a","line":562,"in_reply_to":"1abeadc6_8a5ddf7b","updated":"2014-08-22 00:24:20.000000000","message":"I believe so. If \u0027provider\u0027 extension is defined as extension driver that code can be moved to the drivers instead of living in the Ml2Plugin.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e136ab15d0a1819ef8ae7671c114a9ab489cde66","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                    \"quotas\", \"security-group\", \"agent\","},{"line_number":99,"context_line":"                                    \"dhcp_agent_scheduler\","},{"line_number":100,"context_line":"                                    \"multi-provider\", \"allowed-address-pairs\","},{"line_number":101,"context_line":"                                    \"extra_dhcp_opt\"]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @property"},{"line_number":104,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_116ee0c9","line":101,"updated":"2014-08-25 22:48:40.000000000","message":"The question of which extensions should be processed by appropriate drivers and which not begs another question regarding what should be regarded as \"core\" for the API, which is definetely out of scope.\n\nI think having processors for extensions is a good idea. The extension driver knows how to handle an extension. In theory it can know also how to handle multiple extensions, but 1 is good for now. If and how they should be tied to mechanism it\u0027s one of the point I would like to solve with this piece of work.\n\nIn the list above you see a number of extensions which are not explicitly served by mechanisms drivers. In theory there might be no mechanism driver able to provide this extensions (for instance one might replace the ovs agent mech driver with another one which does not support allowed address pairs).\n\nWithout looking at the DFA extension only, let\u0027s look first at these extensions.\nKeeping at one side provider, external-net, binding, quotas, and security-groups, I think it\u0027s reasonable to consider the other \"optional\", and have extensions drivers for them. However, I would like to see how this framework handles the situation where one specifies an extension driver for an extension which is not supported by any mech driver.\nI see three options:\n1) ignore, and log at most. In the worst case the code will just skip processing of the extension driver\n2) raise at startup. The ml2 init process will validate extensions drivers vs loaded mechanisms and raise if things are configured incorrectly.\n3) try an be smart, by loading all the extensions drivers that can be enabled for the ml2 plugin - and doing something else to let the user explicitly turn off extensions.\n\nOption #3 might sound a bit convoluted and goes against the approved design for this patch. It stems from two considerations:\n1- extensions allowed on the ML2 plugin are given by \"core extensions\" such as security-group and optional extensions which are supported by the mechanism drivers\n2- a deployer might decide to \"turn off\" an extension even if in theory it\u0027s supported.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"a81e7d0bc91b82c2ebb613b6b9c96d941c2c5429","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                    \"quotas\", \"security-group\", \"agent\","},{"line_number":99,"context_line":"                                    \"dhcp_agent_scheduler\","},{"line_number":100,"context_line":"                                    \"multi-provider\", \"allowed-address-pairs\","},{"line_number":101,"context_line":"                                    \"extra_dhcp_opt\"]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @property"},{"line_number":104,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_2f6c5036","line":101,"in_reply_to":"1abeadc6_116ee0c9","updated":"2014-08-26 01:48:37.000000000","message":"As you are aware, I\u0027ve started a discussion in https://docs.google.com/a/noironetworks.com/document/d/14T-defRnFl6M2xR5ZNFGYD6aIiAVWdd1Al9BnjV_JOs/ of the challenges with enforcing extension semantics, and at least an outline of a way to achieve this. Its not a simple matter of ensuring some mechanism driver that understands the extension is loaded, but requires ensuring that such a driver takes part in port bindings when the actual values of the extended attributes require special semantics. I plan to work with anyone interested, including yourself, to turn this document into a Kilo blueprint that enhances the initial extension support implemented here.\n\nClearly refactoring the existing built-in extensions into extension drivers may be a good long term idea, but is out of scope for this blueprint and for the Juno timeframe. I agree that looking at what enforcement of semantics would mean for these extensions is a useful exercise, even if we don\u0027t immediately turn them all into drivers.\n\nAt this point, we need to decide whether its really necessary to start doing something about enforcement in this initial baseline extension driver framework implementation, or if we can leave that to the second phase. I believe that simple homogeneous vendor-specific use cases like DFA do not absolutely require any enforcement, because the vendors will ensure supported configurations load exactly the proper set of drivers. If we do need to do something about enforcement now, I\u0027d strongly recommend we limit to something very simple initially, along the lines of the suggestions in my comments on config.py.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"dd8185d8a0e51d83e05e01562f3fd60050e563cc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"                                    \"quotas\", \"security-group\", \"agent\","},{"line_number":99,"context_line":"                                    \"dhcp_agent_scheduler\","},{"line_number":100,"context_line":"                                    \"multi-provider\", \"allowed-address-pairs\","},{"line_number":101,"context_line":"                                    \"extra_dhcp_opt\"]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    @property"},{"line_number":104,"context_line":"    def supported_extension_aliases(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_8cdacde7","line":101,"in_reply_to":"1abeadc6_116ee0c9","updated":"2014-08-26 04:21:44.000000000","message":"I believe changing the built-in extension supported by Ml2Plugin is not in the scope of this BP. As I mentioned earlier we can always take incremental approach and implement this framework for Juno and as Robert provided the enhancement document, we can improve it in the kilo timeframe .","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e136ab15d0a1819ef8ae7671c114a9ab489cde66","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    def supported_extension_aliases(self):"},{"line_number":105,"context_line":"        if not hasattr(self, \u0027_aliases\u0027):"},{"line_number":106,"context_line":"            aliases \u003d self._supported_extension_aliases[:]"},{"line_number":107,"context_line":"            aliases +\u003d self.extension_manager.extension_aliases()"},{"line_number":108,"context_line":"            sg_rpc.disable_security_group_extension_by_config(aliases)"},{"line_number":109,"context_line":"            self._aliases \u003d aliases"},{"line_number":110,"context_line":"        return self._aliases"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_11ca60a1","line":107,"updated":"2014-08-25 22:48:40.000000000","message":"I think it might be good to do a check either here or in initialize to check whether the extensions that have been requested can be actually provided or not. In the traditional extensions framework, if one loads an extension a mixin for supporting it is added to the plugin (truth be said, that\u0027s far from perfect).\n\nPerhaps if an extension driver is added than we\u0027d need to check that either the plugin itself or some mechanism driver are able to provide it?","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"a81e7d0bc91b82c2ebb613b6b9c96d941c2c5429","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    def supported_extension_aliases(self):"},{"line_number":105,"context_line":"        if not hasattr(self, \u0027_aliases\u0027):"},{"line_number":106,"context_line":"            aliases \u003d self._supported_extension_aliases[:]"},{"line_number":107,"context_line":"            aliases +\u003d self.extension_manager.extension_aliases()"},{"line_number":108,"context_line":"            sg_rpc.disable_security_group_extension_by_config(aliases)"},{"line_number":109,"context_line":"            self._aliases \u003d aliases"},{"line_number":110,"context_line":"        return self._aliases"}],"source_content_type":"text/x-python","patch_set":19,"id":"1abeadc6_ef9ed806","line":107,"in_reply_to":"1abeadc6_11ca60a1","updated":"2014-08-26 01:48:37.000000000","message":"I agree a startup sanity check might be useful. But there could be extensions to the core resources that are only used/enforced by service plugins, so I\u0027m worried that just checking the plugin itself and its mechanism drivers would be too restrictive. I think getting some experience with a simple baseline framework and a very limited set of extension drivers will provide valuable insight into what\u0027s really needed in the next phase.","commit_id":"e13d62459a3603fbce4a2f92d76ddd960a29348d"}],"neutron/tests/unit/ml2/extensions/test_extension.py":[{"author":{"_account_id":8213,"name":"Claudiu Belu","email":"cbelu@cloudbasesolutions.com","username":"claudiub"},"change_message_id":"90fcbd7deeb18492606139393b1b726f1f4bea81","unresolved":false,"context_lines":[{"line_number":39,"context_line":"}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class Test_extension(extensions.ExtensionDescriptor):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_e2513ad6","line":42,"updated":"2014-08-08 11:45:59.000000000","message":"Why not TestExtension?","commit_id":"68dbbabcda7f75177c3fe90ce39b5698f6a410c1"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"ce45a012027e4d91058802c94fada882615910fe","unresolved":false,"context_lines":[{"line_number":39,"context_line":"}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class Test_extension(extensions.ExtensionDescriptor):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def get_name(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"baada198_aed62c51","line":42,"in_reply_to":"baada198_e2513ad6","updated":"2014-08-10 03:01:58.000000000","message":"This is the name of extension which is \u0027test_extension\u0027 and the class name should follow the name (Test_extension).","commit_id":"68dbbabcda7f75177c3fe90ce39b5698f6a410c1"}],"neutron/tests/unit/ml2/test_extension_driver_api.py":[{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"2c464f605780d9ad87ee395e5fb0faa0f029bcf5","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @property"},{"line_number":56,"context_line":"    def extension_alias(self):"},{"line_number":57,"context_line":"        return self._supported_extension_aliases"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def process_create_network(self, session, data, result):"},{"line_number":60,"context_line":"        result[\u0027network_extension\u0027] \u003d self.network_extension"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_741d3d66","line":57,"updated":"2014-08-22 17:40:37.000000000","message":"Isn\u0027t this supposed to be a single alias here rather than a list?","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"361afebf6040e6d65b22cc065858875281736a79","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @property"},{"line_number":56,"context_line":"    def extension_alias(self):"},{"line_number":57,"context_line":"        return self._supported_extension_aliases"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def process_create_network(self, session, data, result):"},{"line_number":60,"context_line":"        result[\u0027network_extension\u0027] \u003d self.network_extension"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_92d95659","line":57,"in_reply_to":"1abeadc6_741d3d66","updated":"2014-08-22 17:56:20.000000000","message":"It is returning what is define in L47. Do you prefer  to remove L47 and L57 to return the defined alias?","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"342b55725ff859e5e2ce058eaaf6e6ffde7eb7a1","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @property"},{"line_number":56,"context_line":"    def extension_alias(self):"},{"line_number":57,"context_line":"        return self._supported_extension_aliases"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def process_create_network(self, session, data, result):"},{"line_number":60,"context_line":"        result[\u0027network_extension\u0027] \u003d self.network_extension"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_290ad525","line":57,"in_reply_to":"1abeadc6_7829f988","updated":"2014-08-22 21:10:11.000000000","message":"Basically it is a list with one element.\nIf it is changed to a string the ext +\u003d ... should be changed as well.\n\nIs that okay to keep it as it is as it has only on entry in the list.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"89946b59c5e56b0878e53c99638c4dd18bbf7ee5","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @property"},{"line_number":56,"context_line":"    def extension_alias(self):"},{"line_number":57,"context_line":"        return self._supported_extension_aliases"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def process_create_network(self, session, data, result):"},{"line_number":60,"context_line":"        result[\u0027network_extension\u0027] \u003d self.network_extension"}],"source_content_type":"text/x-python","patch_set":16,"id":"1abeadc6_7829f988","line":57,"in_reply_to":"1abeadc6_92d95659","updated":"2014-08-22 18:58:07.000000000","message":"From driver_api.py:\n\n    @abc.abstractproperty\n    def extension_alias(self):\n\nand from managers.py:\n\ndef extension_aliases(self):\n        exts \u003d []\n        for driver in self.ordered_ext_drivers:\n            exts +\u003d driver.obj.extension_alias\n\nBoth of these name the property \"extension_ alias\", not \"extension_aliases\", and expect a single alias, not a list.","commit_id":"990a891fa6fa57504f4aa5befd4a935277b0a775"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"4572592287839271c12e548b13241510e61feb04","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            self.assertIsNotNone(ent)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class TestExtensionDriver(api.ExtensionDriver):"},{"line_number":47,"context_line":"    _supported_extension_aliases \u003d [\u0027test_extension\u0027]"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def initialize(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_2b0e523b","line":46,"updated":"2014-08-29 15:08:12.000000000","message":"Should this driver be located in neutron.tests.unit.ml2.drivers?","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"a329abf6850d2787d09bca4491c47a9238c1cf89","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            self.assertIsNotNone(ent)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class TestExtensionDriver(api.ExtensionDriver):"},{"line_number":47,"context_line":"    _supported_extension_aliases \u003d [\u0027test_extension\u0027]"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def initialize(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_12c70646","line":46,"in_reply_to":"1abeadc6_2b0e523b","updated":"2014-08-29 16:34:50.000000000","message":"Didn\u0027t want to create new file for just this class. If it is really needed I can add new file and put it there.","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"4572592287839271c12e548b13241510e61feb04","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class TestExtensionDriver(api.ExtensionDriver):"},{"line_number":47,"context_line":"    _supported_extension_aliases \u003d [\u0027test_extension\u0027]"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def initialize(self):"},{"line_number":50,"context_line":"        self.network_extension \u003d \u0027Test_Network_Extension\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_eb9d3a0b","line":47,"updated":"2014-08-29 15:08:12.000000000","message":"The extension_alias property below is a single alias, not a list. This should therefore be a single string rather than a list, and be named _supported_extension_alias.","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"a329abf6850d2787d09bca4491c47a9238c1cf89","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class TestExtensionDriver(api.ExtensionDriver):"},{"line_number":47,"context_line":"    _supported_extension_aliases \u003d [\u0027test_extension\u0027]"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def initialize(self):"},{"line_number":50,"context_line":"        self.network_extension \u003d \u0027Test_Network_Extension\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_92bb16c3","line":47,"in_reply_to":"1abeadc6_eb9d3a0b","updated":"2014-08-29 16:34:50.000000000","message":"Done","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"4572592287839271c12e548b13241510e61feb04","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.network_extension \u003d \u0027Test_Network_Extension\u0027"},{"line_number":51,"context_line":"        self.subnet_extension \u003d \u0027Test_Subnet_Extension\u0027"},{"line_number":52,"context_line":"        self.port_extension \u003d \u0027Test_Port_Extension\u0027"},{"line_number":53,"context_line":"        extensions.append_api_extensions_path(test_extensions.__path__)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @property"},{"line_number":56,"context_line":"    def extension_alias(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_8ba3e641","line":53,"updated":"2014-08-29 15:08:12.000000000","message":"For extensions not located in neutron.extensions, I\u0027m curious whether we expect drivers to append their locations to the path like this, or whether we expect operators to configure the path to include the necessary locations?","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"a329abf6850d2787d09bca4491c47a9238c1cf89","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.network_extension \u003d \u0027Test_Network_Extension\u0027"},{"line_number":51,"context_line":"        self.subnet_extension \u003d \u0027Test_Subnet_Extension\u0027"},{"line_number":52,"context_line":"        self.port_extension \u003d \u0027Test_Port_Extension\u0027"},{"line_number":53,"context_line":"        extensions.append_api_extensions_path(test_extensions.__path__)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @property"},{"line_number":56,"context_line":"    def extension_alias(self):"}],"source_content_type":"text/x-python","patch_set":20,"id":"1abeadc6_f8e8a9e3","line":53,"in_reply_to":"1abeadc6_8ba3e641","updated":"2014-08-29 16:34:50.000000000","message":"I was thinking the same to have another parameter to specify the path.","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"}],"setup.cfg":[{"author":{"_account_id":1689,"name":"Robert Kukura","email":"rk@theep.net","username":"rkukura"},"change_message_id":"4572592287839271c12e548b13241510e61feb04","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    neutron.openstack.common.notifier.rpc_notifier2 \u003d oslo.messaging.notify._impl_messaging:MessagingV2Driver"},{"line_number":184,"context_line":"    neutron.openstack.common.notifier.rpc_notifier \u003d oslo.messaging.notify._impl_messaging:MessagingDriver"},{"line_number":185,"context_line":"    neutron.openstack.common.notifier.test_notifier \u003d oslo.messaging.notify._impl_test:TestDriver"},{"line_number":186,"context_line":"neutron.ml2.extension_drivers \u003d"},{"line_number":187,"context_line":"    test \u003d neutron.tests.unit.ml2.test_extension_driver_api:TestExtensionDriver"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""}],"source_content_type":"text/x-ttcn-cfg","patch_set":20,"id":"1abeadc6_afa34dfe","line":186,"updated":"2014-08-29 15:08:12.000000000","message":"Please move this up to right after the neutron.ml2.mechanism_drivers so all the ml2 driver entrypoints are together.","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"},{"author":{"_account_id":10393,"name":"nlahouti","email":"nader.lahouti@gmail.com","username":"nlahouti"},"change_message_id":"a329abf6850d2787d09bca4491c47a9238c1cf89","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    neutron.openstack.common.notifier.rpc_notifier2 \u003d oslo.messaging.notify._impl_messaging:MessagingV2Driver"},{"line_number":184,"context_line":"    neutron.openstack.common.notifier.rpc_notifier \u003d oslo.messaging.notify._impl_messaging:MessagingDriver"},{"line_number":185,"context_line":"    neutron.openstack.common.notifier.test_notifier \u003d oslo.messaging.notify._impl_test:TestDriver"},{"line_number":186,"context_line":"neutron.ml2.extension_drivers \u003d"},{"line_number":187,"context_line":"    test \u003d neutron.tests.unit.ml2.test_extension_driver_api:TestExtensionDriver"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""}],"source_content_type":"text/x-ttcn-cfg","patch_set":20,"id":"1abeadc6_6fa3f5b1","line":186,"in_reply_to":"1abeadc6_afa34dfe","updated":"2014-08-29 16:34:50.000000000","message":"Done","commit_id":"b5b305713c070dc95c5fb3ee1a0920efebd85f09"}]}
