)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"1da0b8d58af58a8f26fbe8683e5d27d9c0aaa93f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cbc3a6d1_6d49ec02","updated":"2026-09-16 02:08:24.000000000","message":"check experimental","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c228224eb57956ce66864735d7a1b7de3f757b36","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"541d021f_0eaf55c1","updated":"2026-09-17 17:39:32.000000000","message":"Rodolfo thanks for review, I pushed one small change in EvpnSvd class, pop operation was not idempotent. I also took care of small doc string changes.","commit_id":"eda29fa41ff5f980407cb0be3b88987ca186204e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"688dafaa692c99bf430ce6ca5a8fa73f15f3a308","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c72925f9_ae7810fd","updated":"2026-09-22 13:59:00.000000000","message":"putting -1 for visibility","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"991abbbc9617d01a5dc6b98bbd2b962c436f2210","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4f8c5c87_423ec64e","updated":"2026-09-29 06:44:30.000000000","message":"Patch looks OK, only this nit with the SVD name map.","commit_id":"b8e2b86b633b63dc68d77de447a60cc12b989d63"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1fab5396555862d623e03afb50052487e0f90434","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"e2af4492_e947eb08","updated":"2026-09-28 21:56:44.000000000","message":"recheck neutron-functional","commit_id":"b8e2b86b633b63dc68d77de447a60cc12b989d63"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6a75fc168f1eb44d4f98fd512daf06261277eb46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"43cbc6c0_80a5b03c","updated":"2026-09-29 13:16:32.000000000","message":"recheck requirements patch merged now","commit_id":"b8e2b86b633b63dc68d77de447a60cc12b989d63"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"1236bada7995ee9dfc642a0bebd283afe6d1171e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"62833d25_39b0c190","updated":"2026-09-30 06:19:20.000000000","message":"recheck openstack-tox-cover","commit_id":"175cfb486c9190d64e8a314db54e5e74fe193fa9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ccf9a5b74b44f2f9c0ab72aa3004deff5aa655b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"0d5af817_9c4feb62","updated":"2026-09-30 20:59:20.000000000","message":"recheck openstacksdk-functional-devstack","commit_id":"175cfb486c9190d64e8a314db54e5e74fe193fa9"}],"neutron/agent/ovn/extensions/evpn/svd.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"7f059a877aaf4f1810812f98e29f40a6a2f00350","unresolved":true,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, br_evpn, vxlan_evpn, index\u003d0):"},{"line_number":31,"context_line":"        super().__init__(br_evpn, vxlan_evpn)"},{"line_number":32,"context_line":"        self._index \u003d index"},{"line_number":33,"context_line":"        self._svi_names \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def add_vni(self, vni, vid, vrf_name, mac, br_mtu):"},{"line_number":36,"context_line":"        svi_name \u003d evpn_const.EVPN_VLAN_IFNAME_PATTERN % {"}],"source_content_type":"text/x-python","patch_set":5,"id":"2e607b9e_03a3b407","line":33,"updated":"2026-09-21 21:33:58.000000000","message":"Do we even need the map then? Before this was used to maintain a map of managed SVIs so when we delete, we get a KeyError if attempting to delete an unknown SVI.\n\nWith this change, we still maintain the map but if the item is missing, we just fallback to creating the svi_name but we actually never use the map.","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"60a641f97f32dec3a228aa2ae7fd2c9db026a972","unresolved":true,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, br_evpn, vxlan_evpn, index\u003d0):"},{"line_number":31,"context_line":"        super().__init__(br_evpn, vxlan_evpn)"},{"line_number":32,"context_line":"        self._index \u003d index"},{"line_number":33,"context_line":"        self._svi_names \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def add_vni(self, vni, vid, vrf_name, mac, br_mtu):"},{"line_number":36,"context_line":"        svi_name \u003d evpn_const.EVPN_VLAN_IFNAME_PATTERN % {"}],"source_content_type":"text/x-python","patch_set":5,"id":"ce1ca9e5_2652fd93","line":33,"in_reply_to":"1ce9b029_4dc977ab","updated":"2026-09-30 00:14:09.000000000","message":"Yep, good catch. I will make this change just waiting for one more pass of reviews before I start pushing changes.","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"991abbbc9617d01a5dc6b98bbd2b962c436f2210","unresolved":true,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, br_evpn, vxlan_evpn, index\u003d0):"},{"line_number":31,"context_line":"        super().__init__(br_evpn, vxlan_evpn)"},{"line_number":32,"context_line":"        self._index \u003d index"},{"line_number":33,"context_line":"        self._svi_names \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def add_vni(self, vni, vid, vrf_name, mac, br_mtu):"},{"line_number":36,"context_line":"        svi_name \u003d evpn_const.EVPN_VLAN_IFNAME_PATTERN % {"}],"source_content_type":"text/x-python","patch_set":5,"id":"1ce9b029_4dc977ab","line":33,"in_reply_to":"2e607b9e_03a3b407","updated":"2026-09-29 06:44:30.000000000","message":"I agree with Jakub.","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"562f4f171dd2726905ad7c1d2627aaec624252e1","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    def __init__(self, br_evpn, vxlan_evpn, index\u003d0):"},{"line_number":31,"context_line":"        super().__init__(br_evpn, vxlan_evpn)"},{"line_number":32,"context_line":"        self._index \u003d index"},{"line_number":33,"context_line":"        self._svi_names \u003d {}"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def add_vni(self, vni, vid, vrf_name, mac, br_mtu):"},{"line_number":36,"context_line":"        svi_name \u003d evpn_const.EVPN_VLAN_IFNAME_PATTERN % {"}],"source_content_type":"text/x-python","patch_set":5,"id":"e42f8fbf_8840e621","line":33,"in_reply_to":"ce1ca9e5_2652fd93","updated":"2026-09-30 00:34:08.000000000","message":"Done","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"}],"neutron/privileged/agent/linux/svd.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"047e1f195fb4e3d3cf75aacc7fbda83edff6b97d","unresolved":true,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"def _bridge_add_vni(ipr, vxlan_idx, vni):"},{"line_number":123,"context_line":"    \"\"\"Idempotent: add a VNI filter entry or skip if already present."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    Equivalent to:"},{"line_number":126,"context_line":"        bridge vni add dev \u003cvxlan\u003e vni \u003cvni\u003e"}],"source_content_type":"text/x-python","patch_set":1,"id":"9546f287_a3823a98","line":123,"range":{"start_line":123,"start_character":7,"end_line":123,"end_character":17},"updated":"2026-09-16 06:22:45.000000000","message":"nit: I would mention that in the description, not the title","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"dcc7e4c402acda166b700c70430ed189b8412ea3","unresolved":false,"context_lines":[{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"def _bridge_add_vni(ipr, vxlan_idx, vni):"},{"line_number":123,"context_line":"    \"\"\"Idempotent: add a VNI filter entry or skip if already present."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    Equivalent to:"},{"line_number":126,"context_line":"        bridge vni add dev \u003cvxlan\u003e vni \u003cvni\u003e"}],"source_content_type":"text/x-python","patch_set":1,"id":"a4b7250b_3a02f2c4","line":123,"range":{"start_line":123,"start_character":7,"end_line":123,"end_character":17},"in_reply_to":"9546f287_a3823a98","updated":"2026-09-16 20:07:38.000000000","message":"Done","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"047e1f195fb4e3d3cf75aacc7fbda83edff6b97d","unresolved":true,"context_lines":[{"line_number":130,"context_line":"        ipr.nlm_request(msg, msg_type\u003dRTM_NEWTUNNEL,"},{"line_number":131,"context_line":"                        msg_flags\u003dBRIDGE_ADD_VNI_MSG_FLAGS)"},{"line_number":132,"context_line":"    except netlink_exc.NetlinkError as e:"},{"line_number":133,"context_line":"        if e.code !\u003d errno.EEXIST:"},{"line_number":134,"context_line":"            raise"},{"line_number":135,"context_line":"        LOG.debug(\"Bridge VNI %d on ifindex %d already present, \""},{"line_number":136,"context_line":"                  \"skipping\", vni, vxlan_idx)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def _bridge_del_vni(ipr, vxlan_idx, vni):"}],"source_content_type":"text/x-python","patch_set":1,"id":"c106672a_c83a413d","line":136,"range":{"start_line":133,"start_character":8,"end_line":136,"end_character":45},"updated":"2026-09-16 06:22:45.000000000","message":"nit: this is weird for me. Instead I would check if the code is EEXIST, log and return; by default, raise the exception. Same for the other methods.","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"01dfe81ff4bab89eefa360901af7a12b192b034a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        ipr.nlm_request(msg, msg_type\u003dRTM_NEWTUNNEL,"},{"line_number":131,"context_line":"                        msg_flags\u003dBRIDGE_ADD_VNI_MSG_FLAGS)"},{"line_number":132,"context_line":"    except netlink_exc.NetlinkError as e:"},{"line_number":133,"context_line":"        if e.code !\u003d errno.EEXIST:"},{"line_number":134,"context_line":"            raise"},{"line_number":135,"context_line":"        LOG.debug(\"Bridge VNI %d on ifindex %d already present, \""},{"line_number":136,"context_line":"                  \"skipping\", vni, vxlan_idx)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def _bridge_del_vni(ipr, vxlan_idx, vni):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ea3df990_e5c1f14f","line":136,"range":{"start_line":133,"start_character":8,"end_line":136,"end_character":45},"in_reply_to":"35cbcef6_a3e8396d","updated":"2026-09-30 13:24:09.000000000","message":"I disagree and think the previous version was superior in every way. (not that it matters) :D","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"dcc7e4c402acda166b700c70430ed189b8412ea3","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        ipr.nlm_request(msg, msg_type\u003dRTM_NEWTUNNEL,"},{"line_number":131,"context_line":"                        msg_flags\u003dBRIDGE_ADD_VNI_MSG_FLAGS)"},{"line_number":132,"context_line":"    except netlink_exc.NetlinkError as e:"},{"line_number":133,"context_line":"        if e.code !\u003d errno.EEXIST:"},{"line_number":134,"context_line":"            raise"},{"line_number":135,"context_line":"        LOG.debug(\"Bridge VNI %d on ifindex %d already present, \""},{"line_number":136,"context_line":"                  \"skipping\", vni, vxlan_idx)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def _bridge_del_vni(ipr, vxlan_idx, vni):"}],"source_content_type":"text/x-python","patch_set":1,"id":"35cbcef6_a3e8396d","line":136,"range":{"start_line":133,"start_character":8,"end_line":136,"end_character":45},"in_reply_to":"c106672a_c83a413d","updated":"2026-09-16 20:07:38.000000000","message":"Done","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"047e1f195fb4e3d3cf75aacc7fbda83edff6b97d","unresolved":true,"context_lines":[{"line_number":149,"context_line":"    except netlink_exc.NetlinkError as e:"},{"line_number":150,"context_line":"        if e.code !\u003d errno.ENOENT:"},{"line_number":151,"context_line":"            raise"},{"line_number":152,"context_line":"        LOG.debug(\"Bridge VNI %d on ifindex %d already absent, \""},{"line_number":153,"context_line":"                  \"skipping\", vni, vxlan_idx)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ef0e8924_fdaba1bf","line":152,"updated":"2026-09-16 06:22:45.000000000","message":"just a heads-up: these messages will be in the privsep log, not the Neutron API logs.","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8f9141e2ec12ed7c28f0835edfcdcfe907cc3779","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    except netlink_exc.NetlinkError as e:"},{"line_number":150,"context_line":"        if e.code !\u003d errno.ENOENT:"},{"line_number":151,"context_line":"            raise"},{"line_number":152,"context_line":"        LOG.debug(\"Bridge VNI %d on ifindex %d already absent, \""},{"line_number":153,"context_line":"                  \"skipping\", vni, vxlan_idx)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ec8fb945_346a442e","line":152,"in_reply_to":"4d5973de_ffcb2499","updated":"2026-09-17 08:04:26.000000000","message":"Done","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"dcc7e4c402acda166b700c70430ed189b8412ea3","unresolved":true,"context_lines":[{"line_number":149,"context_line":"    except netlink_exc.NetlinkError as e:"},{"line_number":150,"context_line":"        if e.code !\u003d errno.ENOENT:"},{"line_number":151,"context_line":"            raise"},{"line_number":152,"context_line":"        LOG.debug(\"Bridge VNI %d on ifindex %d already absent, \""},{"line_number":153,"context_line":"                  \"skipping\", vni, vxlan_idx)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"4d5973de_ffcb2499","line":152,"in_reply_to":"ef0e8924_fdaba1bf","updated":"2026-09-16 20:07:38.000000000","message":"Acknowledged","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"047e1f195fb4e3d3cf75aacc7fbda83edff6b97d","unresolved":true,"context_lines":[{"line_number":181,"context_line":"# End Workarounds for features missing in pyroute2 0.8.x."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"def _link_add_or_skip(ipr, ifname, **kwargs):"},{"line_number":185,"context_line":"    \"\"\"Idempotent link add.  Returns the ifindex of the device.\"\"\""},{"line_number":186,"context_line":"    try:"},{"line_number":187,"context_line":"        ipr.link(nl_const.IP_LINK_ADD, ifname\u003difname, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"a70debe2_fde0e385","line":184,"range":{"start_line":184,"start_character":14,"end_line":184,"end_character":21},"updated":"2026-09-16 06:22:45.000000000","message":"ditto","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"dcc7e4c402acda166b700c70430ed189b8412ea3","unresolved":false,"context_lines":[{"line_number":181,"context_line":"# End Workarounds for features missing in pyroute2 0.8.x."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"def _link_add_or_skip(ipr, ifname, **kwargs):"},{"line_number":185,"context_line":"    \"\"\"Idempotent link add.  Returns the ifindex of the device.\"\"\""},{"line_number":186,"context_line":"    try:"},{"line_number":187,"context_line":"        ipr.link(nl_const.IP_LINK_ADD, ifname\u003difname, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6721b1f0_3663890e","line":184,"range":{"start_line":184,"start_character":14,"end_line":184,"end_character":21},"in_reply_to":"a70debe2_fde0e385","updated":"2026-09-16 20:07:38.000000000","message":"Done","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"047e1f195fb4e3d3cf75aacc7fbda83edff6b97d","unresolved":true,"context_lines":[{"line_number":201,"context_line":"    ipr.link(nl_const.IP_LINK_DEL, index\u003didx[0])"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"def _vlan_filter_add_or_skip(ipr, index, label, **kwargs):"},{"line_number":205,"context_line":"    \"\"\"Idempotent vlan_filter add.\"\"\""},{"line_number":206,"context_line":"    try:"},{"line_number":207,"context_line":"        ipr.vlan_filter(nl_const.IP_LINK_ADD, index\u003dindex, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5904b4b0_fc0de473","line":204,"range":{"start_line":204,"start_character":21,"end_line":204,"end_character":28},"updated":"2026-09-16 06:22:45.000000000","message":"I would not use this `or_skip`. This could be commented in the method description, that\u0027s all. Most of the `linux_net` methods are idempotent too and don\u0027t use this suffix.","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"dcc7e4c402acda166b700c70430ed189b8412ea3","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    ipr.link(nl_const.IP_LINK_DEL, index\u003didx[0])"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"def _vlan_filter_add_or_skip(ipr, index, label, **kwargs):"},{"line_number":205,"context_line":"    \"\"\"Idempotent vlan_filter add.\"\"\""},{"line_number":206,"context_line":"    try:"},{"line_number":207,"context_line":"        ipr.vlan_filter(nl_const.IP_LINK_ADD, index\u003dindex, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f95d049_01004450","line":204,"range":{"start_line":204,"start_character":21,"end_line":204,"end_character":28},"in_reply_to":"5904b4b0_fc0de473","updated":"2026-09-16 20:07:38.000000000","message":"Done","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"047e1f195fb4e3d3cf75aacc7fbda83edff6b97d","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        LOG.debug(\"VLAN filter on %s already present, skipping\", label)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"def _vlan_filter_del_or_skip(ipr, index, label, **kwargs):"},{"line_number":215,"context_line":"    \"\"\"Idempotent vlan_filter delete.\"\"\""},{"line_number":216,"context_line":"    try:"},{"line_number":217,"context_line":"        ipr.vlan_filter(nl_const.IP_LINK_DEL, index\u003dindex, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"d4f00fb8_7c404271","line":214,"range":{"start_line":214,"start_character":21,"end_line":214,"end_character":28},"updated":"2026-09-16 06:22:45.000000000","message":"ditto","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"dcc7e4c402acda166b700c70430ed189b8412ea3","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        LOG.debug(\"VLAN filter on %s already present, skipping\", label)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"def _vlan_filter_del_or_skip(ipr, index, label, **kwargs):"},{"line_number":215,"context_line":"    \"\"\"Idempotent vlan_filter delete.\"\"\""},{"line_number":216,"context_line":"    try:"},{"line_number":217,"context_line":"        ipr.vlan_filter(nl_const.IP_LINK_DEL, index\u003dindex, **kwargs)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6fbcf3c0_7e301370","line":214,"range":{"start_line":214,"start_character":21,"end_line":214,"end_character":28},"in_reply_to":"d4f00fb8_7c404271","updated":"2026-09-16 20:07:38.000000000","message":"Done","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"6a952020500dfd7b2e6704703b5d743e96c8c316","unresolved":false,"context_lines":[{"line_number":286,"context_line":"@privileged.default.entrypoint"},{"line_number":287,"context_line":"def add_vni(br_evpn, vxlan_evpn, svi_name, lo_name, vni, vid, vrf_name, mac,"},{"line_number":288,"context_line":"            br_mtu):"},{"line_number":289,"context_line":"    \"\"\"Map a VNI to the SVD.  Idempotent: existing sub-resources are skipped.\"\"\""},{"line_number":290,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":291,"context_line":"        br_idx \u003d ipr.link_lookup(ifname\u003dbr_evpn)[0]"},{"line_number":292,"context_line":"        vxlan_idx \u003d ipr.link_lookup(ifname\u003dvxlan_evpn)[0]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5d54af4d_1b6f3d6b","line":289,"updated":"2026-09-16 03:56:45.000000000","message":"pep8: E501 line too long (80 \u003e 79 characters)","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"6a952020500dfd7b2e6704703b5d743e96c8c316","unresolved":false,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"@privileged.default.entrypoint"},{"line_number":328,"context_line":"def del_vni(br_evpn, vxlan_evpn, svi_name, lo_name, vni, vid):"},{"line_number":329,"context_line":"    \"\"\"Remove a VNI mapping from the SVD.  Idempotent: missing resources are"},{"line_number":330,"context_line":"    skipped.\"\"\""},{"line_number":331,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":332,"context_line":"        br_idx \u003d ipr.link_lookup(ifname\u003dbr_evpn)[0]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9dd6662a_7e1ea56b","line":329,"updated":"2026-09-16 03:56:45.000000000","message":"pep8: H403: multi line docstrings should end on a new line","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"6a952020500dfd7b2e6704703b5d743e96c8c316","unresolved":false,"context_lines":[{"line_number":327,"context_line":"@privileged.default.entrypoint"},{"line_number":328,"context_line":"def del_vni(br_evpn, vxlan_evpn, svi_name, lo_name, vni, vid):"},{"line_number":329,"context_line":"    \"\"\"Remove a VNI mapping from the SVD.  Idempotent: missing resources are"},{"line_number":330,"context_line":"    skipped.\"\"\""},{"line_number":331,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":332,"context_line":"        br_idx \u003d ipr.link_lookup(ifname\u003dbr_evpn)[0]"},{"line_number":333,"context_line":"        vxlan_idx \u003d ipr.link_lookup(ifname\u003dvxlan_evpn)[0]"}],"source_content_type":"text/x-python","patch_set":1,"id":"5397d333_c76ceb14","line":330,"updated":"2026-09-16 03:56:45.000000000","message":"pep8: H403: multi line docstrings should end on a new line","commit_id":"db5e2cb291ad645d0f275cd795daec1b1655e99e"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c228224eb57956ce66864735d7a1b7de3f757b36","unresolved":false,"context_lines":[{"line_number":205,"context_line":""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"def _add_vlan_filter(ipr, index, label, **kwargs):"},{"line_number":208,"context_line":"    \"\"\"vlan_filter add.or skip if already present.\"\"\""},{"line_number":209,"context_line":"    try:"},{"line_number":210,"context_line":"        ipr.vlan_filter(nl_const.IP_LINK_ADD, index\u003dindex, **kwargs)"},{"line_number":211,"context_line":"    except netlink_exc.NetlinkError as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"36e4692a_afea4fc4","line":208,"range":{"start_line":208,"start_character":22,"end_line":208,"end_character":23},"updated":"2026-09-17 17:39:32.000000000","message":"fix typo.","commit_id":"be4bd0d0c6aed7cf0d52c4c1bf968c9f70a7687e"},{"author":{"_account_id":32681,"name":"Phillip Dale","email":"phillip.dale@cleura.com","username":"pdale62"},"change_message_id":"5c6a23bb4b28ea857c689fb560b22a16c7798143","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    is re-applied to match the desired state."},{"line_number":246,"context_line":"    \"\"\""},{"line_number":247,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":248,"context_line":"        vxlan_parent_idx \u003d ipr.link_lookup(ifname\u003dvxlan_parent)[0]"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        # ip link add \u003cvxlan_evpn\u003e vxlan ..."},{"line_number":251,"context_line":"        vxlan_idx \u003d _add_link("}],"source_content_type":"text/x-python","patch_set":5,"id":"ad23b873_eb8e5518","line":248,"updated":"2026-09-21 09:49:16.000000000","message":"One left from the same read. create_svd still opens with ipr.link_lookup(ifname\u003dvxlan_parent)[0], so a missing underlay parent raises IndexError rather than the NetworkInterfaceNotFound that _link_idx three lines above exists to give. Last bare index on a device the function does not create.","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c1e51ae6d035b96d7c7cd1ad1424bb12eaa47d3d","unresolved":true,"context_lines":[{"line_number":245,"context_line":"    is re-applied to match the desired state."},{"line_number":246,"context_line":"    \"\"\""},{"line_number":247,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":248,"context_line":"        vxlan_parent_idx \u003d ipr.link_lookup(ifname\u003dvxlan_parent)[0]"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        # ip link add \u003cvxlan_evpn\u003e vxlan ..."},{"line_number":251,"context_line":"        vxlan_idx \u003d _add_link("}],"source_content_type":"text/x-python","patch_set":5,"id":"b5b4aa7e_2bf36448","line":248,"in_reply_to":"ad23b873_eb8e5518","updated":"2026-09-24 15:47:10.000000000","message":"If there is no parent_idx I still want to know. But let me do this cleaner way. I think there is a link not found helper somewhere, it would be cleaner than Indexerror","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"562f4f171dd2726905ad7c1d2627aaec624252e1","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    is re-applied to match the desired state."},{"line_number":246,"context_line":"    \"\"\""},{"line_number":247,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":248,"context_line":"        vxlan_parent_idx \u003d ipr.link_lookup(ifname\u003dvxlan_parent)[0]"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        # ip link add \u003cvxlan_evpn\u003e vxlan ..."},{"line_number":251,"context_line":"        vxlan_idx \u003d _add_link("}],"source_content_type":"text/x-python","patch_set":5,"id":"0c9b4e21_b31259be","line":248,"in_reply_to":"b5b4aa7e_2bf36448","updated":"2026-09-30 00:34:08.000000000","message":"With merge of vxlan parent removal[1] this comment is obsolete. \nhttps://review.opendev.org/c/openstack/neutron/+/1007488/2?usp\u003drelated-change","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"}],"neutron/tests/unit/agent/ovn/extensions/test_evpn.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"7f059a877aaf4f1810812f98e29f40a6a2f00350","unresolved":true,"context_lines":[{"line_number":243,"context_line":"        self.assertEqual({vrf1, vrf2}, self.handler._known_vrfs)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class TestEvpnSvd(base.BaseTestCase):"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def setUp(self):"},{"line_number":249,"context_line":"        super().setUp()"}],"source_content_type":"text/x-python","patch_set":5,"id":"c98d822f_c6db649c","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":37},"updated":"2026-09-21 21:33:58.000000000","message":"I\u0027d be fine not having this tests as it merely tests a wrapper calls down to underlaying function. The functional tests can exercise the same codepath + they can really interact with the system.","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"562f4f171dd2726905ad7c1d2627aaec624252e1","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        self.assertEqual({vrf1, vrf2}, self.handler._known_vrfs)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"class TestEvpnSvd(base.BaseTestCase):"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"    def setUp(self):"},{"line_number":249,"context_line":"        super().setUp()"}],"source_content_type":"text/x-python","patch_set":5,"id":"8d70d682_073c076c","line":246,"range":{"start_line":246,"start_character":0,"end_line":246,"end_character":37},"in_reply_to":"c98d822f_c6db649c","updated":"2026-09-30 00:34:08.000000000","message":"Done","commit_id":"899afc79fde5d5a550047e2f96b81e5cbd69e19a"}]}
