)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1a315cb05bfeb74b58fb0ddc88c6d7df6e8f859d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"808446ba_dd6ba234","updated":"2026-05-28 18:01:13.000000000","message":"We need to add some kind of test to neutron/tests/common/test_db_base_plugin_v2.py so we know this works","commit_id":"1595ef32a7c27a258e19a1ed286c1d46d216eec1"},{"author":{"_account_id":36760,"name":"Jimin Shin","display_name":"Jimin Shin","email":"jimin3.shin@samsung.com","username":"Jimin"},"change_message_id":"82cacc1b2a51fcb384a43ac4448af39170da2608","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"036b4d53_039f5fc3","in_reply_to":"808446ba_dd6ba234","updated":"2026-05-29 12:05:53.000000000","message":"I added some tests! Thank you!","commit_id":"1595ef32a7c27a258e19a1ed286c1d46d216eec1"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"94f1e00179621754e0ec16e7c05a6a190695aaff","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ce03fefd_28822689","updated":"2026-06-02 14:14:23.000000000","message":"what happens with the already in the db unsanitized mac addresses ? have you tried that path like after an upgrade?","commit_id":"e1e02a2b88a5eaf279c4e7b6cd7892a3d4c788f3"},{"author":{"_account_id":36760,"name":"Jimin Shin","display_name":"Jimin Shin","email":"jimin3.shin@samsung.com","username":"Jimin"},"change_message_id":"f169d27d82665d1486b9a27be3044c35dd59558c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e022f3f1_4af8e402","in_reply_to":"ce03fefd_28822689","updated":"2026-06-08 05:51:20.000000000","message":"Already‑unsanitized MAC addresses remain unsanitized unless the `neutron‑sanitize‑port‑mac‑addresses` CLI script[1] is executed or the port’s MAC address is updated.  \n\nIf the MAC address of an unsanitized port is updated — regardless of whether it is written with “‑” or “:” separators — the address becomes sanitized.\nWhen other port attributes (e.g., the description) are updated, the MAC address stays unsanitized.\n\nI’ve added this description to the commit message. Thank you!\n\n[1] https://opendev.org/openstack/neutron/src/branch/master/neutron/cmd/sanitize_port_mac_addresses.py","commit_id":"e1e02a2b88a5eaf279c4e7b6cd7892a3d4c788f3"},{"author":{"_account_id":36760,"name":"Jimin Shin","display_name":"Jimin Shin","email":"jimin3.shin@samsung.com","username":"Jimin"},"change_message_id":"73e65a78747a4cbdf1f3b54116b68facf052ca42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c976088d_0258c601","updated":"2026-07-23 13:27:14.000000000","message":"I submitted a change to neutron-lib. Thank you!","commit_id":"b9f8966a471dabb0d2117f9862b72e1d0aec631b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"62b6df7adbb7b9214921ed0a6d92ba7d2601cdd2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fa335c75_f863a0b9","updated":"2026-06-08 09:12:01.000000000","message":"This kind of API handling should be done in the API itself definition.\n\nThe problem now is that the API is not enforcing the mac_address `convert_to` field. That happens because [1] is overwritten by [2]. So here we need to fix `convert_to_mac_if_none` and enforce the mac formatting from this method too.\n\n[1]https://github.com/openstack/neutron-lib/blob/52bbe05b1359c0b6982de4603827c760774d7283/neutron_lib/api/definitions/port.py#L59\n[2]https://review.opendev.org/c/openstack/neutron-lib/+/565931","commit_id":"b9f8966a471dabb0d2117f9862b72e1d0aec631b"},{"author":{"_account_id":36760,"name":"Jimin Shin","display_name":"Jimin Shin","email":"jimin3.shin@samsung.com","username":"Jimin"},"change_message_id":"788eeb52f6e7b03cf646f567f3ac357c8e30f138","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"09879257_2ebb76be","in_reply_to":"c976088d_0258c601","updated":"2026-07-23 13:28:36.000000000","message":"Here\u0027s the review: https://review.opendev.org/c/openstack/neutron-lib/+/998473","commit_id":"b9f8966a471dabb0d2117f9862b72e1d0aec631b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"1c8c84a66b7be313a60c05a50ace4a01d7560efe","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4bb6f225_f0c08e66","in_reply_to":"dd568e2d_88f78a06","updated":"2026-06-22 09:43:20.000000000","message":"+1 for api validator/converter fix","commit_id":"b9f8966a471dabb0d2117f9862b72e1d0aec631b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"57483e187eda03a99f762bef6aa2823b29139045","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"dd568e2d_88f78a06","in_reply_to":"fa335c75_f863a0b9","updated":"2026-06-22 08:50:21.000000000","message":"I agree, we should fix this in the neutron-lib and make sure that correct converter is used always for that API parameter","commit_id":"b9f8966a471dabb0d2117f9862b72e1d0aec631b"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1a315cb05bfeb74b58fb0ddc88c6d7df6e8f859d","unresolved":true,"context_lines":[{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1630,"context_line":"            db_port \u003d db_port or self._get_port(context, id)"},{"line_number":1631,"context_line":"            new_mac \u003d new_port.get(\u0027mac_address\u0027)"},{"line_number":1632,"context_line":"            if new_mac:"},{"line_number":1633,"context_line":"                new_mac \u003d converters.convert_to_sanitized_mac_address(new_mac)"},{"line_number":1634,"context_line":"                new_port[\u0027mac_address\u0027] \u003d new_mac"},{"line_number":1635,"context_line":"            self._validate_port_for_update(context, db_port, new_port, new_mac)"},{"line_number":1636,"context_line":"            # Note: _make_port_dict is called here to load extension data"},{"line_number":1637,"context_line":"            # (specifically host binding).  The IPAM plugin is separate from"}],"source_content_type":"text/x-python","patch_set":1,"id":"ed72ee70_182ecfbc","line":1634,"range":{"start_line":1631,"start_character":12,"end_line":1634,"end_character":49},"updated":"2026-05-28 18:01:13.000000000","message":"nit: I guess this whole block could be outside the write context, right after new_port is initialized.","commit_id":"1595ef32a7c27a258e19a1ed286c1d46d216eec1"},{"author":{"_account_id":36760,"name":"Jimin Shin","display_name":"Jimin Shin","email":"jimin3.shin@samsung.com","username":"Jimin"},"change_message_id":"82cacc1b2a51fcb384a43ac4448af39170da2608","unresolved":true,"context_lines":[{"line_number":1628,"context_line":""},{"line_number":1629,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1630,"context_line":"            db_port \u003d db_port or self._get_port(context, id)"},{"line_number":1631,"context_line":"            new_mac \u003d new_port.get(\u0027mac_address\u0027)"},{"line_number":1632,"context_line":"            if new_mac:"},{"line_number":1633,"context_line":"                new_mac \u003d converters.convert_to_sanitized_mac_address(new_mac)"},{"line_number":1634,"context_line":"                new_port[\u0027mac_address\u0027] \u003d new_mac"},{"line_number":1635,"context_line":"            self._validate_port_for_update(context, db_port, new_port, new_mac)"},{"line_number":1636,"context_line":"            # Note: _make_port_dict is called here to load extension data"},{"line_number":1637,"context_line":"            # (specifically host binding).  The IPAM plugin is separate from"}],"source_content_type":"text/x-python","patch_set":1,"id":"666c7184_7d90042c","line":1634,"range":{"start_line":1631,"start_character":12,"end_line":1634,"end_character":49},"in_reply_to":"ed72ee70_182ecfbc","updated":"2026-05-29 12:05:53.000000000","message":"I moved the code block!","commit_id":"1595ef32a7c27a258e19a1ed286c1d46d216eec1"}]}
