)]}'
{"/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"}],"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"}],"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"}],"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/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"}]}
