)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":14,"context_line":"VNI to VLAN interface on the vlan-aware Linux bridge.  The VLAN"},{"line_number":15,"context_line":"interface represents the EVPN instance\u0027s bridge domain.  Netlink,"},{"line_number":16,"context_line":"primarily through pyroute2, is used to programmatically create the"},{"line_number":17,"context_line":"following interfaces and update their settings.  Where pyroute2 does not"},{"line_number":18,"context_line":"support the configuration, a raw netlink message is composed and the"},{"line_number":19,"context_line":"configuration is still through netlink."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Creating SVD:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"ee61f5db_247314c2","line":18,"range":{"start_line":17,"start_character":49,"end_line":18,"end_character":25},"updated":"2026-06-01 13:20:34.000000000","message":"It does support the configuration but the API doesn\u0027t provide this functionality","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"VNI to VLAN interface on the vlan-aware Linux bridge.  The VLAN"},{"line_number":15,"context_line":"interface represents the EVPN instance\u0027s bridge domain.  Netlink,"},{"line_number":16,"context_line":"primarily through pyroute2, is used to programmatically create the"},{"line_number":17,"context_line":"following interfaces and update their settings.  Where pyroute2 does not"},{"line_number":18,"context_line":"support the configuration, a raw netlink message is composed and the"},{"line_number":19,"context_line":"configuration is still through netlink."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Creating SVD:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"f293b51f_771ea668","line":18,"range":{"start_line":17,"start_character":49,"end_line":18,"end_character":25},"in_reply_to":"ee61f5db_247314c2","updated":"2026-06-02 04:16:54.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":24,"context_line":"ip link set $br address $svd_mac"},{"line_number":25,"context_line":"ip link set $br mtu 1500"},{"line_number":26,"context_line":"ip link set dev $br up"},{"line_number":27,"context_line":"ip link add $vxlan type vxlan   \t  \t\\"},{"line_number":28,"context_line":"\tdev $underlay_device    \t\t\\"},{"line_number":29,"context_line":"\tdstport $dstport local $local_ip\t\\"},{"line_number":30,"context_line":"\tnolearning external vnifilter \t\t\\"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"efac7320_f32e9ecf","line":27,"range":{"start_line":27,"start_character":30,"end_line":27,"end_character":36},"updated":"2026-06-01 13:20:34.000000000","message":"Please, remove the tabs","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"ip link set $br address $svd_mac"},{"line_number":25,"context_line":"ip link set $br mtu 1500"},{"line_number":26,"context_line":"ip link set dev $br up"},{"line_number":27,"context_line":"ip link add $vxlan type vxlan   \t  \t\\"},{"line_number":28,"context_line":"\tdev $underlay_device    \t\t\\"},{"line_number":29,"context_line":"\tdstport $dstport local $local_ip\t\\"},{"line_number":30,"context_line":"\tnolearning external vnifilter \t\t\\"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9d85ee9a_8c1bcedd","line":27,"range":{"start_line":27,"start_character":30,"end_line":27,"end_character":36},"in_reply_to":"efac7320_f32e9ecf","updated":"2026-06-02 04:16:54.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":25,"context_line":"ip link set $br mtu 1500"},{"line_number":26,"context_line":"ip link set dev $br up"},{"line_number":27,"context_line":"ip link add $vxlan type vxlan   \t  \t\\"},{"line_number":28,"context_line":"\tdev $underlay_device    \t\t\\"},{"line_number":29,"context_line":"\tdstport $dstport local $local_ip\t\\"},{"line_number":30,"context_line":"\tnolearning external vnifilter \t\t\\"},{"line_number":31,"context_line":"ip link set $vxlan addrgenmode none master $br"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fb3733e1_7e313b25","line":28,"range":{"start_line":28,"start_character":23,"end_line":28,"end_character":27},"updated":"2026-06-01 13:20:34.000000000","message":"ditto","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":25,"context_line":"ip link set $br mtu 1500"},{"line_number":26,"context_line":"ip link set dev $br up"},{"line_number":27,"context_line":"ip link add $vxlan type vxlan   \t  \t\\"},{"line_number":28,"context_line":"\tdev $underlay_device    \t\t\\"},{"line_number":29,"context_line":"\tdstport $dstport local $local_ip\t\\"},{"line_number":30,"context_line":"\tnolearning external vnifilter \t\t\\"},{"line_number":31,"context_line":"ip link set $vxlan addrgenmode none master $br"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9756a03d_5bce188b","line":28,"range":{"start_line":28,"start_character":23,"end_line":28,"end_character":27},"in_reply_to":"fb3733e1_7e313b25","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":26,"context_line":"ip link set dev $br up"},{"line_number":27,"context_line":"ip link add $vxlan type vxlan   \t  \t\\"},{"line_number":28,"context_line":"\tdev $underlay_device    \t\t\\"},{"line_number":29,"context_line":"\tdstport $dstport local $local_ip\t\\"},{"line_number":30,"context_line":"\tnolearning external vnifilter \t\t\\"},{"line_number":31,"context_line":"ip link set $vxlan addrgenmode none master $br"},{"line_number":32,"context_line":"ip link set $vxlan address $svd_mac"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"e9315e81_0e5366ce","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":1},"updated":"2026-06-01 13:20:34.000000000","message":"ditto","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"ip link set dev $br up"},{"line_number":27,"context_line":"ip link add $vxlan type vxlan   \t  \t\\"},{"line_number":28,"context_line":"\tdev $underlay_device    \t\t\\"},{"line_number":29,"context_line":"\tdstport $dstport local $local_ip\t\\"},{"line_number":30,"context_line":"\tnolearning external vnifilter \t\t\\"},{"line_number":31,"context_line":"ip link set $vxlan addrgenmode none master $br"},{"line_number":32,"context_line":"ip link set $vxlan address $svd_mac"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"4adfee42_2cb69409","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":1},"in_reply_to":"e9315e81_0e5366ce","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":45,"context_line":"ip link set vl-0-$vid addr $router_mac addrgenmode none"},{"line_number":46,"context_line":"ip link set vl-0-$vid up"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Claude assisted in generating the unit tests and functional tests, as"},{"line_number":49,"context_line":"well as interfacing with pyroute2 and netlink."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Related-Bug: #2144617"},{"line_number":52,"context_line":"Assisted-By: Claude"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5df946f9_faeab902","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":46},"updated":"2026-06-01 13:20:34.000000000","message":"Not needed","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"ip link set vl-0-$vid addr $router_mac addrgenmode none"},{"line_number":46,"context_line":"ip link set vl-0-$vid up"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"Claude assisted in generating the unit tests and functional tests, as"},{"line_number":49,"context_line":"well as interfacing with pyroute2 and netlink."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Related-Bug: #2144617"},{"line_number":52,"context_line":"Assisted-By: Claude"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"f350f3a9_e36b283a","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":46},"in_reply_to":"5df946f9_faeab902","updated":"2026-06-02 04:16:54.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":49,"context_line":"well as interfacing with pyroute2 and netlink."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Related-Bug: #2144617"},{"line_number":52,"context_line":"Assisted-By: Claude"},{"line_number":53,"context_line":"Change-Id: I78fec86595fb358880b306ec1fe014adad007d87"},{"line_number":54,"context_line":"Signed-off-by: Helen Chen \u003cichen@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"a6cfab7f_c19ebd93","line":52,"range":{"start_line":52,"start_character":13,"end_line":52,"end_character":19},"updated":"2026-06-01 13:20:34.000000000","message":"It is better if we define the model used (Claude Opus 4.6 High, for example)","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"well as interfacing with pyroute2 and netlink."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"Related-Bug: #2144617"},{"line_number":52,"context_line":"Assisted-By: Claude"},{"line_number":53,"context_line":"Change-Id: I78fec86595fb358880b306ec1fe014adad007d87"},{"line_number":54,"context_line":"Signed-off-by: Helen Chen \u003cichen@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5d55fb2e_0563ee5f","line":52,"range":{"start_line":52,"start_character":13,"end_line":52,"end_character":19},"in_reply_to":"a6cfab7f_c19ebd93","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"8183d93102568b14fc84ee7ef5013702d2628736","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5be1c9ae_945f1fd2","updated":"2026-05-26 22:54:17.000000000","message":"So for context, this how real hardware switches work. Which is what the doc in https://review.opendev.org/c/openstack/neutron/+/965415 describes as the binding between VNI and VLAN. Which is what https://docs.openstack.org/networking-baremetal/latest/configuration/ml2/l2vni-mechanism-driver.html provides that @juliaashleykreger@gmail.com and I have been spending the last 2 PTGs trying to work with the Neutron community on how to provide a generic way for Neutron to be able to map this and have ML2 mechanisms and service plugins understand this properly.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"85c9b333de303feaf0e0acd9e6f031a12ea6957d","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4b59e472_e35e837e","in_reply_to":"166a8ad9_9b02d8ff","updated":"2026-05-28 02:23:10.000000000","message":"Are you referring to the generic-networking-switch?  Do you mean that Neutron should manage SVD in the compute node in the same manner as a physical switch?","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"d3fa4f3239e8cac4327e42a23cc389a52e540c1a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4fc8447d_746ae7b7","in_reply_to":"4b59e472_e35e837e","updated":"2026-05-28 04:11:03.000000000","message":"Not referring to networking-generic-switch. I’m referring to how the general model of every ML2 mechanism implements VNI to VLAN mapping. Of which I have been advocating creating a generic component for this instead of re-inventing the wheel multiple times.\n\nA virtual switch is no different than a physical switch.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"42689963253dc4c942f00d65f46eeb43cd347a96","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6cf695e6_c63baa4d","in_reply_to":"4fc8447d_746ae7b7","updated":"2026-05-29 02:32:45.000000000","message":"VNI:VLAN mapping is removed and will be located on the Neutron server side in a different patch.  This patch now only provides the APIs to create interfaces in the kernel.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"661b21705926e66a74d7c69fb2bbae265847a2af","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8c83e97b_c5e24e95","in_reply_to":"5be1c9ae_945f1fd2","updated":"2026-05-27 19:54:37.000000000","message":"Is there a mapping that you\u0027d like to suggest?\n\nThis patch assumes the following:\n1. Each compute node is not expected to support more than 4094 VNIs.\n2. Unlike physical switches, a Linux bridge can support 4094 VLANs.\n\nGiven the above, OVN Agent only needs one vlan-aware Linux bridge (and one vlan-aware VxLAN interface), avoiding creating more bridges than necessary.  The smallest, unallocated VID is mapped to each new VNI created.  The 4095th VNI that is created will raise SvdVlanExhausted exception.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"6d3411397d3cdd5dd718c488d67174214f992491","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4e3981aa_f932e35a","in_reply_to":"6cf695e6_c63baa4d","updated":"2026-05-31 21:28:15.000000000","message":"Done","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"987820676d489aa9e50830ccf0bab96057b2d18e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"166a8ad9_9b02d8ff","in_reply_to":"8c83e97b_c5e24e95","updated":"2026-05-27 21:48:55.000000000","message":"I don’t understand #2. Physical switches support up to 4094 VLANs. In fact certain models I can run more than one SVD and have another set of 4094 VLANs. We use hierarchical port binding with the L2VNI mechanism that I linked to handle the mapping is what I’ve been suggesting to handle this. Each compute node would be its own physnet to be a pool of VLANs. Then you have a tested allocator which can allow the operator make carve outs or work with other service plugin backends that might route traffic over different L3VNI links.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"fe6d8e7d_c7967c02","updated":"2026-06-01 13:20:34.000000000","message":"Nice implementation, minor nits","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"93e3c15eb7bdaa0b5afacbe33dac3e01c5d80bf3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"669904dc_d71d6719","updated":"2026-06-02 14:15:09.000000000","message":"-1 for the content location\n\n+2 for the code and the new tests","commit_id":"00346836ffbcd7c515680e65f3210fac7ef8ee91"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f6ed60b940d09715adb67b505aca29feaecf905e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ee113670_6a930fa8","updated":"2026-06-04 08:35:13.000000000","message":"FT errors are related to this patch","commit_id":"21e28c3aad2721fa6bc86b96b88eb9cfa3c84852"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf6e056629260c920450189e08c664248fd4330a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0a25f078_f149f2ca","updated":"2026-06-04 22:14:57.000000000","message":"All comments can be addressed in a followup if even needed","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"2eae0492f4c56a546d0d1dbfd40ada5596cd8f63","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"7d062dab_0fceba62","updated":"2026-06-04 19:28:25.000000000","message":"recheck due to test time out\nhttps://bugs.launchpad.net/nova/+bug/2155462","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"78e44a100f755884d1ea62252a894442f407f70e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"662defc1_f4f775df","updated":"2026-06-05 11:53:20.000000000","message":"The functional tests failures seem related, also other patches based on this one failed","commit_id":"90b4a88b07a4629a0135ecd19ec773bc71ccfb1b"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"cea3163e861e13a9445080c72a14226b05df5b0f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"ce1ab21e_498f3605","in_reply_to":"662defc1_f4f775df","updated":"2026-06-05 13:24:16.000000000","message":"Restored the change in patch 11, which should fix the functional test error.","commit_id":"90b4a88b07a4629a0135ecd19ec773bc71ccfb1b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"6f228af60c9bf961c3c89883780ec124e6a067ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"8908d8b4_1245d965","updated":"2026-06-05 14:56:24.000000000","message":"Assuming CI is green","commit_id":"6b6748cf418b798e54b680b1a92df42c84f4a945"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9a93d79f4122f00e7015242a9fe44b653761b45e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"478d2477_cac76703","updated":"2026-06-05 15:26:10.000000000","message":"I need to check something","commit_id":"6b6748cf418b798e54b680b1a92df42c84f4a945"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"7767ec5c83435c2ea4394b5358e4b151db84ecd1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"26a3324d_fed7273d","updated":"2026-06-05 17:57:41.000000000","message":"Seems like we\u0027ll need to fix the static naming in svd","commit_id":"6b6748cf418b798e54b680b1a92df42c84f4a945"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e3a4165b282d0041bd85b8ae34b7d18eecd527ab","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"ffb350bd_9021b044","updated":"2026-06-05 16:46:19.000000000","message":"recheck due to test time out when creating a server\nhttps://bugs.launchpad.net/nova/+bug/2155462","commit_id":"6b6748cf418b798e54b680b1a92df42c84f4a945"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"478f50f44cfe07324f375ccc4f20fc5529679311","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"e8fe74b5_b4bc7610","updated":"2026-06-05 19:08:41.000000000","message":"I removed failing things and fixed them in a followup: https://review.opendev.org/c/openstack/neutron/+/991931","commit_id":"4ff56f19306b39b0f269bfabae8e375e2a5d1392"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"6a6c2e1a007c774c221bc037c91b2b9b01de4859","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"ef3017dc_3f9725e7","updated":"2026-06-06 03:16:16.000000000","message":"The functional tests seem to be passing on the next patch up (except a provnet ports patch which seems to be failing across all recent runs)","commit_id":"4ff56f19306b39b0f269bfabae8e375e2a5d1392"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"830c24ebf86d86c9bbc1e8e42792628466aae833","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"8f2626f6_b2a63630","updated":"2026-06-08 01:08:45.000000000","message":"recheck failure due to server timeout","commit_id":"570efdbe1886c202f5b1bcaadc14acc4c9ca9da2"}],"neutron/agent/linux/svd.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"58c287b1492fe2e3be0f92185fa177cd5019c5a2","unresolved":true,"context_lines":[{"line_number":21,"context_line":"from neutron.privileged.agent.linux import svd as privileged_svd"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Svd:"},{"line_number":25,"context_line":"    \"\"\"A Single VXLAN Device: a VLAN-aware bridge + VXLAN device pair."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    Up to 4094 VNIs share the same SVD via VLAN/VNI mappings added"}],"source_content_type":"text/x-python","patch_set":9,"id":"80eaf43d_e61e43bd","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":10},"updated":"2026-06-03 17:28:18.000000000","message":"why do you have identical `Svd` class here and in the extensions/evpn/svd.py?","commit_id":"2c2a8c7f118db75295b311129656b39dc994a6d6"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"8d76baf99ac1e59f0147e236cfbcfffbbbd69840","unresolved":true,"context_lines":[{"line_number":21,"context_line":"from neutron.privileged.agent.linux import svd as privileged_svd"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Svd:"},{"line_number":25,"context_line":"    \"\"\"A Single VXLAN Device: a VLAN-aware bridge + VXLAN device pair."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    Up to 4094 VNIs share the same SVD via VLAN/VNI mappings added"}],"source_content_type":"text/x-python","patch_set":9,"id":"cb0e4859_35d62c35","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":10},"in_reply_to":"2bdf6d90_771e2cab","updated":"2026-06-04 01:29:26.000000000","message":"Should be removed now.","commit_id":"2c2a8c7f118db75295b311129656b39dc994a6d6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86b6c72157497ba6aadf2a749c7ade705c461dd6","unresolved":true,"context_lines":[{"line_number":21,"context_line":"from neutron.privileged.agent.linux import svd as privileged_svd"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Svd:"},{"line_number":25,"context_line":"    \"\"\"A Single VXLAN Device: a VLAN-aware bridge + VXLAN device pair."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    Up to 4094 VNIs share the same SVD via VLAN/VNI mappings added"}],"source_content_type":"text/x-python","patch_set":9,"id":"2bdf6d90_771e2cab","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":10},"in_reply_to":"80eaf43d_e61e43bd","updated":"2026-06-03 19:58:22.000000000","message":"Right, the other one is duplicated/.","commit_id":"2c2a8c7f118db75295b311129656b39dc994a6d6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e6f11fcea4d8f536faa9e6721ca1d4893b223704","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.privileged.agent.linux import svd as privileged_svd"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Svd:"},{"line_number":25,"context_line":"    \"\"\"A Single VXLAN Device: a VLAN-aware bridge + VXLAN device pair."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    Up to 4094 VNIs share the same SVD via VLAN/VNI mappings added"}],"source_content_type":"text/x-python","patch_set":9,"id":"5b92121a_5a7403d7","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":10},"in_reply_to":"cb0e4859_35d62c35","updated":"2026-06-04 14:57:21.000000000","message":"Done","commit_id":"2c2a8c7f118db75295b311129656b39dc994a6d6"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1b8f2e3523e614924f1e9ac8cf6dfe861190baa3","unresolved":true,"context_lines":[{"line_number":46,"context_line":"                                            (vxlan_parent))"},{"line_number":47,"context_line":"        except NetlinkError as e:"},{"line_number":48,"context_line":"            if e.code \u003d\u003d errno.EEXIST:"},{"line_number":49,"context_line":"                raise evpn_exc.SvdDeviceAlreadyExists(\"SVD %s/%s device(s)\""},{"line_number":50,"context_line":"                                                      \"already exist(s)\" %"},{"line_number":51,"context_line":"                                                      (self.br_evpn,"},{"line_number":52,"context_line":"                                                       self.vxlan_evpn))"}],"source_content_type":"text/x-python","patch_set":10,"id":"36e972f9_a938ed8d","line":49,"range":{"start_line":49,"start_character":74,"end_line":49,"end_character":75},"updated":"2026-06-05 01:12:32.000000000","message":"missing space after device(s)","commit_id":"21e28c3aad2721fa6bc86b96b88eb9cfa3c84852"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"6591eca7a2792d493ebfdc8f4784a9986101105a","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                                            (vxlan_parent))"},{"line_number":47,"context_line":"        except NetlinkError as e:"},{"line_number":48,"context_line":"            if e.code \u003d\u003d errno.EEXIST:"},{"line_number":49,"context_line":"                raise evpn_exc.SvdDeviceAlreadyExists(\"SVD %s/%s device(s)\""},{"line_number":50,"context_line":"                                                      \"already exist(s)\" %"},{"line_number":51,"context_line":"                                                      (self.br_evpn,"},{"line_number":52,"context_line":"                                                       self.vxlan_evpn))"}],"source_content_type":"text/x-python","patch_set":10,"id":"7a661da4_3bcd40f3","line":49,"range":{"start_line":49,"start_character":74,"end_line":49,"end_character":75},"in_reply_to":"36e972f9_a938ed8d","updated":"2026-06-05 02:26:32.000000000","message":"Done","commit_id":"21e28c3aad2721fa6bc86b96b88eb9cfa3c84852"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf6e056629260c920450189e08c664248fd4330a","unresolved":true,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import errno"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from pyroute2.netlink.exceptions import NetlinkError"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutron.agent.ovn.extensions.evpn import exceptions as evpn_exc"},{"line_number":21,"context_line":"from neutron.privileged.agent.linux import svd as privileged_svd"}],"source_content_type":"text/x-python","patch_set":11,"id":"a4458298_a90a02e9","line":18,"updated":"2026-06-04 22:14:57.000000000","message":"We should not be importing objects from modules: https://docs.openstack.org/hacking/latest/user/hacking.html#imports","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import errno"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from pyroute2.netlink.exceptions import NetlinkError"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from neutron.agent.ovn.extensions.evpn import exceptions as evpn_exc"},{"line_number":21,"context_line":"from neutron.privileged.agent.linux import svd as privileged_svd"}],"source_content_type":"text/x-python","patch_set":11,"id":"f484e3a6_935d5784","line":18,"in_reply_to":"a4458298_a90a02e9","updated":"2026-06-05 02:26:33.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1b8f2e3523e614924f1e9ac8cf6dfe861190baa3","unresolved":true,"context_lines":[{"line_number":28,"context_line":"    with add_vni()."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    When a VNI is mapped to a VLAN, a VLAN interface with"},{"line_number":31,"context_line":"    EVPN_VLAN_IFNAME_PATTER is created"},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, br_evpn, vxlan_evpn, index\u003d0):"}],"source_content_type":"text/x-python","patch_set":11,"id":"b7b96e07_9834f910","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":27},"updated":"2026-06-05 01:12:32.000000000","message":"missing last \u0027N\u0027","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    with add_vni()."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    When a VNI is mapped to a VLAN, a VLAN interface with"},{"line_number":31,"context_line":"    EVPN_VLAN_IFNAME_PATTER is created"},{"line_number":32,"context_line":"    \"\"\""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def __init__(self, br_evpn, vxlan_evpn, index\u003d0):"}],"source_content_type":"text/x-python","patch_set":11,"id":"a842e616_4c9115c5","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":27},"in_reply_to":"b7b96e07_9834f910","updated":"2026-06-05 02:26:33.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"}],"neutron/agent/ovn/extensions/evpn/pyroute2_utils.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":33,"context_line":"RTM_DELTUNNEL \u003d 121"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class _evpn_vxlan(vxlan.vxlan):"},{"line_number":37,"context_line":"    \"\"\"vxlan NLA extended with IFLA_VXLAN_VNIFILTER (type 30)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    pyroute2\u0027s vxlan plugin ends at IFLA_VXLAN_DF (type 29)."}],"source_content_type":"text/x-python","patch_set":2,"id":"27dd7676_7785a78d","line":36,"updated":"2026-05-29 19:52:25.000000000","message":"I know pyroute2 has a different coding convention but I think it would be goo if this followed the class name camel-case OpenStack convention","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":33,"context_line":"RTM_DELTUNNEL \u003d 121"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class _evpn_vxlan(vxlan.vxlan):"},{"line_number":37,"context_line":"    \"\"\"vxlan NLA extended with IFLA_VXLAN_VNIFILTER (type 30)."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    pyroute2\u0027s vxlan plugin ends at IFLA_VXLAN_DF (type 29)."}],"source_content_type":"text/x-python","patch_set":2,"id":"bed62874_eb2fc9bd","line":36,"in_reply_to":"27dd7676_7785a78d","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":66,"context_line":"        )"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def bridge_vni(ipr, command, vxlan_idx, vni):"},{"line_number":70,"context_line":"    \"\"\"Add or delete a VNI filter entry on a vxlan device."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":2,"id":"6b300864_0ce8b6af","line":69,"updated":"2026-05-29 19:52:25.000000000","message":"Let\u0027s make this a generic function and then specific function for add and delete.\n```\n\nBRIDGE_ADD_VNI_MSG_FLAGS \u003d (\n    netlink.NLM_F_REQUEST | netlink.NLM_F_ACK | netlink.NLM_F_CREATE | netlink.NLM_F_EXCL)\nBRIDGE_DEL_VNI_MSG_FLAGS \u003d netlink.NLM_F_REQUEST | netlink.NLM_F_ACK \n\ndef _make_bridge_vni_msg():\n    ...\n    return msg\n\ndef bridge_add_vni():\n    msg \u003d _make_bridge_vni_msg()\n    ipr.nlm_request(msg, msg_type\u003dRTM_NEWTUNNEL, msg_flags\u003dBRIDGE_ADD_VNI_MSG_FLAGS)\n    \ndef bridge_del_vni():\n    msg \u003d _make_bridge_vni_msg()\n    ipr.nlm_request(msg, msg_type\u003dRTM_DELTUNNEL, msg_flags\u003dBRIDGE_DEL_VNI_MSG_FLAGS)\n```\n\nthis way you don\u0027t need to make all constants per call and you don\u0027t need have a logic to figure out if the caller wanted to add or delete the vni","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        )"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"def bridge_vni(ipr, command, vxlan_idx, vni):"},{"line_number":70,"context_line":"    \"\"\"Add or delete a VNI filter entry on a vxlan device."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":2,"id":"f765a924_d00b1dac","line":69,"in_reply_to":"6b300864_0ce8b6af","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":74,"context_line":"        bridge vni del dev \u003cvxlan\u003e vni \u003cvni\u003e"},{"line_number":75,"context_line":"    \"\"\""},{"line_number":76,"context_line":"    msg \u003d _tunnel_msg()"},{"line_number":77,"context_line":"    msg[\u0027family\u0027] \u003d pyroute2_config.AF_BRIDGE"},{"line_number":78,"context_line":"    msg[\u0027ifindex\u0027] \u003d vxlan_idx"},{"line_number":79,"context_line":"    msg[\u0027attrs\u0027] \u003d ["},{"line_number":80,"context_line":"        (\u0027VXLAN_VNIFILTER_ENTRY\u0027, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"5b600c3d_5bd8d714","line":77,"updated":"2026-05-29 19:52:25.000000000","message":"We can set this at the `__init__` of the `_tunnel_msg` as it\u0027s a constant","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        bridge vni del dev \u003cvxlan\u003e vni \u003cvni\u003e"},{"line_number":75,"context_line":"    \"\"\""},{"line_number":76,"context_line":"    msg \u003d _tunnel_msg()"},{"line_number":77,"context_line":"    msg[\u0027family\u0027] \u003d pyroute2_config.AF_BRIDGE"},{"line_number":78,"context_line":"    msg[\u0027ifindex\u0027] \u003d vxlan_idx"},{"line_number":79,"context_line":"    msg[\u0027attrs\u0027] \u003d ["},{"line_number":80,"context_line":"        (\u0027VXLAN_VNIFILTER_ENTRY\u0027, {"}],"source_content_type":"text/x-python","patch_set":2,"id":"aebacac3_c5316ebd","line":77,"in_reply_to":"5b600c3d_5bd8d714","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":20,"context_line":"- RTM_NEWTUNNEL / RTM_DELTUNNEL (bridge vni add/del)"},{"line_number":21,"context_line":"- IFLA_INET6_ADDR_GEN_MODE via link(\u0027set\u0027, ...)"},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from pyroute2 import config as pyroute2_config"},{"line_number":25,"context_line":"from pyroute2 import netlink"},{"line_number":26,"context_line":"from pyroute2.netlink.rtnl import ifinfmsg"}],"source_content_type":"text/x-python","patch_set":4,"id":"f74cf869_a009d264","line":23,"updated":"2026-06-01 13:20:34.000000000","message":"These functions are public but require priv permissions. These should be in the `neutron/privileged/agent/linux/svd.py` file as private methods.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"- RTM_NEWTUNNEL / RTM_DELTUNNEL (bridge vni add/del)"},{"line_number":21,"context_line":"- IFLA_INET6_ADDR_GEN_MODE via link(\u0027set\u0027, ...)"},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from pyroute2 import config as pyroute2_config"},{"line_number":25,"context_line":"from pyroute2 import netlink"},{"line_number":26,"context_line":"from pyroute2.netlink.rtnl import ifinfmsg"}],"source_content_type":"text/x-python","patch_set":4,"id":"56c171c5_7cbfe1cc","line":23,"in_reply_to":"1b70b197_19b7fcb5","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"a7b24d282b160327bc1b01e6c118697d3ce62240","unresolved":true,"context_lines":[{"line_number":20,"context_line":"- RTM_NEWTUNNEL / RTM_DELTUNNEL (bridge vni add/del)"},{"line_number":21,"context_line":"- IFLA_INET6_ADDR_GEN_MODE via link(\u0027set\u0027, ...)"},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from pyroute2 import config as pyroute2_config"},{"line_number":25,"context_line":"from pyroute2 import netlink"},{"line_number":26,"context_line":"from pyroute2.netlink.rtnl import ifinfmsg"}],"source_content_type":"text/x-python","patch_set":4,"id":"d8dd2500_98672b3f","line":23,"in_reply_to":"208581d3_c673692b","updated":"2026-06-02 08:50:55.000000000","message":"@Helen: can those functions be run in non-privileged way? I thought that those operations will require some privileged capabilities and if that\u0027s the case I think they should be moved to the ``neutron.privileged`` module as Rodolfo suggested and should use ``privileged.default.entrypoint`` also. Maybe you don\u0027t need to move everything, just extract from here some key parts which really needs to run in privileged mode and move those to that privileged module.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"93e3c15eb7bdaa0b5afacbe33dac3e01c5d80bf3","unresolved":true,"context_lines":[{"line_number":20,"context_line":"- RTM_NEWTUNNEL / RTM_DELTUNNEL (bridge vni add/del)"},{"line_number":21,"context_line":"- IFLA_INET6_ADDR_GEN_MODE via link(\u0027set\u0027, ...)"},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from pyroute2 import config as pyroute2_config"},{"line_number":25,"context_line":"from pyroute2 import netlink"},{"line_number":26,"context_line":"from pyroute2.netlink.rtnl import ifinfmsg"}],"source_content_type":"text/x-python","patch_set":4,"id":"1b70b197_19b7fcb5","line":23,"in_reply_to":"d8dd2500_98672b3f","updated":"2026-06-02 14:15:09.000000000","message":"If these methods require privileged permissions but are public outside the /privileged directory, this is an error because the are importable and usable. They need to be declared in the neutron/privileged/agent/linux/svd.py file, regardless if the will be removed in the future.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":true,"context_lines":[{"line_number":20,"context_line":"- RTM_NEWTUNNEL / RTM_DELTUNNEL (bridge vni add/del)"},{"line_number":21,"context_line":"- IFLA_INET6_ADDR_GEN_MODE via link(\u0027set\u0027, ...)"},{"line_number":22,"context_line":"\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from pyroute2 import config as pyroute2_config"},{"line_number":25,"context_line":"from pyroute2 import netlink"},{"line_number":26,"context_line":"from pyroute2.netlink.rtnl import ifinfmsg"}],"source_content_type":"text/x-python","patch_set":4,"id":"208581d3_c673692b","line":23,"in_reply_to":"f74cf869_a009d264","updated":"2026-06-02 04:16:54.000000000","message":"In Patch 5, I still kept this file here.  The reason is that this file is better removed in the future when pyroute2 supports the APIs.  So, keeping it here and separate from neutron/privileged/agent/linux/svd.py will make it easier to eliminate this file in the future.\n\nSeparately, the functions in this file are called from neutron/privileged/agent/linux/svd.py , which creates the privileged netlink socket and passes it to the functions here.  So, the device configurations that the functions in this file do take effect.\n\n\nThat said, if those are not good reasons to keep this file in the evpn/ directory, I can move this to neutron/privileged/agent/linux/svd.py .","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"a529712bc747d8798c21c91e6232dc6b8838fad3","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    nla_map \u003d vxlan.vxlan.nla_map + ((\u0027IFLA_VXLAN_VNIFILTER\u0027, \u0027uint8\u0027),)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def register_vxlan_vnifilter():"},{"line_number":46,"context_line":"    \"\"\"Register the extended vxlan NLA with pyroute2."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    Must be called once before creating any vxlan device with"}],"source_content_type":"text/x-python","patch_set":5,"id":"d865e647_08ce0936","line":45,"updated":"2026-06-02 14:26:45.000000000","message":"why is this function needed here? I see you are only using the privileged version of it from svd.py","commit_id":"00346836ffbcd7c515680e65f3210fac7ef8ee91"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    nla_map \u003d vxlan.vxlan.nla_map + ((\u0027IFLA_VXLAN_VNIFILTER\u0027, \u0027uint8\u0027),)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def register_vxlan_vnifilter():"},{"line_number":46,"context_line":"    \"\"\"Register the extended vxlan NLA with pyroute2."},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    Must be called once before creating any vxlan device with"}],"source_content_type":"text/x-python","patch_set":5,"id":"36832ed2_db092418","line":45,"in_reply_to":"d865e647_08ce0936","updated":"2026-06-03 02:15:13.000000000","message":"Moved to neutron/privileged/agent/linux/svd.py","commit_id":"00346836ffbcd7c515680e65f3210fac7ef8ee91"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"535113d37fae6102d7d4d4349114cc3fa4d0b51c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7149aab1_2c3e77e0","line":144,"range":{"start_line":88,"start_character":0,"end_line":144,"end_character":1},"updated":"2026-06-03 14:21:01.000000000","message":"These 4 methods are no longer used from here.","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"08483c2357684841e2bc4f4d33a6aeff96963bae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3abd77ea_e3b73c28","line":144,"range":{"start_line":88,"start_character":0,"end_line":144,"end_character":1},"in_reply_to":"7149aab1_2c3e77e0","updated":"2026-06-03 14:34:09.000000000","message":"Done","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"}],"neutron/agent/ovn/extensions/evpn/svd.py":[{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        heapq.heappush(self._free_vids, vid)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":142,"context_line":"        \"\"\" Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":143,"context_line":"        vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        # Equivalent to:"}],"source_content_type":"text/x-python","patch_set":1,"id":"c0660103_a2f71026","line":142,"in_reply_to":"04156d81_d6069f2c","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"382e58e5ab479b5efdecd68c88d0f97438d55402","unresolved":true,"context_lines":[{"line_number":139,"context_line":"        heapq.heappush(self._free_vids, vid)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":142,"context_line":"        \"\"\" Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":143,"context_line":"        vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        # Equivalent to:"}],"source_content_type":"text/x-python","patch_set":1,"id":"04156d81_d6069f2c","line":142,"in_reply_to":"4cf44ab5_0cbaa081","updated":"2026-05-27 13:47:18.000000000","message":"\u003e pep8: H401: docstring should not start with a space\n\nPlease fix.\n\nFurthermore what is making the error worse is your creating a docstring which is wrapping. If your going to wrap beyond the pep8 character limit, you need to look at creating a multiline doc string, which wouldn\u0027t be a bad idea to do in general because the docstring adds context to AI assistants as to what each variable is and why it exists.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":142,"context_line":"        \"\"\" Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":143,"context_line":"        vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        # Equivalent to:"},{"line_number":146,"context_line":"        # ip link add \u003cself.br_evpn\u003e type bridge vlan_filtering 1 \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"934fad29_c8e14013","line":143,"in_reply_to":"1e10b157_d627eaa7","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"382e58e5ab479b5efdecd68c88d0f97438d55402","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":142,"context_line":"        \"\"\" Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":143,"context_line":"        vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        # Equivalent to:"},{"line_number":146,"context_line":"        # ip link add \u003cself.br_evpn\u003e type bridge vlan_filtering 1 \\"}],"source_content_type":"text/x-python","patch_set":1,"id":"1e10b157_d627eaa7","line":143,"in_reply_to":"6d3505fd_b6066b0a","updated":"2026-05-27 13:47:18.000000000","message":"\u003e pep8: H401: docstring should not start with a space\n\nPlease fix.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"382e58e5ab479b5efdecd68c88d0f97438d55402","unresolved":true,"context_lines":[{"line_number":141,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":142,"context_line":"        \"\"\" Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":143,"context_line":"        vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        # Equivalent to:"},{"line_number":146,"context_line":"        # ip link add \u003cself.br_evpn\u003e type bridge vlan_filtering 1 \\"},{"line_number":147,"context_line":"        #   vlan_default_pvid 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"3ddd77ca_df237bc2","line":144,"in_reply_to":"22de8556_50ea2e9c","updated":"2026-05-27 13:47:18.000000000","message":"\u003e pep8: H401: docstring should not start with a space\n\nPlease fix.","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":142,"context_line":"        \"\"\" Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":143,"context_line":"        vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        # Equivalent to:"},{"line_number":146,"context_line":"        # ip link add \u003cself.br_evpn\u003e type bridge vlan_filtering 1 \\"},{"line_number":147,"context_line":"        #   vlan_default_pvid 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"e692513a_b1f5b22e","line":144,"in_reply_to":"3ddd77ca_df237bc2","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"283976aa822464beb4cb08f5f824f573f4862114"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":38,"context_line":"        self.br_evpn \u003d br_evpn"},{"line_number":39,"context_line":"        self.vxlan_evpn \u003d vxlan_evpn"},{"line_number":40,"context_line":"        self._br_idx \u003d None"},{"line_number":41,"context_line":"        self._vxlan_idx \u003d None"},{"line_number":42,"context_line":"        self._create(ipr, local_ip, mac, vxlan_parent, dstport)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"}],"source_content_type":"text/x-python","patch_set":2,"id":"c0797806_d2a25a03","line":41,"updated":"2026-05-29 19:52:25.000000000","message":"I\u0027m wondering why don\u0027t we store the iproute interface here as an attribute\n```\nself.ipr \u003d ipr\n```\nand then we would not require it in all the methods.","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self.br_evpn \u003d br_evpn"},{"line_number":39,"context_line":"        self.vxlan_evpn \u003d vxlan_evpn"},{"line_number":40,"context_line":"        self._br_idx \u003d None"},{"line_number":41,"context_line":"        self._vxlan_idx \u003d None"},{"line_number":42,"context_line":"        self._create(ipr, local_ip, mac, vxlan_parent, dstport)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6f5d8ade_7863d7ff","line":41,"in_reply_to":"c0797806_d2a25a03","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        self.vxlan_evpn \u003d vxlan_evpn"},{"line_number":40,"context_line":"        self._br_idx \u003d None"},{"line_number":41,"context_line":"        self._vxlan_idx \u003d None"},{"line_number":42,"context_line":"        self._create(ipr, local_ip, mac, vxlan_parent, dstport)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":45,"context_line":"        \"\"\"Create a shared Single VxLAN Device (SVD) consisting of a"}],"source_content_type":"text/x-python","patch_set":2,"id":"eb878cb3_b04edfc7","line":42,"updated":"2026-05-29 19:52:25.000000000","message":"nit: I\u0027d move this out of the `__init__` and let the caller create the instance first and then perform actions:\n```\nsvd \u003d Svd()\nsvd.create()\n...\nsvd.add_vni(vni)\n```","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        self.vxlan_evpn \u003d vxlan_evpn"},{"line_number":40,"context_line":"        self._br_idx \u003d None"},{"line_number":41,"context_line":"        self._vxlan_idx \u003d None"},{"line_number":42,"context_line":"        self._create(ipr, local_ip, mac, vxlan_parent, dstport)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create(self, ipr, local_ip, mac, vxlan_parent, dstport):"},{"line_number":45,"context_line":"        \"\"\"Create a shared Single VxLAN Device (SVD) consisting of a"}],"source_content_type":"text/x-python","patch_set":2,"id":"26ab281b_c80475aa","line":42,"in_reply_to":"eb878cb3_b04edfc7","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":49,"context_line":"        # ip link add \u003cself.br_evpn\u003e type bridge vlan_filtering 1 \\"},{"line_number":50,"context_line":"        #   vlan_default_pvid 0"},{"line_number":51,"context_line":"        # ip link set \u003cself.br_evpn\u003e address \u003cmac\u003e"},{"line_number":52,"context_line":"        # ip link set \u003cself.br_evpn\u003e addrgenmode none"},{"line_number":53,"context_line":"        # ip link set \u003cself.br_evpn\u003e up"},{"line_number":54,"context_line":"        ipr.link(\u0027add\u0027, ifname\u003dself.br_evpn, kind\u003d\u0027bridge\u0027,"},{"line_number":55,"context_line":"                 br_vlan_filtering\u003d1, br_vlan_default_pvid\u003d0)"}],"source_content_type":"text/x-python","patch_set":2,"id":"e252015c_b2f03a5d","line":52,"updated":"2026-05-29 19:52:25.000000000","message":"Where is this set?","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        # ip link add \u003cself.br_evpn\u003e type bridge vlan_filtering 1 \\"},{"line_number":50,"context_line":"        #   vlan_default_pvid 0"},{"line_number":51,"context_line":"        # ip link set \u003cself.br_evpn\u003e address \u003cmac\u003e"},{"line_number":52,"context_line":"        # ip link set \u003cself.br_evpn\u003e addrgenmode none"},{"line_number":53,"context_line":"        # ip link set \u003cself.br_evpn\u003e up"},{"line_number":54,"context_line":"        ipr.link(\u0027add\u0027, ifname\u003dself.br_evpn, kind\u003d\u0027bridge\u0027,"},{"line_number":55,"context_line":"                 br_vlan_filtering\u003d1, br_vlan_default_pvid\u003d0)"}],"source_content_type":"text/x-python","patch_set":2,"id":"12caa160_157ddf91","line":52,"in_reply_to":"e252015c_b2f03a5d","updated":"2026-05-31 21:27:59.000000000","message":"It\u0027s on line 108.  I\u0027ll remove this comment.","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":90,"context_line":"                  self.br_evpn, self.vxlan_evpn, vxlan_parent,"},{"line_number":91,"context_line":"                  local_ip, dstport)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def delete(self, ipr):"},{"line_number":94,"context_line":"        ipr.link(\u0027del\u0027, index\u003dself._vxlan_idx)"},{"line_number":95,"context_line":"        ipr.link(\u0027del\u0027, index\u003dself._br_idx)"},{"line_number":96,"context_line":"        LOG.debug(\"Deleted SVD: bridge %s, vxlan %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"d697cf8d_d12302af","line":93,"updated":"2026-05-29 19:52:25.000000000","message":"I\u0027d suggest to create a private method of each action (create, add_vni, delete, del_vni) with the current bodies and then wrap those private methods from the public methods and raise a common or more specific Exception for the callers for the error handling in case any of the commands fail.\n\n```\ndef delete(self):\n   try:\n       return self._delete()\n   except pyroute2.SomeException:\n       raise SvdDeleteError()\n   except pyroute2.SomeOtherException:\n       raise RuntimeError()\n```","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                  self.br_evpn, self.vxlan_evpn, vxlan_parent,"},{"line_number":91,"context_line":"                  local_ip, dstport)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def delete(self, ipr):"},{"line_number":94,"context_line":"        ipr.link(\u0027del\u0027, index\u003dself._vxlan_idx)"},{"line_number":95,"context_line":"        ipr.link(\u0027del\u0027, index\u003dself._br_idx)"},{"line_number":96,"context_line":"        LOG.debug(\"Deleted SVD: bridge %s, vxlan %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"828bbd42_23a9bc7e","line":93,"in_reply_to":"d697cf8d_d12302af","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"b64b9476_2d92ee7e","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":29},"updated":"2026-06-01 13:20:34.000000000","message":"This file should be located in neutron/agent/linux/svd.py","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"93e3c15eb7bdaa0b5afacbe33dac3e01c5d80bf3","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"bdccfbb4_c529204c","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":29},"in_reply_to":"4123f5de_7727c5cc","updated":"2026-06-02 14:15:09.000000000","message":"Not in privileged, but in `neutron/agent/linux/svd.py`. These commands can be used by any agent running in Linux.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"4123f5de_7727c5cc","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":29},"in_reply_to":"b64b9476_2d92ee7e","updated":"2026-06-02 04:16:54.000000000","message":"Should I move this file to neutron/privileged/agent/linux/svd.py ?  The comment in the privileged file seems to imply that this file can say here.  https://review.opendev.org/c/openstack/neutron/+/990169/comment/54999e25_8bcf8e28/","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":4,"id":"4c4a3f80_8ef2597d","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":29},"in_reply_to":"bdccfbb4_c529204c","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"}],"neutron/privileged/agent/linux/svd.py":[{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"59fb12b812c57c62773137415d8a11c823802548","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@privileged.default.entrypoint"},{"line_number":28,"context_line":"def register_vxlan_vnifilter():"},{"line_number":29,"context_line":"    \"\"\"Register the extended vxlan NLA with pyroute2."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"54999e25_8bcf8e28","line":27,"range":{"start_line":27,"start_character":1,"end_line":27,"end_character":11},"updated":"2026-06-01 03:46:30.000000000","message":"When I went to create SVD through FSM, I found out that the SVD could only be created through the privileged linux agent.  So, the private methods previously in the EVPN extension\u0027s svd.py are moved to the privileged linux agent.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"@privileged.default.entrypoint"},{"line_number":28,"context_line":"def register_vxlan_vnifilter():"},{"line_number":29,"context_line":"    \"\"\"Register the extended vxlan NLA with pyroute2."},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"6f88142a_fc0a818e","line":27,"range":{"start_line":27,"start_character":1,"end_line":27,"end_character":11},"in_reply_to":"54999e25_8bcf8e28","updated":"2026-06-01 13:20:34.000000000","message":"For now in Neutron we have one single directory for privileged methods. Being these commands executed in linux, I\u0027m OK with this location. Actually, as I commented in other files, the sibling methods should be located in the same directory, in the non-priv directory.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e9b00279ff69e2e086181d1da8dbaefad9a980e9","unresolved":true,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # Equivalent to:"},{"line_number":47,"context_line":"        # ip link add \u003cvxlan_evpn\u003e vxlan \\"},{"line_number":48,"context_line":"        #   dev \u003cvxlan_parent\u003e dtport \u003cdstport\u003e local \u003clocal_ip\u003e \\"},{"line_number":49,"context_line":"        #   no learning external vnifilter"},{"line_number":50,"context_line":"        ipr.link(\u0027add\u0027, ifname\u003dvxlan_evpn, kind\u003d\u0027vxlan\u0027,"},{"line_number":51,"context_line":"                 vxlan_link\u003dvxlan_parent_idx,"}],"source_content_type":"text/x-python","patch_set":4,"id":"d8f98709_51ed693c","line":48,"range":{"start_line":48,"start_character":31,"end_line":48,"end_character":37},"updated":"2026-06-01 14:00:19.000000000","message":"dstport","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        # Equivalent to:"},{"line_number":47,"context_line":"        # ip link add \u003cvxlan_evpn\u003e vxlan \\"},{"line_number":48,"context_line":"        #   dev \u003cvxlan_parent\u003e dtport \u003cdstport\u003e local \u003clocal_ip\u003e \\"},{"line_number":49,"context_line":"        #   no learning external vnifilter"},{"line_number":50,"context_line":"        ipr.link(\u0027add\u0027, ifname\u003dvxlan_evpn, kind\u003d\u0027vxlan\u0027,"},{"line_number":51,"context_line":"                 vxlan_link\u003dvxlan_parent_idx,"}],"source_content_type":"text/x-python","patch_set":4,"id":"2b4cc051_5406d6a6","line":48,"range":{"start_line":48,"start_character":31,"end_line":48,"end_character":37},"in_reply_to":"d8f98709_51ed693c","updated":"2026-06-02 04:16:54.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"a529712bc747d8798c21c91e6232dc6b8838fad3","unresolved":true,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@privileged.default.entrypoint"},{"line_number":39,"context_line":"def create_svd(br_evpn, vxlan_evpn, local_ip, mac, vxlan_parent, dstport):"},{"line_number":40,"context_line":"    \"\"\"Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":41,"context_line":"    vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":42,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"06e6bcd3_51e438dc","line":39,"range":{"start_line":39,"start_character":15,"end_line":39,"end_character":72},"updated":"2026-06-02 14:26:45.000000000","message":"nit: too many arguments. Maybe define a `dataclass` such that you are passing just one object","commit_id":"00346836ffbcd7c515680e65f3210fac7ef8ee91"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"@privileged.default.entrypoint"},{"line_number":39,"context_line":"def create_svd(br_evpn, vxlan_evpn, local_ip, mac, vxlan_parent, dstport):"},{"line_number":40,"context_line":"    \"\"\"Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":41,"context_line":"    vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":42,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"6a6365d4_444779fd","line":39,"range":{"start_line":39,"start_character":15,"end_line":39,"end_character":72},"in_reply_to":"06e6bcd3_51e438dc","updated":"2026-06-03 02:15:13.000000000","message":"It turned out that it is not possible to pass arguments using dataclass from OVN Agent to the privileged linux agent.","commit_id":"00346836ffbcd7c515680e65f3210fac7ef8ee91"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"a529712bc747d8798c21c91e6232dc6b8838fad3","unresolved":true,"context_lines":[{"line_number":46,"context_line":"        # Equivalent to:"},{"line_number":47,"context_line":"        # ip link add \u003cvxlan_evpn\u003e vxlan \\"},{"line_number":48,"context_line":"        #   dev \u003cvxlan_parent\u003e dstport \u003cdstport\u003e local \u003clocal_ip\u003e \\"},{"line_number":49,"context_line":"        #   no learning external vnifilter"},{"line_number":50,"context_line":"        ipr.link(evpn_const.EVPN_IP_LINK_ADD, ifname\u003dvxlan_evpn, kind\u003d\u0027vxlan\u0027,"},{"line_number":51,"context_line":"                 vxlan_link\u003dvxlan_parent_idx,"},{"line_number":52,"context_line":"                 vxlan_port\u003ddstport,"},{"line_number":53,"context_line":"                 vxlan_local\u003dlocal_ip,"},{"line_number":54,"context_line":"                 vxlan_learning\u003d0,"},{"line_number":55,"context_line":"                 vxlan_collect_metadata\u003d1,"},{"line_number":56,"context_line":"                 vxlan_vnifilter\u003d1)"},{"line_number":57,"context_line":"        vxlan_idx \u003d ipr.link_lookup(ifname\u003dvxlan_evpn)[0]"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        # Equivalent to:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1d63218b_fdc52c94","line":56,"range":{"start_line":49,"start_character":0,"end_line":56,"end_character":35},"updated":"2026-06-02 14:26:45.000000000","message":"just curious which of these sets `external`?","commit_id":"00346836ffbcd7c515680e65f3210fac7ef8ee91"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        # Equivalent to:"},{"line_number":47,"context_line":"        # ip link add \u003cvxlan_evpn\u003e vxlan \\"},{"line_number":48,"context_line":"        #   dev \u003cvxlan_parent\u003e dstport \u003cdstport\u003e local \u003clocal_ip\u003e \\"},{"line_number":49,"context_line":"        #   no learning external vnifilter"},{"line_number":50,"context_line":"        ipr.link(evpn_const.EVPN_IP_LINK_ADD, ifname\u003dvxlan_evpn, kind\u003d\u0027vxlan\u0027,"},{"line_number":51,"context_line":"                 vxlan_link\u003dvxlan_parent_idx,"},{"line_number":52,"context_line":"                 vxlan_port\u003ddstport,"},{"line_number":53,"context_line":"                 vxlan_local\u003dlocal_ip,"},{"line_number":54,"context_line":"                 vxlan_learning\u003d0,"},{"line_number":55,"context_line":"                 vxlan_collect_metadata\u003d1,"},{"line_number":56,"context_line":"                 vxlan_vnifilter\u003d1)"},{"line_number":57,"context_line":"        vxlan_idx \u003d ipr.link_lookup(ifname\u003dvxlan_evpn)[0]"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        # Equivalent to:"}],"source_content_type":"text/x-python","patch_set":5,"id":"89772db2_efaab7af","line":56,"range":{"start_line":49,"start_character":0,"end_line":56,"end_character":35},"in_reply_to":"1d63218b_fdc52c94","updated":"2026-06-03 02:15:13.000000000","message":"vxlan_collect_metadata\u003d1","commit_id":"00346836ffbcd7c515680e65f3210fac7ef8ee91"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"535113d37fae6102d7d4d4349114cc3fa4d0b51c","unresolved":true,"context_lines":[{"line_number":108,"context_line":"    return msg"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"def bridge_add_vni(ipr, vxlan_idx, vni):"},{"line_number":112,"context_line":"    \"\"\"Add a VNI filter entry on a vxlan device."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":8,"id":"8f2acfae_96b76921","line":111,"range":{"start_line":111,"start_character":4,"end_line":111,"end_character":18},"updated":"2026-06-03 14:21:01.000000000","message":"This should be private","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"08483c2357684841e2bc4f4d33a6aeff96963bae","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    return msg"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"def bridge_add_vni(ipr, vxlan_idx, vni):"},{"line_number":112,"context_line":"    \"\"\"Add a VNI filter entry on a vxlan device."},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":8,"id":"2fbd452c_9eb78cb0","line":111,"range":{"start_line":111,"start_character":4,"end_line":111,"end_character":18},"in_reply_to":"8f2acfae_96b76921","updated":"2026-06-03 14:34:09.000000000","message":"Done","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"535113d37fae6102d7d4d4349114cc3fa4d0b51c","unresolved":true,"context_lines":[{"line_number":119,"context_line":"                    msg_flags\u003dBRIDGE_ADD_VNI_MSG_FLAGS)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"def bridge_del_vni(ipr, vxlan_idx, vni):"},{"line_number":123,"context_line":"    \"\"\"Delete a VNI filter entry on a vxlan device."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":8,"id":"1ef6f7ba_07522fc0","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":18},"updated":"2026-06-03 14:21:01.000000000","message":"This should be private","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"08483c2357684841e2bc4f4d33a6aeff96963bae","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                    msg_flags\u003dBRIDGE_ADD_VNI_MSG_FLAGS)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"def bridge_del_vni(ipr, vxlan_idx, vni):"},{"line_number":123,"context_line":"    \"\"\"Delete a VNI filter entry on a vxlan device."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":8,"id":"c63f66c2_00b5b822","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":18},"in_reply_to":"1ef6f7ba_07522fc0","updated":"2026-06-03 14:34:09.000000000","message":"Done","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"535113d37fae6102d7d4d4349114cc3fa4d0b51c","unresolved":true,"context_lines":[{"line_number":130,"context_line":"                    msg_flags\u003dBRIDGE_DEL_VNI_MSG_FLAGS)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"def set_addrgenmode_none(ipr, idx):"},{"line_number":134,"context_line":"    \"\"\"Set addrgenmode none (IN6_ADDR_GEN_MODE_NONE) on an interface."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":8,"id":"f6bc533a_fc3ce24a","line":133,"updated":"2026-06-03 14:21:01.000000000","message":"This should be private","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"08483c2357684841e2bc4f4d33a6aeff96963bae","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                    msg_flags\u003dBRIDGE_DEL_VNI_MSG_FLAGS)"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"def set_addrgenmode_none(ipr, idx):"},{"line_number":134,"context_line":"    \"\"\"Set addrgenmode none (IN6_ADDR_GEN_MODE_NONE) on an interface."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    Equivalent to:"}],"source_content_type":"text/x-python","patch_set":8,"id":"232e3fe1_1b5b4a6a","line":133,"in_reply_to":"f6bc533a_fc3ce24a","updated":"2026-06-03 14:34:09.000000000","message":"Done","commit_id":"e2e9bc98207909b83922902d8a6e02d43b052be8"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1b8f2e3523e614924f1e9ac8cf6dfe861190baa3","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"@privileged.default.entrypoint"},{"line_number":61,"context_line":"def register_vxlan_vnifilter():"},{"line_number":62,"context_line":"    \"\"\"Register the extended vxlan NLA with pyroute2."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    Must be called once before creating any vxlan device with"}],"source_content_type":"text/x-python","patch_set":11,"id":"47731939_1f4edec4","line":61,"range":{"start_line":61,"start_character":4,"end_line":61,"end_character":28},"updated":"2026-06-05 01:12:32.000000000","message":"Since this needs to be called before Svd() is instantiated, it feels a little hidden, API-wise. I wonder if we could just wrap this with something like:\n```\nclass Svd:\n    _initialized \u003d False\n    @classmethod\n    def initialize(cls):\n        if not cls._initialized:\n            svd_priv.register_vxlan_vnifilter()\n            cls._initialized \u003d True\n```\n\nWe could check in Svd methods like create if _initialized was true and raise if it wasn\u0027t called or something. Could do something similar and just do it the first time an Svd.__init__() was called, but it being an explicit step and not hiding it feels a bit better to me for some reason. But no really strong feelings. And if what register_vxlan_vnifilter() does is idempotent and it doesn\u0027t really matter if it\u0027s called multiple times (other than being a wasted privileged call), then the guard around the call could be removed I guess.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"@privileged.default.entrypoint"},{"line_number":61,"context_line":"def register_vxlan_vnifilter():"},{"line_number":62,"context_line":"    \"\"\"Register the extended vxlan NLA with pyroute2."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    Must be called once before creating any vxlan device with"}],"source_content_type":"text/x-python","patch_set":11,"id":"e9080f5a_5f6f9395","line":61,"range":{"start_line":61,"start_character":4,"end_line":61,"end_character":28},"in_reply_to":"47731939_1f4edec4","updated":"2026-06-05 02:26:33.000000000","message":"The latest patch still keeps this separate, since this is a workaround until pyroute2 supports vnifilter.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf6e056629260c920450189e08c664248fd4330a","unresolved":true,"context_lines":[{"line_number":89,"context_line":"            (\u0027VXLAN_VNIFILTER_ENTRY_END\u0027, \u0027uint32\u0027),"},{"line_number":90,"context_line":"        )"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, data\u003dNone, offset\u003d0, length\u003dNone, parent\u003dNone,"},{"line_number":93,"context_line":"                 init\u003dNone):"},{"line_number":94,"context_line":"        super().__init__(data\u003ddata, offset\u003doffset, length\u003dlength,"},{"line_number":95,"context_line":"                         parent\u003dparent, init\u003dinit)"},{"line_number":96,"context_line":"        self[\u0027family\u0027] \u003d pyroute2_config.AF_BRIDGE"}],"source_content_type":"text/x-python","patch_set":11,"id":"b8d5da9e_a2a011bc","line":93,"range":{"start_line":92,"start_character":23,"end_line":93,"end_character":26},"updated":"2026-06-04 22:14:57.000000000","message":"is it used anywhere? Can we just do `*args, **kwargs` ?","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            (\u0027VXLAN_VNIFILTER_ENTRY_END\u0027, \u0027uint32\u0027),"},{"line_number":90,"context_line":"        )"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def __init__(self, data\u003dNone, offset\u003d0, length\u003dNone, parent\u003dNone,"},{"line_number":93,"context_line":"                 init\u003dNone):"},{"line_number":94,"context_line":"        super().__init__(data\u003ddata, offset\u003doffset, length\u003dlength,"},{"line_number":95,"context_line":"                         parent\u003dparent, init\u003dinit)"},{"line_number":96,"context_line":"        self[\u0027family\u0027] \u003d pyroute2_config.AF_BRIDGE"}],"source_content_type":"text/x-python","patch_set":11,"id":"560babcc_ed3aab77","line":93,"range":{"start_line":92,"start_character":23,"end_line":93,"end_character":26},"in_reply_to":"b8d5da9e_a2a011bc","updated":"2026-06-05 02:26:33.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf6e056629260c920450189e08c664248fd4330a","unresolved":true,"context_lines":[{"line_number":96,"context_line":"        self[\u0027family\u0027] \u003d pyroute2_config.AF_BRIDGE"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"BRIDGE_ADD_VNI_MSG_FLAGS \u003d ("},{"line_number":100,"context_line":"    netlink.NLM_F_REQUEST | netlink.NLM_F_ACK | netlink.NLM_F_CREATE |"},{"line_number":101,"context_line":"    netlink.NLM_F_EXCL)"},{"line_number":102,"context_line":"BRIDGE_DEL_VNI_MSG_FLAGS \u003d netlink.NLM_F_REQUEST | netlink.NLM_F_ACK"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def _make_bridge_vni_msg(vxlan_idx, vni):"}],"source_content_type":"text/x-python","patch_set":11,"id":"32450145_1fc17ca9","line":102,"range":{"start_line":99,"start_character":0,"end_line":102,"end_character":68},"updated":"2026-06-04 22:14:57.000000000","message":"The constants are usually at the beginning of a module","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"6591eca7a2792d493ebfdc8f4784a9986101105a","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self[\u0027family\u0027] \u003d pyroute2_config.AF_BRIDGE"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"BRIDGE_ADD_VNI_MSG_FLAGS \u003d ("},{"line_number":100,"context_line":"    netlink.NLM_F_REQUEST | netlink.NLM_F_ACK | netlink.NLM_F_CREATE |"},{"line_number":101,"context_line":"    netlink.NLM_F_EXCL)"},{"line_number":102,"context_line":"BRIDGE_DEL_VNI_MSG_FLAGS \u003d netlink.NLM_F_REQUEST | netlink.NLM_F_ACK"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def _make_bridge_vni_msg(vxlan_idx, vni):"}],"source_content_type":"text/x-python","patch_set":11,"id":"41cdb615_ebc4db50","line":102,"range":{"start_line":99,"start_character":0,"end_line":102,"end_character":68},"in_reply_to":"32450145_1fc17ca9","updated":"2026-06-05 02:26:32.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self[\u0027family\u0027] \u003d pyroute2_config.AF_BRIDGE"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"BRIDGE_ADD_VNI_MSG_FLAGS \u003d ("},{"line_number":100,"context_line":"    netlink.NLM_F_REQUEST | netlink.NLM_F_ACK | netlink.NLM_F_CREATE |"},{"line_number":101,"context_line":"    netlink.NLM_F_EXCL)"},{"line_number":102,"context_line":"BRIDGE_DEL_VNI_MSG_FLAGS \u003d netlink.NLM_F_REQUEST | netlink.NLM_F_ACK"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def _make_bridge_vni_msg(vxlan_idx, vni):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5c06b7ea_c8fada21","line":102,"range":{"start_line":99,"start_character":0,"end_line":102,"end_character":68},"in_reply_to":"32450145_1fc17ca9","updated":"2026-06-05 02:26:33.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1b8f2e3523e614924f1e9ac8cf6dfe861190baa3","unresolved":true,"context_lines":[{"line_number":150,"context_line":"            \u0027attrs\u0027: ["},{"line_number":151,"context_line":"                (\u0027AF_INET6\u0027, {"},{"line_number":152,"context_line":"                    \u0027attrs\u0027: ["},{"line_number":153,"context_line":"                        (\u0027IFLA_INET6_ADDR_GEN_MODE\u0027, 1)"},{"line_number":154,"context_line":"                    ]"},{"line_number":155,"context_line":"                })"},{"line_number":156,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":11,"id":"da9ced95_06e7782c","line":153,"range":{"start_line":153,"start_character":53,"end_line":153,"end_character":54},"updated":"2026-06-05 01:12:32.000000000","message":"nit: Should we create local constants for things like IN6_ADDR_GEN_MODE_NONE \u003d 1 to avoid using magic numbers? In this one it\u0027s pretty obvious based on the comment what this is, so not a big deal.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":true,"context_lines":[{"line_number":150,"context_line":"            \u0027attrs\u0027: ["},{"line_number":151,"context_line":"                (\u0027AF_INET6\u0027, {"},{"line_number":152,"context_line":"                    \u0027attrs\u0027: ["},{"line_number":153,"context_line":"                        (\u0027IFLA_INET6_ADDR_GEN_MODE\u0027, 1)"},{"line_number":154,"context_line":"                    ]"},{"line_number":155,"context_line":"                })"},{"line_number":156,"context_line":"            ]"}],"source_content_type":"text/x-python","patch_set":11,"id":"076f1b38_d0420532","line":153,"range":{"start_line":153,"start_character":53,"end_line":153,"end_character":54},"in_reply_to":"da9ced95_06e7782c","updated":"2026-06-05 02:26:33.000000000","message":"The latest patch keeps the magic number, since this is a workaround until pyroute2 supports this setting.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf6e056629260c920450189e08c664248fd4330a","unresolved":true,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"@privileged.default.entrypoint"},{"line_number":167,"context_line":"def create_svd(br_evpn, vxlan_evpn, local_ip, mac, vxlan_parent, dstport):"},{"line_number":168,"context_line":"    \"\"\"Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":169,"context_line":"    vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":170,"context_line":"    \"\"\""},{"line_number":171,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":172,"context_line":"        vxlan_parent_idx \u003d ipr.link_lookup(ifname\u003dvxlan_parent)[0]"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"850f0aff_848d26b1","line":170,"range":{"start_line":168,"start_character":0,"end_line":170,"end_character":7},"updated":"2026-06-04 22:14:57.000000000","message":"I\u0027m wondering why the pep8 job doesn\u0027t fail because of the first docstring being a multiline","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea1a5bce8b9779ae3878bb822cda360027b8a741","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"@privileged.default.entrypoint"},{"line_number":167,"context_line":"def create_svd(br_evpn, vxlan_evpn, local_ip, mac, vxlan_parent, dstport):"},{"line_number":168,"context_line":"    \"\"\"Create a shared Single VxLAN Device (SVD) consisting of a"},{"line_number":169,"context_line":"    vlan-aware bridge and a vlan-aware VxLAN"},{"line_number":170,"context_line":"    \"\"\""},{"line_number":171,"context_line":"    with priv_ip_lib.get_iproute(None) as ipr:"},{"line_number":172,"context_line":"        vxlan_parent_idx \u003d ipr.link_lookup(ifname\u003dvxlan_parent)[0]"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"f1aed97e_4815e009","line":170,"range":{"start_line":168,"start_character":0,"end_line":170,"end_character":7},"in_reply_to":"850f0aff_848d26b1","updated":"2026-06-05 18:55:04.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1b8f2e3523e614924f1e9ac8cf6dfe861190baa3","unresolved":true,"context_lines":[{"line_number":182,"context_line":"                 vxlan_learning\u003d0,"},{"line_number":183,"context_line":"                 vxlan_collect_metadata\u003d1,"},{"line_number":184,"context_line":"                 vxlan_vnifilter\u003d1)"},{"line_number":185,"context_line":"        vxlan_idx \u003d ipr.link_lookup(ifname\u003dvxlan_evpn)[0]"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        # Equivalent to:"},{"line_number":188,"context_line":"        # ip link add \u003cbr_evpn\u003e type bridge vlan_filtering 1 \\"}],"source_content_type":"text/x-python","patch_set":11,"id":"97417a6e_08bcd71f","line":185,"updated":"2026-06-05 01:12:32.000000000","message":"If we fail at any point after creating devices, do we we need to cleanup the devices we\u0027ve successfully created with try/finally?","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":true,"context_lines":[{"line_number":182,"context_line":"                 vxlan_learning\u003d0,"},{"line_number":183,"context_line":"                 vxlan_collect_metadata\u003d1,"},{"line_number":184,"context_line":"                 vxlan_vnifilter\u003d1)"},{"line_number":185,"context_line":"        vxlan_idx \u003d ipr.link_lookup(ifname\u003dvxlan_evpn)[0]"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"        # Equivalent to:"},{"line_number":188,"context_line":"        # ip link add \u003cbr_evpn\u003e type bridge vlan_filtering 1 \\"}],"source_content_type":"text/x-python","patch_set":11,"id":"bf4c781f_52c195e6","line":185,"in_reply_to":"97417a6e_08bcd71f","updated":"2026-06-05 02:26:33.000000000","message":"Error handling will come later.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"1b8f2e3523e614924f1e9ac8cf6dfe861190baa3","unresolved":true,"context_lines":[{"line_number":248,"context_line":"        ipr.vlan_filter(evpn_const.EVPN_IP_LINK_ADD, index\u003dvxlan_idx,"},{"line_number":249,"context_line":"                        vlan_info\u003d{\u0027vid\u0027: vid},"},{"line_number":250,"context_line":"                        vlan_tunnel_info\u003d{\u0027vid\u0027: vid, \u0027id\u0027: vni})"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        # Equivalent to:"},{"line_number":253,"context_line":"        # bridge vni add dev \u003cvxlan_evpn\u003e vni \u003cvni\u003e"},{"line_number":254,"context_line":"        _bridge_add_vni(ipr, vxlan_idx, vni)"}],"source_content_type":"text/x-python","patch_set":11,"id":"4e03a31b_877d7526","line":251,"updated":"2026-06-05 01:12:32.000000000","message":"Same question about if we need to handle cleanup if things fail somewhere after we create things.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"4f4f3b43fdb6be52f8bfefc47db2b8b5d8b0086d","unresolved":true,"context_lines":[{"line_number":248,"context_line":"        ipr.vlan_filter(evpn_const.EVPN_IP_LINK_ADD, index\u003dvxlan_idx,"},{"line_number":249,"context_line":"                        vlan_info\u003d{\u0027vid\u0027: vid},"},{"line_number":250,"context_line":"                        vlan_tunnel_info\u003d{\u0027vid\u0027: vid, \u0027id\u0027: vni})"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        # Equivalent to:"},{"line_number":253,"context_line":"        # bridge vni add dev \u003cvxlan_evpn\u003e vni \u003cvni\u003e"},{"line_number":254,"context_line":"        _bridge_add_vni(ipr, vxlan_idx, vni)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1540f82f_2c40abb6","line":251,"in_reply_to":"4e03a31b_877d7526","updated":"2026-06-05 02:26:33.000000000","message":"Error handling will come later.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"1e5c9bf3ef34a5504ad2b85e19e446f8af308375","unresolved":true,"context_lines":[{"line_number":22,"context_line":"from pyroute2.netlink.rtnl import ifinfmsg"},{"line_number":23,"context_line":"from pyroute2.netlink.rtnl.ifinfmsg.plugins import vxlan"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from neutron.agent.ovn.extensions.evpn import constants as evpn_const"},{"line_number":26,"context_line":"from neutron import privileged"},{"line_number":27,"context_line":"from neutron.privileged.agent.linux import ip_lib as priv_ip_lib"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a0ccac5_003d16f7","line":25,"updated":"2026-06-05 16:35:24.000000000","message":"The current implementation relies on evpn naming. As this Svd is generic, it should not be hardcoding evpn names. I\u0027ll send a followup patch to decouple that.","commit_id":"6b6748cf418b798e54b680b1a92df42c84f4a945"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea1a5bce8b9779ae3878bb822cda360027b8a741","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from pyroute2.netlink.rtnl import ifinfmsg"},{"line_number":23,"context_line":"from pyroute2.netlink.rtnl.ifinfmsg.plugins import vxlan"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from neutron.agent.ovn.extensions.evpn import constants as evpn_const"},{"line_number":26,"context_line":"from neutron import privileged"},{"line_number":27,"context_line":"from neutron.privileged.agent.linux import ip_lib as priv_ip_lib"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"dc25b744_c239b89a","line":25,"in_reply_to":"9a0ccac5_003d16f7","updated":"2026-06-05 18:55:04.000000000","message":"Done","commit_id":"6b6748cf418b798e54b680b1a92df42c84f4a945"}],"neutron/tests/functional/agent/ovn/extensions/evpn/test_svd.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        self.assertIn(\u0027external\u0027, vx_output)"},{"line_number":88,"context_line":"        self.assertIn(\u0027addrgenmode none\u0027, vx_output)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_delete_svd(self):"},{"line_number":91,"context_line":"        svd \u003d self._create_svd()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        svd.delete()"}],"source_content_type":"text/x-python","patch_set":4,"id":"88807db1_566ac736","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":23},"updated":"2026-06-01 13:20:34.000000000","message":"You missed the test raising SvdNetlinkError","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        self.assertIn(\u0027external\u0027, vx_output)"},{"line_number":88,"context_line":"        self.assertIn(\u0027addrgenmode none\u0027, vx_output)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_delete_svd(self):"},{"line_number":91,"context_line":"        svd \u003d self._create_svd()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        svd.delete()"}],"source_content_type":"text/x-python","patch_set":4,"id":"72a0b53a_46395ac5","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":23},"in_reply_to":"76b997ce_1765bf3e","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        self.assertIn(\u0027external\u0027, vx_output)"},{"line_number":88,"context_line":"        self.assertIn(\u0027addrgenmode none\u0027, vx_output)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_delete_svd(self):"},{"line_number":91,"context_line":"        svd \u003d self._create_svd()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        svd.delete()"}],"source_content_type":"text/x-python","patch_set":4,"id":"76b997ce_1765bf3e","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":23},"in_reply_to":"88807db1_566ac736","updated":"2026-06-02 04:16:54.000000000","message":"Because of the way svd.delete() is written, looking up the bridge and vxlan devices first followed by deletion in the same function, it is difficult to trigger a netlink error, such as no such device, in a functional test.  (To trigger a netlink error, there would need to be another process to delete one of the devices while svd.delete() executed.)","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        self.assertFalse(ip_lib.device_exists(self.BR))"},{"line_number":96,"context_line":"        self.assertFalse(ip_lib.device_exists(self.VX))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def test_add_vni(self):"},{"line_number":99,"context_line":"        svd \u003d self._create_svd()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        vni \u003d 5000"}],"source_content_type":"text/x-python","patch_set":4,"id":"5e3f305c_0f18e59e","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":20},"updated":"2026-06-01 13:20:34.000000000","message":"You missed the tests raising SvdVrfNotFound and SvdNetlinkError","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":true,"context_lines":[{"line_number":95,"context_line":"        self.assertFalse(ip_lib.device_exists(self.BR))"},{"line_number":96,"context_line":"        self.assertFalse(ip_lib.device_exists(self.VX))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def test_add_vni(self):"},{"line_number":99,"context_line":"        svd \u003d self._create_svd()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        vni \u003d 5000"}],"source_content_type":"text/x-python","patch_set":4,"id":"c7020ee9_81e06059","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":20},"in_reply_to":"5e3f305c_0f18e59e","updated":"2026-06-02 04:16:54.000000000","message":"Sorry for not keeping the tests together.  There is a test for SvdVrfNotFound below, which is moved to be closer to test_add_vni() in Patch 5.\n\nSeparately, SvdVrfNotFound is renamed to SvdDevsNotFound in Patch 5, since it could be any of the devices, the Linux bridge, vxlan, or the VRF.\n\nSimilar to my comment about testing SvdNetlinkError for svd.delete(), it is difficult to cause the error in a functional test given the way add_vni() is written.  From the functional test\u0027s perspective, add_vni() is almost like a single atomic action, since there\u0027s no way to leave the execution of add_vni() to delete one of the devices that were just looked up, so that a netlink error such as no such device is triggered.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        self.assertFalse(ip_lib.device_exists(self.BR))"},{"line_number":96,"context_line":"        self.assertFalse(ip_lib.device_exists(self.VX))"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def test_add_vni(self):"},{"line_number":99,"context_line":"        svd \u003d self._create_svd()"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        vni \u003d 5000"}],"source_content_type":"text/x-python","patch_set":4,"id":"f9a978d7_ffd39ad1","line":98,"range":{"start_line":98,"start_character":8,"end_line":98,"end_character":20},"in_reply_to":"c7020ee9_81e06059","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":114,"context_line":"        vni_output \u003d self._bridge_cmd(\u0027vni\u0027, \u0027show\u0027, \u0027dev\u0027, self.VX)"},{"line_number":115,"context_line":"        self.assertIn(str(vni), vni_output)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test_del_vni(self):"},{"line_number":118,"context_line":"        svd \u003d self._create_svd()"},{"line_number":119,"context_line":"        vni \u003d 5000"},{"line_number":120,"context_line":"        vid \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"ae63bcb8_0b1729ff","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":20},"updated":"2026-06-01 13:20:34.000000000","message":"ditto","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"e316a8ef5f3ad00c41c785c7aa4ae8d03f31c86c","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        vni_output \u003d self._bridge_cmd(\u0027vni\u0027, \u0027show\u0027, \u0027dev\u0027, self.VX)"},{"line_number":115,"context_line":"        self.assertIn(str(vni), vni_output)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def test_del_vni(self):"},{"line_number":118,"context_line":"        svd \u003d self._create_svd()"},{"line_number":119,"context_line":"        vni \u003d 5000"},{"line_number":120,"context_line":"        vid \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"46fb8869_1464967a","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":20},"in_reply_to":"ae63bcb8_0b1729ff","updated":"2026-06-03 02:15:13.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        svd.del_vni(vni, vid)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def test_create_svd_parent_not_found(self):"},{"line_number":170,"context_line":"        brvxlan \u003d svd.Svd(br_evpn\u003dself.BR, vxlan_evpn\u003dself.VX)"},{"line_number":171,"context_line":"        self.assertRaises(evpn_exc.SvdNoVxlanParent, brvxlan.create,"},{"line_number":172,"context_line":"                          local_ip\u003dself.LOCAL_IP, mac\u003dself.MAC,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9e99c36a_2300b7fb","line":169,"range":{"start_line":169,"start_character":4,"end_line":169,"end_character":42},"updated":"2026-06-01 13:20:34.000000000","message":"Please, group the tests associated to the same method (.create in this case) close together.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        svd.del_vni(vni, vid)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def test_create_svd_parent_not_found(self):"},{"line_number":170,"context_line":"        brvxlan \u003d svd.Svd(br_evpn\u003dself.BR, vxlan_evpn\u003dself.VX)"},{"line_number":171,"context_line":"        self.assertRaises(evpn_exc.SvdNoVxlanParent, brvxlan.create,"},{"line_number":172,"context_line":"                          local_ip\u003dself.LOCAL_IP, mac\u003dself.MAC,"}],"source_content_type":"text/x-python","patch_set":4,"id":"2dddbd93_c3f7532e","line":169,"range":{"start_line":169,"start_character":4,"end_line":169,"end_character":42},"in_reply_to":"9e99c36a_2300b7fb","updated":"2026-06-02 04:16:54.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d2d884c80a33609262bef33d2262fa9f7e34c859","unresolved":true,"context_lines":[{"line_number":181,"context_line":"                          5000, 1, \u0027no-such-vrf\u0027, self.SVI_MAC)"},{"line_number":182,"context_line":"        self.assertFalse(ip_lib.device_exists(\u0027vl-0-1\u0027))"},{"line_number":183,"context_line":"        vni_output \u003d self._bridge_cmd(\u0027vni\u0027, \u0027show\u0027, \u0027dev\u0027, self.VX)"},{"line_number":184,"context_line":"        self.assertNotIn(\u00275000\u0027, vni_output)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5202398d_d8007315","line":184,"updated":"2026-06-01 13:20:34.000000000","message":"For `Sdv.create`, the `SvdLocalIPNotAvail` test and the `SvdNetlinkError` test are missing.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"84b29cc3a88aa051719a1a9a7f3f42742bb9d22b","unresolved":true,"context_lines":[{"line_number":181,"context_line":"                          5000, 1, \u0027no-such-vrf\u0027, self.SVI_MAC)"},{"line_number":182,"context_line":"        self.assertFalse(ip_lib.device_exists(\u0027vl-0-1\u0027))"},{"line_number":183,"context_line":"        vni_output \u003d self._bridge_cmd(\u0027vni\u0027, \u0027show\u0027, \u0027dev\u0027, self.VX)"},{"line_number":184,"context_line":"        self.assertNotIn(\u00275000\u0027, vni_output)"}],"source_content_type":"text/x-python","patch_set":4,"id":"bee3c976_f17132b9","line":184,"in_reply_to":"5202398d_d8007315","updated":"2026-06-02 04:16:54.000000000","message":"It turned out that Linux accepts a random local IP for the vxlan interface we\u0027re creating, so SvdLocalIPNotAvil is removed in Patch 5.","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"93e3c15eb7bdaa0b5afacbe33dac3e01c5d80bf3","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                          5000, 1, \u0027no-such-vrf\u0027, self.SVI_MAC)"},{"line_number":182,"context_line":"        self.assertFalse(ip_lib.device_exists(\u0027vl-0-1\u0027))"},{"line_number":183,"context_line":"        vni_output \u003d self._bridge_cmd(\u0027vni\u0027, \u0027show\u0027, \u0027dev\u0027, self.VX)"},{"line_number":184,"context_line":"        self.assertNotIn(\u00275000\u0027, vni_output)"}],"source_content_type":"text/x-python","patch_set":4,"id":"78508939_d59b4635","line":184,"in_reply_to":"bee3c976_f17132b9","updated":"2026-06-02 14:15:09.000000000","message":"Done","commit_id":"51a51e86915a62e780388251099ac1cad7f38f32"}],"neutron/tests/unit/agent/linux/test_svd.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf6e056629260c920450189e08c664248fd4330a","unresolved":true,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":11,"id":"a6aab32e_22895678","line":1,"updated":"2026-06-04 22:14:57.000000000","message":"I\u0027m not sure what additional test coverage do these unittests add compared to the functional suite. I\u0027d be ok with just the functional tests.","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"6591eca7a2792d493ebfdc8f4784a9986101105a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, LLC"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":11,"id":"32ea61b8_7a9c8e42","line":1,"in_reply_to":"a6aab32e_22895678","updated":"2026-06-05 02:26:32.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bf6e056629260c920450189e08c664248fd4330a","unresolved":true,"context_lines":[{"line_number":16,"context_line":"import errno"},{"line_number":17,"context_line":"from unittest import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from pyroute2.netlink.exceptions import NetlinkError"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.agent.linux import svd"},{"line_number":22,"context_line":"from neutron.agent.ovn.extensions.evpn import exceptions as evpn_exc"}],"source_content_type":"text/x-python","patch_set":11,"id":"c28dd26f_bd5e75a2","line":19,"updated":"2026-06-04 22:14:57.000000000","message":"ditto","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"6591eca7a2792d493ebfdc8f4784a9986101105a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import errno"},{"line_number":17,"context_line":"from unittest import mock"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from pyroute2.netlink.exceptions import NetlinkError"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.agent.linux import svd"},{"line_number":22,"context_line":"from neutron.agent.ovn.extensions.evpn import exceptions as evpn_exc"}],"source_content_type":"text/x-python","patch_set":11,"id":"da88e2f8_d3d713c7","line":19,"in_reply_to":"c28dd26f_bd5e75a2","updated":"2026-06-05 02:26:32.000000000","message":"Done","commit_id":"123da0307627159c26f10743f0c8e7abe8d52251"}],"neutron/tests/unit/agent/ovn/extensions/evpn/test_svd.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9c49067ad55e5c5c3bc0f2f426698d3b5fb35f02","unresolved":true,"context_lines":[{"line_number":24,"context_line":"from neutron.tests import base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestSvd(base.BaseTestCase):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    VRF_NAME \u003d \u0027svd-vrf\u0027"},{"line_number":30,"context_line":"    SVI_MAC \u003d \u002700:11:22:33:44:55\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"53269772_a6ec50d2","line":27,"updated":"2026-05-29 19:52:25.000000000","message":"I think we need some negative tests here as well that would mock side-effect of iproute commands when they raise errors.","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"},{"author":{"_account_id":38298,"name":"Helen Chen","display_name":"Helen Chen","email":"ichen@redhat.com","username":"ingwherchen"},"change_message_id":"3d122f3c5abbda3805fab9fbd4a46149af5ee9ac","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from neutron.tests import base"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class TestSvd(base.BaseTestCase):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    VRF_NAME \u003d \u0027svd-vrf\u0027"},{"line_number":30,"context_line":"    SVI_MAC \u003d \u002700:11:22:33:44:55\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"2ed5532d_2e3d1e7d","line":27,"in_reply_to":"53269772_a6ec50d2","updated":"2026-05-31 21:27:59.000000000","message":"Done","commit_id":"fc1e7191ce5b4b9649b355465efc064786de99c3"}]}
