)]}'
{"neutron/extensions/_tag_ports_during_bulk_creation.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"83dc8af2a6b780aea056b7698bffa704342e578a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"TODO(mlavalle): This module should be deleted once neutron-lib containing"},{"line_number":18,"context_line":"https://review.opendev.org/#/c/700754/ change is released."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_6657ee28","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":58},"updated":"2020-01-28 13:49:54.000000000","message":"The neutron-lib part got into 2.0.0, didn\u0027t it?","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"868d1a1613c1c8ec3364cb08904867caf1ce0959","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"TODO(mlavalle): This module should be deleted once neutron-lib containing"},{"line_number":18,"context_line":"https://review.opendev.org/#/c/700754/ change is released."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_c74c9976","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":58},"in_reply_to":"3fa7e38b_6657ee28","updated":"2020-01-28 17:13:27.000000000","message":"It does: https://github.com/openstack/neutron-lib/blob/2.0.0/neutron_lib/api/definitions/tag_ports_during_bulk_creation.py","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"3ed153732604823ed9a87ec67b1198dfbb010e63","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"\"\"\""},{"line_number":17,"context_line":"TODO(mlavalle): This module should be deleted once neutron-lib containing"},{"line_number":18,"context_line":"https://review.opendev.org/#/c/700754/ change is released."},{"line_number":19,"context_line":"\"\"\""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_3124c30d","line":18,"range":{"start_line":17,"start_character":0,"end_line":18,"end_character":58},"in_reply_to":"3fa7e38b_c74c9976","updated":"2020-01-29 00:16:44.000000000","message":"Module was removed","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"}],"neutron/extensions/tagging.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"efc46b7541a539d13e9cdfbb70f3579ca2d6a4a1","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    NOT_TAGS_ANY: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                   \u0027is_visible\u0027: False, \u0027is_filter\u0027: True},"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":"TAG_ATTRIBUTE_MAP_PORTS \u003d {"},{"line_number":53,"context_line":"    TAGS: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":54,"context_line":"           \u0027validate\u0027: {\u0027type:list_of_unique_strings\u0027: MAX_TAG_LEN},"},{"line_number":55,"context_line":"           \u0027default\u0027: [], \u0027is_visible\u0027: True, \u0027is_filter\u0027: True},"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_8e2fd83c","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":23},"updated":"2020-01-06 12:23:37.000000000","message":"Your plan is to have as many tag_attribute_map as many resources have the possibility for bulk tagged creation?\nIf yes that seems to be a lot of code duplication.\n\nSo perhaps\nTAG_ATTRIBUTE_MAP_PORTS \u003d TAG_ATTRIBUTE_MAP\nTAG_ATTRIBUTE_MAP_PORTS[\u0027TAGS\u0027] \u003d {....}\n\nThat should make the introduction of this feature for next resources (nets, subnets??) simpler as I see:\nTAG_ATTRIBUTE_MAP_NETS \u003d TAG_ATTRIBUTE_MAP_PORTS","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fa7f757d60a017afc70d1c2a54f8bcafa4969a88","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    NOT_TAGS_ANY: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                   \u0027is_visible\u0027: False, \u0027is_filter\u0027: True},"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":"TAG_ATTRIBUTE_MAP_PORTS \u003d {"},{"line_number":53,"context_line":"    TAGS: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":54,"context_line":"           \u0027validate\u0027: {\u0027type:list_of_unique_strings\u0027: MAX_TAG_LEN},"},{"line_number":55,"context_line":"           \u0027default\u0027: [], \u0027is_visible\u0027: True, \u0027is_filter\u0027: True},"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_d89bfd62","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":23},"in_reply_to":"3fa7e38b_8e2fd83c","updated":"2020-01-12 22:50:11.000000000","message":"No, this is being implemented specifically to support port bulk creation, as requested by the kuryr team in this RFE: https://bugs.launchpad.net/neutron/+bug/1815933. There are no plans to support other resources. Having said that, there is no reason not to optimize the code a little bit along the lines you suggest. Done","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"13139a133457cd95fc2325c99b6beab8c06710a0","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    NOT_TAGS_ANY: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                   \u0027is_visible\u0027: False, \u0027is_filter\u0027: True},"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":"TAG_ATTRIBUTE_MAP_PORTS \u003d {"},{"line_number":53,"context_line":"    TAGS: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":54,"context_line":"           \u0027validate\u0027: {\u0027type:list_of_unique_strings\u0027: MAX_TAG_LEN},"},{"line_number":55,"context_line":"           \u0027default\u0027: [], \u0027is_visible\u0027: True, \u0027is_filter\u0027: True},"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_2cd43ebc","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":23},"in_reply_to":"3fa7e38b_d89bfd62","updated":"2020-01-14 13:25:09.000000000","message":"ack","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"868d1a1613c1c8ec3364cb08904867caf1ce0959","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    NOT_TAGS_ANY: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                   \u0027is_visible\u0027: False, \u0027is_filter\u0027: True},"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":"TAG_ATTRIBUTE_MAP_PORTS \u003d TAG_ATTRIBUTE_MAP"},{"line_number":53,"context_line":"TAG_ATTRIBUTE_MAP_PORTS[TAGS] \u003d {"},{"line_number":54,"context_line":"        \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":55,"context_line":"        \u0027validate\u0027: {\u0027type:list_of_unique_strings\u0027: MAX_TAG_LEN},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_c7833954","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":43},"updated":"2020-01-28 17:13:27.000000000","message":"Be careful: we are NOT making a copy of TAG_ATTRIBUTE_MAP, just creating a new reference. L53 is modifying TAG_ATTRIBUTE_MAP too.","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"3ed153732604823ed9a87ec67b1198dfbb010e63","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    NOT_TAGS_ANY: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":50,"context_line":"                   \u0027is_visible\u0027: False, \u0027is_filter\u0027: True},"},{"line_number":51,"context_line":"}"},{"line_number":52,"context_line":"TAG_ATTRIBUTE_MAP_PORTS \u003d TAG_ATTRIBUTE_MAP"},{"line_number":53,"context_line":"TAG_ATTRIBUTE_MAP_PORTS[TAGS] \u003d {"},{"line_number":54,"context_line":"        \u0027allow_post\u0027: True, \u0027allow_put\u0027: False,"},{"line_number":55,"context_line":"        \u0027validate\u0027: {\u0027type:list_of_unique_strings\u0027: MAX_TAG_LEN},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_d161af39","line":52,"range":{"start_line":52,"start_character":0,"end_line":52,"end_character":43},"in_reply_to":"3fa7e38b_c7833954","updated":"2020-01-29 00:16:44.000000000","message":"Done","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"}],"neutron/plugins/ml2/extensions/tag_ports_during_bulk_creation.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"075ec6c1c8f897226f2ac2fda7227fd36ebde84f","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TagPortsDuringBulkCreationExtensionDriver(api.ExtensionDriver):"},{"line_number":27,"context_line":"    _supported_extension_alias \u003d apidef.ALIAS"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_bc4e79bf","line":26,"updated":"2020-01-07 15:16:25.000000000","message":"We\u0027ll need an initialize method, even if it does nothing:\n\nERROR stevedore.extension [None req-446af0ad-cc35-4981-a5fd-a3c2f2a5255b None None] Could not load \u0027tag_ports_during_bulk_creation\u0027: Can\u0027t instantiate abstract class TagPortsDuringBulkCreationExtensionDriver with abstract methods initialize","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fa7f757d60a017afc70d1c2a54f8bcafa4969a88","unresolved":false,"context_lines":[{"line_number":23,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TagPortsDuringBulkCreationExtensionDriver(api.ExtensionDriver):"},{"line_number":27,"context_line":"    _supported_extension_alias \u003d apidef.ALIAS"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_f8983968","line":26,"in_reply_to":"3fa7e38b_bc4e79bf","updated":"2020-01-12 22:50:11.000000000","message":"I forgot to mark this patch as WIP. Yes, my plan was to add the initialize method, just ran out of time the day I pushed the current revision. Done","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"efc46b7541a539d13e9cdfbb70f3579ca2d6a4a1","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        tags \u003d request_data.get(\u0027tags\u0027)"},{"line_number":41,"context_line":"        if not (self.tag_plugin and tags):"},{"line_number":42,"context_line":"            return"},{"line_number":43,"context_line":"        self.tag_plugin.add_tags(plugin_context, db_data.standard_attr_id,"},{"line_number":44,"context_line":"                                 tags)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_ceadd0e7","line":43,"range":{"start_line":43,"start_character":24,"end_line":43,"end_character":32},"updated":"2020-01-06 12:23:37.000000000","message":"As I see the original update_tags method in tag_plugin was decorated with @db_api.retry_if_session_inactive and with @log_helpers.log_method_call.\nThe retry_if_session_inactive is ok here coming from create_port, but the log_method_call is missing.\n\nIs it possible to add here the log_method_call decorator? to have the same logging as for all other tag operations?","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fa7f757d60a017afc70d1c2a54f8bcafa4969a88","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        tags \u003d request_data.get(\u0027tags\u0027)"},{"line_number":41,"context_line":"        if not (self.tag_plugin and tags):"},{"line_number":42,"context_line":"            return"},{"line_number":43,"context_line":"        self.tag_plugin.add_tags(plugin_context, db_data.standard_attr_id,"},{"line_number":44,"context_line":"                                 tags)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_98a585a3","line":43,"range":{"start_line":43,"start_character":24,"end_line":43,"end_character":32},"in_reply_to":"3fa7e38b_ceadd0e7","updated":"2020-01-12 22:50:11.000000000","message":"Done","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"83dc8af2a6b780aea056b7698bffa704342e578a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return self._plugin"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @log_helpers.log_method_call"},{"line_number":51,"context_line":"    def process_create_port(self, plugin_context, request_data, db_data):"},{"line_number":52,"context_line":"        tags \u003d request_data.get(\u0027tags\u0027)"},{"line_number":53,"context_line":"        if not (self.tag_plugin and tags):"},{"line_number":54,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_c986f516","line":51,"range":{"start_line":51,"start_character":64,"end_line":51,"end_character":71},"updated":"2020-01-28 13:49:54.000000000","message":"IIRC at some point in the past we called this \u0027result\u0027 because it was an input-output parameter. The ovo stuff done in add_tags() works for me in simple cases. But I\u0027m wondering if we need to modify this parameter in place. For example if multiple extensions had been processing the same port, later extensions would not see the tags added in db_data. Is this parameter supposed to be modified or are all extensions expected to ignore db_data and re-query their port data from the db?","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"3ed153732604823ed9a87ec67b1198dfbb010e63","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return self._plugin"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @log_helpers.log_method_call"},{"line_number":51,"context_line":"    def process_create_port(self, plugin_context, request_data, db_data):"},{"line_number":52,"context_line":"        tags \u003d request_data.get(\u0027tags\u0027)"},{"line_number":53,"context_line":"        if not (self.tag_plugin and tags):"},{"line_number":54,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_d1ef6f83","line":51,"range":{"start_line":51,"start_character":64,"end_line":51,"end_character":71},"in_reply_to":"3fa7e38b_c986f516","updated":"2020-01-29 00:16:44.000000000","message":"No. This argument is the dictionary representation of the db object that was added to the DB by the plugin. I have implemented several ML2 extensions and have never extended this dictionary directly. Besides, one extension shouldn\u0027t be making assumptions about what other extensions did before it. An extension shouldn\u0027t make assumptions about what other extensions are configured and / or in what order they are called. That would lead to non-deterministic behavior","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"4a7e664b66a0da7e862b7c2e99f3267ae0c9033f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        return self._plugin"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @log_helpers.log_method_call"},{"line_number":51,"context_line":"    def process_create_port(self, plugin_context, request_data, db_data):"},{"line_number":52,"context_line":"        tags \u003d request_data.get(\u0027tags\u0027)"},{"line_number":53,"context_line":"        if not (self.tag_plugin and tags):"},{"line_number":54,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":12,"id":"3fa7e38b_a19a9ec0","line":51,"range":{"start_line":51,"start_character":64,"end_line":51,"end_character":71},"in_reply_to":"3fa7e38b_d1ef6f83","updated":"2020-01-29 11:52:48.000000000","message":"Ack.","commit_id":"aa741b8dc66ccc0789a4c23b133938fe9b75962b"}],"neutron/tests/unit/plugins/ml2/extensions/test_tag_ports_during_bulk_creation.py":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"075ec6c1c8f897226f2ac2fda7227fd36ebde84f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            ports \u003d [copy.deepcopy(port) for x in range(num_ports)]"},{"line_number":45,"context_line":"            ports[0][\u0027port\u0027][\u0027tags\u0027] \u003d [\u0027tag-1\u0027, \u0027tag-2\u0027, \u0027tag-3\u0027]"},{"line_number":46,"context_line":"            ports[1][\u0027port\u0027][\u0027tags\u0027] \u003d [\u0027tag-1\u0027, \u0027tag-2\u0027]"},{"line_number":47,"context_line":"            ports[2][\u0027port\u0027][\u0027tags\u0027] \u003d [\u0027tag-1\u0027, \u0027tag-3\u0027]"},{"line_number":48,"context_line":"            req_body \u003d {\u0027ports\u0027: ports}"},{"line_number":49,"context_line":"            ports_req \u003d self.new_create_request(\u0027ports\u0027, req_body)"},{"line_number":50,"context_line":"            res \u003d ports_req.get_response(self.api)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_fc10715a","line":47,"updated":"2020-01-07 15:16:25.000000000","message":"It may make sense to also cover the corner case of a port with an empty tag list.","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fa7f757d60a017afc70d1c2a54f8bcafa4969a88","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            ports \u003d [copy.deepcopy(port) for x in range(num_ports)]"},{"line_number":45,"context_line":"            ports[0][\u0027port\u0027][\u0027tags\u0027] \u003d [\u0027tag-1\u0027, \u0027tag-2\u0027, \u0027tag-3\u0027]"},{"line_number":46,"context_line":"            ports[1][\u0027port\u0027][\u0027tags\u0027] \u003d [\u0027tag-1\u0027, \u0027tag-2\u0027]"},{"line_number":47,"context_line":"            ports[2][\u0027port\u0027][\u0027tags\u0027] \u003d [\u0027tag-1\u0027, \u0027tag-3\u0027]"},{"line_number":48,"context_line":"            req_body \u003d {\u0027ports\u0027: ports}"},{"line_number":49,"context_line":"            ports_req \u003d self.new_create_request(\u0027ports\u0027, req_body)"},{"line_number":50,"context_line":"            res \u003d ports_req.get_response(self.api)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_18abd571","line":47,"in_reply_to":"3fa7e38b_fc10715a","updated":"2020-01-12 22:50:11.000000000","message":"Done. I added the and empty list of tags to this test case and then I added a second test case where tags are not passed in the request","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"}],"setup.cfg":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"075ec6c1c8f897226f2ac2fda7227fd36ebde84f","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    data_plane_status \u003d neutron.plugins.ml2.extensions.data_plane_status:DataPlaneStatusExtensionDriver"},{"line_number":109,"context_line":"    dns_domain_ports \u003d neutron.plugins.ml2.extensions.dns_integration:DNSDomainPortsExtensionDriver"},{"line_number":110,"context_line":"    uplink_status_propagation \u003d neutron.plugins.ml2.extensions.uplink_status_propagation:UplinkStatusPropagationExtensionDriver"},{"line_number":111,"context_line":"    tag_ports_during_bulk_creation \u003d neutron.plugins.ml2.extensions.tag_ports_during_bulk_creation:TagPortsDuringBulkCreationExtensionDriver"},{"line_number":112,"context_line":"    subnet_dns_publish_fixed_ip \u003d neutron.plugins.ml2.extensions.subnet_dns_publish_fixed_ip:SubnetDNSPublishFixedIPExtensionDriver"},{"line_number":113,"context_line":"neutron.ipam_drivers \u003d"},{"line_number":114,"context_line":"    fake \u003d neutron.tests.unit.ipam.fake_driver:FakeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":6,"id":"3fa7e38b_bc8199a2","line":111,"range":{"start_line":111,"start_character":21,"end_line":111,"end_character":25},"updated":"2020-01-07 15:16:25.000000000","message":"Since this is implemented as an ML2 extension driver it should work the same way for single *and* bulk port create, right? This naming may make the user expect it to work for bulk create only.","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"8eab1b420a6b3bec39f721f67da35b4382df58b7","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    data_plane_status \u003d neutron.plugins.ml2.extensions.data_plane_status:DataPlaneStatusExtensionDriver"},{"line_number":109,"context_line":"    dns_domain_ports \u003d neutron.plugins.ml2.extensions.dns_integration:DNSDomainPortsExtensionDriver"},{"line_number":110,"context_line":"    uplink_status_propagation \u003d neutron.plugins.ml2.extensions.uplink_status_propagation:UplinkStatusPropagationExtensionDriver"},{"line_number":111,"context_line":"    tag_ports_during_bulk_creation \u003d neutron.plugins.ml2.extensions.tag_ports_during_bulk_creation:TagPortsDuringBulkCreationExtensionDriver"},{"line_number":112,"context_line":"    subnet_dns_publish_fixed_ip \u003d neutron.plugins.ml2.extensions.subnet_dns_publish_fixed_ip:SubnetDNSPublishFixedIPExtensionDriver"},{"line_number":113,"context_line":"neutron.ipam_drivers \u003d"},{"line_number":114,"context_line":"    fake \u003d neutron.tests.unit.ipam.fake_driver:FakeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":6,"id":"3fa7e38b_d766a3ee","line":111,"range":{"start_line":111,"start_character":21,"end_line":111,"end_character":25},"in_reply_to":"3fa7e38b_4ffe3305","updated":"2020-01-27 01:53:49.000000000","message":"During port creation in bulk, the ML2 plugin is passing a db object to the extension for the resource that has to be extended: https://github.com/openstack/neutron/blob/7d5bb6d03048f8bff17d82ee08e779d2f5e6dcff/neutron/plugins/ml2/plugin.py#L1534. However, the API definition specifies a dictionary: https://github.com/openstack/neutron-lib/blob/478502b3dfb8c3ff66318169377251826563a398/neutron_lib/plugins/ml2/api.py#L1142. So, when we try to use this new extension with single port create, which is compliant with the API definition, we get this error. I have made the port create in bulk code compliant with the API (https://review.opendev.org/#/c/704240/) and adjusted this patch accordingly","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"fa7f757d60a017afc70d1c2a54f8bcafa4969a88","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    data_plane_status \u003d neutron.plugins.ml2.extensions.data_plane_status:DataPlaneStatusExtensionDriver"},{"line_number":109,"context_line":"    dns_domain_ports \u003d neutron.plugins.ml2.extensions.dns_integration:DNSDomainPortsExtensionDriver"},{"line_number":110,"context_line":"    uplink_status_propagation \u003d neutron.plugins.ml2.extensions.uplink_status_propagation:UplinkStatusPropagationExtensionDriver"},{"line_number":111,"context_line":"    tag_ports_during_bulk_creation \u003d neutron.plugins.ml2.extensions.tag_ports_during_bulk_creation:TagPortsDuringBulkCreationExtensionDriver"},{"line_number":112,"context_line":"    subnet_dns_publish_fixed_ip \u003d neutron.plugins.ml2.extensions.subnet_dns_publish_fixed_ip:SubnetDNSPublishFixedIPExtensionDriver"},{"line_number":113,"context_line":"neutron.ipam_drivers \u003d"},{"line_number":114,"context_line":"    fake \u003d neutron.tests.unit.ipam.fake_driver:FakeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":6,"id":"3fa7e38b_d8c45d45","line":111,"range":{"start_line":111,"start_character":21,"end_line":111,"end_character":25},"in_reply_to":"3fa7e38b_bc8199a2","updated":"2020-01-12 22:50:11.000000000","message":"The intended user of this is the port bulk creation and if we change the name your argument then applies to that user. Let\u0027s address the concern in the release note and the documentation, given that the tagging during single port creation is really a side effect","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"3d025ca41a2c9f928fc415cba45ad04ade0d2dd7","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    data_plane_status \u003d neutron.plugins.ml2.extensions.data_plane_status:DataPlaneStatusExtensionDriver"},{"line_number":109,"context_line":"    dns_domain_ports \u003d neutron.plugins.ml2.extensions.dns_integration:DNSDomainPortsExtensionDriver"},{"line_number":110,"context_line":"    uplink_status_propagation \u003d neutron.plugins.ml2.extensions.uplink_status_propagation:UplinkStatusPropagationExtensionDriver"},{"line_number":111,"context_line":"    tag_ports_during_bulk_creation \u003d neutron.plugins.ml2.extensions.tag_ports_during_bulk_creation:TagPortsDuringBulkCreationExtensionDriver"},{"line_number":112,"context_line":"    subnet_dns_publish_fixed_ip \u003d neutron.plugins.ml2.extensions.subnet_dns_publish_fixed_ip:SubnetDNSPublishFixedIPExtensionDriver"},{"line_number":113,"context_line":"neutron.ipam_drivers \u003d"},{"line_number":114,"context_line":"    fake \u003d neutron.tests.unit.ipam.fake_driver:FakeDriver"}],"source_content_type":"text/x-ttcn-cfg","patch_set":6,"id":"3fa7e38b_4ffe3305","line":111,"range":{"start_line":111,"start_character":21,"end_line":111,"end_character":25},"in_reply_to":"3fa7e38b_d8c45d45","updated":"2020-01-15 13:32:01.000000000","message":"Ack, I understand the primary use case is the bulk creation. However the single create with a tag produces an internal server error, which may not be what you intended:\n\necho \"{\\\"port\\\": {\\\"network_id\\\": \\\"$NET\\\", \\\"name\\\": \\\"port10\\\", \\\"tags\\\": [\\\"foo\\\"]}}\" | curl -s -d @- -H \"Accept: application/json\" -H \"Content-Type: application/json\" -H \"X-Auth-Token: $TOKEN\" -X POST \"http://127.0.0.1:9696/v2.0/ports\" | json_pp\n\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/opt/stack/neutron/neutron/plugins/ml2/plugin.py\", line 1410, in create_port\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     result, mech_context \u003d self._create_port_db(context, port)\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/opt/stack/neutron/neutron/plugins/ml2/plugin.py\", line 1379, in _create_port_db\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     self.extension_manager.process_create_port(context, attrs, result)\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/opt/stack/neutron/neutron/plugins/ml2/managers.py\", line 1142, in process_create_port\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     data, result)\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/opt/stack/neutron/neutron/plugins/ml2/managers.py\", line 1117, in _call_on_ext_drivers\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     {\u0027name\u0027: driver.name, \u0027method\u0027: method_name})\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/usr/local/lib/python3.6/dist-packages/oslo_utils/excutils.py\", line 220, in __exit__\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     self.force_reraise()\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/usr/local/lib/python3.6/dist-packages/oslo_utils/excutils.py\", line 196, in force_reraise\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     six.reraise(self.type_, self.value, self.tb)\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/usr/local/lib/python3.6/dist-packages/six.py\", line 696, in reraise\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     raise value\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/opt/stack/neutron/neutron/plugins/ml2/managers.py\", line 1112, in _call_on_ext_drivers\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     getattr(driver.obj, method_name)(plugin_context, data, result)\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/usr/local/lib/python3.6/dist-packages/oslo_log/helpers.py\", line 67, in wrapper\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     return method(*args, **kwargs)\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation   File \"/opt/stack/neutron/neutron/plugins/ml2/extensions/tag_ports_during_bulk_creation.py\", line 49, in process_create_port\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation     self.tag_plugin.add_tags(plugin_context, db_data.standard_attr_id,\njan 15 13:24:52 devstack0 neutron-server[4137]: ERROR neutron.pecan_wsgi.hooks.translation AttributeError: \u0027dict\u0027 object has no attribute \u0027standard_attr_id\u0027","commit_id":"31839fb315e93b2986322aec2d7effbe6ea220b1"}]}
