)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6dddfe55f06a6a6a7b7ebe637eb441a89ed3eadb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4040dd78_fb2ccd4c","updated":"2026-01-26 21:25:43.000000000","message":"good idea. thanks for doing it","commit_id":"85a67b3f0268c361cd900f32f62d5f363f774a37"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"266c8be021070d4050ea018a67bede35db8d6ae8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6eaf4c08_bc5e9a57","updated":"2026-01-28 18:34:51.000000000","message":"one nit. LGTM","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"76f35324d1639003518c35cf826e39c352a42a2f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9f59c84b_c9e4ef6d","updated":"2026-01-29 15:27:14.000000000","message":"recheck neutron-functional known issue","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"7ac04496a8abf92f8c33766f10d524c5de2baf86","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"88599d1e_fc4b6473","updated":"2026-01-28 16:34:50.000000000","message":"recheck pep8 job timed out","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"223dd8c329cf0b65cf9c7c4832e5fa6b158a7f8e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"eba5e1d8_64929588","updated":"2026-01-29 18:36:04.000000000","message":"recheck unrelated unittest failure","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"}],"neutron/agent/ovn/metadata/agent.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"266c8be021070d4050ea018a67bede35db8d6ae8","unresolved":true,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        # First entry of the mac field must be the MAC address."},{"line_number":717,"context_line":"        try:"},{"line_number":718,"context_line":"            mac, ips \u003d ovn_utils.get_mac_and_ips_from_port_binding("},{"line_number":719,"context_line":"                metadata_port)"},{"line_number":720,"context_line":"        except ValueError:"},{"line_number":721,"context_line":"            LOG.error(\"Metadata port for network %s doesn\u0027t have a MAC \""}],"source_content_type":"text/x-python","patch_set":6,"id":"c980ccf3_c6e6791c","line":718,"range":{"start_line":718,"start_character":17,"end_line":718,"end_character":20},"updated":"2026-01-28 18:34:51.000000000","message":"nit(if pushing new update) use `_` since `ips` is not used.","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"304fa160bc49d473b7d9b8de343c841ab4c5db82","unresolved":true,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        # First entry of the mac field must be the MAC address."},{"line_number":717,"context_line":"        try:"},{"line_number":718,"context_line":"            mac, ips \u003d ovn_utils.get_mac_and_ips_from_port_binding("},{"line_number":719,"context_line":"                metadata_port)"},{"line_number":720,"context_line":"        except ValueError:"},{"line_number":721,"context_line":"            LOG.error(\"Metadata port for network %s doesn\u0027t have a MAC \""}],"source_content_type":"text/x-python","patch_set":6,"id":"ee3dde54_49dd3d0f","line":718,"range":{"start_line":718,"start_character":17,"end_line":718,"end_character":20},"in_reply_to":"c980ccf3_c6e6791c","updated":"2026-01-28 22:03:25.000000000","message":"It is a good practice to avoid using `_` in openstack codebase because `_()` is a function used for text localization.","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"1cbe2b20ee0fd4730cdf10591e63f9436d446184","unresolved":false,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        # First entry of the mac field must be the MAC address."},{"line_number":717,"context_line":"        try:"},{"line_number":718,"context_line":"            mac, ips \u003d ovn_utils.get_mac_and_ips_from_port_binding("},{"line_number":719,"context_line":"                metadata_port)"},{"line_number":720,"context_line":"        except ValueError:"},{"line_number":721,"context_line":"            LOG.error(\"Metadata port for network %s doesn\u0027t have a MAC \""}],"source_content_type":"text/x-python","patch_set":6,"id":"ee2f71c9_88f3634d","line":718,"range":{"start_line":718,"start_character":17,"end_line":718,"end_character":20},"in_reply_to":"ee3dde54_49dd3d0f","updated":"2026-01-29 01:59:39.000000000","message":"Acknowledged","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"}],"neutron/common/ovn/utils.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d6a8a6a6cbc3a0a07941503858a6a6856e9d5946","unresolved":false,"context_lines":[{"line_number":1508,"context_line":"        mac_list \u003d port_binding.mac[0].split(\u0027 \u0027)"},{"line_number":1509,"context_line":"        mac \u003d mac_list[0]"},{"line_number":1510,"context_line":"    except IndexError:"},{"line_number":1511,"context_line":"        raise ValueError(\"mac column is empty\")"},{"line_number":1512,"context_line":"    match \u003d MAC_PATTERN.match(mac)"},{"line_number":1513,"context_line":"    if not match:"},{"line_number":1514,"context_line":"        raise ValueError(\"Invalid MAC address: %s\", mac)"}],"source_content_type":"text/x-python","patch_set":3,"id":"df2567eb_4e9aa16b","line":1511,"in_reply_to":"a0f09ef7_e2ef0ff2","updated":"2026-01-26 22:40:57.000000000","message":"\u003e pep8: N534: Untranslated exception message.\n\nDone","commit_id":"85a67b3f0268c361cd900f32f62d5f363f774a37"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d6a8a6a6cbc3a0a07941503858a6a6856e9d5946","unresolved":false,"context_lines":[{"line_number":1511,"context_line":"        raise ValueError(\"mac column is empty\")"},{"line_number":1512,"context_line":"    match \u003d MAC_PATTERN.match(mac)"},{"line_number":1513,"context_line":"    if not match:"},{"line_number":1514,"context_line":"        raise ValueError(\"Invalid MAC address: %s\", mac)"},{"line_number":1515,"context_line":"    return mac, mac_list[1:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"830d1f51_1c46d409","line":1514,"in_reply_to":"347e3a96_4101d305","updated":"2026-01-26 22:40:57.000000000","message":"\u003e pep8: N534: Untranslated exception message.\n\nDone","commit_id":"85a67b3f0268c361cd900f32f62d5f363f774a37"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"411fe27b3a25a76fc90695984274119284b5ab47","unresolved":true,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"_OVS_PERSIST_UUID \u003d _SENTINEL \u003d object()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"MAC_PATTERN \u003d re.compile(r\u0027([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$\u0027, re.I)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class HAChassisGroupInfo:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ebe91ef0_62ebc443","line":70,"updated":"2026-01-27 13:02:20.000000000","message":"just nitty nit: maybe using re.IGNORECASE instead of re.I would be easier to understand by the readers in future, wdyt?","commit_id":"9c8ff63cbe537a6668635253cc4b746a46e3172a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4481414d059527504b63e85354c12cfe845d990c","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"_OVS_PERSIST_UUID \u003d _SENTINEL \u003d object()"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"MAC_PATTERN \u003d re.compile(r\u0027([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$\u0027, re.I)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class HAChassisGroupInfo:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ce37772d_79ee946e","line":70,"in_reply_to":"ebe91ef0_62ebc443","updated":"2026-01-27 21:47:11.000000000","message":"Done","commit_id":"9c8ff63cbe537a6668635253cc4b746a46e3172a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2a22d5ddf35cfc8e444945f047c7f8a1dcc1cf16","unresolved":true,"context_lines":[{"line_number":1538,"context_line":"        mac \u003d mac_list[0]"},{"line_number":1539,"context_line":"    except IndexError:"},{"line_number":1540,"context_line":"        raise ValueError(_(\"mac column is empty\"))"},{"line_number":1541,"context_line":"    match \u003d MAC_PATTERN.match(mac)"},{"line_number":1542,"context_line":"    if not match:"},{"line_number":1543,"context_line":"        raise ValueError(_(\"Invalid MAC address: %s\"), mac)"},{"line_number":1544,"context_line":"    return mac, mac_list[1:]"}],"source_content_type":"text/x-python","patch_set":6,"id":"c3497c6c_01387a20","line":1541,"range":{"start_line":1541,"start_character":4,"end_line":1541,"end_character":34},"updated":"2026-01-29 07:04:03.000000000","message":"Similar to what we do in `convert_to_sanitized_mac_address` (in neutron-lib), is more robust to use something like this:\n```\nfrom netaddr import EUI, AddrFormatError\n\ndef is_valid_mac(mac_str):\n    try:\n        # EUI (Extended Unique Identifier) handles MAC addresses\n        EUI(mac_str)\n        return True\n    except (AddrFormatError, TypeError):\n        return False\\\n```","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0baf9553b73466c863af46a1e24aa58f761b4435","unresolved":true,"context_lines":[{"line_number":1538,"context_line":"        mac \u003d mac_list[0]"},{"line_number":1539,"context_line":"    except IndexError:"},{"line_number":1540,"context_line":"        raise ValueError(_(\"mac column is empty\"))"},{"line_number":1541,"context_line":"    match \u003d MAC_PATTERN.match(mac)"},{"line_number":1542,"context_line":"    if not match:"},{"line_number":1543,"context_line":"        raise ValueError(_(\"Invalid MAC address: %s\"), mac)"},{"line_number":1544,"context_line":"    return mac, mac_list[1:]"}],"source_content_type":"text/x-python","patch_set":6,"id":"fb95f145_f5f3632b","line":1541,"range":{"start_line":1541,"start_character":4,"end_line":1541,"end_character":34},"in_reply_to":"c3497c6c_01387a20","updated":"2026-01-29 10:29:34.000000000","message":"is this something to fix or shall we move forward?","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4fb7c36142808310831a8292b2772fb737aaba62","unresolved":false,"context_lines":[{"line_number":1538,"context_line":"        mac \u003d mac_list[0]"},{"line_number":1539,"context_line":"    except IndexError:"},{"line_number":1540,"context_line":"        raise ValueError(_(\"mac column is empty\"))"},{"line_number":1541,"context_line":"    match \u003d MAC_PATTERN.match(mac)"},{"line_number":1542,"context_line":"    if not match:"},{"line_number":1543,"context_line":"        raise ValueError(_(\"Invalid MAC address: %s\"), mac)"},{"line_number":1544,"context_line":"    return mac, mac_list[1:]"}],"source_content_type":"text/x-python","patch_set":6,"id":"3598b426_be899f85","line":1541,"range":{"start_line":1541,"start_character":4,"end_line":1541,"end_character":34},"in_reply_to":"c5926c84_16dbd634","updated":"2026-01-29 13:17:22.000000000","message":"True that, thanks! https://review.opendev.org/c/openstack/neutron/+/975149","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"dc7662d4e549bb2a17db7d3856a4027e68423ef2","unresolved":false,"context_lines":[{"line_number":1538,"context_line":"        mac \u003d mac_list[0]"},{"line_number":1539,"context_line":"    except IndexError:"},{"line_number":1540,"context_line":"        raise ValueError(_(\"mac column is empty\"))"},{"line_number":1541,"context_line":"    match \u003d MAC_PATTERN.match(mac)"},{"line_number":1542,"context_line":"    if not match:"},{"line_number":1543,"context_line":"        raise ValueError(_(\"Invalid MAC address: %s\"), mac)"},{"line_number":1544,"context_line":"    return mac, mac_list[1:]"}],"source_content_type":"text/x-python","patch_set":6,"id":"c5926c84_16dbd634","line":1541,"range":{"start_line":1541,"start_character":4,"end_line":1541,"end_character":34},"in_reply_to":"fb95f145_f5f3632b","updated":"2026-01-29 12:17:59.000000000","message":"I can be improved later. I\u0027ll +2 the patch.","commit_id":"52ce0057d14bd3a1d9156b059ab7db51457c1727"}],"neutron/tests/unit/common/ovn/test_utils.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6dddfe55f06a6a6a7b7ebe637eb441a89ed3eadb","unresolved":true,"context_lines":[{"line_number":1308,"context_line":"            self.mac \u003d mac_column"},{"line_number":1309,"context_line":""},{"line_number":1310,"context_line":"    def test_get_mac_and_ips_from_port_binding(self):"},{"line_number":1311,"context_line":"        pb \u003d self.FakePB(mac_column\u003d[\u002700:00:00:00:00:00 10.0.0.1 10.0.0.2\u0027])"},{"line_number":1312,"context_line":"        mac, ips \u003d utils.get_mac_and_ips_from_port_binding(pb)"},{"line_number":1313,"context_line":"        self.assertEqual(\u002700:00:00:00:00:00\u0027, mac)"},{"line_number":1314,"context_line":"        self.assertEqual([\u002710.0.0.1\u0027, \u002710.0.0.2\u0027], ips)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6780cd1d_da1c5a1a","line":1311,"updated":"2026-01-26 21:25:43.000000000","message":"I know this does not change anything but can the fake mac column also contain mix of ipv4 and ipv6 addresses. Also(nit) in a real enviroment, IPs are in cidr notation form.\n\nE.g. from my enviroment:\n```\n...\ngateway_chassis     : []\nha_chassis_group    : []\nlogical_port        : lrp-0d0adab2-a4ba-4a7f-88b9-ca8be02a7f2b\nmac                 : [\"fa:16:3e:f7:68:0e 172.24.4.236/24 2001:db8::1/64\"]\nmirror_rules        : []\nnat_addresses       : []\n...\n```","commit_id":"85a67b3f0268c361cd900f32f62d5f363f774a37"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d6a8a6a6cbc3a0a07941503858a6a6856e9d5946","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"            self.mac \u003d mac_column"},{"line_number":1309,"context_line":""},{"line_number":1310,"context_line":"    def test_get_mac_and_ips_from_port_binding(self):"},{"line_number":1311,"context_line":"        pb \u003d self.FakePB(mac_column\u003d[\u002700:00:00:00:00:00 10.0.0.1 10.0.0.2\u0027])"},{"line_number":1312,"context_line":"        mac, ips \u003d utils.get_mac_and_ips_from_port_binding(pb)"},{"line_number":1313,"context_line":"        self.assertEqual(\u002700:00:00:00:00:00\u0027, mac)"},{"line_number":1314,"context_line":"        self.assertEqual([\u002710.0.0.1\u0027, \u002710.0.0.2\u0027], ips)"}],"source_content_type":"text/x-python","patch_set":3,"id":"e919dc2a_aa5975d0","line":1311,"in_reply_to":"6029be17_7d6b8ab9","updated":"2026-01-26 22:40:57.000000000","message":"Done","commit_id":"85a67b3f0268c361cd900f32f62d5f363f774a37"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"9fb284314488bd3c1e220c75c12f482690b84bee","unresolved":true,"context_lines":[{"line_number":1308,"context_line":"            self.mac \u003d mac_column"},{"line_number":1309,"context_line":""},{"line_number":1310,"context_line":"    def test_get_mac_and_ips_from_port_binding(self):"},{"line_number":1311,"context_line":"        pb \u003d self.FakePB(mac_column\u003d[\u002700:00:00:00:00:00 10.0.0.1 10.0.0.2\u0027])"},{"line_number":1312,"context_line":"        mac, ips \u003d utils.get_mac_and_ips_from_port_binding(pb)"},{"line_number":1313,"context_line":"        self.assertEqual(\u002700:00:00:00:00:00\u0027, mac)"},{"line_number":1314,"context_line":"        self.assertEqual([\u002710.0.0.1\u0027, \u002710.0.0.2\u0027], ips)"}],"source_content_type":"text/x-python","patch_set":3,"id":"6029be17_7d6b8ab9","line":1311,"in_reply_to":"6780cd1d_da1c5a1a","updated":"2026-01-26 21:28:25.000000000","message":"Clarification ^ it could be in a CIDR form, depending on a `type`","commit_id":"85a67b3f0268c361cd900f32f62d5f363f774a37"}]}
