)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c6b3143ce4d9772ffa2c717dbc3a728448794a01","unresolved":true,"context_lines":[{"line_number":10,"context_line":"creates and tears down VNI infrastructure on the VTEP node by"},{"line_number":11,"context_line":"shelling out to sudo ip and sudo vtysh. This mirrors the static"},{"line_number":12,"context_line":"setup done by the Zuul playbook but allows per-test VNI"},{"line_number":13,"context_line":"allocation, enabling parallel EVPN test execution and tests"},{"line_number":14,"context_line":"that require multiple VNIs."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"VNI allocation uses a shared file-based counter protected by an"},{"line_number":17,"context_line":"external lock (oslo.concurrency) so that parallel tempest"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1770d1c7_a1c0c2e1","line":14,"range":{"start_line":13,"start_character":12,"end_line":14,"end_character":27},"updated":"2026-07-24 21:55:25.000000000","message":"I think this might be problematic in the current state. For example, if you have two concurrent tests using the same VNI then they might interfere. I also dont know what will happen if you have multiple tests accessing same frr service.\nWe can maybe solve in similar way as in neutron functional test.\nhttps://opendev.org/openstack/neutron/src/branch/master/neutron/tests/common/net_helpers.py#L1094\n\nFor each test we will start frr in a namespace, this will isolate each frr instance.","commit_id":"52a1ac0159d0a858c070798a9560723cf3b6b331"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"4bbda313ee72a43f168a7ce10fa75de55599aea3","unresolved":false,"context_lines":[{"line_number":10,"context_line":"creates and tears down VNI infrastructure on the VTEP node by"},{"line_number":11,"context_line":"shelling out to sudo ip and sudo vtysh. This mirrors the static"},{"line_number":12,"context_line":"setup done by the Zuul playbook but allows per-test VNI"},{"line_number":13,"context_line":"allocation, enabling parallel EVPN test execution and tests"},{"line_number":14,"context_line":"that require multiple VNIs."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"VNI allocation uses a shared file-based counter protected by an"},{"line_number":17,"context_line":"external lock (oslo.concurrency) so that parallel tempest"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"9f11abfa_b9600ca6","line":14,"range":{"start_line":13,"start_character":12,"end_line":14,"end_character":27},"in_reply_to":"1770d1c7_a1c0c2e1","updated":"2026-07-31 19:53:34.000000000","message":"Never mind, I see now that `allocate_vni` will automatically hand out VNIs per for each test and make sure VNI are unique. The only downside of that is that test can not explicitly set which VNI they want to use, but that should be ok.","commit_id":"52a1ac0159d0a858c070798a9560723cf3b6b331"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"cb515311880585718a9f59eece30cc6a7a664781","unresolved":true,"context_lines":[{"line_number":19,"context_line":"the test machine is the VTEP) or remotely via SSH (when"},{"line_number":20,"context_line":"evpn_vtep_host is configured)."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Add test_evpn_port_detach_attach which uses two dynamically"},{"line_number":23,"context_line":"provisioned VNIs to move a port between VMs on different tenant"},{"line_number":24,"context_line":"networks, verifying EVPN connectivity is maintained via hostname"},{"line_number":25,"context_line":"checks. This test is skipped when dynamic VNI provisioning is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"08f79e48_6d465cb6","line":22,"updated":"2026-08-10 13:46:26.000000000","message":"this is not included in this patch anymore.","commit_id":"ef1ef65ef40c1b77c8635f93b0a8f61ccf453a00"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c3941fd5108c85b3cdcb2cc65731f5929b8a4278","unresolved":false,"context_lines":[{"line_number":19,"context_line":"the test machine is the VTEP) or remotely via SSH (when"},{"line_number":20,"context_line":"evpn_vtep_host is configured)."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Add test_evpn_port_detach_attach which uses two dynamically"},{"line_number":23,"context_line":"provisioned VNIs to move a port between VMs on different tenant"},{"line_number":24,"context_line":"networks, verifying EVPN connectivity is maintained via hostname"},{"line_number":25,"context_line":"checks. This test is skipped when dynamic VNI provisioning is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"87c80fa8_740cc31f","line":22,"in_reply_to":"08f79e48_6d465cb6","updated":"2026-08-11 01:19:42.000000000","message":"Done","commit_id":"ef1ef65ef40c1b77c8635f93b0a8f61ccf453a00"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"05f501804f9a02b45845d31b2edda354fc477c58","unresolved":true,"context_lines":[{"line_number":19,"context_line":"the test machine is the VTEP) or remotely via SSH (when"},{"line_number":20,"context_line":"evpn_vtep_host is configured)."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"OSPRH-32939"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Co-Authored-By: Miro Tomaska \u003cmtomaska@redhat.com\u003e"},{"line_number":25,"context_line":"Assisted-By: Claude Opus 4.6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"3787a9d4_74258e74","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":2},"updated":"2026-08-25 12:38:56.000000000","message":"Do we have better a launchpad bug?","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"27f35d61ce4ff55192cf1fd56c6af4b57627775f","unresolved":true,"context_lines":[{"line_number":19,"context_line":"the test machine is the VTEP) or remotely via SSH (when"},{"line_number":20,"context_line":"evpn_vtep_host is configured)."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"OSPRH-32939"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Co-Authored-By: Miro Tomaska \u003cmtomaska@redhat.com\u003e"},{"line_number":25,"context_line":"Assisted-By: Claude Opus 4.6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"7430e4e5_fe3cfe93","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":2},"in_reply_to":"3787a9d4_74258e74","updated":"2026-08-25 22:23:47.000000000","message":"No. The `EVPNVNIProvisioner` is a tool used by tempest tests. We discovered need for it while developing evpn tempest tests. Should I still create LP for it?","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"48a93d8bf15a1daae10ed097d5453b964db0959a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"the test machine is the VTEP) or remotely via SSH (when"},{"line_number":20,"context_line":"evpn_vtep_host is configured)."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"OSPRH-32939"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Co-Authored-By: Miro Tomaska \u003cmtomaska@redhat.com\u003e"},{"line_number":25,"context_line":"Assisted-By: Claude Opus 4.6"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"7357baed_fc0b5aa0","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":2},"in_reply_to":"7430e4e5_fe3cfe93","updated":"2026-08-26 16:17:13.000000000","message":"Done","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"9bd181e108dd1f93d5822cef44218c1d13c93683","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8d7915a2_bfd5ece4","updated":"2026-08-01 00:40:18.000000000","message":"recheck","commit_id":"71c1b1d5600b8d469730cc392dce6d9ed3ab246c"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"3e8ebe9b77412d0313efeced766b0d15e18cb996","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"147d1e5b_3054867c","updated":"2026-08-04 18:49:55.000000000","message":"recheck https://review.opendev.org/c/openstack/neutron-fwaas/+/999712 merged","commit_id":"5e704a88a58cdbb64baa1fb7f7b6654b71ae2af7"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"2030fae7b24e7d8be3f66c567ddcbb78bd678ffa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"2c7bda34_270e5d83","updated":"2026-08-10 13:34:59.000000000","message":"recheck neutron-tempest-plugin-ovn-ubuntu-jammy-2025-1","commit_id":"ef1ef65ef40c1b77c8635f93b0a8f61ccf453a00"},{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"4985a846388dadcc8d93c2e35e694042b60e8a5a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"9537b03c_744ecd41","updated":"2026-08-26 07:36:20.000000000","message":"recheck neutron-tempest-plugin-ovn-ubuntu-jammy-2025-1","commit_id":"bb77acf2ec18935dea61e9ee74912ba50ae3e33a"}],"neutron_tempest_plugin/api/test_evpn_negative.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"57ff58f192a95325e549488760c35fc2018baf1f","unresolved":true,"context_lines":[{"line_number":31,"context_line":"    def test_create_router_evpn_vni_non_admin_forbidden(self):"},{"line_number":32,"context_line":"        name \u003d data_utils.rand_name(\u0027evpn-router\u0027)"},{"line_number":33,"context_line":"        with testtools.ExpectedException(lib_exc.Forbidden):"},{"line_number":34,"context_line":"            self.client.create_router(name\u003dname, evpn_vni\u003d100)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @decorators.attr(type\u003d\u0027negative\u0027)"},{"line_number":37,"context_line":"    @decorators.idempotent_id(\u0027d7e6f5a4-3b2c-5d9e-0f1a-8b7c6d5e4f3a\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"3f30ea24_c4e29dcf","line":34,"range":{"start_line":34,"start_character":49,"end_line":34,"end_character":61},"updated":"2026-09-08 13:57:35.000000000","message":"These should be updated too.","commit_id":"9d638a28bf0c76be7b089f9524330ad51c45d1c1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"20143ced4d3a494c26304b3e508a856b80982d87","unresolved":true,"context_lines":[{"line_number":31,"context_line":"    def test_create_router_evpn_vni_non_admin_forbidden(self):"},{"line_number":32,"context_line":"        name \u003d data_utils.rand_name(\u0027evpn-router\u0027)"},{"line_number":33,"context_line":"        with testtools.ExpectedException(lib_exc.Forbidden):"},{"line_number":34,"context_line":"            self.client.create_router(name\u003dname, evpn_vni\u003d100)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @decorators.attr(type\u003d\u0027negative\u0027)"},{"line_number":37,"context_line":"    @decorators.idempotent_id(\u0027d7e6f5a4-3b2c-5d9e-0f1a-8b7c6d5e4f3a\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"4b4ce247_cf56ea99","line":34,"range":{"start_line":34,"start_character":49,"end_line":34,"end_character":61},"in_reply_to":"3f30ea24_c4e29dcf","updated":"2026-09-08 14:17:28.000000000","message":"I take my comment back, sorry for the confusion. We decided to go with static values here https://opendev.org/openstack/neutron-tempest-plugin/commit/cb3b30a915de2749b73840c7c208731380e60fc5 but this patch is not rebased yet","commit_id":"9d638a28bf0c76be7b089f9524330ad51c45d1c1"}],"neutron_tempest_plugin/common/evpn_provisioner.py":[{"author":{"_account_id":31291,"name":"Eduardo Olivares","email":"eolivare@redhat.com","username":"eolivare"},"change_message_id":"cb515311880585718a9f59eece30cc6a7a664781","unresolved":true,"context_lines":[{"line_number":208,"context_line":"        self._create_vni_unlocked(vni)"},{"line_number":209,"context_line":"        return vni"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def release_vni(self, vni):"},{"line_number":212,"context_line":"        self.delete_vni(vni)"}],"source_content_type":"text/x-python","patch_set":18,"id":"133536dd_96d3d470","line":211,"updated":"2026-08-10 13:46:26.000000000","message":"I can\u0027t understand why I used release_vni and delete_vni instead of just one method.","commit_id":"ef1ef65ef40c1b77c8635f93b0a8f61ccf453a00"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c3941fd5108c85b3cdcb2cc65731f5929b8a4278","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        self._create_vni_unlocked(vni)"},{"line_number":209,"context_line":"        return vni"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def release_vni(self, vni):"},{"line_number":212,"context_line":"        self.delete_vni(vni)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bb92fb1a_d43ae119","line":211,"in_reply_to":"133536dd_96d3d470","updated":"2026-08-11 01:19:42.000000000","message":"Done","commit_id":"ef1ef65ef40c1b77c8635f93b0a8f61ccf453a00"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ada94cd4ac9be8b1403840b214f17cfb516e5e9b","unresolved":true,"context_lines":[{"line_number":16,"context_line":"import subprocess"},{"line_number":17,"context_line":"import tempfile"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron_lib._i18n import _"},{"line_number":20,"context_line":"from oslo_concurrency import lockutils"},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"5eeec157_38519ed9","line":19,"updated":"2026-08-11 20:54:32.000000000","message":"no action required: Do we need to localize the exception? :)","commit_id":"c526834da8de06aa3f546ce29b774fce5910c4ac"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"7def7607823ce1f8c84c38af9897ba8f976185f4","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import subprocess"},{"line_number":17,"context_line":"import tempfile"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron_lib._i18n import _"},{"line_number":20,"context_line":"from oslo_concurrency import lockutils"},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"d8f5240a_028fded1","line":19,"in_reply_to":"35f1ae64_52c970f6","updated":"2026-08-12 19:32:12.000000000","message":"Done","commit_id":"c526834da8de06aa3f546ce29b774fce5910c4ac"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6aef3d01abbced6810c5392358b58941670f1ab1","unresolved":true,"context_lines":[{"line_number":16,"context_line":"import subprocess"},{"line_number":17,"context_line":"import tempfile"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from neutron_lib._i18n import _"},{"line_number":20,"context_line":"from oslo_concurrency import lockutils"},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"35f1ae64_52c970f6","line":19,"in_reply_to":"5eeec157_38519ed9","updated":"2026-08-12 13:30:45.000000000","message":"samozřejmě :)","commit_id":"c526834da8de06aa3f546ce29b774fce5910c4ac"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ada94cd4ac9be8b1403840b214f17cfb516e5e9b","unresolved":true,"context_lines":[{"line_number":45,"context_line":" address-family l2vpn evpn"},{"line_number":46,"context_line":"  advertise ipv4 unicast"},{"line_number":47,"context_line":"  advertise ipv6 unicast"},{"line_number":48,"context_line":"  route-target import {peer_asn}:{vni}"},{"line_number":49,"context_line":" exit-address-family"},{"line_number":50,"context_line":"exit"},{"line_number":51,"context_line":"!"}],"source_content_type":"text/x-python","patch_set":19,"id":"56129059_6f0a7d3d","line":48,"updated":"2026-08-11 20:54:32.000000000","message":"I\u0027m not sure but I think like we didn\u0027t have to import anything with evpn to the vrf router. Can we avoid doing this and the import on L54 and instead do advertise-all-vni and advertise-svi-ip - like we do on the nodes where Neutron configures FRR?","commit_id":"c526834da8de06aa3f546ce29b774fce5910c4ac"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"6aef3d01abbced6810c5392358b58941670f1ab1","unresolved":true,"context_lines":[{"line_number":45,"context_line":" address-family l2vpn evpn"},{"line_number":46,"context_line":"  advertise ipv4 unicast"},{"line_number":47,"context_line":"  advertise ipv6 unicast"},{"line_number":48,"context_line":"  route-target import {peer_asn}:{vni}"},{"line_number":49,"context_line":" exit-address-family"},{"line_number":50,"context_line":"exit"},{"line_number":51,"context_line":"!"}],"source_content_type":"text/x-python","patch_set":19,"id":"74e5f265_dc3e5fcd","line":48,"in_reply_to":"56129059_6f0a7d3d","updated":"2026-08-12 13:30:45.000000000","message":"+1 I think what we have in templates.py is sufficient\nhttps://opendev.org/openstack/neutron/src/branch/master/neutron/agent/linux/evpn_router/frr/templates.py","commit_id":"c526834da8de06aa3f546ce29b774fce5910c4ac"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"7def7607823ce1f8c84c38af9897ba8f976185f4","unresolved":false,"context_lines":[{"line_number":45,"context_line":" address-family l2vpn evpn"},{"line_number":46,"context_line":"  advertise ipv4 unicast"},{"line_number":47,"context_line":"  advertise ipv6 unicast"},{"line_number":48,"context_line":"  route-target import {peer_asn}:{vni}"},{"line_number":49,"context_line":" exit-address-family"},{"line_number":50,"context_line":"exit"},{"line_number":51,"context_line":"!"}],"source_content_type":"text/x-python","patch_set":19,"id":"0d1acf69_48d8112c","line":48,"in_reply_to":"74e5f265_dc3e5fcd","updated":"2026-08-12 19:32:12.000000000","message":"Actually, I think it will be easier to have follow up review on this. Currently, both bgp and evpn job set spine to 65000 and leaf to 64999 in their respective frr.conf.j2. So the spine where this is evpn provisioner is running, needs to set correct `peer_asn`.\n\nWe could follow up this with another set of patches where we make the leaf and spine asn configurable. If I start messing with this now it will cause more files to be changed.","commit_id":"c526834da8de06aa3f546ce29b774fce5910c4ac"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"05f501804f9a02b45845d31b2edda354fc477c58","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    FRR with EVPN extension of BGP router."},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    _COUNTER_FILE \u003d \u0027/tmp/evpn-vni-counter\u0027"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, vtep_ip, datapath_ip, vxlan_port\u003d4789,"},{"line_number":87,"context_line":"                 asn\u003d65000, peer_asn\u003d64999,"}],"source_content_type":"text/x-python","patch_set":20,"id":"c52496aa_422c9075","line":84,"range":{"start_line":84,"start_character":21,"end_line":84,"end_character":26},"updated":"2026-08-25 12:38:56.000000000","message":"I see we use /tmp/ in other tests directly, so we could use it here too.","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"27f35d61ce4ff55192cf1fd56c6af4b57627775f","unresolved":true,"context_lines":[{"line_number":81,"context_line":"    FRR with EVPN extension of BGP router."},{"line_number":82,"context_line":"    \"\"\""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    _COUNTER_FILE \u003d \u0027/tmp/evpn-vni-counter\u0027"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def __init__(self, vtep_ip, datapath_ip, vxlan_port\u003d4789,"},{"line_number":87,"context_line":"                 asn\u003d65000, peer_asn\u003d64999,"}],"source_content_type":"text/x-python","patch_set":20,"id":"f1f6e3b7_a19a4e35","line":84,"range":{"start_line":84,"start_character":21,"end_line":84,"end_character":26},"in_reply_to":"c52496aa_422c9075","updated":"2026-08-25 22:23:47.000000000","message":"Sorry, I dont understand. Are you suggesting to use some existing constant?","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"05f501804f9a02b45845d31b2edda354fc477c58","unresolved":true,"context_lines":[{"line_number":175,"context_line":"        for dev in (\u0027vxlan-%d\u0027 % vni, \u0027br-%d\u0027 % vni, \u0027evpnvrf-%d\u0027 % vni):"},{"line_number":176,"context_line":"            try:"},{"line_number":177,"context_line":"                self._run([\u0027ip\u0027, \u0027link\u0027, \u0027del\u0027, dev])"},{"line_number":178,"context_line":"            except subprocess.CalledProcessError:"},{"line_number":179,"context_line":"                LOG.warning(\u0027Failed to delete %s (may not exist)\u0027, dev)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        self._run_vtysh(_FRR_DELETE_TEMPLATE.format("}],"source_content_type":"text/x-python","patch_set":20,"id":"bedbe7b4_584a70f6","line":178,"range":{"start_line":178,"start_character":12,"end_line":178,"end_character":49},"updated":"2026-08-25 12:38:56.000000000","message":"Found by Claude.\n\nIf `_run` uses `ssh.Client.exec_command()`, that will raise `tempest.lib.exceptions.SSHExecCommandFailed`","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"39d8c62c5bab4f34ea3ff5641b13b96ef19590f0","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        for dev in (\u0027vxlan-%d\u0027 % vni, \u0027br-%d\u0027 % vni, \u0027evpnvrf-%d\u0027 % vni):"},{"line_number":176,"context_line":"            try:"},{"line_number":177,"context_line":"                self._run([\u0027ip\u0027, \u0027link\u0027, \u0027del\u0027, dev])"},{"line_number":178,"context_line":"            except subprocess.CalledProcessError:"},{"line_number":179,"context_line":"                LOG.warning(\u0027Failed to delete %s (may not exist)\u0027, dev)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        self._run_vtysh(_FRR_DELETE_TEMPLATE.format("}],"source_content_type":"text/x-python","patch_set":20,"id":"0fd183b2_8e067df0","line":178,"range":{"start_line":178,"start_character":12,"end_line":178,"end_character":49},"in_reply_to":"bedbe7b4_584a70f6","updated":"2026-08-26 13:58:43.000000000","message":"Done","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1c29514c07121c74cdbaca8bc34be89d57b4f596","unresolved":true,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    _COUNTER_FILE \u003d \u0027/tmp/evpn-vni-counter\u0027"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def __init__(self, vtep_ip, datapath_ip, vxlan_port\u003d4789,"},{"line_number":88,"context_line":"                 asn\u003d65000, peer_asn\u003d64999,"},{"line_number":89,"context_line":"                 vni_range_start\u003d1000, vni_range_end\u003d1100):"},{"line_number":90,"context_line":"        self.vtep_ip \u003d vtep_ip"},{"line_number":91,"context_line":"        self.datapath_ip \u003d datapath_ip"},{"line_number":92,"context_line":"        self.vxlan_port \u003d vxlan_port"}],"source_content_type":"text/x-python","patch_set":26,"id":"a788471b_8a587a43","line":89,"range":{"start_line":87,"start_character":45,"end_line":89,"end_character":57},"updated":"2026-09-08 13:26:08.000000000","message":"nit: Seems like these are always passed with the defaults taken from the config options. I\u0027d not make two defaults and let these be mandatory.","commit_id":"9d638a28bf0c76be7b089f9524330ad51c45d1c1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1c29514c07121c74cdbaca8bc34be89d57b4f596","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        bridge \u003d \u0027br-%d\u0027 % vni"},{"line_number":143,"context_line":"        vxlan \u003d \u0027vxlan-%d\u0027 % vni"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        self._run("},{"line_number":146,"context_line":"            [\u0027ip\u0027, \u0027link\u0027, \u0027add\u0027, vrf,"},{"line_number":147,"context_line":"             \u0027type\u0027, \u0027vrf\u0027, \u0027table\u0027, str(vni)])"},{"line_number":148,"context_line":"        self._run([\u0027ip\u0027, \u0027link\u0027, \u0027set\u0027, vrf, \u0027up\u0027])"},{"line_number":149,"context_line":"        self._run([\u0027ip\u0027, \u0027link\u0027, \u0027add\u0027, bridge, \u0027type\u0027, \u0027bridge\u0027])"},{"line_number":150,"context_line":"        self._run([\u0027ip\u0027, \u0027link\u0027, \u0027set\u0027, bridge, \u0027master\u0027, vrf])"},{"line_number":151,"context_line":"        self._run("},{"line_number":152,"context_line":"            [\u0027ip\u0027, \u0027link\u0027, \u0027add\u0027, vxlan,"},{"line_number":153,"context_line":"             \u0027type\u0027, \u0027vxlan\u0027, \u0027id\u0027, str(vni),"},{"line_number":154,"context_line":"             \u0027local\u0027, self.vtep_ip,"},{"line_number":155,"context_line":"             \u0027dstport\u0027, str(self.vxlan_port), \u0027nolearning\u0027])"},{"line_number":156,"context_line":"        self._run([\u0027ip\u0027, \u0027link\u0027, \u0027set\u0027, vxlan, \u0027master\u0027, bridge])"},{"line_number":157,"context_line":"        self._run("},{"line_number":158,"context_line":"            [\u0027bridge\u0027, \u0027link\u0027, \u0027set\u0027, \u0027dev\u0027, vxlan,"},{"line_number":159,"context_line":"             \u0027neigh_suppress\u0027, \u0027on\u0027])"},{"line_number":160,"context_line":"        self._run([\u0027ip\u0027, \u0027link\u0027, \u0027set\u0027, bridge, \u0027up\u0027])"},{"line_number":161,"context_line":"        self._run([\u0027ip\u0027, \u0027link\u0027, \u0027set\u0027, vxlan, \u0027up\u0027])"},{"line_number":162,"context_line":"        self._run("},{"line_number":163,"context_line":"            [\u0027ip\u0027, \u0027addr\u0027, \u0027add\u0027,"},{"line_number":164,"context_line":"             \u0027%s/32\u0027 % self.datapath_ip, \u0027dev\u0027, bridge])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        self._run_vtysh(_FRR_CREATE_TEMPLATE.format("},{"line_number":167,"context_line":"            vni\u003dvni, asn\u003dself.asn, peer_asn\u003dself.peer_asn))"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    @lockutils.synchronized(\u0027evpn-vni-provisioner\u0027, external\u003dTrue,"},{"line_number":170,"context_line":"                            lock_path\u003d\u0027/tmp\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"62809a02_5a35b9af","line":167,"range":{"start_line":145,"start_character":0,"end_line":167,"end_character":59},"updated":"2026-09-08 13:26:08.000000000","message":"No action required: I know this is a test code but if any of the commands fail, we will leave the remote machine in an inconsistent state with some orphaned devices.\n\nBut we do not reuse the vnis, right? So even with orphaned we should be fine.","commit_id":"9d638a28bf0c76be7b089f9524330ad51c45d1c1"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e61d99940c6d2afc65d83b538b8cf02f0e253b5c","unresolved":true,"context_lines":[{"line_number":204,"context_line":"    @lockutils.synchronized(\u0027evpn-vni-provisioner\u0027, external\u003dTrue,"},{"line_number":205,"context_line":"                            lock_path\u003d\u0027/tmp\u0027)"},{"line_number":206,"context_line":"    def allocate_vni(self):"},{"line_number":207,"context_line":"        vni \u003d self._next_vni()"},{"line_number":208,"context_line":"        self._create_vni_unlocked(vni)"},{"line_number":209,"context_line":"        return vni"}],"source_content_type":"text/x-python","patch_set":26,"id":"b2721c67_e9b2c690","line":209,"range":{"start_line":207,"start_character":0,"end_line":209,"end_character":18},"updated":"2026-09-08 13:28:20.000000000","message":"nit: I would do\n```\nvni \u003d self._next_vni()\ntry:\n    self._create_vni_unlocked(vni)\nexcept Exception:\n    LOG.error(\"bla bla bla\")\nreturn vni\n```\n\nthis way if the ip link commands fail, we\u0027d still add the cleanup routine and attempt to delete the devices and remove the router from frr.","commit_id":"9d638a28bf0c76be7b089f9524330ad51c45d1c1"}],"neutron_tempest_plugin/scenario/test_evpn.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"93790fd3abe515752e9da8ffa94dae945d4f9f9a","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.lib.common.utils import data_utils"},{"line_number":17,"context_line":"from tempest.lib import decorators"},{"line_number":18,"context_line":"from tempest.lib import exceptions as lib_exc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutron_tempest_plugin.common.evpn_provisioner import ("},{"line_number":21,"context_line":"    EVPNVNIProvisioner)"}],"source_content_type":"text/x-python","patch_set":12,"id":"be555e9c_6d9255be","line":18,"updated":"2026-08-01 05:22:13.000000000","message":"pep8: F401 \u0027tempest.lib.exceptions as lib_exc\u0027 imported but unused","commit_id":"6b417b83d3f1f105e957e784d15fe26f065ee70b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"93790fd3abe515752e9da8ffa94dae945d4f9f9a","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutron_tempest_plugin.common.evpn_provisioner import ("},{"line_number":21,"context_line":"    EVPNVNIProvisioner)"},{"line_number":22,"context_line":"from neutron_tempest_plugin.common import ssh"},{"line_number":23,"context_line":"from neutron_tempest_plugin import config"},{"line_number":24,"context_line":"from neutron_tempest_plugin.scenario import base"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"037b41f8_9ed1d2e7","line":22,"updated":"2026-08-01 05:22:13.000000000","message":"pep8: F401 \u0027neutron_tempest_plugin.common.ssh\u0027 imported but unused","commit_id":"6b417b83d3f1f105e957e784d15fe26f065ee70b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"05f501804f9a02b45845d31b2edda354fc477c58","unresolved":true,"context_lines":[{"line_number":34,"context_line":"    def _init_vni_provisioner(cls):"},{"line_number":35,"context_line":"        opts \u003d CONF.neutron_plugin_options"},{"line_number":36,"context_line":"        if opts.evpn_vtep_ip:"},{"line_number":37,"context_line":"            cls.vni_provisioner \u003d EVPNVNIProvisioner("},{"line_number":38,"context_line":"                vtep_ip\u003dopts.evpn_vtep_ip,"},{"line_number":39,"context_line":"                datapath_ip\u003dopts.evpn_datapath_ip,"},{"line_number":40,"context_line":"                vxlan_port\u003dopts.evpn_vxlan_port,"}],"source_content_type":"text/x-python","patch_set":20,"id":"f333dce6_fc023ed9","line":37,"range":{"start_line":37,"start_character":34,"end_line":37,"end_character":52},"updated":"2026-08-25 12:38:56.000000000","message":"nit: we usually import the module, not the class","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"48a93d8bf15a1daae10ed097d5453b964db0959a","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def _init_vni_provisioner(cls):"},{"line_number":35,"context_line":"        opts \u003d CONF.neutron_plugin_options"},{"line_number":36,"context_line":"        if opts.evpn_vtep_ip:"},{"line_number":37,"context_line":"            cls.vni_provisioner \u003d EVPNVNIProvisioner("},{"line_number":38,"context_line":"                vtep_ip\u003dopts.evpn_vtep_ip,"},{"line_number":39,"context_line":"                datapath_ip\u003dopts.evpn_datapath_ip,"},{"line_number":40,"context_line":"                vxlan_port\u003dopts.evpn_vxlan_port,"}],"source_content_type":"text/x-python","patch_set":20,"id":"a5826b41_8ff6823f","line":37,"range":{"start_line":37,"start_character":34,"end_line":37,"end_character":52},"in_reply_to":"f333dce6_fc023ed9","updated":"2026-08-26 16:17:13.000000000","message":"Done","commit_id":"3ee74a52e366e91165fffeb25c794a3f3f3804b4"}]}
