)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"43a74277c33daa02ff18bc1329b9dc8da4bb9070","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7290e0bc_708dcfff","updated":"2024-01-24 11:04:08.000000000","message":"Very WIP, but shows some insight in challenges","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"2f95bf4e_69db0c5d","updated":"2024-01-29 11:12:04.000000000","message":"Thanks for the review 😊","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"89c5915e_53cdc8f7","updated":"2024-01-29 10:05:45.000000000","message":"The patch looks good, I leave a couple of minor things on my first (fast) review. Basically, given that this patch will be long I would do the next:\n- Split some of the fixes that you included here in separate patch sets, so that we can merge them fast\n- Split the new config options to expose the network instead of the tenant IPs in a different patch too\n- Same for the snat thing\n\nAnd finally, it would be great to also add some extra documentation about this method... but that can be done after this is merged: https://review.opendev.org/c/openstack/ovn-bgp-agent/+/903407","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b737bafa4a814ed674fcd1392b55683b25fe4687","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"2076925f_d0b183e9","updated":"2024-01-25 17:14:53.000000000","message":"Will also work on more unit tests for added code and some documentation on how it can be used (or at least on how we\u0027re using it)","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"03723d8feb7c8acf238600f820403bcb2a37ca00","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6197ea1e_f915cc20","updated":"2024-01-29 16:52:00.000000000","message":"i\u0027ve created loads of subchanges to make at least those better to review 😎","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"237233c30d55ecb8cae00669e619a72a64f91a0d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9d6dcfdf_e0aa21b0","updated":"2024-02-27 10:39:53.000000000","message":"Will work on some documentation, but at least this should work 😊","commit_id":"c4acd9ab82e73d2b6b748a1625daf9b5d1d6375f"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"346fb07d7568ee8f812758fd223e931e5770642d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"3ac89b04_9d6e5fdf","in_reply_to":"9d6dcfdf_e0aa21b0","updated":"2024-03-01 10:58:32.000000000","message":"done","commit_id":"c4acd9ab82e73d2b6b748a1625daf9b5d1d6375f"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"346fb07d7568ee8f812758fd223e931e5770642d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"fb863725_d5d13078","updated":"2024-03-01 10:58:32.000000000","message":"Included some documentation now too.","commit_id":"78c7df8dcbb43aaa13c505cf32011e6224f9a9d7"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"3d21dba10ae687efb8b2b915ccdd2826cf15c9c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3614b6e3_9022b51f","updated":"2024-03-01 19:19:18.000000000","message":"Updated documentation and implemented advertisement method hosts 😊","commit_id":"a12052a578c85e893843ee7fff032fdf66f4cb7d"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"f070735747a5057724c9d46fdc6544da2606f13a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d877a4f2_74085114","updated":"2024-03-04 09:15:44.000000000","message":"Please let me know if there is more to be done for this change","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"1d5fa985_a2040776","updated":"2024-03-06 15:35:47.000000000","message":"Thanks for the review, please take a look at some of the answers i\u0027ve given.\n\nLooking forward to see if you agree or have different view on what i\u0027ve proposed.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a34a84e5_37b99531","updated":"2024-03-06 18:24:52.000000000","message":"Yeah, it will need a rebase for sure, i\u0027ll make sure to fix this with the next round of improvements.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"21eb403b_61e39f19","updated":"2024-03-06 14:25:21.000000000","message":"overall looks good, just a couple of nits and questions here and there","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"324f4746_c822bd6a","updated":"2024-03-06 16:10:27.000000000","message":"seems it also needs a rebase on master. Thanks for the replies to my doubts!","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"212ecd6e67d06d2e93c5be0efb77f08ff18e884c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c4651423_5db1799e","updated":"2024-03-07 07:05:18.000000000","message":"thanks for all the replies! really valuable!","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"222cf3dc_f131b8f1","updated":"2024-03-08 14:31:04.000000000","message":"I believe i implemented all the feedback 😊","commit_id":"12d101688a7a0ca66811e90ba5f3c1c9b3993490"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"1bbd9ce677ca722d49529a0f4628f973cd3021c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"ba550a37_7395fabf","updated":"2024-03-19 11:43:11.000000000","message":"Need to investigate it further... but this still does not work with flat provider networks, still getting the KeyError at the lookup, which ends up on \"EVPN has not been setup for brdige br-ex with vlan device None\"","commit_id":"84ddb5cc77b9e1c0e86ce4a702d6ad7eee9eee8e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"65b81e84f526f7812affab269d6ad733d7f823e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"15357c37_4bdd2618","updated":"2024-03-19 15:15:27.000000000","message":"It actually is exporting routes into route table with devstack and flat provider network right now.","commit_id":"7c9f2ee1836742b32cfeb7731294bbd3e12a61bf"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"96ec679b643696e078decce09da9fb34458bfe20","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"2aef830b_d9d14d34","updated":"2024-03-20 14:22:45.000000000","message":"also, we probably need to include some new event detection at the watchers, so that we react to vni (networking_bgpvpn) information being added at the NB DBs","commit_id":"7c9f2ee1836742b32cfeb7731294bbd3e12a61bf"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"5a0abe6309513f0081d7d4613a9e189afbbcd4f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"f35c4d7d_f7b3c16c","updated":"2024-03-20 12:19:56.000000000","message":"flows seems to not be added for flat networks","commit_id":"7c9f2ee1836742b32cfeb7731294bbd3e12a61bf"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"41d06f616d20a688502c69264cad6c63ae28ea4f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"7a257898_ed6a49f7","updated":"2024-03-21 14:49:33.000000000","message":"So, updates since patchset 13:\n\n* Added event for logical-switch updates (to track if we need to run sync() again for new or updated provider networks)\n* Implemented logic for vni changes in evpn util.\n* Fixed an issue with ovs-ofctl dump-flows in OpenFlow13 format\n* Re-ordered frr reconfigure to _after_ deletion of all vrf devices (since frr only removes inactive vrf\u0027s from their configs)\n* Restored support for flat provider networks\n\nI believe that was all we discovered thusfar 😊","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"680f931b_abe53017","updated":"2024-04-25 17:34:56.000000000","message":"Thanks a lot for the patch! I have looked at the patch at the beginning of April but haven\u0027t finished yet. Maybe it would be better and easier to review if it\u0027s broken down into smaller pieces? I\u0027m pasting the comments/questions/suggestions now even when not complete to move forward a bit.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"9ad030ba_b5514654","in_reply_to":"680f931b_abe53017","updated":"2024-05-02 09:23:56.000000000","message":"Thanks for these reviews!\n\nI completely understand that it is a big change, though i am not sure how to break this change in smaller pieces, as it seems (for me) to all be interconnected with each other.\n\nIf you do see a change that could be independant of this one, i am happy to split that up too, as i\u0027ve done with 6 other changes before this 😊","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"51741203_135284b1","updated":"2024-05-02 13:54:52.000000000","message":"Implemented all requested changes.","commit_id":"2518acb21b3918dc02d0694b357fbad66993fe64"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4585a635fbefa3f19eff0008b320e376f0ebe5d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"e2f148f8_e3ff1e23","updated":"2024-05-13 11:51:03.000000000","message":"I\u0027ve tested it again and works as expected. I left a couple of nits/comments. Most of them can be handled as follow ups or are minor things. Thus I\u0027m adding +2","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bc7274ba8619e777a4ab790fed8dbc5d0feda9df","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"505b3476_f38c9a2c","updated":"2024-05-20 19:18:08.000000000","message":"All in all looks good to me, just wondering about the `type` configuration of the Logical Switch.","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"56e86145_0fbb8b7e","updated":"2024-05-21 09:46:27.000000000","message":"Sorry for the delay in reviewing it. Overall I think this is great, a few nits pointed out. I also would like to see the l2vpn type being implemented as a follow up patch","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"25f6d7ce_ab519390","updated":"2024-05-14 12:25:18.000000000","message":"Updated the final nits from ltomasbo","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"}],"doc/source/contributor/evpn_advertising.rst":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":16,"context_line":"  running OpenVSwitch instance (e.g. ``ovn-bridge-mappings\u003d\"physnet1:br-ex\"``)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"- The provider network has been configured by an admin with at least a ``vni``,"},{"line_number":19,"context_line":"  and preferably the vpn type has been configured too with either ``l2`` or ``l3``."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"  For example (when using the OVN tools):"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"1c6938b5_ed948dd7","line":19,"range":{"start_line":19,"start_character":66,"end_line":19,"end_character":73},"updated":"2024-03-06 14:25:21.000000000","message":"it does not support L2 for now, right?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":16,"context_line":"  running OpenVSwitch instance (e.g. ``ovn-bridge-mappings\u003d\"physnet1:br-ex\"``)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"- The provider network has been configured by an admin with at least a ``vni``,"},{"line_number":19,"context_line":"  and preferably the vpn type has been configured too with either ``l2`` or ``l3``."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"  For example (when using the OVN tools):"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"c1c44252_1956cacf","line":19,"range":{"start_line":19,"start_character":66,"end_line":19,"end_character":73},"in_reply_to":"1c6938b5_ed948dd7","updated":"2024-03-06 15:35:47.000000000","message":"That is correct, i will update the docs for this.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":16,"context_line":"  running OpenVSwitch instance (e.g. ``ovn-bridge-mappings\u003d\"physnet1:br-ex\"``)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"- The provider network has been configured by an admin with at least a ``vni``,"},{"line_number":19,"context_line":"  and preferably the vpn type has been configured too with either ``l2`` or ``l3``."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"  For example (when using the OVN tools):"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"11443d12_09188d0c","line":19,"range":{"start_line":19,"start_character":66,"end_line":19,"end_character":73},"in_reply_to":"c1c44252_1956cacf","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"cec0df89_d63c9df5","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"updated":"2024-03-06 14:25:21.000000000","message":"worth to add a note about the 0 vlan for the provider network\n\nAlso, this raised a concern... what if we have 2 different ovs bridges (br-ex1 and br-ex2, associated to different nics). We could have same vlan in both of then, but this will crash on the veth creation due to that. Like having in both provider networks associated to vlan 101","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"8a4f5ba41c3dd5e72821d534a163f05bf1469d8e","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"c505e7ea_afba6bee","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"3fc8f30e_dfb9385c","updated":"2024-03-07 11:06:46.000000000","message":"yep, incomming traffic should be simple (comming on the related vni/vxlan, redirect it to br-ex). The outgoing traffic is the one to handle... were we would need to add ovs flows at br-ex than, when comming from the cr-lrp MAC (adn the subnet CIDR) neeed to go to one port (veth device) or another","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"620f82c0f344df80fa721448873b038564d6551e","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"3fc8f30e_dfb9385c","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"65c91471_c5869f6f","updated":"2024-03-07 10:58:54.000000000","message":"Maybe in a follow up it _could_ work, though i think there are challenges in how to properly forward the traffic to the correct vni/vlan iface.\n\nI think with OVS flows we could add some mapping, that per mac address from a tenant network, you could send that traffic to another vni/vlan iface.\n\ne.g. traffic from tenant router port mac would then be sent to a specific veth-ovs port, in addition to being rewritten to a specific mac address. Not sure yet, but maybe we even have to do some mac rewrites to make sure the source mac address (from OVN/OVS point of view) remains the same as it ingresses toward the tenant network again.\n\nThen also we to create the localnet veth pair in more than one vni, so that might complicate things too with naming and such O:-)","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bc581b9d_d1d0670c","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"7c95b91a_dc9d2f5d","updated":"2024-03-06 18:24:52.000000000","message":"Considering the VNI range is 1-16777214 (0xfffffe in hex), and then vlan is 0-4095 (0xfff in hex), we could also opt for naming like\n\nso for example, veth pair for vni 16777214, vlan 4095\novs-fffffe-fff and vrf-fffffe-fff  (which is 14 chars)\n\nin decimal it would be\novs-16777214-4096 (which is 18 chars, which is longer than the 15 char kernel limit), so that would not be my preference\n\nWe could keep the vrf number as is, since vrf-16777214 is only 12 chars, and is easier to recognise that the routing table number is equivalent to the vni number.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"7c95b91a_dc9d2f5d","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"9a2a5413_c7233b87","updated":"2024-03-06 16:10:27.000000000","message":"I assume vni-vlan should be fine. perhaps instead of veth-ovs/veth-vrf, we can call it v-ovs-vni-vlan, v-vrf-vni-vlan","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"a5a5897866f2873c2b6ec3c8905fa5a719e4f8aa","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"aa63efcf_89f74299","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"9b53762d_58bb2b72","updated":"2024-03-07 08:15:15.000000000","message":"well yes, that is possible, connect multiple provider networks with different vlan to the same VNI, it is what i\u0027ve been running actually.\n\nWhat i\u0027m thinking about is a scenario where you have multiple bridge mappings, e.g.\n`physnet1:br-ex,physnet2:my-other-bridge`\n\nThen, assume that both physnets are using vlan type provider nets. Then you could configure two provnets with same vlan and same vni, and in theory, this should be able to work to (not right now, because naming would be in the way).\n\nIf we want to support this scenario to, and be true agnostic of vni/vlan, i think we should use the uuid of the localnet port.\n\n```\n_uuid               : e01c0e11-71fa-4e14-84a7-05301e0ff0e1\naddresses           : [unknown]\ndhcpv4_options      : []\ndhcpv6_options      : []\ndynamic_addresses   : []\nenabled             : []\nexternal_ids        : {}\nha_chassis_group    : []\nmirror_rules        : []\nname                : provnet-816a922c-02bb-4879-a6d1-958c85a5a023\noptions             : {mcast_flood\u003d\"false\", mcast_flood_reports\u003d\"true\", network_name\u003dphysnet1}\nparent_name         : []\nport_security       : []\ntag                 : 100\ntag_request         : []\ntype                : localnet\nup                  : false\n```\n\nSo now, we could use the first 11 chars of the name or the uuid field (like neutron does with the tap interfaces), and use that as postfix for the veth interfaces.\n\ne.g. `vrfe01c0e11-71` and `ovse01c0e11-71` (using the uuid)\nor   `vrf816a922c-02` and `ovs816a922c-02` (using the provnet uuid, which is the uuid of the record in neutron.networksegments table)\n\nThe downside, obviously, is that it is not really readible, the upside is that you probably don\u0027t have to worry about interface name clashes (i\u0027d wager it has worked fine for neutron)\n\n\nBut since it is all a routed EVPN anyway (in all fairness, the bridge is only a placeholder in config), i think you\u0027d only want this if you scale really big (like beyond the 4094 vlan provnets), before one would need this feature like this. \n\nI think my preference would be to create it agnostic (by going the neutron way; using the uuid in the interface name), as it opens up more possibilities, but i am fine with renaming it a little bit different too.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"822903a5cb31408bd9cb5bafdee242531e806f6f","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"65c91471_c5869f6f","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"aa63efcf_89f74299","updated":"2024-03-07 09:09:52.000000000","message":"I agree with you, better to go with the uuid and be safer.\n\nFollow up question on that, what about tenant networks? This works assuming tenant networks are exposed on the same vni as the provider. But what if that is not the case? I know with this approach we cannot expose a tenant in a different vni than the provider... but, can we expose the tenant without exposing the provider, so that 2 tenant networks in the same provider can be exposed in different vnis?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"212ecd6e67d06d2e93c5be0efb77f08ff18e884c","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9b53762d_58bb2b72","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"bc581b9d_d1d0670c","updated":"2024-03-07 07:05:18.000000000","message":"what if we want to connect couple of provider networks (diferent vlan) on the same VNI? is that posible?\n\nOther options would be a mix:\n- o-16777214-4096 / v-16777214-4096\n- or ovs16777214-fff / vrf16777214-fff","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"b94dd648_18939096","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"c505e7ea_afba6bee","updated":"2024-03-08 14:31:04.000000000","message":"the veth pair has been renamed.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":96,"context_line":"   to the OVN virtual networking. It needs to connect the VRF to the OVS"},{"line_number":97,"context_line":"   provider bridge:"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"   - Create a veth device, that will be used for routing between the vrf and"},{"line_number":100,"context_line":"     OVN, using the VLAN number as name suffix: veth-ovs-123 and veth-vrf-123"},{"line_number":101,"context_line":"     and connect it to ovs"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"     .. code-block:: bash"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9a2a5413_c7233b87","line":101,"range":{"start_line":99,"start_character":0,"end_line":101,"end_character":26},"in_reply_to":"cec0df89_d63c9df5","updated":"2024-03-06 15:35:47.000000000","message":"Yes that is indeed a current implementation limitation. Maybe we could workaround this by using a different naming convention, e.g. vrf-\u003cvni\u003e-\u003cvlan\u003e, assuming we keep the vni relatively low.\n\nAnother approach is to use the uuid of the localnet port and shorten this, so we keep within the character limit of 15 chars.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":106,"context_line":"       $ ovs-vsctl add-port br-ex veth-ovs-123"},{"line_number":107,"context_line":"       $ ip link set up dev veth-ovs-123"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"   - For EVPN l2 mode it will attach the vrf side to the bridge:"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"     .. code-block:: bash"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"       $ ip link set veth-vrf-123 master br-1001"},{"line_number":114,"context_line":"       $ ip link set up dev veth-vrf-123"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"   - For EVPN l3 mode, it will attach the vrf side to the vrf:"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"0380809e_eabda005","line":114,"range":{"start_line":109,"start_character":2,"end_line":114,"end_character":40},"updated":"2024-03-06 14:25:21.000000000","message":"does this patch adds support to L2?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":106,"context_line":"       $ ovs-vsctl add-port br-ex veth-ovs-123"},{"line_number":107,"context_line":"       $ ip link set up dev veth-ovs-123"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"   - For EVPN l2 mode it will attach the vrf side to the bridge:"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"     .. code-block:: bash"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"       $ ip link set veth-vrf-123 master br-1001"},{"line_number":114,"context_line":"       $ ip link set up dev veth-vrf-123"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"   - For EVPN l3 mode, it will attach the vrf side to the vrf:"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"beea1cf3_71c646b6","line":114,"range":{"start_line":109,"start_character":2,"end_line":114,"end_character":40},"in_reply_to":"0380809e_eabda005","updated":"2024-03-06 15:35:47.000000000","message":"There is some support for it in the evpn util, yes; But it has been untested, so probably better to remove this, since it has not been implemented properly.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":106,"context_line":"       $ ovs-vsctl add-port br-ex veth-ovs-123"},{"line_number":107,"context_line":"       $ ip link set up dev veth-ovs-123"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"   - For EVPN l2 mode it will attach the vrf side to the bridge:"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"     .. code-block:: bash"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"       $ ip link set veth-vrf-123 master br-1001"},{"line_number":114,"context_line":"       $ ip link set up dev veth-vrf-123"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"   - For EVPN l3 mode, it will attach the vrf side to the vrf:"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"5953cd23_3fe04618","line":114,"range":{"start_line":109,"start_character":2,"end_line":114,"end_character":40},"in_reply_to":"36f23a9f_1b8aa467","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":106,"context_line":"       $ ovs-vsctl add-port br-ex veth-ovs-123"},{"line_number":107,"context_line":"       $ ip link set up dev veth-ovs-123"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"   - For EVPN l2 mode it will attach the vrf side to the bridge:"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"     .. code-block:: bash"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"       $ ip link set veth-vrf-123 master br-1001"},{"line_number":114,"context_line":"       $ ip link set up dev veth-vrf-123"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"   - For EVPN l3 mode, it will attach the vrf side to the vrf:"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"36f23a9f_1b8aa467","line":114,"range":{"start_line":109,"start_character":2,"end_line":114,"end_character":40},"in_reply_to":"beea1cf3_71c646b6","updated":"2024-03-06 16:10:27.000000000","message":"yep, this can be added later once we add that support","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":120,"context_line":"       $ ip link set veth-vrf-123 master vrf-1001"},{"line_number":121,"context_line":"       $ ip link set up dev veth-vrf-123"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     And it will add the required IP\u0027s on the veth interface, so the network is"},{"line_number":124,"context_line":"     able to do actual routing. If possible it will use the dhcp options to"},{"line_number":125,"context_line":"     determine if it can use a real ip address, instead of an APIPA address."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"5aade17b_5f3af483","line":123,"range":{"start_line":123,"start_character":24,"end_line":123,"end_character":39},"updated":"2024-03-06 14:25:21.000000000","message":"worth to explain what are those \"required IPs\"","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":120,"context_line":"       $ ip link set veth-vrf-123 master vrf-1001"},{"line_number":121,"context_line":"       $ ip link set up dev veth-vrf-123"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     And it will add the required IP\u0027s on the veth interface, so the network is"},{"line_number":124,"context_line":"     able to do actual routing. If possible it will use the dhcp options to"},{"line_number":125,"context_line":"     determine if it can use a real ip address, instead of an APIPA address."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"83e1e9e9_418b8555","line":123,"range":{"start_line":123,"start_character":24,"end_line":123,"end_character":39},"in_reply_to":"5aade17b_5f3af483","updated":"2024-03-06 15:35:47.000000000","message":"I will elaborate on this a bit more in the docs.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":120,"context_line":"       $ ip link set veth-vrf-123 master vrf-1001"},{"line_number":121,"context_line":"       $ ip link set up dev veth-vrf-123"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     And it will add the required IP\u0027s on the veth interface, so the network is"},{"line_number":124,"context_line":"     able to do actual routing. If possible it will use the dhcp options to"},{"line_number":125,"context_line":"     determine if it can use a real ip address, instead of an APIPA address."},{"line_number":126,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"53dc091f_fea72a61","line":123,"range":{"start_line":123,"start_character":24,"end_line":123,"end_character":39},"in_reply_to":"83e1e9e9_418b8555","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":117,"context_line":"       $ ip link set up dev vrf12345678-12"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"     And it will add routing IPs on the veth interface, so the kernel is able"},{"line_number":120,"context_line":"     to do L3 routing within the VRF. By default it will add a APIPA address"},{"line_number":121,"context_line":"     based on the VNI/VLAN."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     If possible it will use the dhcp options to determine if it can use a"}],"source_content_type":"text/x-rst","patch_set":18,"id":"8d1750d5_e0197287","line":120,"range":{"start_line":120,"start_character":63,"end_line":120,"end_character":68},"updated":"2024-04-25 17:34:56.000000000","message":"nit: I might be wrong but I always associated APIPA with Microsoft Windows. Since this is Linux based solution I think it would make sense to just say `169.254.x.x address`","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":117,"context_line":"       $ ip link set up dev vrf12345678-12"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"     And it will add routing IPs on the veth interface, so the kernel is able"},{"line_number":120,"context_line":"     to do L3 routing within the VRF. By default it will add a APIPA address"},{"line_number":121,"context_line":"     based on the VNI/VLAN."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     If possible it will use the dhcp options to determine if it can use a"}],"source_content_type":"text/x-rst","patch_set":18,"id":"f0bb993d_86cf991a","line":120,"range":{"start_line":120,"start_character":63,"end_line":120,"end_character":68},"in_reply_to":"1d97ade7_e0214b9b","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":117,"context_line":"       $ ip link set up dev vrf12345678-12"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"     And it will add routing IPs on the veth interface, so the kernel is able"},{"line_number":120,"context_line":"     to do L3 routing within the VRF. By default it will add a APIPA address"},{"line_number":121,"context_line":"     based on the VNI/VLAN."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     If possible it will use the dhcp options to determine if it can use a"}],"source_content_type":"text/x-rst","patch_set":18,"id":"1d97ade7_e0214b9b","line":120,"range":{"start_line":120,"start_character":63,"end_line":120,"end_character":68},"in_reply_to":"8d1750d5_e0197287","updated":"2024-05-02 09:23:56.000000000","message":"you are right, will adapt this","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":120,"context_line":"     to do L3 routing within the VRF. By default it will add a APIPA address"},{"line_number":121,"context_line":"     based on the VNI/VLAN."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     If possible it will use the dhcp options to determine if it can use a"},{"line_number":124,"context_line":"     actually configured router ip address, in addition to the APIPA address:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"     .. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":18,"id":"13c61e1d_9315244a","line":123,"range":{"start_line":123,"start_character":73,"end_line":123,"end_character":74},"updated":"2024-04-25 17:34:56.000000000","message":"an","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":120,"context_line":"     to do L3 routing within the VRF. By default it will add a APIPA address"},{"line_number":121,"context_line":"     based on the VNI/VLAN."},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"     If possible it will use the dhcp options to determine if it can use a"},{"line_number":124,"context_line":"     actually configured router ip address, in addition to the APIPA address:"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"     .. code-block:: bash"}],"source_content_type":"text/x-rst","patch_set":18,"id":"9ed82879_e12869a0","line":123,"range":{"start_line":123,"start_character":73,"end_line":123,"end_character":74},"in_reply_to":"13c61e1d_9315244a","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"     # Replace link local address and update to generated vlan mac (used for ipv6 router advertisements)"},{"line_number":149,"context_line":"     $ ip -6 address del \u003csome fe80::/10 address\u003e dev vrf12345678-12"},{"line_number":150,"context_line":"     $ ip -6 address add fe80::200:5e00:65/64 dev vrf12345678-12"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"6. If IPv6 subnets are defined (checked in dhcp opts once again), then configure"},{"line_number":153,"context_line":"   FRR to handle neighbor discovery (and do router advertisements for us)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"e867d731_d22e96b3","line":150,"range":{"start_line":150,"start_character":24,"end_line":150,"end_character":45},"updated":"2024-04-25 17:34:56.000000000","message":"Should this be the new LLA based on the MAC? If so, isn\u0027t that `fe80:::5eff:fe00:7b` ?","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"     # Replace link local address and update to generated vlan mac (used for ipv6 router advertisements)"},{"line_number":149,"context_line":"     $ ip -6 address del \u003csome fe80::/10 address\u003e dev vrf12345678-12"},{"line_number":150,"context_line":"     $ ip -6 address add fe80::200:5e00:65/64 dev vrf12345678-12"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"6. If IPv6 subnets are defined (checked in dhcp opts once again), then configure"},{"line_number":153,"context_line":"   FRR to handle neighbor discovery (and do router advertisements for us)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"04e27179_9d1ada65","line":150,"range":{"start_line":150,"start_character":24,"end_line":150,"end_character":45},"in_reply_to":"d3780ccb_497ea2ed","updated":"2024-05-14 12:25:18.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"     # Replace link local address and update to generated vlan mac (used for ipv6 router advertisements)"},{"line_number":149,"context_line":"     $ ip -6 address del \u003csome fe80::/10 address\u003e dev vrf12345678-12"},{"line_number":150,"context_line":"     $ ip -6 address add fe80::200:5e00:65/64 dev vrf12345678-12"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"6. If IPv6 subnets are defined (checked in dhcp opts once again), then configure"},{"line_number":153,"context_line":"   FRR to handle neighbor discovery (and do router advertisements for us)"}],"source_content_type":"text/x-rst","patch_set":18,"id":"d3780ccb_497ea2ed","line":150,"range":{"start_line":150,"start_character":24,"end_line":150,"end_character":45},"in_reply_to":"e867d731_d22e96b3","updated":"2024-05-02 09:23:56.000000000","message":"that is one option, though it is allowed to not adhere to EUI-64 format, and we generate this mac address based on vni and vlan combo.\n\nI do see i need to update the documentation on the latest change for how we generate the new mac address though 😊\n\nAnd for easier recognition of the ipv6 address i found it more useful to use the annotation shown, as it will be easier to locate this on hosts.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bc7274ba8619e777a4ab790fed8dbc5d0feda9df","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"  .. code-block:: bash"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:type\"\u003dl3"},{"line_number":26,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:vni\"\u003d100"},{"line_number":27,"context_line":"    $ ovn-nbctl list logical-switch | less"},{"line_number":28,"context_line":"    ..."}],"source_content_type":"text/x-rst","patch_set":21,"id":"4446728e_97330df2","line":25,"range":{"start_line":25,"start_character":94,"end_line":25,"end_character":118},"updated":"2024-05-20 19:18:08.000000000","message":"Is this used for something else then searching for logical switches with the bgpvpn configuration? Can we use the same using just the `vni` option and removing configuration of the type altogether?\n\nWithout the type it will be less complex. I think if we want implement different types they should be included in different set of patches, otherwise it is YAGNI.\n\nPlease let me know what you think.","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"b67a453bf96d29912f5bebd34238fb8f752cd12c","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"  .. code-block:: bash"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:type\"\u003dl3"},{"line_number":26,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:vni\"\u003d100"},{"line_number":27,"context_line":"    $ ovn-nbctl list logical-switch | less"},{"line_number":28,"context_line":"    ..."}],"source_content_type":"text/x-rst","patch_set":21,"id":"d0d3326e_136cb1a5","line":25,"range":{"start_line":25,"start_character":94,"end_line":25,"end_character":118},"in_reply_to":"095b8e8f_51dfaaf2","updated":"2024-05-21 20:22:12.000000000","message":"The best would be to isolate introducing the `type` to a separate patch. That way is more agile, decreases complexity of this patch and even the LOC.","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"5568a13baa3043750cc5eddeb5a504fbcf14d0c5","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"  .. code-block:: bash"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:type\"\u003dl3"},{"line_number":26,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:vni\"\u003d100"},{"line_number":27,"context_line":"    $ ovn-nbctl list logical-switch | less"},{"line_number":28,"context_line":"    ..."}],"source_content_type":"text/x-rst","patch_set":21,"id":"b8b83650_c1d62411","line":25,"range":{"start_line":25,"start_character":94,"end_line":25,"end_character":118},"in_reply_to":"4446728e_97330df2","updated":"2024-05-21 06:00:38.000000000","message":"there was other work to also suport l2vni: https://review.opendev.org/c/openstack/ovn-bgp-agent/+/886090\n\nHopefully that is retaken and adapted to this patch after it gets merged. So that depending on the notation things can be exposed with l2 or l3 evpn","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"  .. code-block:: bash"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:type\"\u003dl3"},{"line_number":26,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:vni\"\u003d100"},{"line_number":27,"context_line":"    $ ovn-nbctl list logical-switch | less"},{"line_number":28,"context_line":"    ..."}],"source_content_type":"text/x-rst","patch_set":21,"id":"095b8e8f_51dfaaf2","line":25,"range":{"start_line":25,"start_character":94,"end_line":25,"end_character":118},"in_reply_to":"b8b83650_c1d62411","updated":"2024-05-21 09:46:27.000000000","message":"Thanks for pointing this out @Luis. If more types are coming I think it should be OK to include the base code in this patch, otherwise, if L3 was the only type for the time being I think we also ought simplify it as @Kuba mentioned.","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"a1ab47ac46560cc71dbf24ee815097826201de08","unresolved":true,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"  .. code-block:: bash"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:type\"\u003dl3"},{"line_number":26,"context_line":"    $ ovn-nbctl set logical-switch neutron-cd5d6fa7-3ed7-452b-8ce9-1490e2d377c8 external_ids:\"neutron_bgpvpn\\:vni\"\u003d100"},{"line_number":27,"context_line":"    $ ovn-nbctl list logical-switch | less"},{"line_number":28,"context_line":"    ..."}],"source_content_type":"text/x-rst","patch_set":21,"id":"c3fb881f_ebfd31c1","line":25,"range":{"start_line":25,"start_character":94,"end_line":25,"end_character":118},"in_reply_to":"d0d3326e_136cb1a5","updated":"2024-05-22 05:51:56.000000000","message":"it won\u0027t reduce complexity by a lot, and only a few lines of code. And that was being added by the neutron-bgpvpn patch, so it is good to take it into account anyway. As the code is already there, let\u0027s leave it and use it for the l2 support patch that is already ongoing","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"}],"doc/source/examples/nb_evpn_vrf.rst":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":178,"context_line":"Current known limitations"},{"line_number":179,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"- Only one Flat provider network can be exposed per host. Recommendation is"},{"line_number":182,"context_line":"  to use VLAN provider networks. Please make sure not to use duplicate vlan"},{"line_number":183,"context_line":"  ids."},{"line_number":184,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"bc7d6515_6fd43eed","line":181,"range":{"start_line":181,"start_character":1,"end_line":181,"end_character":57},"updated":"2024-03-06 14:25:21.000000000","message":"per host or per ovs bridge?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":178,"context_line":"Current known limitations"},{"line_number":179,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"- Only one Flat provider network can be exposed per host. Recommendation is"},{"line_number":182,"context_line":"  to use VLAN provider networks. Please make sure not to use duplicate vlan"},{"line_number":183,"context_line":"  ids."},{"line_number":184,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"b23fcbd2_20b0391b","line":181,"range":{"start_line":181,"start_character":1,"end_line":181,"end_character":57},"in_reply_to":"18690b96_ef639e1b","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":178,"context_line":"Current known limitations"},{"line_number":179,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"- Only one Flat provider network can be exposed per host. Recommendation is"},{"line_number":182,"context_line":"  to use VLAN provider networks. Please make sure not to use duplicate vlan"},{"line_number":183,"context_line":"  ids."},{"line_number":184,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"4359fe89_cb0bfacd","line":181,"range":{"start_line":181,"start_character":1,"end_line":181,"end_character":57},"in_reply_to":"2b49b199_06dfd966","updated":"2024-03-06 16:10:27.000000000","message":"ok, but if we move to vni-vlan, it should be per ovs, right?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":true,"context_lines":[{"line_number":178,"context_line":"Current known limitations"},{"line_number":179,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"- Only one Flat provider network can be exposed per host. Recommendation is"},{"line_number":182,"context_line":"  to use VLAN provider networks. Please make sure not to use duplicate vlan"},{"line_number":183,"context_line":"  ids."},{"line_number":184,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"18690b96_ef639e1b","line":181,"range":{"start_line":181,"start_character":1,"end_line":181,"end_character":57},"in_reply_to":"4359fe89_cb0bfacd","updated":"2024-03-06 18:24:52.000000000","message":"yes, per vni actually 😊","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":178,"context_line":"Current known limitations"},{"line_number":179,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"- Only one Flat provider network can be exposed per host. Recommendation is"},{"line_number":182,"context_line":"  to use VLAN provider networks. Please make sure not to use duplicate vlan"},{"line_number":183,"context_line":"  ids."},{"line_number":184,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"2b49b199_06dfd966","line":181,"range":{"start_line":181,"start_character":1,"end_line":181,"end_character":57},"in_reply_to":"bc7d6515_6fd43eed","updated":"2024-03-06 15:35:47.000000000","message":"per host, because it uses vlan id 0 (and then for reasons as noted in other comment in regard to the vlan interface names)","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":188,"context_line":"  gateway) in separate VRF\u0027s, make sure to use address scopes and subnet pools"},{"line_number":189,"context_line":"  to prevent ip overlaps, if you are planning to expose tenant networks."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"- Provider networks of type ``flat`` has not been tested extensively. It is"},{"line_number":192,"context_line":"  recommended to use provider networks of type ``vlan``. That way it is also"},{"line_number":193,"context_line":"  easier to create multiple provider networks, without having to create"},{"line_number":194,"context_line":"  new bridgemappings for every provider network."}],"source_content_type":"text/x-rst","patch_set":18,"id":"78a35f24_55276bd9","line":191,"range":{"start_line":191,"start_character":2,"end_line":191,"end_character":69},"updated":"2024-04-25 17:34:56.000000000","message":"I\u0027d be in favor in this patch issuing an error in the agent if flat network was used and not configure anything. If there is a use-case for the flat networks then it can be added later with proper testing coverage.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[{"line_number":188,"context_line":"  gateway) in separate VRF\u0027s, make sure to use address scopes and subnet pools"},{"line_number":189,"context_line":"  to prevent ip overlaps, if you are planning to expose tenant networks."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"- Provider networks of type ``flat`` has not been tested extensively. It is"},{"line_number":192,"context_line":"  recommended to use provider networks of type ``vlan``. That way it is also"},{"line_number":193,"context_line":"  easier to create multiple provider networks, without having to create"},{"line_number":194,"context_line":"  new bridgemappings for every provider network."}],"source_content_type":"text/x-rst","patch_set":18,"id":"009e664f_7bc8a144","line":191,"range":{"start_line":191,"start_character":2,"end_line":191,"end_character":69},"in_reply_to":"687aca5f_8aa3fa54","updated":"2024-05-14 12:25:18.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":188,"context_line":"  gateway) in separate VRF\u0027s, make sure to use address scopes and subnet pools"},{"line_number":189,"context_line":"  to prevent ip overlaps, if you are planning to expose tenant networks."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"- Provider networks of type ``flat`` has not been tested extensively. It is"},{"line_number":192,"context_line":"  recommended to use provider networks of type ``vlan``. That way it is also"},{"line_number":193,"context_line":"  easier to create multiple provider networks, without having to create"},{"line_number":194,"context_line":"  new bridgemappings for every provider network."}],"source_content_type":"text/x-rst","patch_set":18,"id":"85c62e7b_28347d97","line":191,"range":{"start_line":191,"start_character":2,"end_line":191,"end_character":69},"in_reply_to":"78a35f24_55276bd9","updated":"2024-05-02 09:23:56.000000000","message":"I am fine with this approach too, as flat networking would be (in my opinion) too limited in this usecase anyway, as this approach allows you to create multiple vrf\u0027s, which is easier to do if you use provider networks with type vlan.\n\n@ltomasbo, what is your opinion on this?","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":true,"context_lines":[{"line_number":188,"context_line":"  gateway) in separate VRF\u0027s, make sure to use address scopes and subnet pools"},{"line_number":189,"context_line":"  to prevent ip overlaps, if you are planning to expose tenant networks."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"- Provider networks of type ``flat`` has not been tested extensively. It is"},{"line_number":192,"context_line":"  recommended to use provider networks of type ``vlan``. That way it is also"},{"line_number":193,"context_line":"  easier to create multiple provider networks, without having to create"},{"line_number":194,"context_line":"  new bridgemappings for every provider network."}],"source_content_type":"text/x-rst","patch_set":18,"id":"687aca5f_8aa3fa54","line":191,"range":{"start_line":191,"start_character":2,"end_line":191,"end_character":69},"in_reply_to":"85c62e7b_28347d97","updated":"2024-05-02 13:54:52.000000000","message":"btw, provider network type flat does work (we confirmed this in a devstack), so i updated the doc that is it not the preferred type of provider network","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4585a635fbefa3f19eff0008b320e376f0ebe5d9","unresolved":true,"context_lines":[{"line_number":175,"context_line":"And create some routers, or add some instances on the provider network, so a"},{"line_number":176,"context_line":"host will start exposing the networks and/or ips."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Current known limitations"},{"line_number":179,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"- Only one Flat provider network can be exposed per vni. Recommendation is"}],"source_content_type":"text/x-rst","patch_set":20,"id":"7e2f9c1a_3b78e2bf","line":178,"range":{"start_line":178,"start_character":0,"end_line":178,"end_character":25},"updated":"2024-05-13 11:51:03.000000000","message":"perhaps worth to also state that DHCP is a requirement in the provider network for this to work ,right?","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[{"line_number":175,"context_line":"And create some routers, or add some instances on the provider network, so a"},{"line_number":176,"context_line":"host will start exposing the networks and/or ips."},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"Current known limitations"},{"line_number":179,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"- Only one Flat provider network can be exposed per vni. Recommendation is"}],"source_content_type":"text/x-rst","patch_set":20,"id":"4e3722fb_eb76e501","line":178,"range":{"start_line":178,"start_character":0,"end_line":178,"end_character":25},"in_reply_to":"7e2f9c1a_3b78e2bf","updated":"2024-05-14 12:25:18.000000000","message":"Well, even without DHCP it will function as expected, as the 169.254.x.x is also still added to the veth interface. And also neutron will still be assigning ip addresses to ports, end users just need to configure it all manually, instead of DHCP.","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"}],"ovn_bgp_agent/config.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":34,"context_line":"                     \u0027expose_ipv6_gua_tenant_networks flag and all tenant \u0027"},{"line_number":35,"context_line":"                     \u0027network IPs will be exposed.\u0027,"},{"line_number":36,"context_line":"                default\u003dFalse),"},{"line_number":37,"context_line":"    cfg.BoolOpt(\u0027expose_tenant_networks_per_port\u0027,"},{"line_number":38,"context_line":"                help\u003d\u0027if expose_tenant_networks is true it will (by default) \u0027"},{"line_number":39,"context_line":"                     \u0027expose all internal ports individually (so announce \u0027"},{"line_number":40,"context_line":"                     \u0027per /32 or /128). When this option is set to False, \u0027"},{"line_number":41,"context_line":"                     \u0027it will use the subnet prefix as announcement.\u0027,"},{"line_number":42,"context_line":"                default\u003dTrue),"},{"line_number":43,"context_line":"    cfg.BoolOpt(\u0027require_snat_disabled_for_tenant_networks\u0027,"},{"line_number":44,"context_line":"                help\u003d\u0027Require SNAT on the router port to be disabled before \u0027"},{"line_number":45,"context_line":"                     \u0027exposing the tenant networks. Otherwise the exposed \u0027"},{"line_number":46,"context_line":"                     \u0027tenant networks will be reachable from the outside, but\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"ca0f6695_5683b6de","line":43,"range":{"start_line":37,"start_character":0,"end_line":43,"end_character":60},"updated":"2024-01-29 10:05:45.000000000","message":"this looks like a nice addition, but kind of independent of L3vni support","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"03723d8feb7c8acf238600f820403bcb2a37ca00","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                     \u0027expose_ipv6_gua_tenant_networks flag and all tenant \u0027"},{"line_number":35,"context_line":"                     \u0027network IPs will be exposed.\u0027,"},{"line_number":36,"context_line":"                default\u003dFalse),"},{"line_number":37,"context_line":"    cfg.BoolOpt(\u0027expose_tenant_networks_per_port\u0027,"},{"line_number":38,"context_line":"                help\u003d\u0027if expose_tenant_networks is true it will (by default) \u0027"},{"line_number":39,"context_line":"                     \u0027expose all internal ports individually (so announce \u0027"},{"line_number":40,"context_line":"                     \u0027per /32 or /128). When this option is set to False, \u0027"},{"line_number":41,"context_line":"                     \u0027it will use the subnet prefix as announcement.\u0027,"},{"line_number":42,"context_line":"                default\u003dTrue),"},{"line_number":43,"context_line":"    cfg.BoolOpt(\u0027require_snat_disabled_for_tenant_networks\u0027,"},{"line_number":44,"context_line":"                help\u003d\u0027Require SNAT on the router port to be disabled before \u0027"},{"line_number":45,"context_line":"                     \u0027exposing the tenant networks. Otherwise the exposed \u0027"},{"line_number":46,"context_line":"                     \u0027tenant networks will be reachable from the outside, but\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"4bd1eed2_5bac108f","line":43,"range":{"start_line":37,"start_character":0,"end_line":43,"end_character":60},"in_reply_to":"764a0c3d_006488dc","updated":"2024-01-29 16:52:00.000000000","message":"https://review.opendev.org/c/openstack/ovn-bgp-agent/+/907057","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":34,"context_line":"                     \u0027expose_ipv6_gua_tenant_networks flag and all tenant \u0027"},{"line_number":35,"context_line":"                     \u0027network IPs will be exposed.\u0027,"},{"line_number":36,"context_line":"                default\u003dFalse),"},{"line_number":37,"context_line":"    cfg.BoolOpt(\u0027expose_tenant_networks_per_port\u0027,"},{"line_number":38,"context_line":"                help\u003d\u0027if expose_tenant_networks is true it will (by default) \u0027"},{"line_number":39,"context_line":"                     \u0027expose all internal ports individually (so announce \u0027"},{"line_number":40,"context_line":"                     \u0027per /32 or /128). When this option is set to False, \u0027"},{"line_number":41,"context_line":"                     \u0027it will use the subnet prefix as announcement.\u0027,"},{"line_number":42,"context_line":"                default\u003dTrue),"},{"line_number":43,"context_line":"    cfg.BoolOpt(\u0027require_snat_disabled_for_tenant_networks\u0027,"},{"line_number":44,"context_line":"                help\u003d\u0027Require SNAT on the router port to be disabled before \u0027"},{"line_number":45,"context_line":"                     \u0027exposing the tenant networks. Otherwise the exposed \u0027"},{"line_number":46,"context_line":"                     \u0027tenant networks will be reachable from the outside, but\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"764a0c3d_006488dc","line":43,"range":{"start_line":37,"start_character":0,"end_line":43,"end_character":60},"in_reply_to":"ca0f6695_5683b6de","updated":"2024-01-29 11:12:04.000000000","message":"I will create separate change for it.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    \u0027redirection\u0027),"},{"line_number":139,"context_line":"    cfg.BoolOpt(\"anycast_evpn_gateway_mode\","},{"line_number":140,"context_line":"                default\u003dFalse,"},{"line_number":141,"context_line":"                help\u003d\"When using exposing_method vrf and l3 mode on networks, \""},{"line_number":142,"context_line":"                     \"then one can create anycast mac addresses, basically\""},{"line_number":143,"context_line":"                     \"using the same mac address on all nodes for use with \""},{"line_number":144,"context_line":"                     \"routing.\"),"},{"line_number":145,"context_line":"]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"root_helper_opts \u003d ["},{"line_number":148,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"8e6493fc_d8a6972d","line":145,"range":{"start_line":141,"start_character":22,"end_line":145,"end_character":1},"updated":"2024-03-06 14:25:21.000000000","message":"is this required when using vrf or an option? if it is required, then this needs rephrase to make it clear","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"212ecd6e67d06d2e93c5be0efb77f08ff18e884c","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    \u0027redirection\u0027),"},{"line_number":139,"context_line":"    cfg.BoolOpt(\"anycast_evpn_gateway_mode\","},{"line_number":140,"context_line":"                default\u003dFalse,"},{"line_number":141,"context_line":"                help\u003d\"When using exposing_method vrf and l3 mode on networks, \""},{"line_number":142,"context_line":"                     \"then one can create anycast mac addresses, basically\""},{"line_number":143,"context_line":"                     \"using the same mac address on all nodes for use with \""},{"line_number":144,"context_line":"                     \"routing.\"),"},{"line_number":145,"context_line":"]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"root_helper_opts \u003d ["},{"line_number":148,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"b4496655_c4be4251","line":145,"range":{"start_line":141,"start_character":22,"end_line":145,"end_character":1},"in_reply_to":"8440607f_91693af2","updated":"2024-03-07 07:05:18.000000000","message":"if that is the case, I agree, better to drop the config option and make it default behaviour for EVPN","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    \u0027redirection\u0027),"},{"line_number":139,"context_line":"    cfg.BoolOpt(\"anycast_evpn_gateway_mode\","},{"line_number":140,"context_line":"                default\u003dFalse,"},{"line_number":141,"context_line":"                help\u003d\"When using exposing_method vrf and l3 mode on networks, \""},{"line_number":142,"context_line":"                     \"then one can create anycast mac addresses, basically\""},{"line_number":143,"context_line":"                     \"using the same mac address on all nodes for use with \""},{"line_number":144,"context_line":"                     \"routing.\"),"},{"line_number":145,"context_line":"]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"root_helper_opts \u003d ["},{"line_number":148,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"fc8bf268_1b13e3dd","line":145,"range":{"start_line":141,"start_character":22,"end_line":145,"end_character":1},"in_reply_to":"8e6493fc_d8a6972d","updated":"2024-03-06 15:35:47.000000000","message":"It is not required, but in my opionion highly recommended to prevent issues with live migrations and such, when the mac address of the router might change between nodes.\n\nI could not really work out how you fixed this in other drivers, so i made a CONF option for it. I would be fine to make this required, and remove the CONF option, when using VRF style driver.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    \u0027redirection\u0027),"},{"line_number":139,"context_line":"    cfg.BoolOpt(\"anycast_evpn_gateway_mode\","},{"line_number":140,"context_line":"                default\u003dFalse,"},{"line_number":141,"context_line":"                help\u003d\"When using exposing_method vrf and l3 mode on networks, \""},{"line_number":142,"context_line":"                     \"then one can create anycast mac addresses, basically\""},{"line_number":143,"context_line":"                     \"using the same mac address on all nodes for use with \""},{"line_number":144,"context_line":"                     \"routing.\"),"},{"line_number":145,"context_line":"]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"root_helper_opts \u003d ["},{"line_number":148,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"8440607f_91693af2","line":145,"range":{"start_line":141,"start_character":22,"end_line":145,"end_character":1},"in_reply_to":"8f177180_c8850f8c","updated":"2024-03-06 18:24:52.000000000","message":"Well, i found out the hard way that OVN creates a static mac mapping for the gateway address on the provider network, which is how i remembered this feature in juniper and cisco evpn environments and made an effort to implement this.\n\nI would argue, that for this specific implementation you\u0027d always want this though, so having a config option for it would then not make sense.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    \u0027redirection\u0027),"},{"line_number":139,"context_line":"    cfg.BoolOpt(\"anycast_evpn_gateway_mode\","},{"line_number":140,"context_line":"                default\u003dFalse,"},{"line_number":141,"context_line":"                help\u003d\"When using exposing_method vrf and l3 mode on networks, \""},{"line_number":142,"context_line":"                     \"then one can create anycast mac addresses, basically\""},{"line_number":143,"context_line":"                     \"using the same mac address on all nodes for use with \""},{"line_number":144,"context_line":"                     \"routing.\"),"},{"line_number":145,"context_line":"]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"root_helper_opts \u003d ["},{"line_number":148,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"2c034e04_a7d1413e","line":145,"range":{"start_line":141,"start_character":22,"end_line":145,"end_character":1},"in_reply_to":"956087df_e7ec1c78","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"a5a5897866f2873c2b6ec3c8905fa5a719e4f8aa","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    \u0027redirection\u0027),"},{"line_number":139,"context_line":"    cfg.BoolOpt(\"anycast_evpn_gateway_mode\","},{"line_number":140,"context_line":"                default\u003dFalse,"},{"line_number":141,"context_line":"                help\u003d\"When using exposing_method vrf and l3 mode on networks, \""},{"line_number":142,"context_line":"                     \"then one can create anycast mac addresses, basically\""},{"line_number":143,"context_line":"                     \"using the same mac address on all nodes for use with \""},{"line_number":144,"context_line":"                     \"routing.\"),"},{"line_number":145,"context_line":"]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"root_helper_opts \u003d ["},{"line_number":148,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"956087df_e7ec1c78","line":145,"range":{"start_line":141,"start_character":22,"end_line":145,"end_character":1},"in_reply_to":"b4496655_c4be4251","updated":"2024-03-07 08:15:15.000000000","message":"agree, i will update the code for this.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    \u0027redirection\u0027),"},{"line_number":139,"context_line":"    cfg.BoolOpt(\"anycast_evpn_gateway_mode\","},{"line_number":140,"context_line":"                default\u003dFalse,"},{"line_number":141,"context_line":"                help\u003d\"When using exposing_method vrf and l3 mode on networks, \""},{"line_number":142,"context_line":"                     \"then one can create anycast mac addresses, basically\""},{"line_number":143,"context_line":"                     \"using the same mac address on all nodes for use with \""},{"line_number":144,"context_line":"                     \"routing.\"),"},{"line_number":145,"context_line":"]"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"root_helper_opts \u003d ["},{"line_number":148,"context_line":"    cfg.StrOpt(\u0027root_helper\u0027, default\u003d\u0027sudo\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"8f177180_c8850f8c","line":145,"range":{"start_line":141,"start_character":22,"end_line":145,"end_character":1},"in_reply_to":"fc8bf268_1b13e3dd","updated":"2024-03-06 16:10:27.000000000","message":"I don\u0027t have a great answer to this... I know there was a nned for some mac-mappings (in L2 domains) to avoid the same mac in different locations (like in case of FIPs). Not sure how this plays with it. As for the live migration probably it works because we are assuming a pure L3 env (computes are connected to leafs in their own isolated network). This probably requires documentation for make it clear when should or should not be used (drivers, infra, ...)","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"}],"ovn_bgp_agent/constants.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4585a635fbefa3f19eff0008b320e376f0ebe5d9","unresolved":true,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"OVN_EVPN_VNI_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:vni\u0027"},{"line_number":71,"context_line":"OVN_EVPN_AS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:as\u0027"},{"line_number":72,"context_line":"OVN_EVPN_TYPE_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:type\u0027"},{"line_number":73,"context_line":"OVN_EVPN_ROUTE_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:rt\u0027"},{"line_number":74,"context_line":"OVN_EVPN_ROUTE_DISTINGUISHERS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:rd\u0027"},{"line_number":75,"context_line":"OVN_EVPN_IMPORT_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:it\u0027"},{"line_number":76,"context_line":"OVN_EVPN_EXPORT_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:et\u0027"},{"line_number":77,"context_line":"OVN_EVPN_TYPE_L2 \u003d \u0027l2\u0027"},{"line_number":78,"context_line":"OVN_EVPN_TYPE_L3 \u003d \u0027l3\u0027"},{"line_number":79,"context_line":"OVN_EVPN_VRF_PREFIX \u003d \"vrf-\""},{"line_number":80,"context_line":"OVN_EVPN_BRIDGE_PREFIX \u003d \"br-\""}],"source_content_type":"text/x-python","patch_set":20,"id":"4c3ff217_bd726355","line":77,"range":{"start_line":72,"start_character":0,"end_line":77,"end_character":23},"updated":"2024-05-13 11:51:03.000000000","message":"I know this comes from the previous patch but, given that now the idea is to create a neutron API for this, perhaps it does not make sense to hardcode these to neutron_bgpvpn:xxx. That said, perhaps it can be kept anyway, and add them like that from neutron, or move them to config instead of constant (though that is a bit ugly). Just leaving the comment here in case anyone has a clever idea around it","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"OVN_EVPN_VNI_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:vni\u0027"},{"line_number":71,"context_line":"OVN_EVPN_AS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:as\u0027"},{"line_number":72,"context_line":"OVN_EVPN_TYPE_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:type\u0027"},{"line_number":73,"context_line":"OVN_EVPN_ROUTE_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:rt\u0027"},{"line_number":74,"context_line":"OVN_EVPN_ROUTE_DISTINGUISHERS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:rd\u0027"},{"line_number":75,"context_line":"OVN_EVPN_IMPORT_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:it\u0027"},{"line_number":76,"context_line":"OVN_EVPN_EXPORT_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:et\u0027"},{"line_number":77,"context_line":"OVN_EVPN_TYPE_L2 \u003d \u0027l2\u0027"},{"line_number":78,"context_line":"OVN_EVPN_TYPE_L3 \u003d \u0027l3\u0027"},{"line_number":79,"context_line":"OVN_EVPN_VRF_PREFIX \u003d \"vrf-\""},{"line_number":80,"context_line":"OVN_EVPN_BRIDGE_PREFIX \u003d \"br-\""}],"source_content_type":"text/x-python","patch_set":20,"id":"46a9f9cd_b5d04731","line":77,"range":{"start_line":72,"start_character":0,"end_line":77,"end_character":23},"in_reply_to":"4c3ff217_bd726355","updated":"2024-05-14 12:25:18.000000000","message":"Added a comment in code as well.","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":79,"context_line":"OVN_EVPN_IMPORT_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:it\u0027"},{"line_number":80,"context_line":"OVN_EVPN_EXPORT_TARGETS_EXT_ID_KEY \u003d \u0027neutron_bgpvpn:et\u0027"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"OVN_EVPN_TYPE_L2 \u003d \u0027l2\u0027"},{"line_number":83,"context_line":"OVN_EVPN_TYPE_L3 \u003d \u0027l3\u0027"},{"line_number":84,"context_line":"OVN_EVPN_VRF_PREFIX \u003d \"vrf-\""},{"line_number":85,"context_line":"OVN_EVPN_BRIDGE_PREFIX \u003d \"br-\""}],"source_content_type":"text/x-python","patch_set":21,"id":"ed4e50b4_4d286c39","line":82,"updated":"2024-05-21 09:46:27.000000000","message":"So I would assume that this will be used in a future patch as pointed out by @Luis [0] ?\n\n[0] https://review.opendev.org/c/openstack/ovn-bgp-agent/+/886090","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"}],"ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py":[{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"43a74277c33daa02ff18bc1329b9dc8da4bb9070","unresolved":true,"context_lines":[{"line_number":630,"context_line":"                bridge_device, bridge_vlan, localnet,"},{"line_number":631,"context_line":"                self.ovn_routing_tables, ips_info[\u0027cidrs\u0027],"},{"line_number":632,"context_line":"                mac\u003dips_info[\u0027mac\u0027], via\u003dips_info.get(\u0027via\u0027, None),"},{"line_number":633,"context_line":"                ovn_idl\u003dself.local_nb_idl, network\u003dnetwork):"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"            bgp_utils.announce_ips(ips_to_expose)"},{"line_number":636,"context_line":"            for ip in ips_to_expose:"}],"source_content_type":"text/x-python","patch_set":1,"id":"dc280880_001a956f","line":633,"updated":"2024-01-24 11:04:08.000000000","message":"Since the announcements for l3vpn go through wire_provider_port, i\u0027ve added this for now, but this needs to be different most likely","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b737bafa4a814ed674fcd1392b55683b25fe4687","unresolved":false,"context_lines":[{"line_number":630,"context_line":"                bridge_device, bridge_vlan, localnet,"},{"line_number":631,"context_line":"                self.ovn_routing_tables, ips_info[\u0027cidrs\u0027],"},{"line_number":632,"context_line":"                mac\u003dips_info[\u0027mac\u0027], via\u003dips_info.get(\u0027via\u0027, None),"},{"line_number":633,"context_line":"                ovn_idl\u003dself.local_nb_idl, network\u003dnetwork):"},{"line_number":634,"context_line":""},{"line_number":635,"context_line":"            bgp_utils.announce_ips(ips_to_expose)"},{"line_number":636,"context_line":"            for ip in ips_to_expose:"}],"source_content_type":"text/x-python","patch_set":1,"id":"6bc1cbd4_ba96efee","line":633,"in_reply_to":"dc280880_001a956f","updated":"2024-01-25 17:14:53.000000000","message":"Is now exposed via `_expose_router_lsp`","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"43a74277c33daa02ff18bc1329b9dc8da4bb9070","unresolved":true,"context_lines":[{"line_number":683,"context_line":"                      \"and they have not been properly exposed\", ips)"},{"line_number":684,"context_line":"            return"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:"},{"line_number":687,"context_line":"            # Since vrf method is exposing kernel routes, we can just expose"},{"line_number":688,"context_line":"            # the cidr, instead of single ips"},{"line_number":689,"context_line":"            via \u003d {constants.IP_VERSION_4: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"26d51ae7_6b013d87","line":686,"updated":"2024-01-24 11:04:08.000000000","message":"This needs to be another config option probably, to toggle between /24 or /32 announcements (whole subnet vs per port)","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b737bafa4a814ed674fcd1392b55683b25fe4687","unresolved":false,"context_lines":[{"line_number":683,"context_line":"                      \"and they have not been properly exposed\", ips)"},{"line_number":684,"context_line":"            return"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"        if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:"},{"line_number":687,"context_line":"            # Since vrf method is exposing kernel routes, we can just expose"},{"line_number":688,"context_line":"            # the cidr, instead of single ips"},{"line_number":689,"context_line":"            via \u003d {constants.IP_VERSION_4: None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"6f1b0e4c_9ef1eddb","line":686,"in_reply_to":"26d51ae7_6b013d87","updated":"2024-01-25 17:14:53.000000000","message":"Is now a config option called `CONF.expose_tenant_networks_per_port`","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b737bafa4a814ed674fcd1392b55683b25fe4687","unresolved":true,"context_lines":[{"line_number":36,"context_line":"# LOG.setLevel(logging.DEBUG)"},{"line_number":37,"context_line":"# logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVN_TABLES \u003d [\u0027Logical_Switch_Port\u0027, \u0027NAT\u0027, \u0027Logical_Switch\u0027, \u0027Logical_Router\u0027,"},{"line_number":40,"context_line":"              \u0027Logical_Router_Port\u0027, \u0027Load_Balancer\u0027, \u0027DHCP_Options\u0027]"},{"line_number":41,"context_line":"LOCAL_CLUSTER_OVN_TABLES \u003d [\u0027Logical_Switch\u0027, \u0027Logical_Switch_Port\u0027,"},{"line_number":42,"context_line":"                            \u0027Logical_Router\u0027, \u0027Logical_Router_Port\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"35cdb140_731b41ce","line":39,"updated":"2024-01-25 17:14:53.000000000","message":"We could consider adding `Logical_router` based on config flag `CONF.require_snat_disabled_for_tenant_networks`.\n\nNot sure what the implications are for having this in the list, while not being used.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0196f36ce5b93f0e3a37012fe4b35357306e1923","unresolved":false,"context_lines":[{"line_number":36,"context_line":"# LOG.setLevel(logging.DEBUG)"},{"line_number":37,"context_line":"# logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"OVN_TABLES \u003d [\u0027Logical_Switch_Port\u0027, \u0027NAT\u0027, \u0027Logical_Switch\u0027, \u0027Logical_Router\u0027,"},{"line_number":40,"context_line":"              \u0027Logical_Router_Port\u0027, \u0027Load_Balancer\u0027, \u0027DHCP_Options\u0027]"},{"line_number":41,"context_line":"LOCAL_CLUSTER_OVN_TABLES \u003d [\u0027Logical_Switch\u0027, \u0027Logical_Switch_Port\u0027,"},{"line_number":42,"context_line":"                            \u0027Logical_Router\u0027, \u0027Logical_Router_Port\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"b30b37ba_ae9eadc4","line":39,"in_reply_to":"35cdb140_731b41ce","updated":"2024-02-27 10:37:04.000000000","message":"Done","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":230,"context_line":"        if not self.is_ls_exposed(logical_switch):"},{"line_number":231,"context_line":"            return"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        _, bridge_device, bridge_vlan \u003d self._get_provider_ls_info("},{"line_number":234,"context_line":"            logical_switch)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        ips \u003d port.addresses[0].strip().split(\u0027 \u0027)[1:]"},{"line_number":237,"context_line":"        mac \u003d port.addresses[0].strip().split(\u0027 \u0027)[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"64f6468e_ec8c7adb","line":234,"range":{"start_line":233,"start_character":1,"end_line":234,"end_character":27},"updated":"2024-01-29 10:05:45.000000000","message":"this is not exactly the same as before as we are not filling in ovn_tenant_ls, right?","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":230,"context_line":"        if not self.is_ls_exposed(logical_switch):"},{"line_number":231,"context_line":"            return"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        _, bridge_device, bridge_vlan \u003d self._get_provider_ls_info("},{"line_number":234,"context_line":"            logical_switch)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        ips \u003d port.addresses[0].strip().split(\u0027 \u0027)[1:]"},{"line_number":237,"context_line":"        mac \u003d port.addresses[0].strip().split(\u0027 \u0027)[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"fc33c4d9_87ef41f4","line":234,"range":{"start_line":233,"start_character":1,"end_line":234,"end_character":27},"in_reply_to":"64f6468e_ec8c7adb","updated":"2024-01-29 11:12:04.000000000","message":"No we are not filling ovn_tenant_ls, it is just a method that fetches the information from cache, if set (since we were doing it multiple times in multiple methods i created a central method for it 😊 )\n\nI will create separate change for it.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"03723d8feb7c8acf238600f820403bcb2a37ca00","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        if not self.is_ls_exposed(logical_switch):"},{"line_number":231,"context_line":"            return"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        _, bridge_device, bridge_vlan \u003d self._get_provider_ls_info("},{"line_number":234,"context_line":"            logical_switch)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        ips \u003d port.addresses[0].strip().split(\u0027 \u0027)[1:]"},{"line_number":237,"context_line":"        mac \u003d port.addresses[0].strip().split(\u0027 \u0027)[0]"}],"source_content_type":"text/x-python","patch_set":2,"id":"25306d41_353ad35c","line":234,"range":{"start_line":233,"start_character":1,"end_line":234,"end_character":27},"in_reply_to":"fc33c4d9_87ef41f4","updated":"2024-01-29 16:52:00.000000000","message":"https://review.opendev.org/c/openstack/ovn-bgp-agent/+/907073","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":263,"context_line":"        if proxy_cidrs is None:"},{"line_number":264,"context_line":"            proxy_cidrs \u003d []"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        network \u003d self.nb_idl.ls_get(logical_switch).execute(check_error\u003dTrue)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        # Connect to OVN"},{"line_number":269,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"09c3592d_89b9176f","line":266,"range":{"start_line":266,"start_character":8,"end_line":266,"end_character":78},"updated":"2024-01-29 10:05:45.000000000","message":"perhaps we can create a function in ovn for this, to keep all the nb_idl interactions in there instead of the driver itself?","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":263,"context_line":"        if proxy_cidrs is None:"},{"line_number":264,"context_line":"            proxy_cidrs \u003d []"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        network \u003d self.nb_idl.ls_get(logical_switch).execute(check_error\u003dTrue)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        # Connect to OVN"},{"line_number":269,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"e5af9df7_d5472257","line":266,"range":{"start_line":266,"start_character":8,"end_line":266,"end_character":78},"in_reply_to":"09c3592d_89b9176f","updated":"2024-01-29 11:12:04.000000000","message":"Will do.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"614161b81352db35023ae1f530a88f384cadbd0f","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        if proxy_cidrs is None:"},{"line_number":264,"context_line":"            proxy_cidrs \u003d []"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        network \u003d self.nb_idl.ls_get(logical_switch).execute(check_error\u003dTrue)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        # Connect to OVN"},{"line_number":269,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"29c6d522_5e6d2692","line":266,"range":{"start_line":266,"start_character":8,"end_line":266,"end_character":78},"in_reply_to":"e5af9df7_d5472257","updated":"2024-01-30 13:57:52.000000000","message":"turns out i did not need this specific call anymore..","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b737bafa4a814ed674fcd1392b55683b25fe4687","unresolved":false,"context_lines":[{"line_number":684,"context_line":"            ips_without_snat \u003d set(ips)"},{"line_number":685,"context_line":"            # LOG.info(router)"},{"line_number":686,"context_line":"            for nat in router.nat:"},{"line_number":687,"context_line":"                if nat.type \u003d\u003d \u0027snat\u0027:"},{"line_number":688,"context_line":"                    net \u003d ipaddress.ip_network(nat.logical_ip, strict\u003dFalse)"},{"line_number":689,"context_line":"                    for ip in list(ips_without_snat):"},{"line_number":690,"context_line":"                        if ipaddress.ip_address(ip.split(\u0027/\u0027)[0]) in net:"}],"source_content_type":"text/x-python","patch_set":2,"id":"439b0fb8_603ee69e","line":687,"updated":"2024-01-25 17:14:53.000000000","message":"Will put `snat` in the constants in next patchset.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":676,"context_line":"                      \"cr-lrp matching %s\", ips, gateway_router)"},{"line_number":677,"context_line":"            return"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        if CONF.require_snat_disabled_for_tenant_networks:"},{"line_number":680,"context_line":"            # Check if there is a SNAT entry for this LRP"},{"line_number":681,"context_line":"            router \u003d self.nb_idl.lr_get(\u0027neutron-\u0027 + gateway_router).execute("},{"line_number":682,"context_line":"                check_error\u003dTrue)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            ips_without_snat \u003d set(ips)"},{"line_number":685,"context_line":"            # LOG.info(router)"},{"line_number":686,"context_line":"            for nat in router.nat:"},{"line_number":687,"context_line":"                if nat.type \u003d\u003d \u0027snat\u0027:"},{"line_number":688,"context_line":"                    net \u003d ipaddress.ip_network(nat.logical_ip, strict\u003dFalse)"},{"line_number":689,"context_line":"                    for ip in list(ips_without_snat):"},{"line_number":690,"context_line":"                        if ipaddress.ip_address(ip.split(\u0027/\u0027)[0]) in net:"},{"line_number":691,"context_line":"                            ips_without_snat.discard(ip)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"            if len(ips_without_snat) \u003d\u003d 0:"},{"line_number":694,"context_line":"                LOG.info(\u0027All ips (%s) were removed due to SNAT requirement \u0027"},{"line_number":695,"context_line":"                         \u0027when exposing subnet %s for router %s\u0027, ips,"},{"line_number":696,"context_line":"                         subnet_info[\u0027network\u0027], gateway_router)"},{"line_number":697,"context_line":"                return"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"            if len(set(ips)) !\u003d len(ips_without_snat):"},{"line_number":700,"context_line":"                LOG.info(\u0027When exposing subnet %s for router %s, these ips \u0027"},{"line_number":701,"context_line":"                         \u0027were removed for SNAT: %s\u0027, subnet_info[\u0027network\u0027],"},{"line_number":702,"context_line":"                         gateway_router, set(ips) - ips_without_snat)"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        if not self._expose_router_lsp(ips, subnet_info, cr_lrp_info):"},{"line_number":705,"context_line":"            LOG.debug(\"Something happen while exposing the Subnet CIRDs %s \""}],"source_content_type":"text/x-python","patch_set":2,"id":"d57011f6_b62fb528","line":702,"range":{"start_line":679,"start_character":0,"end_line":702,"end_character":69},"updated":"2024-01-29 10:05:45.000000000","message":"other than filling the \"ips_without_snat\" here, we are not doing anything, just logging that information, right?","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"03723d8feb7c8acf238600f820403bcb2a37ca00","unresolved":false,"context_lines":[{"line_number":676,"context_line":"                      \"cr-lrp matching %s\", ips, gateway_router)"},{"line_number":677,"context_line":"            return"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        if CONF.require_snat_disabled_for_tenant_networks:"},{"line_number":680,"context_line":"            # Check if there is a SNAT entry for this LRP"},{"line_number":681,"context_line":"            router \u003d self.nb_idl.lr_get(\u0027neutron-\u0027 + gateway_router).execute("},{"line_number":682,"context_line":"                check_error\u003dTrue)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            ips_without_snat \u003d set(ips)"},{"line_number":685,"context_line":"            # LOG.info(router)"},{"line_number":686,"context_line":"            for nat in router.nat:"},{"line_number":687,"context_line":"                if nat.type \u003d\u003d \u0027snat\u0027:"},{"line_number":688,"context_line":"                    net \u003d ipaddress.ip_network(nat.logical_ip, strict\u003dFalse)"},{"line_number":689,"context_line":"                    for ip in list(ips_without_snat):"},{"line_number":690,"context_line":"                        if ipaddress.ip_address(ip.split(\u0027/\u0027)[0]) in net:"},{"line_number":691,"context_line":"                            ips_without_snat.discard(ip)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"            if len(ips_without_snat) \u003d\u003d 0:"},{"line_number":694,"context_line":"                LOG.info(\u0027All ips (%s) were removed due to SNAT requirement \u0027"},{"line_number":695,"context_line":"                         \u0027when exposing subnet %s for router %s\u0027, ips,"},{"line_number":696,"context_line":"                         subnet_info[\u0027network\u0027], gateway_router)"},{"line_number":697,"context_line":"                return"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"            if len(set(ips)) !\u003d len(ips_without_snat):"},{"line_number":700,"context_line":"                LOG.info(\u0027When exposing subnet %s for router %s, these ips \u0027"},{"line_number":701,"context_line":"                         \u0027were removed for SNAT: %s\u0027, subnet_info[\u0027network\u0027],"},{"line_number":702,"context_line":"                         gateway_router, set(ips) - ips_without_snat)"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        if not self._expose_router_lsp(ips, subnet_info, cr_lrp_info):"},{"line_number":705,"context_line":"            LOG.debug(\"Something happen while exposing the Subnet CIRDs %s \""}],"source_content_type":"text/x-python","patch_set":2,"id":"0f66bf20_d2ff938b","line":702,"range":{"start_line":679,"start_character":0,"end_line":702,"end_character":69},"in_reply_to":"d3c665fd_4ed4d380","updated":"2024-01-29 16:52:00.000000000","message":"https://review.opendev.org/c/openstack/ovn-bgp-agent/+/907068","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":676,"context_line":"                      \"cr-lrp matching %s\", ips, gateway_router)"},{"line_number":677,"context_line":"            return"},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"        if CONF.require_snat_disabled_for_tenant_networks:"},{"line_number":680,"context_line":"            # Check if there is a SNAT entry for this LRP"},{"line_number":681,"context_line":"            router \u003d self.nb_idl.lr_get(\u0027neutron-\u0027 + gateway_router).execute("},{"line_number":682,"context_line":"                check_error\u003dTrue)"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            ips_without_snat \u003d set(ips)"},{"line_number":685,"context_line":"            # LOG.info(router)"},{"line_number":686,"context_line":"            for nat in router.nat:"},{"line_number":687,"context_line":"                if nat.type \u003d\u003d \u0027snat\u0027:"},{"line_number":688,"context_line":"                    net \u003d ipaddress.ip_network(nat.logical_ip, strict\u003dFalse)"},{"line_number":689,"context_line":"                    for ip in list(ips_without_snat):"},{"line_number":690,"context_line":"                        if ipaddress.ip_address(ip.split(\u0027/\u0027)[0]) in net:"},{"line_number":691,"context_line":"                            ips_without_snat.discard(ip)"},{"line_number":692,"context_line":""},{"line_number":693,"context_line":"            if len(ips_without_snat) \u003d\u003d 0:"},{"line_number":694,"context_line":"                LOG.info(\u0027All ips (%s) were removed due to SNAT requirement \u0027"},{"line_number":695,"context_line":"                         \u0027when exposing subnet %s for router %s\u0027, ips,"},{"line_number":696,"context_line":"                         subnet_info[\u0027network\u0027], gateway_router)"},{"line_number":697,"context_line":"                return"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"            if len(set(ips)) !\u003d len(ips_without_snat):"},{"line_number":700,"context_line":"                LOG.info(\u0027When exposing subnet %s for router %s, these ips \u0027"},{"line_number":701,"context_line":"                         \u0027were removed for SNAT: %s\u0027, subnet_info[\u0027network\u0027],"},{"line_number":702,"context_line":"                         gateway_router, set(ips) - ips_without_snat)"},{"line_number":703,"context_line":""},{"line_number":704,"context_line":"        if not self._expose_router_lsp(ips, subnet_info, cr_lrp_info):"},{"line_number":705,"context_line":"            LOG.debug(\"Something happen while exposing the Subnet CIRDs %s \""}],"source_content_type":"text/x-python","patch_set":2,"id":"d3c665fd_4ed4d380","line":702,"range":{"start_line":679,"start_character":0,"end_line":702,"end_character":69},"in_reply_to":"d57011f6_b62fb528","updated":"2024-01-29 11:12:04.000000000","message":"What we are doing here is starting with all ip\u0027s, and remove them if snat is enabled.\n\nSo eventually we might end up with a empty set, at which point we should return, or continue with a smaller list.\n\nWill create separate change for this as well.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":763,"context_line":"        if not self._expose_tenant_networks:"},{"line_number":764,"context_line":"            return True"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        if CONF.expose_tenant_networks_per_port:"},{"line_number":767,"context_line":"            # Exposure will be done per port, instead of per prefix."},{"line_number":768,"context_line":"            return True"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"        # Fix ips to be the network address, instead of the lrp address"},{"line_number":771,"context_line":"        # so the cleanup will not remove them, since they match what\u0027s"}],"source_content_type":"text/x-python","patch_set":2,"id":"ab1ff134_74351dda","line":768,"range":{"start_line":766,"start_character":0,"end_line":768,"end_character":23},"updated":"2024-01-29 10:05:45.000000000","message":"even if we expose per port we need to expose the router_lsp and add the network route, right?","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"03723d8feb7c8acf238600f820403bcb2a37ca00","unresolved":false,"context_lines":[{"line_number":763,"context_line":"        if not self._expose_tenant_networks:"},{"line_number":764,"context_line":"            return True"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        if CONF.expose_tenant_networks_per_port:"},{"line_number":767,"context_line":"            # Exposure will be done per port, instead of per prefix."},{"line_number":768,"context_line":"            return True"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"        # Fix ips to be the network address, instead of the lrp address"},{"line_number":771,"context_line":"        # so the cleanup will not remove them, since they match what\u0027s"}],"source_content_type":"text/x-python","patch_set":2,"id":"2e362255_df98deeb","line":768,"range":{"start_line":766,"start_character":0,"end_line":768,"end_character":23},"in_reply_to":"68c9e8fb_30faea0e","updated":"2024-01-29 16:52:00.000000000","message":"Lets discuss this in the relevant change https://review.opendev.org/c/openstack/ovn-bgp-agent/+/907057","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":763,"context_line":"        if not self._expose_tenant_networks:"},{"line_number":764,"context_line":"            return True"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        if CONF.expose_tenant_networks_per_port:"},{"line_number":767,"context_line":"            # Exposure will be done per port, instead of per prefix."},{"line_number":768,"context_line":"            return True"},{"line_number":769,"context_line":""},{"line_number":770,"context_line":"        # Fix ips to be the network address, instead of the lrp address"},{"line_number":771,"context_line":"        # so the cleanup will not remove them, since they match what\u0027s"}],"source_content_type":"text/x-python","patch_set":2,"id":"68c9e8fb_30faea0e","line":768,"range":{"start_line":766,"start_character":0,"end_line":768,"end_character":23},"in_reply_to":"ab1ff134_74351dda","updated":"2024-01-29 11:12:04.000000000","message":"Ah yes, since the bgp_nic is only a dummy used for exporting the ip\u0027s on bgp...\n\nThen, how will the route be exported in exposing_method ovn or underlay? What do we need to accomplish to get that done?","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":813,"context_line":"        _, cr_lrp_info \u003d self._get_exposed_ip(lrps[0])"},{"line_number":814,"context_line":"        return cr_lrp_info"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"    def _expose_routed_remote_ip(self, ips, ips_info):"},{"line_number":817,"context_line":"        \u0027\u0027\u0027Expose a ip address from a tenant network behind a router"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        It relies havily on the fact that the router has already been exposed"}],"source_content_type":"text/x-python","patch_set":11,"id":"eded4707_d4cd4dab","line":816,"range":{"start_line":816,"start_character":1,"end_line":816,"end_character":32},"updated":"2024-03-06 14:25:21.000000000","message":"if I\u0027m not mistaken, once the network is exposed, to expose a given IP on a tenant network we only need to add either the ip to the bgp-nic associated to the vrf (host mode) or the route to the specific IP. If subnet is being used, this is already exposed right?\n\nAs this is about just advertisement, not really wiring I would probably call bgp_utils.announce_ips(ips_to_expose), and in there, if EXPOSE_METHOD_VRF do the action to add the ip to the nic/route","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":true,"context_lines":[{"line_number":813,"context_line":"        _, cr_lrp_info \u003d self._get_exposed_ip(lrps[0])"},{"line_number":814,"context_line":"        return cr_lrp_info"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"    def _expose_routed_remote_ip(self, ips, ips_info):"},{"line_number":817,"context_line":"        \u0027\u0027\u0027Expose a ip address from a tenant network behind a router"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        It relies havily on the fact that the router has already been exposed"}],"source_content_type":"text/x-python","patch_set":11,"id":"5cb92b1e_1a0c364d","line":816,"range":{"start_line":816,"start_character":1,"end_line":816,"end_character":32},"in_reply_to":"282adbac_e92391b7","updated":"2024-03-06 18:24:52.000000000","message":"sure thing, i will make an effort to put it in there 😊","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":813,"context_line":"        _, cr_lrp_info \u003d self._get_exposed_ip(lrps[0])"},{"line_number":814,"context_line":"        return cr_lrp_info"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"    def _expose_routed_remote_ip(self, ips, ips_info):"},{"line_number":817,"context_line":"        \u0027\u0027\u0027Expose a ip address from a tenant network behind a router"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        It relies havily on the fact that the router has already been exposed"}],"source_content_type":"text/x-python","patch_set":11,"id":"c2863970_4146ca30","line":816,"range":{"start_line":816,"start_character":1,"end_line":816,"end_character":32},"in_reply_to":"5cb92b1e_1a0c364d","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":813,"context_line":"        _, cr_lrp_info \u003d self._get_exposed_ip(lrps[0])"},{"line_number":814,"context_line":"        return cr_lrp_info"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"    def _expose_routed_remote_ip(self, ips, ips_info):"},{"line_number":817,"context_line":"        \u0027\u0027\u0027Expose a ip address from a tenant network behind a router"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        It relies havily on the fact that the router has already been exposed"}],"source_content_type":"text/x-python","patch_set":11,"id":"282adbac_e92391b7","line":816,"range":{"start_line":816,"start_character":1,"end_line":816,"end_character":32},"in_reply_to":"cdd6c747_3b1fa184","updated":"2024-03-06 16:10:27.000000000","message":"I see. Still I like the split between wiring (i.e., ensuring the traffic once in the host can be redirected to br-ex), and advertisement (i.e., brinding the traffic to the host). So, perhaps we can try to pass extra information to the bgp_utils so that this exposing is being done there","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":813,"context_line":"        _, cr_lrp_info \u003d self._get_exposed_ip(lrps[0])"},{"line_number":814,"context_line":"        return cr_lrp_info"},{"line_number":815,"context_line":""},{"line_number":816,"context_line":"    def _expose_routed_remote_ip(self, ips, ips_info):"},{"line_number":817,"context_line":"        \u0027\u0027\u0027Expose a ip address from a tenant network behind a router"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        It relies havily on the fact that the router has already been exposed"}],"source_content_type":"text/x-python","patch_set":11,"id":"cdd6c747_3b1fa184","line":816,"range":{"start_line":816,"start_character":1,"end_line":816,"end_character":32},"in_reply_to":"eded4707_d4cd4dab","updated":"2024-03-06 15:35:47.000000000","message":"Since i took the approach of kernel routing (without using ip rule and such) i just add the route in the appropriate routing table. Only difference beween host mode and subnet mode, is whether we add a /24 or a /32 entry in it.\n\nSince the method to expose the LRP is going through wiring previously, i decided to re-use the same logic. The reason i do this with a method in the agent, is because i need some dictionaries in the agent, that hold key information abount bridge/vlan combo, which is required to select the proper EVPN bridge class.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":851,"context_line":"            except Exception as e:"},{"line_number":852,"context_line":"                raise exceptions.WireFailure(cidr\u003dip, message\u003dstr(e)) from e"},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def _withdraw_routed_remote_ip(self, ips, ips_info):"},{"line_number":855,"context_line":"        \u0027\u0027\u0027Withdraw a ip address from a tenant network behind a router"},{"line_number":856,"context_line":""},{"line_number":857,"context_line":"        It relies havily on the fact that the router has already been exposed"}],"source_content_type":"text/x-python","patch_set":11,"id":"5e84c0ba_e543bc13","line":854,"range":{"start_line":854,"start_character":0,"end_line":854,"end_character":56},"updated":"2024-03-06 14:25:21.000000000","message":"same here","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":851,"context_line":"            except Exception as e:"},{"line_number":852,"context_line":"                raise exceptions.WireFailure(cidr\u003dip, message\u003dstr(e)) from e"},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def _withdraw_routed_remote_ip(self, ips, ips_info):"},{"line_number":855,"context_line":"        \u0027\u0027\u0027Withdraw a ip address from a tenant network behind a router"},{"line_number":856,"context_line":""},{"line_number":857,"context_line":"        It relies havily on the fact that the router has already been exposed"}],"source_content_type":"text/x-python","patch_set":11,"id":"b4b37cbc_653ddf7d","line":854,"range":{"start_line":854,"start_character":0,"end_line":854,"end_character":56},"in_reply_to":"5e84c0ba_e543bc13","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"}],"ovn_bgp_agent/drivers/openstack/utils/bgp.py":[{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"43a74277c33daa02ff18bc1329b9dc8da4bb9070","unresolved":true,"context_lines":[{"line_number":31,"context_line":"    linux_net.add_ips_to_dev(CONF.bgp_nic, port_ips)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def withdraw_ips(port_ips, bridge_device\u003dNone, bridge_vlan\u003dNone):"},{"line_number":35,"context_line":"    if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:"},{"line_number":36,"context_line":"        return"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"30581c09_f1a0037c","line":34,"updated":"2024-01-24 11:04:08.000000000","message":"ignore this change in args O:)","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b737bafa4a814ed674fcd1392b55683b25fe4687","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    linux_net.add_ips_to_dev(CONF.bgp_nic, port_ips)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def withdraw_ips(port_ips, bridge_device\u003dNone, bridge_vlan\u003dNone):"},{"line_number":35,"context_line":"    if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:"},{"line_number":36,"context_line":"        return"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d0469145_7a837fcf","line":34,"in_reply_to":"30581c09_f1a0037c","updated":"2024-01-25 17:14:53.000000000","message":"Done","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def announce_ips(port_ips, ips_info\u003dNone):"},{"line_number":30,"context_line":"    if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:"},{"line_number":31,"context_line":"        if ips_info is None or ips_info.get(\u0027bridge_device\u0027, None) is None:"},{"line_number":32,"context_line":"            return"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"0ec21c4d_51e44f71","line":30,"range":{"start_line":30,"start_character":4,"end_line":30,"end_character":61},"updated":"2024-05-21 09:46:27.000000000","message":"Nit: Checking if the value is part of a sequence of one item, should be a direct comparison\n\n\u003e if CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_VRF:","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def withdraw_ips(port_ips, ips_info\u003dNone):"},{"line_number":54,"context_line":"    if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:"},{"line_number":55,"context_line":"        if ips_info is None or ips_info.get(\u0027bridge_device\u0027, None) is None:"},{"line_number":56,"context_line":"            return"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"5c7a83bd_df61dd00","line":54,"updated":"2024-05-21 09:46:27.000000000","message":"ditto: Should be a direct comparison \n\n\u003e if CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_VRF:","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"}],"ovn_bgp_agent/drivers/openstack/utils/evpn.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        else:"},{"line_number":279,"context_line":"            method(*a, **kw)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def process_dhcp_opts(self, dhcp_opts):"},{"line_number":282,"context_line":"        # Try to discover the gateway ip\u0027s, so we can configure them"},{"line_number":283,"context_line":"        # on the vrf, and OVN is able to discover them."},{"line_number":284,"context_line":"        for opt in dhcp_opts:"},{"line_number":285,"context_line":"            ver \u003d netaddr.IPNetwork(opt.cidr).version"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c807b9e0_f1cbe3c5","line":283,"range":{"start_line":281,"start_character":0,"end_line":283,"end_character":55},"updated":"2024-01-29 10:05:45.000000000","message":"the problem with this is that we cannot assume dhcp to be enabled on the provider networks, right?","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":278,"context_line":"        else:"},{"line_number":279,"context_line":"            method(*a, **kw)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def process_dhcp_opts(self, dhcp_opts):"},{"line_number":282,"context_line":"        # Try to discover the gateway ip\u0027s, so we can configure them"},{"line_number":283,"context_line":"        # on the vrf, and OVN is able to discover them."},{"line_number":284,"context_line":"        for opt in dhcp_opts:"},{"line_number":285,"context_line":"            ver \u003d netaddr.IPNetwork(opt.cidr).version"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"df2ce333_939737f0","line":283,"range":{"start_line":281,"start_character":0,"end_line":283,"end_character":55},"in_reply_to":"c807b9e0_f1cbe3c5","updated":"2024-01-29 11:12:04.000000000","message":"that is not really a problem to me, the reason it is a separate method, is because it is an optional feature.\n\nOnly if anycast_evpn_gateway_mode is enabled, then we call this function. Because without anycast, you probably don\u0027t want the router ip on the interface, as mac addresses will differ (which might be an issue nonetheless)","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0196f36ce5b93f0e3a37012fe4b35357306e1923","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        else:"},{"line_number":279,"context_line":"            method(*a, **kw)"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"    def process_dhcp_opts(self, dhcp_opts):"},{"line_number":282,"context_line":"        # Try to discover the gateway ip\u0027s, so we can configure them"},{"line_number":283,"context_line":"        # on the vrf, and OVN is able to discover them."},{"line_number":284,"context_line":"        for opt in dhcp_opts:"},{"line_number":285,"context_line":"            ver \u003d netaddr.IPNetwork(opt.cidr).version"},{"line_number":286,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"a8c1bb64_d8b9bd92","line":283,"range":{"start_line":281,"start_character":0,"end_line":283,"end_character":55},"in_reply_to":"df2ce333_939737f0","updated":"2024-02-27 10:37:04.000000000","message":"Done","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        self.vrf_name \u003d constants.OVN_EVPN_VRF_PREFIX + str(vni)"},{"line_number":44,"context_line":"        self.bridge_name \u003d constants.OVN_EVPN_BRIDGE_PREFIX + str(vni)"},{"line_number":45,"context_line":"        self.vxlan_name \u003d constants.OVN_EVPN_VXLAN_PREFIX + str(vni)"},{"line_number":46,"context_line":"        self.local_ip \u003d CONF.evpn_local_ip"},{"line_number":47,"context_line":"        self.evpn_opts \u003d dict("},{"line_number":48,"context_line":"            vni\u003dself.vni,"},{"line_number":49,"context_line":"            local_ip\u003dself.local_ip,"}],"source_content_type":"text/x-python","patch_set":11,"id":"f11d26ef_9263e358","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":42},"updated":"2024-03-06 14:25:21.000000000","message":"we also have this config option CONF.evpn_nic (https://opendev.org/openstack/ovn-bgp-agent/src/branch/master/ovn_bgp_agent/config.py#L91), to take the IP from there if no evpn_local_ip is specified. This was used in the EVPN driver (https://opendev.org/openstack/ovn-bgp-agent/src/branch/master/ovn_bgp_agent/drivers/openstack/ovn_evpn_driver.py#L595), and if none was used, the IP on the loopback was used. So either we mimic that or we make the evpn_nic deprecated","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        self.vrf_name \u003d constants.OVN_EVPN_VRF_PREFIX + str(vni)"},{"line_number":44,"context_line":"        self.bridge_name \u003d constants.OVN_EVPN_BRIDGE_PREFIX + str(vni)"},{"line_number":45,"context_line":"        self.vxlan_name \u003d constants.OVN_EVPN_VXLAN_PREFIX + str(vni)"},{"line_number":46,"context_line":"        self.local_ip \u003d CONF.evpn_local_ip"},{"line_number":47,"context_line":"        self.evpn_opts \u003d dict("},{"line_number":48,"context_line":"            vni\u003dself.vni,"},{"line_number":49,"context_line":"            local_ip\u003dself.local_ip,"}],"source_content_type":"text/x-python","patch_set":11,"id":"2d555272_3d948636","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":42},"in_reply_to":"95ee548c_1a253487","updated":"2024-03-08 14:31:04.000000000","message":"I will leave this as a follow-up","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        self.vrf_name \u003d constants.OVN_EVPN_VRF_PREFIX + str(vni)"},{"line_number":44,"context_line":"        self.bridge_name \u003d constants.OVN_EVPN_BRIDGE_PREFIX + str(vni)"},{"line_number":45,"context_line":"        self.vxlan_name \u003d constants.OVN_EVPN_VXLAN_PREFIX + str(vni)"},{"line_number":46,"context_line":"        self.local_ip \u003d CONF.evpn_local_ip"},{"line_number":47,"context_line":"        self.evpn_opts \u003d dict("},{"line_number":48,"context_line":"            vni\u003dself.vni,"},{"line_number":49,"context_line":"            local_ip\u003dself.local_ip,"}],"source_content_type":"text/x-python","patch_set":11,"id":"95ee548c_1a253487","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":42},"in_reply_to":"eb32da42_5af0655f","updated":"2024-03-06 16:10:27.000000000","message":"I agree... it can be a follow up. I\u0027m also fine deprecating the nic option and having as an option to either past the IP, or use the one at loopback.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":43,"context_line":"        self.vrf_name \u003d constants.OVN_EVPN_VRF_PREFIX + str(vni)"},{"line_number":44,"context_line":"        self.bridge_name \u003d constants.OVN_EVPN_BRIDGE_PREFIX + str(vni)"},{"line_number":45,"context_line":"        self.vxlan_name \u003d constants.OVN_EVPN_VXLAN_PREFIX + str(vni)"},{"line_number":46,"context_line":"        self.local_ip \u003d CONF.evpn_local_ip"},{"line_number":47,"context_line":"        self.evpn_opts \u003d dict("},{"line_number":48,"context_line":"            vni\u003dself.vni,"},{"line_number":49,"context_line":"            local_ip\u003dself.local_ip,"}],"source_content_type":"text/x-python","patch_set":11,"id":"eb32da42_5af0655f","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":42},"in_reply_to":"f11d26ef_9263e358","updated":"2024-03-06 15:35:47.000000000","message":"Maybe we should take a next step, and make a driver_util for this, or a generic util, that takes the CONF values, and is able to return the evpn_local ip, based on the logic you described. (though this could be another patch)","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        self._setup_done \u003d False"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def setup(self):"},{"line_number":64,"context_line":"        if self._setup_done:"},{"line_number":65,"context_line":"            return"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        LOG.debug(\u0027Creating bridge %s\u0027, self.bridge_name)"},{"line_number":68,"context_line":"        linux_net.ensure_bridge(self.bridge_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"d9f628c0_1c9373ff","line":65,"range":{"start_line":64,"start_character":2,"end_line":65,"end_character":18},"updated":"2024-03-06 14:25:21.000000000","message":"what is something got disconnected, don\u0027t we want to reexecute this (on the sync) so that it gets fixed? e.g., if we remove the bridge it will get recreated and reconected","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        self._setup_done \u003d False"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def setup(self):"},{"line_number":64,"context_line":"        if self._setup_done:"},{"line_number":65,"context_line":"            return"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        LOG.debug(\u0027Creating bridge %s\u0027, self.bridge_name)"},{"line_number":68,"context_line":"        linux_net.ensure_bridge(self.bridge_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"80fb775e_2d03c347","line":65,"range":{"start_line":64,"start_character":2,"end_line":65,"end_character":18},"in_reply_to":"0bd5c992_6a925ca8","updated":"2024-03-06 16:10:27.000000000","message":"right... but the reconcile can be configured to not happen that often, and we have seen that it was useful to fix (and hide too) some bugs preventing either exposing or withdrawal of IPs under certain situations","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        self._setup_done \u003d False"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def setup(self):"},{"line_number":64,"context_line":"        if self._setup_done:"},{"line_number":65,"context_line":"            return"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        LOG.debug(\u0027Creating bridge %s\u0027, self.bridge_name)"},{"line_number":68,"context_line":"        linux_net.ensure_bridge(self.bridge_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"23785262_649ccda2","line":65,"range":{"start_line":64,"start_character":2,"end_line":65,"end_character":18},"in_reply_to":"80fb775e_2d03c347","updated":"2024-03-06 18:24:52.000000000","message":"yes, we are running the sync once every hour though, and possibly we will increase the interval even more (in an effort to see if we have some bugs in there...) 😎","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":61,"context_line":"        self._setup_done \u003d False"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def setup(self):"},{"line_number":64,"context_line":"        if self._setup_done:"},{"line_number":65,"context_line":"            return"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        LOG.debug(\u0027Creating bridge %s\u0027, self.bridge_name)"},{"line_number":68,"context_line":"        linux_net.ensure_bridge(self.bridge_name)"}],"source_content_type":"text/x-python","patch_set":11,"id":"0bd5c992_6a925ca8","line":65,"range":{"start_line":64,"start_character":2,"end_line":65,"end_character":18},"in_reply_to":"d9f628c0_1c9373ff","updated":"2024-03-06 15:35:47.000000000","message":"It will get disconnected when the cleanup is executed in the final stage of the sync method. If there are no ip\u0027s announced through the vlan and/or bridge, it will run the disconnect method and remove the vlan interface and/or entire vrf from the system.\n\nOnce it starts announcing the first ip for a specific vlan, it will execute the setup again.\n\nI chose this approach to increase the speed of a announcment, because for me it does not make sense to check if the vrf/vlan is connected for every announcement. One should be able to trust the system it is running on to not delete the vrf and interfaces.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":112,"context_line":"            LOG.info(\u0027Delete device %s\u0027, devname)"},{"line_number":113,"context_line":"            linux_net.delete_device(devname)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        LOG.debug(\u0027Configure FRR VRF (del)\u0027)"},{"line_number":116,"context_line":"        frr.vrf_reconfigure(self.evpn_opts, action\u003d\"del-vrf\")"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self._setup_done \u003d False"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"55ff44f4_8281acd5","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":61},"updated":"2024-03-06 14:25:21.000000000","message":"perhaps better to first remove the advertisement and then disconnect the wiring","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":112,"context_line":"            LOG.info(\u0027Delete device %s\u0027, devname)"},{"line_number":113,"context_line":"            linux_net.delete_device(devname)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        LOG.debug(\u0027Configure FRR VRF (del)\u0027)"},{"line_number":116,"context_line":"        frr.vrf_reconfigure(self.evpn_opts, action\u003d\"del-vrf\")"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self._setup_done \u003d False"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"e0b6724d_edc1b34d","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":61},"in_reply_to":"55ff44f4_8281acd5","updated":"2024-03-06 15:35:47.000000000","message":"Yes, makes sense.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"8a39d6f9e358d77285a621705adebf6d10072daa","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            LOG.info(\u0027Delete device %s\u0027, devname)"},{"line_number":113,"context_line":"            linux_net.delete_device(devname)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        LOG.debug(\u0027Configure FRR VRF (del)\u0027)"},{"line_number":116,"context_line":"        frr.vrf_reconfigure(self.evpn_opts, action\u003d\"del-vrf\")"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self._setup_done \u003d False"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9a2deee4_6d5f38d7","line":116,"range":{"start_line":115,"start_character":0,"end_line":116,"end_character":61},"in_reply_to":"e0b6724d_edc1b34d","updated":"2024-03-08 14:31:04.000000000","message":"Done","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":168,"context_line":"            self._lladdr \u003d linux_net.get_interface_address(self.veth_vrf)"},{"line_number":169,"context_line":"        return self._lladdr"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def setup(self):"},{"line_number":172,"context_line":"        if self._setup_done:"},{"line_number":173,"context_line":"            return"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"904774ed_dc88ec07","line":171,"range":{"start_line":171,"start_character":0,"end_line":171,"end_character":20},"updated":"2024-03-06 14:25:21.000000000","message":"I may have missed it, where is this being called?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":168,"context_line":"            self._lladdr \u003d linux_net.get_interface_address(self.veth_vrf)"},{"line_number":169,"context_line":"        return self._lladdr"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def setup(self):"},{"line_number":172,"context_line":"        if self._setup_done:"},{"line_number":173,"context_line":"            return"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"54e6a346_537d320c","line":171,"range":{"start_line":171,"start_character":0,"end_line":171,"end_character":20},"in_reply_to":"06337f17_ff679022","updated":"2024-03-06 16:10:27.000000000","message":"ohh, ok, I see then why you have _setup_done then. I believe the setup() is better done during the sync rather than for each route, but as it will be skipt, not a big deal","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            self._lladdr \u003d linux_net.get_interface_address(self.veth_vrf)"},{"line_number":169,"context_line":"        return self._lladdr"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def setup(self):"},{"line_number":172,"context_line":"        if self._setup_done:"},{"line_number":173,"context_line":"            return"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"b3fedaf8_9406126e","line":171,"range":{"start_line":171,"start_character":0,"end_line":171,"end_character":20},"in_reply_to":"54e6a346_537d320c","updated":"2024-03-06 18:24:52.000000000","message":"Yeah, for me this works great 😊","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":168,"context_line":"            self._lladdr \u003d linux_net.get_interface_address(self.veth_vrf)"},{"line_number":169,"context_line":"        return self._lladdr"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def setup(self):"},{"line_number":172,"context_line":"        if self._setup_done:"},{"line_number":173,"context_line":"            return"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"06337f17_ff679022","line":171,"range":{"start_line":171,"start_character":0,"end_line":171,"end_character":20},"in_reply_to":"904774ed_dc88ec07","updated":"2024-03-06 15:35:47.000000000","message":"Line 332, when `add_route` method is called.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":25,"context_line":"from ovn_bgp_agent import exceptions"},{"line_number":26,"context_line":"from ovn_bgp_agent.utils import linux_net"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"a8a10c4d_1202982a","line":28,"updated":"2024-04-25 17:34:56.000000000","message":"super nit: Just one empty line between imports and constants :)","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from ovn_bgp_agent import exceptions"},{"line_number":26,"context_line":"from ovn_bgp_agent.utils import linux_net"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"c23537fe_068391f0","line":28,"in_reply_to":"a8a10c4d_1202982a","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class EvpnBridge:"},{"line_number":40,"context_line":"    def __init__(self, ovs_bridge: str, vni: int, evpn_opts: dict,"},{"line_number":41,"context_line":"                 mode\u003dconstants.OVN_EVPN_TYPE_L3, ovs_flows\u003d{}):"},{"line_number":42,"context_line":"        self.ovs_bridge \u003d ovs_bridge"},{"line_number":43,"context_line":"        self.vni \u003d vni"},{"line_number":44,"context_line":"        self.mode \u003d mode"}],"source_content_type":"text/x-python","patch_set":18,"id":"ee373231_43092cfd","line":41,"range":{"start_line":41,"start_character":60,"end_line":41,"end_character":62},"updated":"2024-04-25 17:34:56.000000000","message":"This is a mutable object - it should be set to None and then on L45\n```\n   self.ovs_flows \u003d ovs_flows or {}\n```","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class EvpnBridge:"},{"line_number":40,"context_line":"    def __init__(self, ovs_bridge: str, vni: int, evpn_opts: dict,"},{"line_number":41,"context_line":"                 mode\u003dconstants.OVN_EVPN_TYPE_L3, ovs_flows\u003d{}):"},{"line_number":42,"context_line":"        self.ovs_bridge \u003d ovs_bridge"},{"line_number":43,"context_line":"        self.vni \u003d vni"},{"line_number":44,"context_line":"        self.mode \u003d mode"}],"source_content_type":"text/x-python","patch_set":18,"id":"2bd655c2_9ea9f384","line":41,"range":{"start_line":41,"start_character":60,"end_line":41,"end_character":62},"in_reply_to":"aab68a65_0bf4225d","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class EvpnBridge:"},{"line_number":40,"context_line":"    def __init__(self, ovs_bridge: str, vni: int, evpn_opts: dict,"},{"line_number":41,"context_line":"                 mode\u003dconstants.OVN_EVPN_TYPE_L3, ovs_flows\u003d{}):"},{"line_number":42,"context_line":"        self.ovs_bridge \u003d ovs_bridge"},{"line_number":43,"context_line":"        self.vni \u003d vni"},{"line_number":44,"context_line":"        self.mode \u003d mode"}],"source_content_type":"text/x-python","patch_set":18,"id":"aab68a65_0bf4225d","line":41,"range":{"start_line":41,"start_character":60,"end_line":41,"end_character":62},"in_reply_to":"ee373231_43092cfd","updated":"2024-05-02 09:23:56.000000000","message":"alright, will adapt.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.mode \u003d mode"},{"line_number":45,"context_line":"        self.ovs_flows \u003d ovs_flows"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self.vrf_name \u003d constants.OVN_EVPN_VRF_PREFIX + str(vni)"},{"line_number":48,"context_line":"        self.bridge_name \u003d constants.OVN_EVPN_BRIDGE_PREFIX + str(vni)"},{"line_number":49,"context_line":"        self.vxlan_name \u003d constants.OVN_EVPN_VXLAN_PREFIX + str(vni)"},{"line_number":50,"context_line":"        self.local_ip \u003d CONF.evpn_local_ip"}],"source_content_type":"text/x-python","patch_set":18,"id":"96a47c97_862d5708","line":47,"updated":"2024-04-25 17:34:56.000000000","message":"nit: Better to use formatting like\n```self.vrf_name \u003d \"%s%s\" % (constants.OVN_EVPN_VRF_PREFIX, vni)```","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.mode \u003d mode"},{"line_number":45,"context_line":"        self.ovs_flows \u003d ovs_flows"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self.vrf_name \u003d constants.OVN_EVPN_VRF_PREFIX + str(vni)"},{"line_number":48,"context_line":"        self.bridge_name \u003d constants.OVN_EVPN_BRIDGE_PREFIX + str(vni)"},{"line_number":49,"context_line":"        self.vxlan_name \u003d constants.OVN_EVPN_VXLAN_PREFIX + str(vni)"},{"line_number":50,"context_line":"        self.local_ip \u003d CONF.evpn_local_ip"}],"source_content_type":"text/x-python","patch_set":18,"id":"94a9a876_4e33c9be","line":47,"in_reply_to":"1de7bfde_24ed9cca","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":44,"context_line":"        self.mode \u003d mode"},{"line_number":45,"context_line":"        self.ovs_flows \u003d ovs_flows"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self.vrf_name \u003d constants.OVN_EVPN_VRF_PREFIX + str(vni)"},{"line_number":48,"context_line":"        self.bridge_name \u003d constants.OVN_EVPN_BRIDGE_PREFIX + str(vni)"},{"line_number":49,"context_line":"        self.vxlan_name \u003d constants.OVN_EVPN_VXLAN_PREFIX + str(vni)"},{"line_number":50,"context_line":"        self.local_ip \u003d CONF.evpn_local_ip"}],"source_content_type":"text/x-python","patch_set":18,"id":"1de7bfde_24ed9cca","line":47,"in_reply_to":"96a47c97_862d5708","updated":"2024-05-02 09:23:56.000000000","message":"alright, will adapt.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        )"},{"line_number":57,"context_line":"        self.evpn_opts.update(evpn_opts)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if not self.local_ip:"},{"line_number":60,"context_line":"            LOG.error(\"EVPN device must have an IP associated for the \""},{"line_number":61,"context_line":"                      \"VXLAN local ip\")"},{"line_number":62,"context_line":"            raise exceptions.ConfOptionRequired(option\u003d\u0027evpn_local_ip\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.vlans: dict[str, \u0027VlanDev\u0027] \u003d {}"},{"line_number":65,"context_line":"        self._setup_done \u003d False"}],"source_content_type":"text/x-python","patch_set":18,"id":"d30cd87c_0ec62dae","line":62,"range":{"start_line":59,"start_character":0,"end_line":62,"end_character":71},"updated":"2024-04-25 17:34:56.000000000","message":"I would add this check as the first thing the initializer does","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        )"},{"line_number":57,"context_line":"        self.evpn_opts.update(evpn_opts)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if not self.local_ip:"},{"line_number":60,"context_line":"            LOG.error(\"EVPN device must have an IP associated for the \""},{"line_number":61,"context_line":"                      \"VXLAN local ip\")"},{"line_number":62,"context_line":"            raise exceptions.ConfOptionRequired(option\u003d\u0027evpn_local_ip\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.vlans: dict[str, \u0027VlanDev\u0027] \u003d {}"},{"line_number":65,"context_line":"        self._setup_done \u003d False"}],"source_content_type":"text/x-python","patch_set":18,"id":"ad0a1e70_4b113aa1","line":62,"range":{"start_line":59,"start_character":0,"end_line":62,"end_character":71},"in_reply_to":"672422e8_b6f6cfb4","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":56,"context_line":"        )"},{"line_number":57,"context_line":"        self.evpn_opts.update(evpn_opts)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        if not self.local_ip:"},{"line_number":60,"context_line":"            LOG.error(\"EVPN device must have an IP associated for the \""},{"line_number":61,"context_line":"                      \"VXLAN local ip\")"},{"line_number":62,"context_line":"            raise exceptions.ConfOptionRequired(option\u003d\u0027evpn_local_ip\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        self.vlans: dict[str, \u0027VlanDev\u0027] \u003d {}"},{"line_number":65,"context_line":"        self._setup_done \u003d False"}],"source_content_type":"text/x-python","patch_set":18,"id":"672422e8_b6f6cfb4","line":62,"range":{"start_line":59,"start_character":0,"end_line":62,"end_character":71},"in_reply_to":"d30cd87c_0ec62dae","updated":"2024-05-02 09:23:56.000000000","message":"alright, will adapt.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":468,"context_line":"    if var is None:"},{"line_number":469,"context_line":"        return []"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":"    if not isinstance(var, (list, tuple, set)):"},{"line_number":472,"context_line":"        var \u003d [var]"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"    return var"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"def _find_route_info(routes: \u0027list[dict]\u0027, ip: str):"}],"source_content_type":"text/x-python","patch_set":21,"id":"807b3dde_902c5fea","line":474,"range":{"start_line":471,"start_character":0,"end_line":474,"end_character":14},"updated":"2024-05-21 09:46:27.000000000","message":"nit: Could be a one liner\n\nreturn [var] if not isinstance(var, (list, tuple, set)) else var","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":491,"context_line":"    It will transform the vni to a 6 digit hex, append the 3 digit vlan hex"},{"line_number":492,"context_line":"    and transform it back to a integer."},{"line_number":493,"context_line":"    \u0027\u0027\u0027"},{"line_number":494,"context_line":"    if vni \u003e 16777214:"},{"line_number":495,"context_line":"        LOG.warning(\u0027Configured vni value %d is too big (range 1-16777214)\u0027,"},{"line_number":496,"context_line":"                    vni)"},{"line_number":497,"context_line":"        vni \u003d vni % 0xffffff  # reset vni, to prevent overflow."}],"source_content_type":"text/x-python","patch_set":21,"id":"ad205f35_8dbbd838","line":494,"range":{"start_line":494,"start_character":13,"end_line":494,"end_character":21},"updated":"2024-05-21 09:46:27.000000000","message":"nit: Should be a constant perhaps ?","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":496,"context_line":"                    vni)"},{"line_number":497,"context_line":"        vni \u003d vni % 0xffffff  # reset vni, to prevent overflow."},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    if int(vlan) \u003e 4094:"},{"line_number":500,"context_line":"        LOG.warning(\u0027Configured vlan value %d is too big (range 0-4094)\u0027,"},{"line_number":501,"context_line":"                    int(vlan))"},{"line_number":502,"context_line":"        vlan \u003d int(vlan) % 0xfff  # reset vlan, to prevent overflow."}],"source_content_type":"text/x-python","patch_set":21,"id":"1387aa20_aa6346e4","line":499,"range":{"start_line":499,"start_character":19,"end_line":499,"end_character":23},"updated":"2024-05-21 09:46:27.000000000","message":"ditto","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"}],"ovn_bgp_agent/drivers/openstack/utils/frr.py":[{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"43a74277c33daa02ff18bc1329b9dc8da4bb9070","unresolved":true,"context_lines":[{"line_number":51,"context_line":"  exit-address-family"},{"line_number":52,"context_line":"  address-family ipv6 unicast"},{"line_number":53,"context_line":"    redistribute connected"},{"line_number":54,"context_line":"    redistribute kernel"},{"line_number":55,"context_line":"  exit-address-family"},{"line_number":56,"context_line":"  address-family l2vpn evpn"},{"line_number":57,"context_line":"    advertise ipv4 unicast"}],"source_content_type":"text/x-python","patch_set":1,"id":"d75d3f13_5d5b498f","line":54,"updated":"2024-01-24 11:04:08.000000000","message":"Probably need to make this configurable with evpn_info opts too.","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b737bafa4a814ed674fcd1392b55683b25fe4687","unresolved":false,"context_lines":[{"line_number":51,"context_line":"  exit-address-family"},{"line_number":52,"context_line":"  address-family ipv6 unicast"},{"line_number":53,"context_line":"    redistribute connected"},{"line_number":54,"context_line":"    redistribute kernel"},{"line_number":55,"context_line":"  exit-address-family"},{"line_number":56,"context_line":"  address-family l2vpn evpn"},{"line_number":57,"context_line":"    advertise ipv4 unicast"}],"source_content_type":"text/x-python","patch_set":1,"id":"29865a56_49ab5245","line":54,"in_reply_to":"ca8fe00a_4b5aedd0","updated":"2024-01-25 17:14:53.000000000","message":"I\u0027ve chosen to do it with evpn_info opts, so the exposing_method driver can influence which redistribute opts are required to make it work for that method.","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"3a6369cc0fbce7a4dceb0de5ff51588b5f0effbf","unresolved":true,"context_lines":[{"line_number":51,"context_line":"  exit-address-family"},{"line_number":52,"context_line":"  address-family ipv6 unicast"},{"line_number":53,"context_line":"    redistribute connected"},{"line_number":54,"context_line":"    redistribute kernel"},{"line_number":55,"context_line":"  exit-address-family"},{"line_number":56,"context_line":"  address-family l2vpn evpn"},{"line_number":57,"context_line":"    advertise ipv4 unicast"}],"source_content_type":"text/x-python","patch_set":1,"id":"ca8fe00a_4b5aedd0","line":54,"in_reply_to":"d75d3f13_5d5b498f","updated":"2024-01-25 07:03:42.000000000","message":"or at ovn-bgp-agent level","commit_id":"ac514a55a11f4bd6bc1dc224bd5878501e0efc6e"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"DEL_VRF_TEMPLATE \u003d \u0027\u0027\u0027"},{"line_number":83,"context_line":"no vrf {{ vrf_name }}"},{"line_number":84,"context_line":"no interface veth-{{ vrf_name }}"},{"line_number":85,"context_line":"no router bgp {{ bgp_as }} vrf {{ vrf_name }}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"a82c3297_e4474408","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":32},"updated":"2024-03-06 14:25:21.000000000","message":"will this fail if there is no IPV6 and therefore veth-vrf_name was not added?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"DEL_VRF_TEMPLATE \u003d \u0027\u0027\u0027"},{"line_number":83,"context_line":"no vrf {{ vrf_name }}"},{"line_number":84,"context_line":"no interface veth-{{ vrf_name }}"},{"line_number":85,"context_line":"no router bgp {{ bgp_as }} vrf {{ vrf_name }}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"e006c19d_5a8047bb","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":32},"in_reply_to":"8e27884a_87049e0d","updated":"2024-03-06 16:10:27.000000000","message":"great!","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"DEL_VRF_TEMPLATE \u003d \u0027\u0027\u0027"},{"line_number":83,"context_line":"no vrf {{ vrf_name }}"},{"line_number":84,"context_line":"no interface veth-{{ vrf_name }}"},{"line_number":85,"context_line":"no router bgp {{ bgp_as }} vrf {{ vrf_name }}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"\u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"8e27884a_87049e0d","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":32},"in_reply_to":"a82c3297_e4474408","updated":"2024-03-06 15:35:47.000000000","message":"It shouldn\u0027t, i\u0027ve tested this using vtysh manually and it did not give me an error. I\u0027ve also not had any issues with this so far.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"}],"ovn_bgp_agent/drivers/openstack/utils/ovn.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        lbs \u003d []"},{"line_number":494,"context_line":"        cmd \u003d self.db_find_rows(\u0027Load_Balancer\u0027, (\u0027vips\u0027, \u0027!\u003d\u0027, {}))"},{"line_number":495,"context_line":"        for row in cmd.execute(check_error\u003dTrue):"},{"line_number":496,"context_line":"            if constants.OVN_LB_LR_REF_EXT_ID_KEY not in row.external_ids:"},{"line_number":497,"context_line":"                continue"},{"line_number":498,"context_line":"            if (row.vips and row.external_ids["},{"line_number":499,"context_line":"                    constants.OVN_LB_LR_REF_EXT_ID_KEY].replace("},{"line_number":500,"context_line":"                        \u0027neutron-\u0027, \"\", 1) in local_gateway_ports):"}],"source_content_type":"text/x-python","patch_set":2,"id":"db07ed26_167fc030","line":497,"range":{"start_line":496,"start_character":1,"end_line":497,"end_character":24},"updated":"2024-01-29 10:05:45.000000000","message":"this is also unrelated, probably a typo/bug that should be fixed independely of the L3vni work, right?","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"614161b81352db35023ae1f530a88f384cadbd0f","unresolved":false,"context_lines":[{"line_number":493,"context_line":"        lbs \u003d []"},{"line_number":494,"context_line":"        cmd \u003d self.db_find_rows(\u0027Load_Balancer\u0027, (\u0027vips\u0027, \u0027!\u003d\u0027, {}))"},{"line_number":495,"context_line":"        for row in cmd.execute(check_error\u003dTrue):"},{"line_number":496,"context_line":"            if constants.OVN_LB_LR_REF_EXT_ID_KEY not in row.external_ids:"},{"line_number":497,"context_line":"                continue"},{"line_number":498,"context_line":"            if (row.vips and row.external_ids["},{"line_number":499,"context_line":"                    constants.OVN_LB_LR_REF_EXT_ID_KEY].replace("},{"line_number":500,"context_line":"                        \u0027neutron-\u0027, \"\", 1) in local_gateway_ports):"}],"source_content_type":"text/x-python","patch_set":2,"id":"d1892570_0b394f2b","line":497,"range":{"start_line":496,"start_character":1,"end_line":497,"end_character":24},"in_reply_to":"ad4f6f47_949c70a2","updated":"2024-01-30 13:57:52.000000000","message":"will be fixed (differently) in the port forwarding issue https://review.opendev.org/c/openstack/ovn-bgp-agent/+/905504","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        lbs \u003d []"},{"line_number":494,"context_line":"        cmd \u003d self.db_find_rows(\u0027Load_Balancer\u0027, (\u0027vips\u0027, \u0027!\u003d\u0027, {}))"},{"line_number":495,"context_line":"        for row in cmd.execute(check_error\u003dTrue):"},{"line_number":496,"context_line":"            if constants.OVN_LB_LR_REF_EXT_ID_KEY not in row.external_ids:"},{"line_number":497,"context_line":"                continue"},{"line_number":498,"context_line":"            if (row.vips and row.external_ids["},{"line_number":499,"context_line":"                    constants.OVN_LB_LR_REF_EXT_ID_KEY].replace("},{"line_number":500,"context_line":"                        \u0027neutron-\u0027, \"\", 1) in local_gateway_ports):"}],"source_content_type":"text/x-python","patch_set":2,"id":"ad4f6f47_949c70a2","line":497,"range":{"start_line":496,"start_character":1,"end_line":497,"end_character":24},"in_reply_to":"db07ed26_167fc030","updated":"2024-01-29 11:12:04.000000000","message":"Yes, will create separate issue for it.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"b06f94500936cd23dec7b8f374f62ee56cd0a08d","unresolved":true,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def get_localnet_ports_by_network_name(self, network_name):"},{"line_number":389,"context_line":"        for row in self.get_localnet_ports():"},{"line_number":390,"context_line":"            if (row.tag and row.options and"},{"line_number":391,"context_line":"                    row.options.get(\u0027network_name\u0027) \u003d\u003d network_name):"},{"line_number":392,"context_line":"                yield row"},{"line_number":393,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"97a8d26d_b03fa801","line":390,"updated":"2024-03-19 15:04:09.000000000","message":"if statement should not check on the row.tag here..","commit_id":"84ddb5cc77b9e1c0e86ce4a702d6ad7eee9eee8e"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"65b81e84f526f7812affab269d6ad733d7f823e8","unresolved":false,"context_lines":[{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def get_localnet_ports_by_network_name(self, network_name):"},{"line_number":389,"context_line":"        for row in self.get_localnet_ports():"},{"line_number":390,"context_line":"            if (row.tag and row.options and"},{"line_number":391,"context_line":"                    row.options.get(\u0027network_name\u0027) \u003d\u003d network_name):"},{"line_number":392,"context_line":"                yield row"},{"line_number":393,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"6a610fc7_ade88b86","line":390,"in_reply_to":"97a8d26d_b03fa801","updated":"2024-03-19 15:15:27.000000000","message":"Done","commit_id":"84ddb5cc77b9e1c0e86ce4a702d6ad7eee9eee8e"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":399,"context_line":"                tags.append(row.tag[0])"},{"line_number":400,"context_line":"        return tags"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"    def get_localnet_ports_by_network_name(self, network_name):"},{"line_number":403,"context_line":"        cmd \u003d self.db_find_rows(\u0027Logical_Switch_Port\u0027, (\u0027type\u0027, \u0027\u003d\u0027,"},{"line_number":404,"context_line":"                                constants.OVN_LOCALNET_VIF_PORT_TYPE))"},{"line_number":405,"context_line":"        for row in cmd.execute(check_error\u003dTrue):"},{"line_number":406,"context_line":"            if (row.options and"},{"line_number":407,"context_line":"                    row.options.get(\u0027network_name\u0027) \u003d\u003d network_name):"},{"line_number":408,"context_line":"                yield row"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def get_bgpvpn_networks_for_ports(self, ports,"},{"line_number":411,"context_line":"                                      vpn_type\u003dconstants.OVN_EVPN_TYPE_L3):"},{"line_number":412,"context_line":"        cmd \u003d self.db_find_rows("}],"source_content_type":"text/x-python","patch_set":18,"id":"2ca87765_a1c1591b","line":409,"range":{"start_line":402,"start_character":0,"end_line":409,"end_character":0},"updated":"2024-04-25 17:34:56.000000000","message":"I see the above code does it the same but this is very ineffective and won\u0027t scale with large number of networks. Since we have the network_name, we know what logical switch we are interested in by calling `self.ls_get_localnet_ports(switch_name)`","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":399,"context_line":"                tags.append(row.tag[0])"},{"line_number":400,"context_line":"        return tags"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"    def get_localnet_ports_by_network_name(self, network_name):"},{"line_number":403,"context_line":"        cmd \u003d self.db_find_rows(\u0027Logical_Switch_Port\u0027, (\u0027type\u0027, \u0027\u003d\u0027,"},{"line_number":404,"context_line":"                                constants.OVN_LOCALNET_VIF_PORT_TYPE))"},{"line_number":405,"context_line":"        for row in cmd.execute(check_error\u003dTrue):"},{"line_number":406,"context_line":"            if (row.options and"},{"line_number":407,"context_line":"                    row.options.get(\u0027network_name\u0027) \u003d\u003d network_name):"},{"line_number":408,"context_line":"                yield row"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def get_bgpvpn_networks_for_ports(self, ports,"},{"line_number":411,"context_line":"                                      vpn_type\u003dconstants.OVN_EVPN_TYPE_L3):"},{"line_number":412,"context_line":"        cmd \u003d self.db_find_rows("}],"source_content_type":"text/x-python","patch_set":18,"id":"79d887b5_42a6d61e","line":409,"range":{"start_line":402,"start_character":0,"end_line":409,"end_character":0},"in_reply_to":"24bc97cc_83cdc7b3","updated":"2024-05-02 13:54:52.000000000","message":"Turns out that we do need this method, as the network_name is like \u0027physnet1\u0027, so not a logical switch network name, but the arbitrary provider network name.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":399,"context_line":"                tags.append(row.tag[0])"},{"line_number":400,"context_line":"        return tags"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"    def get_localnet_ports_by_network_name(self, network_name):"},{"line_number":403,"context_line":"        cmd \u003d self.db_find_rows(\u0027Logical_Switch_Port\u0027, (\u0027type\u0027, \u0027\u003d\u0027,"},{"line_number":404,"context_line":"                                constants.OVN_LOCALNET_VIF_PORT_TYPE))"},{"line_number":405,"context_line":"        for row in cmd.execute(check_error\u003dTrue):"},{"line_number":406,"context_line":"            if (row.options and"},{"line_number":407,"context_line":"                    row.options.get(\u0027network_name\u0027) \u003d\u003d network_name):"},{"line_number":408,"context_line":"                yield row"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def get_bgpvpn_networks_for_ports(self, ports,"},{"line_number":411,"context_line":"                                      vpn_type\u003dconstants.OVN_EVPN_TYPE_L3):"},{"line_number":412,"context_line":"        cmd \u003d self.db_find_rows("}],"source_content_type":"text/x-python","patch_set":18,"id":"24bc97cc_83cdc7b3","line":409,"range":{"start_line":402,"start_character":0,"end_line":409,"end_character":0},"in_reply_to":"2ca87765_a1c1591b","updated":"2024-05-02 09:23:56.000000000","message":"good catch, will change it 😊","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"de5e94939fe9d5b90a947e57e25473ba7913eb1c","unresolved":false,"context_lines":[{"line_number":399,"context_line":"                tags.append(row.tag[0])"},{"line_number":400,"context_line":"        return tags"},{"line_number":401,"context_line":""},{"line_number":402,"context_line":"    def get_localnet_ports_by_network_name(self, network_name):"},{"line_number":403,"context_line":"        cmd \u003d self.db_find_rows(\u0027Logical_Switch_Port\u0027, (\u0027type\u0027, \u0027\u003d\u0027,"},{"line_number":404,"context_line":"                                constants.OVN_LOCALNET_VIF_PORT_TYPE))"},{"line_number":405,"context_line":"        for row in cmd.execute(check_error\u003dTrue):"},{"line_number":406,"context_line":"            if (row.options and"},{"line_number":407,"context_line":"                    row.options.get(\u0027network_name\u0027) \u003d\u003d network_name):"},{"line_number":408,"context_line":"                yield row"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    def get_bgpvpn_networks_for_ports(self, ports,"},{"line_number":411,"context_line":"                                      vpn_type\u003dconstants.OVN_EVPN_TYPE_L3):"},{"line_number":412,"context_line":"        cmd \u003d self.db_find_rows("}],"source_content_type":"text/x-python","patch_set":18,"id":"05b7daf2_526628e2","line":409,"range":{"start_line":402,"start_character":0,"end_line":409,"end_character":0},"in_reply_to":"79d887b5_42a6d61e","updated":"2024-05-02 15:15:17.000000000","message":"Now updated to do this filtering in the IDL, as discussed on IRC 😊\n\nsee: https://review.opendev.org/c/openstack/ovn-bgp-agent/+/906505/19..20","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"}],"ovn_bgp_agent/drivers/openstack/utils/ovs.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":129,"context_line":"def remove_extra_ovs_flows(ovs_flows, bridge, cookie):"},{"line_number":130,"context_line":"    expected_flows \u003d []"},{"line_number":131,"context_line":"    for port in ovs_flows[bridge].get(\u0027in_port\u0027):"},{"line_number":132,"context_line":"        pmm \u003d ovs_flows[bridge].get(\u0027port-mac-mapping\u0027, {})"},{"line_number":133,"context_line":"        lladdr \u003d pmm.get(port, ovs_flows[bridge][\u0027mac\u0027])"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        flow \u003d (\"\u003d900,ip,in_port\u003d{} actions\u003dmod_dl_dst:{},NORMAL\".format("},{"line_number":136,"context_line":"            port, lladdr))"},{"line_number":137,"context_line":"        expected_flows.append(flow)"},{"line_number":138,"context_line":"        flow_v6 \u003d (\"\u003d900,ipv6,in_port\u003d{} actions\u003dmod_dl_dst:{},NORMAL\".format("},{"line_number":139,"context_line":"            port, lladdr))"},{"line_number":140,"context_line":"        expected_flows.append(flow_v6)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    cookie_id \u003d \"cookie\u003d{}/-1\".format(cookie)"}],"source_content_type":"text/x-python","patch_set":11,"id":"763a139e_b41b00a0","line":139,"range":{"start_line":132,"start_character":0,"end_line":139,"end_character":26},"updated":"2024-03-06 14:25:21.000000000","message":"this perhaps is unrelated to this patch?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":129,"context_line":"def remove_extra_ovs_flows(ovs_flows, bridge, cookie):"},{"line_number":130,"context_line":"    expected_flows \u003d []"},{"line_number":131,"context_line":"    for port in ovs_flows[bridge].get(\u0027in_port\u0027):"},{"line_number":132,"context_line":"        pmm \u003d ovs_flows[bridge].get(\u0027port-mac-mapping\u0027, {})"},{"line_number":133,"context_line":"        lladdr \u003d pmm.get(port, ovs_flows[bridge][\u0027mac\u0027])"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        flow \u003d (\"\u003d900,ip,in_port\u003d{} actions\u003dmod_dl_dst:{},NORMAL\".format("},{"line_number":136,"context_line":"            port, lladdr))"},{"line_number":137,"context_line":"        expected_flows.append(flow)"},{"line_number":138,"context_line":"        flow_v6 \u003d (\"\u003d900,ipv6,in_port\u003d{} actions\u003dmod_dl_dst:{},NORMAL\".format("},{"line_number":139,"context_line":"            port, lladdr))"},{"line_number":140,"context_line":"        expected_flows.append(flow_v6)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    cookie_id \u003d \"cookie\u003d{}/-1\".format(cookie)"}],"source_content_type":"text/x-python","patch_set":11,"id":"86ee1a5d_53bf5c0f","line":139,"range":{"start_line":132,"start_character":0,"end_line":139,"end_character":26},"in_reply_to":"763a139e_b41b00a0","updated":"2024-03-06 15:35:47.000000000","message":"No, i add this port-mac-mapping in evpn.py#247, because i needed not 1 port per vrf, but more per vrf, and directly wired to the veth-ovs interface.\n\nSince the current logic relied on the mac address of the bridge interface (e.g. br-\u003cvrf\u003e), i had to update this logic a little bit.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":false,"context_lines":[{"line_number":129,"context_line":"def remove_extra_ovs_flows(ovs_flows, bridge, cookie):"},{"line_number":130,"context_line":"    expected_flows \u003d []"},{"line_number":131,"context_line":"    for port in ovs_flows[bridge].get(\u0027in_port\u0027):"},{"line_number":132,"context_line":"        pmm \u003d ovs_flows[bridge].get(\u0027port-mac-mapping\u0027, {})"},{"line_number":133,"context_line":"        lladdr \u003d pmm.get(port, ovs_flows[bridge][\u0027mac\u0027])"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        flow \u003d (\"\u003d900,ip,in_port\u003d{} actions\u003dmod_dl_dst:{},NORMAL\".format("},{"line_number":136,"context_line":"            port, lladdr))"},{"line_number":137,"context_line":"        expected_flows.append(flow)"},{"line_number":138,"context_line":"        flow_v6 \u003d (\"\u003d900,ipv6,in_port\u003d{} actions\u003dmod_dl_dst:{},NORMAL\".format("},{"line_number":139,"context_line":"            port, lladdr))"},{"line_number":140,"context_line":"        expected_flows.append(flow_v6)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    cookie_id \u003d \"cookie\u003d{}/-1\".format(cookie)"}],"source_content_type":"text/x-python","patch_set":11,"id":"f5e1751d_e63aaaf7","line":139,"range":{"start_line":132,"start_character":0,"end_line":139,"end_character":26},"in_reply_to":"86ee1a5d_53bf5c0f","updated":"2024-03-06 16:10:27.000000000","message":"got it","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"}],"ovn_bgp_agent/drivers/openstack/utils/wire.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"d72cd079_e7b40aba","line":125,"range":{"start_line":125,"start_character":20,"end_line":125,"end_character":27},"updated":"2024-03-06 14:25:21.000000000","message":"perhaps just a debug?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f88cf74_26f7dddc","line":125,"range":{"start_line":125,"start_character":20,"end_line":125,"end_character":27},"in_reply_to":"80cb6db2_ef0b8101","updated":"2024-03-06 16:10:27.000000000","message":"fair enough!","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"416de3bc_1f8743c8","line":125,"range":{"start_line":125,"start_character":20,"end_line":125,"end_character":27},"in_reply_to":"9f88cf74_26f7dddc","updated":"2024-03-06 18:24:52.000000000","message":"Acknowledged","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"}],"source_content_type":"text/x-python","patch_set":11,"id":"80cb6db2_ef0b8101","line":125,"range":{"start_line":125,"start_character":20,"end_line":125,"end_character":27},"in_reply_to":"d72cd079_e7b40aba","updated":"2024-03-06 15:35:47.000000000","message":"I went with warning, because as a operator i would want to know what could be wrong with my settings if i misconfigured the network.\n\nIf verbose would be False as well (so no info messages as well), then we probably want to elaborate a bit more with details though.\n\n(i mainly added this log line because it did not work for you the first time 😊)","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"297783ecbff086a92e713cb60ea330a77a7bdb56","unresolved":true,"context_lines":[{"line_number":108,"context_line":"            flows_info[bridge][\u0027in_port\u0027] \u003d ovs.get_ovs_patch_ports_info("},{"line_number":109,"context_line":"                bridge)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"},{"line_number":118,"context_line":"        if not provnets:"},{"line_number":119,"context_line":"            LOG.debug(\u0027- No provider networks found for %s %s\u0027,"},{"line_number":120,"context_line":"                      constants.OVN_EVPN_TYPE_EXT_ID_KEY, mode)"},{"line_number":121,"context_line":"        for ls in provnets:"},{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"},{"line_number":129,"context_line":"            for opt, ext_id_key in constants.EVPN_EXT_ID_MAPPING.items():"},{"line_number":130,"context_line":"                evpn_opts[opt] \u003d literal_eval("},{"line_number":131,"context_line":"                    ls.external_ids.get(ext_id_key, \u0027[]\u0027)"},{"line_number":132,"context_line":"                )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"            # Create or return the EVPN bridge"},{"line_number":135,"context_line":"            evpn_bridge \u003d evpn.setup("},{"line_number":136,"context_line":"                ovs_bridge\u003dbridge,"},{"line_number":137,"context_line":"                vni\u003dls.external_ids[constants.OVN_EVPN_VNI_EXT_ID_KEY],"},{"line_number":138,"context_line":"                evpn_opts\u003devpn_opts,"},{"line_number":139,"context_line":"                mode\u003dmode,"},{"line_number":140,"context_line":"                ovs_flows\u003dflows_info,"},{"line_number":141,"context_line":"            )"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            # Connect all VLAN interfaces to this VRF and gather dhcp"},{"line_number":144,"context_line":"            # options to be configured for l3 mode."},{"line_number":145,"context_line":"            evpn_dev, dhcp_opts \u003d _ensure_evpn_vlan_dev(ls, localnet_ports,"},{"line_number":146,"context_line":"                                                        evpn_bridge,"},{"line_number":147,"context_line":"                                                        flows_info, bridge)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            if dhcp_opts and evpn_dev:"},{"line_number":150,"context_line":"                evpn_dev.process_dhcp_opts(dhcp_opts)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    return ovn_bridge_mappings, flows_info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"079bfbeb_1d61ef76","line":151,"range":{"start_line":111,"start_character":0,"end_line":151,"end_character":2},"updated":"2024-03-06 14:25:21.000000000","message":"interesting, this is done differently for the other drivers, where the main flow is in the nb_ovn_bgp_driver sync function.\n\nDoes the other sync need to be removed/skipped for the evpn case?","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"37717e0ab83243c11a24fdd8e3595a6b2f216ef4","unresolved":true,"context_lines":[{"line_number":108,"context_line":"            flows_info[bridge][\u0027in_port\u0027] \u003d ovs.get_ovs_patch_ports_info("},{"line_number":109,"context_line":"                bridge)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"},{"line_number":118,"context_line":"        if not provnets:"},{"line_number":119,"context_line":"            LOG.debug(\u0027- No provider networks found for %s %s\u0027,"},{"line_number":120,"context_line":"                      constants.OVN_EVPN_TYPE_EXT_ID_KEY, mode)"},{"line_number":121,"context_line":"        for ls in provnets:"},{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"},{"line_number":129,"context_line":"            for opt, ext_id_key in constants.EVPN_EXT_ID_MAPPING.items():"},{"line_number":130,"context_line":"                evpn_opts[opt] \u003d literal_eval("},{"line_number":131,"context_line":"                    ls.external_ids.get(ext_id_key, \u0027[]\u0027)"},{"line_number":132,"context_line":"                )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"            # Create or return the EVPN bridge"},{"line_number":135,"context_line":"            evpn_bridge \u003d evpn.setup("},{"line_number":136,"context_line":"                ovs_bridge\u003dbridge,"},{"line_number":137,"context_line":"                vni\u003dls.external_ids[constants.OVN_EVPN_VNI_EXT_ID_KEY],"},{"line_number":138,"context_line":"                evpn_opts\u003devpn_opts,"},{"line_number":139,"context_line":"                mode\u003dmode,"},{"line_number":140,"context_line":"                ovs_flows\u003dflows_info,"},{"line_number":141,"context_line":"            )"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            # Connect all VLAN interfaces to this VRF and gather dhcp"},{"line_number":144,"context_line":"            # options to be configured for l3 mode."},{"line_number":145,"context_line":"            evpn_dev, dhcp_opts \u003d _ensure_evpn_vlan_dev(ls, localnet_ports,"},{"line_number":146,"context_line":"                                                        evpn_bridge,"},{"line_number":147,"context_line":"                                                        flows_info, bridge)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            if dhcp_opts and evpn_dev:"},{"line_number":150,"context_line":"                evpn_dev.process_dhcp_opts(dhcp_opts)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    return ovn_bridge_mappings, flows_info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"216f07c2_e16c3316","line":151,"range":{"start_line":111,"start_character":0,"end_line":151,"end_character":2},"in_reply_to":"079bfbeb_1d61ef76","updated":"2024-03-06 15:35:47.000000000","message":"What do you mean with this exacly? The frr sync method is not actively doing anything, that sync can be skipped, or be set on a high interval. \n\nWhat i attempted to do here is to make sure the EVPNBridge class and VlanDev class are initialized, so they can do the real initialization of the interfaces, once the add_route method is called.\n\nAnother reason to \u0027lazy-initialize\u0027 the interfaces, is that we now have the chance to add a real router address as first ip on the veth-vrf-* interface, which makes linux use that ip show up in the traceroute/mtr instead of the APIPA address.\nThis because we can process the dhcp options and add the appropriate actions required, after we\u0027ve initialized the class.","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"35675eb85a9db2f39cabf3cc3344517df1f8d868","unresolved":true,"context_lines":[{"line_number":108,"context_line":"            flows_info[bridge][\u0027in_port\u0027] \u003d ovs.get_ovs_patch_ports_info("},{"line_number":109,"context_line":"                bridge)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"},{"line_number":118,"context_line":"        if not provnets:"},{"line_number":119,"context_line":"            LOG.debug(\u0027- No provider networks found for %s %s\u0027,"},{"line_number":120,"context_line":"                      constants.OVN_EVPN_TYPE_EXT_ID_KEY, mode)"},{"line_number":121,"context_line":"        for ls in provnets:"},{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"},{"line_number":129,"context_line":"            for opt, ext_id_key in constants.EVPN_EXT_ID_MAPPING.items():"},{"line_number":130,"context_line":"                evpn_opts[opt] \u003d literal_eval("},{"line_number":131,"context_line":"                    ls.external_ids.get(ext_id_key, \u0027[]\u0027)"},{"line_number":132,"context_line":"                )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"            # Create or return the EVPN bridge"},{"line_number":135,"context_line":"            evpn_bridge \u003d evpn.setup("},{"line_number":136,"context_line":"                ovs_bridge\u003dbridge,"},{"line_number":137,"context_line":"                vni\u003dls.external_ids[constants.OVN_EVPN_VNI_EXT_ID_KEY],"},{"line_number":138,"context_line":"                evpn_opts\u003devpn_opts,"},{"line_number":139,"context_line":"                mode\u003dmode,"},{"line_number":140,"context_line":"                ovs_flows\u003dflows_info,"},{"line_number":141,"context_line":"            )"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            # Connect all VLAN interfaces to this VRF and gather dhcp"},{"line_number":144,"context_line":"            # options to be configured for l3 mode."},{"line_number":145,"context_line":"            evpn_dev, dhcp_opts \u003d _ensure_evpn_vlan_dev(ls, localnet_ports,"},{"line_number":146,"context_line":"                                                        evpn_bridge,"},{"line_number":147,"context_line":"                                                        flows_info, bridge)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            if dhcp_opts and evpn_dev:"},{"line_number":150,"context_line":"                evpn_dev.process_dhcp_opts(dhcp_opts)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    return ovn_bridge_mappings, flows_info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"c47ac31c_8335447d","line":151,"range":{"start_line":111,"start_character":0,"end_line":151,"end_character":2},"in_reply_to":"216f07c2_e16c3316","updated":"2024-03-06 16:10:27.000000000","message":"I meant the sync function (not the frr_sync), but as you are not doing the setup here but on the expose route... I see the difference now","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"01f2a8a9d6df0379876ea3105a78a1044c40f85c","unresolved":false,"context_lines":[{"line_number":108,"context_line":"            flows_info[bridge][\u0027in_port\u0027] \u003d ovs.get_ovs_patch_ports_info("},{"line_number":109,"context_line":"                bridge)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"},{"line_number":118,"context_line":"        if not provnets:"},{"line_number":119,"context_line":"            LOG.debug(\u0027- No provider networks found for %s %s\u0027,"},{"line_number":120,"context_line":"                      constants.OVN_EVPN_TYPE_EXT_ID_KEY, mode)"},{"line_number":121,"context_line":"        for ls in provnets:"},{"line_number":122,"context_line":"            LOG.info(\u0027Network %s (settings: %s)\u0027, ls.name, ls.external_ids)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"            if constants.OVN_EVPN_VNI_EXT_ID_KEY not in ls.external_ids:"},{"line_number":125,"context_line":"                LOG.warning(\u0027- Skipped, VNI required for EVPN VRF setup\u0027)"},{"line_number":126,"context_line":"                continue"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"            evpn_opts \u003d {}"},{"line_number":129,"context_line":"            for opt, ext_id_key in constants.EVPN_EXT_ID_MAPPING.items():"},{"line_number":130,"context_line":"                evpn_opts[opt] \u003d literal_eval("},{"line_number":131,"context_line":"                    ls.external_ids.get(ext_id_key, \u0027[]\u0027)"},{"line_number":132,"context_line":"                )"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"            # Create or return the EVPN bridge"},{"line_number":135,"context_line":"            evpn_bridge \u003d evpn.setup("},{"line_number":136,"context_line":"                ovs_bridge\u003dbridge,"},{"line_number":137,"context_line":"                vni\u003dls.external_ids[constants.OVN_EVPN_VNI_EXT_ID_KEY],"},{"line_number":138,"context_line":"                evpn_opts\u003devpn_opts,"},{"line_number":139,"context_line":"                mode\u003dmode,"},{"line_number":140,"context_line":"                ovs_flows\u003dflows_info,"},{"line_number":141,"context_line":"            )"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"            # Connect all VLAN interfaces to this VRF and gather dhcp"},{"line_number":144,"context_line":"            # options to be configured for l3 mode."},{"line_number":145,"context_line":"            evpn_dev, dhcp_opts \u003d _ensure_evpn_vlan_dev(ls, localnet_ports,"},{"line_number":146,"context_line":"                                                        evpn_bridge,"},{"line_number":147,"context_line":"                                                        flows_info, bridge)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"            if dhcp_opts and evpn_dev:"},{"line_number":150,"context_line":"                evpn_dev.process_dhcp_opts(dhcp_opts)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    return ovn_bridge_mappings, flows_info"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"43a42a9d_d03813f7","line":151,"range":{"start_line":111,"start_character":0,"end_line":151,"end_character":2},"in_reply_to":"c47ac31c_8335447d","updated":"2024-03-06 18:24:52.000000000","message":"Yeah, it is not necessarily better, just different. With the bonus of being able to add config afterwards that you can use when initializing the interfaces 😊","commit_id":"57d39d2a4fb4c79b3fb15c9a48ec5aa15155d29a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import ipaddress"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ast import literal_eval"},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"996ffabe_ff0f5ac4","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":28},"updated":"2024-04-25 17:34:56.000000000","message":"The import should be in the previous group of modules as `ast` is a standard library. It also should import the whole module and not just the function as per the guidelines (wondering why pep8 doesn\u0027t fail here).\n\nhttps://docs.openstack.org/hacking/latest/user/hacking.html#imports","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import ipaddress"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ast import literal_eval"},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"467b7c04_044a233a","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":28},"in_reply_to":"6d43d47b_fe03d4e6","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import ipaddress"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from ast import literal_eval"},{"line_number":18,"context_line":"from oslo_config import cfg"},{"line_number":19,"context_line":"from oslo_log import log as logging"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"6d43d47b_fe03d4e6","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":28},"in_reply_to":"996ffabe_ff0f5ac4","updated":"2024-05-02 09:23:56.000000000","message":"alright, will adapt.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":35,"context_line":"    if CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_UNDERLAY:"},{"line_number":36,"context_line":"        return _ensure_base_wiring_config_underlay(idl, ovs_idl,"},{"line_number":37,"context_line":"                                                   routing_tables)"},{"line_number":38,"context_line":"    if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:  # Type 5 evpn"},{"line_number":39,"context_line":"        return _ensure_base_wiring_config_evpn(idl, ovs_idl)"},{"line_number":40,"context_line":"    elif CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_OVN:"},{"line_number":41,"context_line":"        return _ensure_base_wiring_config_ovn(ovs_idl, ovn_idl)"}],"source_content_type":"text/x-python","patch_set":18,"id":"cb22baae_0a83bd3e","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":61},"updated":"2024-04-25 17:34:56.000000000","message":"why is this not checking the exact method like the others?\n```\n   elif CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_VRF:\n```","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":35,"context_line":"    if CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_UNDERLAY:"},{"line_number":36,"context_line":"        return _ensure_base_wiring_config_underlay(idl, ovs_idl,"},{"line_number":37,"context_line":"                                                   routing_tables)"},{"line_number":38,"context_line":"    if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:  # Type 5 evpn"},{"line_number":39,"context_line":"        return _ensure_base_wiring_config_evpn(idl, ovs_idl)"},{"line_number":40,"context_line":"    elif CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_OVN:"},{"line_number":41,"context_line":"        return _ensure_base_wiring_config_ovn(ovs_idl, ovn_idl)"}],"source_content_type":"text/x-python","patch_set":18,"id":"f375bca6_09936f03","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":61},"in_reply_to":"cb22baae_0a83bd3e","updated":"2024-05-02 09:23:56.000000000","message":"my bad, in the poc we had running earlier, i also included EXPOSE_METHOD_EVPN as an option, but later i learned this was more suitable for l2vpn instead of l3vpn. \n\nI will adapt it as exact check makes more sense now (and changing it later will cause the line to marked as a change anyway)","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    if CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_UNDERLAY:"},{"line_number":36,"context_line":"        return _ensure_base_wiring_config_underlay(idl, ovs_idl,"},{"line_number":37,"context_line":"                                                   routing_tables)"},{"line_number":38,"context_line":"    if CONF.exposing_method in [constants.EXPOSE_METHOD_VRF]:  # Type 5 evpn"},{"line_number":39,"context_line":"        return _ensure_base_wiring_config_evpn(idl, ovs_idl)"},{"line_number":40,"context_line":"    elif CONF.exposing_method \u003d\u003d constants.EXPOSE_METHOD_OVN:"},{"line_number":41,"context_line":"        return _ensure_base_wiring_config_ovn(ovs_idl, ovn_idl)"}],"source_content_type":"text/x-python","patch_set":18,"id":"68387736_fe4c5d43","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":61},"in_reply_to":"f375bca6_09936f03","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    ovn_bridge_mappings \u003d {}"},{"line_number":89,"context_line":"    flows_info \u003d {}  # dictionary to use for mappings with vrf\u0027s"},{"line_number":90,"context_line":"    for _, bridge_mapping in enumerate(bridge_mappings, 1):"},{"line_number":91,"context_line":"        network \u003d bridge_mapping.split(\":\")[0]"},{"line_number":92,"context_line":"        if not network:"},{"line_number":93,"context_line":"            LOG.debug(\u0027Invalid bridge mapping: %s\u0027, bridge_mapping)"}],"source_content_type":"text/x-python","patch_set":18,"id":"7f97a678_29e799ca","line":90,"updated":"2024-04-25 17:34:56.000000000","message":"Why do we need to enumerate here?","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    ovn_bridge_mappings \u003d {}"},{"line_number":89,"context_line":"    flows_info \u003d {}  # dictionary to use for mappings with vrf\u0027s"},{"line_number":90,"context_line":"    for _, bridge_mapping in enumerate(bridge_mappings, 1):"},{"line_number":91,"context_line":"        network \u003d bridge_mapping.split(\":\")[0]"},{"line_number":92,"context_line":"        if not network:"},{"line_number":93,"context_line":"            LOG.debug(\u0027Invalid bridge mapping: %s\u0027, bridge_mapping)"}],"source_content_type":"text/x-python","patch_set":18,"id":"85ce446e_92c10635","line":90,"in_reply_to":"377b9e78_29691d31","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    ovn_bridge_mappings \u003d {}"},{"line_number":89,"context_line":"    flows_info \u003d {}  # dictionary to use for mappings with vrf\u0027s"},{"line_number":90,"context_line":"    for _, bridge_mapping in enumerate(bridge_mappings, 1):"},{"line_number":91,"context_line":"        network \u003d bridge_mapping.split(\":\")[0]"},{"line_number":92,"context_line":"        if not network:"},{"line_number":93,"context_line":"            LOG.debug(\u0027Invalid bridge mapping: %s\u0027, bridge_mapping)"}],"source_content_type":"text/x-python","patch_set":18,"id":"377b9e78_29691d31","line":90,"in_reply_to":"7f97a678_29e799ca","updated":"2024-05-02 09:23:56.000000000","message":"in all honesty, i copied that part from `_ensure_base_wiring_config_underlay`, so i will check if it can be done without enumerate...","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":88,"context_line":"    ovn_bridge_mappings \u003d {}"},{"line_number":89,"context_line":"    flows_info \u003d {}  # dictionary to use for mappings with vrf\u0027s"},{"line_number":90,"context_line":"    for _, bridge_mapping in enumerate(bridge_mappings, 1):"},{"line_number":91,"context_line":"        network \u003d bridge_mapping.split(\":\")[0]"},{"line_number":92,"context_line":"        if not network:"},{"line_number":93,"context_line":"            LOG.debug(\u0027Invalid bridge mapping: %s\u0027, bridge_mapping)"},{"line_number":94,"context_line":"            continue"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        bridge \u003d bridge_mapping.split(\":\")[1]"},{"line_number":97,"context_line":"        ovn_bridge_mappings[network] \u003d bridge"},{"line_number":98,"context_line":"        LOG.debug(\u0027Setup EVPN base wiring for network %s on bridge %s\u0027,"},{"line_number":99,"context_line":"                  network, bridge)"}],"source_content_type":"text/x-python","patch_set":18,"id":"72000e80_a3653d55","line":96,"range":{"start_line":91,"start_character":0,"end_line":96,"end_character":45},"updated":"2024-04-25 17:34:56.000000000","message":"```\ntry:\n    network, bridge \u003d bridge_mapping.split(\":\")\nexcept ValueError:\n    LOG.debug(...)\n    continue\n```","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    ovn_bridge_mappings \u003d {}"},{"line_number":89,"context_line":"    flows_info \u003d {}  # dictionary to use for mappings with vrf\u0027s"},{"line_number":90,"context_line":"    for _, bridge_mapping in enumerate(bridge_mappings, 1):"},{"line_number":91,"context_line":"        network \u003d bridge_mapping.split(\":\")[0]"},{"line_number":92,"context_line":"        if not network:"},{"line_number":93,"context_line":"            LOG.debug(\u0027Invalid bridge mapping: %s\u0027, bridge_mapping)"},{"line_number":94,"context_line":"            continue"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        bridge \u003d bridge_mapping.split(\":\")[1]"},{"line_number":97,"context_line":"        ovn_bridge_mappings[network] \u003d bridge"},{"line_number":98,"context_line":"        LOG.debug(\u0027Setup EVPN base wiring for network %s on bridge %s\u0027,"},{"line_number":99,"context_line":"                  network, bridge)"}],"source_content_type":"text/x-python","patch_set":18,"id":"a0e233b4_1bbd9295","line":96,"range":{"start_line":91,"start_character":0,"end_line":96,"end_character":45},"in_reply_to":"567381c3_71bd319d","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":88,"context_line":"    ovn_bridge_mappings \u003d {}"},{"line_number":89,"context_line":"    flows_info \u003d {}  # dictionary to use for mappings with vrf\u0027s"},{"line_number":90,"context_line":"    for _, bridge_mapping in enumerate(bridge_mappings, 1):"},{"line_number":91,"context_line":"        network \u003d bridge_mapping.split(\":\")[0]"},{"line_number":92,"context_line":"        if not network:"},{"line_number":93,"context_line":"            LOG.debug(\u0027Invalid bridge mapping: %s\u0027, bridge_mapping)"},{"line_number":94,"context_line":"            continue"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        bridge \u003d bridge_mapping.split(\":\")[1]"},{"line_number":97,"context_line":"        ovn_bridge_mappings[network] \u003d bridge"},{"line_number":98,"context_line":"        LOG.debug(\u0027Setup EVPN base wiring for network %s on bridge %s\u0027,"},{"line_number":99,"context_line":"                  network, bridge)"}],"source_content_type":"text/x-python","patch_set":18,"id":"567381c3_71bd319d","line":96,"range":{"start_line":91,"start_character":0,"end_line":96,"end_character":45},"in_reply_to":"72000e80_a3653d55","updated":"2024-05-02 09:23:56.000000000","message":"ok.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":98,"context_line":"        LOG.debug(\u0027Setup EVPN base wiring for network %s on bridge %s\u0027,"},{"line_number":99,"context_line":"                  network, bridge)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"}],"source_content_type":"text/x-python","patch_set":18,"id":"76417c31_796c9c4e","line":101,"updated":"2024-04-25 17:34:56.000000000","message":"Can we use ovs_idl instead?\n`ovs_idl.idl_ovs.add_br(bridge)`","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":98,"context_line":"        LOG.debug(\u0027Setup EVPN base wiring for network %s on bridge %s\u0027,"},{"line_number":99,"context_line":"                  network, bridge)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"}],"source_content_type":"text/x-python","patch_set":18,"id":"c2b8c71a_97c2abd0","line":101,"in_reply_to":"76417c31_796c9c4e","updated":"2024-05-02 09:23:56.000000000","message":"definitely, will adapt it.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        LOG.debug(\u0027Setup EVPN base wiring for network %s on bridge %s\u0027,"},{"line_number":99,"context_line":"                  network, bridge)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"}],"source_content_type":"text/x-python","patch_set":18,"id":"971df8ea_f552fd31","line":101,"in_reply_to":"c2b8c71a_97c2abd0","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"},{"line_number":105,"context_line":"            flows_info[bridge] \u003d {\u0027mac\u0027: mac,"},{"line_number":106,"context_line":"                                  \u0027in_port\u0027: set(),"}],"source_content_type":"text/x-python","patch_set":18,"id":"8675414b_3096777a","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":38},"updated":"2024-04-25 17:34:56.000000000","message":"`if bridge not in flows_info`:","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"},{"line_number":105,"context_line":"            flows_info[bridge] \u003d {\u0027mac\u0027: mac,"},{"line_number":106,"context_line":"                                  \u0027in_port\u0027: set(),"}],"source_content_type":"text/x-python","patch_set":18,"id":"fbe8f498_df4ac287","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":38},"in_reply_to":"8675414b_3096777a","updated":"2024-05-02 09:23:56.000000000","message":"sure, np, will change it.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"},{"line_number":105,"context_line":"            flows_info[bridge] \u003d {\u0027mac\u0027: mac,"},{"line_number":106,"context_line":"                                  \u0027in_port\u0027: set(),"}],"source_content_type":"text/x-python","patch_set":18,"id":"63dd5217_a5af5169","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":38},"in_reply_to":"fbe8f498_df4ac287","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"},{"line_number":105,"context_line":"            flows_info[bridge] \u003d {\u0027mac\u0027: mac,"},{"line_number":106,"context_line":"                                  \u0027in_port\u0027: set(),"},{"line_number":107,"context_line":"                                  \u0027evpn\u0027: {}}"},{"line_number":108,"context_line":"            flows_info[bridge][\u0027in_port\u0027] \u003d ovs.get_ovs_patch_ports_info("},{"line_number":109,"context_line":"                bridge)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"}],"source_content_type":"text/x-python","patch_set":18,"id":"a541fedf_8f14f0fa","line":109,"range":{"start_line":104,"start_character":0,"end_line":109,"end_character":23},"updated":"2024-04-25 17:34:56.000000000","message":"Maybe it could be done with a single assignment?\n```\nflows_info[bridge] \u003d {\n    \u0027mac\u0027: linux_net.get_interface_address(bridge),\n    \u0027in_port\u0027: ovs.get_ovs_patch_ports_info(bridge),\n    \u0027evpn\u0027: {},\n}\n```","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        ovs.ensure_bridge_exists(bridge)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if not flows_info.get(bridge):"},{"line_number":104,"context_line":"            mac \u003d linux_net.get_interface_address(bridge)"},{"line_number":105,"context_line":"            flows_info[bridge] \u003d {\u0027mac\u0027: mac,"},{"line_number":106,"context_line":"                                  \u0027in_port\u0027: set(),"},{"line_number":107,"context_line":"                                  \u0027evpn\u0027: {}}"},{"line_number":108,"context_line":"            flows_info[bridge][\u0027in_port\u0027] \u003d ovs.get_ovs_patch_ports_info("},{"line_number":109,"context_line":"                bridge)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"}],"source_content_type":"text/x-python","patch_set":18,"id":"02246b4a_729be92b","line":109,"range":{"start_line":104,"start_character":0,"end_line":109,"end_character":23},"in_reply_to":"a541fedf_8f14f0fa","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"}],"source_content_type":"text/x-python","patch_set":18,"id":"8d7c8402_3cbf34cb","line":114,"range":{"start_line":114,"start_character":23,"end_line":114,"end_character":25},"updated":"2024-04-25 17:34:56.000000000","message":"Why is there the leading dash?","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"}],"source_content_type":"text/x-python","patch_set":18,"id":"2fad1e06_12cef9ba","line":114,"range":{"start_line":114,"start_character":23,"end_line":114,"end_character":25},"in_reply_to":"5c836363_944bfc47","updated":"2024-05-14 12:25:18.000000000","message":"ok, removed them.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"}],"source_content_type":"text/x-python","patch_set":18,"id":"ebf6ef7e_5e847075","line":114,"range":{"start_line":114,"start_character":23,"end_line":114,"end_character":25},"in_reply_to":"8d7c8402_3cbf34cb","updated":"2024-05-02 09:23:56.000000000","message":"i use this sometimes to make it easier to read the logs, as the log line directly applies to the last logline without the leading dash.\n\nI can remove it if it\u0027s not desired.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4585a635fbefa3f19eff0008b320e376f0ebe5d9","unresolved":true,"context_lines":[{"line_number":111,"context_line":"        # Find all provider networks, and create the vrf\u0027s"},{"line_number":112,"context_line":"        localnet_ports \u003d list(idl.get_localnet_ports_by_network_name(network))"},{"line_number":113,"context_line":"        if not localnet_ports:"},{"line_number":114,"context_line":"            LOG.debug(\u0027- No localnet ports found for network %s\u0027, network)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        provnets \u003d idl.get_bgpvpn_networks_for_ports(localnet_ports,"},{"line_number":117,"context_line":"                                                     vpn_type\u003dmode)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5c836363_944bfc47","line":114,"range":{"start_line":114,"start_character":23,"end_line":114,"end_character":25},"in_reply_to":"ebf6ef7e_5e847075","updated":"2024-05-13 11:51:03.000000000","message":"yep, lets remove it to keep it consistent with the rest","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":538,"context_line":""},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"def _cleanup_wiring_evpn(ovs_flows, routing_tables_routes):"},{"line_number":541,"context_line":"    for _, flow_conf in ovs_flows.items():"},{"line_number":542,"context_line":"        for vlan, evpn_bridge in flow_conf.get(\u0027evpn\u0027, {}).items():"},{"line_number":543,"context_line":"            LOG.debug(\u0027Running cleanup for vrf %s vlan %s\u0027,"},{"line_number":544,"context_line":"                      evpn_bridge.vrf_name, vlan)"}],"source_content_type":"text/x-python","patch_set":18,"id":"209da661_53b0bc33","line":541,"range":{"start_line":541,"start_character":34,"end_line":541,"end_character":39},"updated":"2024-04-25 17:34:56.000000000","message":"`values()`","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":538,"context_line":""},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"def _cleanup_wiring_evpn(ovs_flows, routing_tables_routes):"},{"line_number":541,"context_line":"    for _, flow_conf in ovs_flows.items():"},{"line_number":542,"context_line":"        for vlan, evpn_bridge in flow_conf.get(\u0027evpn\u0027, {}).items():"},{"line_number":543,"context_line":"            LOG.debug(\u0027Running cleanup for vrf %s vlan %s\u0027,"},{"line_number":544,"context_line":"                      evpn_bridge.vrf_name, vlan)"}],"source_content_type":"text/x-python","patch_set":18,"id":"f7400bd9_c1515871","line":541,"range":{"start_line":541,"start_character":34,"end_line":541,"end_character":39},"in_reply_to":"209da661_53b0bc33","updated":"2024-05-02 09:23:56.000000000","message":"ack","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":538,"context_line":""},{"line_number":539,"context_line":""},{"line_number":540,"context_line":"def _cleanup_wiring_evpn(ovs_flows, routing_tables_routes):"},{"line_number":541,"context_line":"    for _, flow_conf in ovs_flows.items():"},{"line_number":542,"context_line":"        for vlan, evpn_bridge in flow_conf.get(\u0027evpn\u0027, {}).items():"},{"line_number":543,"context_line":"            LOG.debug(\u0027Running cleanup for vrf %s vlan %s\u0027,"},{"line_number":544,"context_line":"                      evpn_bridge.vrf_name, vlan)"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f244104_b651fbea","line":541,"range":{"start_line":541,"start_character":34,"end_line":541,"end_character":39},"in_reply_to":"f7400bd9_c1515871","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":801,"context_line":"        LOG.error(msg, bridge_device, bridge_vlan)"},{"line_number":802,"context_line":"        return"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    ver \u003d ipaddress.ip_address(ip.split(\u0027/\u0027)[0]).version"},{"line_number":805,"context_line":"    evpn_dev.add_route(routing_tables_routes, ip, None, via\u003dvia.get(ver))"},{"line_number":806,"context_line":"    return True"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"be926493_64a62050","line":804,"range":{"start_line":804,"start_character":0,"end_line":804,"end_character":56},"updated":"2024-04-25 17:34:56.000000000","message":"`ver \u003d linux_net.get_ip_version(ip)`","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":801,"context_line":"        LOG.error(msg, bridge_device, bridge_vlan)"},{"line_number":802,"context_line":"        return"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    ver \u003d ipaddress.ip_address(ip.split(\u0027/\u0027)[0]).version"},{"line_number":805,"context_line":"    evpn_dev.add_route(routing_tables_routes, ip, None, via\u003dvia.get(ver))"},{"line_number":806,"context_line":"    return True"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"0e808621_d2bc2ab5","line":804,"range":{"start_line":804,"start_character":0,"end_line":804,"end_character":56},"in_reply_to":"1c369619_0c2db593","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":801,"context_line":"        LOG.error(msg, bridge_device, bridge_vlan)"},{"line_number":802,"context_line":"        return"},{"line_number":803,"context_line":""},{"line_number":804,"context_line":"    ver \u003d ipaddress.ip_address(ip.split(\u0027/\u0027)[0]).version"},{"line_number":805,"context_line":"    evpn_dev.add_route(routing_tables_routes, ip, None, via\u003dvia.get(ver))"},{"line_number":806,"context_line":"    return True"},{"line_number":807,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"1c369619_0c2db593","line":804,"range":{"start_line":804,"start_character":0,"end_line":804,"end_character":56},"in_reply_to":"be926493_64a62050","updated":"2024-05-02 09:23:56.000000000","message":"that works too, will change it.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4585a635fbefa3f19eff0008b320e376f0ebe5d9","unresolved":true,"context_lines":[{"line_number":650,"context_line":"        evpn_dev \u003d evpn.lookup_vlan(bridge_device, bridge_vlan)"},{"line_number":651,"context_line":"    except KeyError:"},{"line_number":652,"context_line":"        msg \u003d \u0027EVPN has not been setup for bridge %s with vlan device %s\u0027"},{"line_number":653,"context_line":"        LOG.error(msg, bridge_device, bridge_vlan)"},{"line_number":654,"context_line":"        return"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    via \u003d via or {}  # make sure it is at least a empty dictionary"}],"source_content_type":"text/x-python","patch_set":20,"id":"4e6f6b10_a8230012","line":653,"range":{"start_line":653,"start_character":7,"end_line":653,"end_character":50},"updated":"2024-05-13 11:51:03.000000000","message":"I\u0027m getting this on a fresh environment before I\u0027m adding the inputs on the external_ids. That is a bit misleading as it seems as if there was an error, while in practice is just that we have not (yet) added any VNI information to expose it (rather than the vlan device being none). Perhaps this needs to simply be a warning or at least differentiate between the cases.","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        evpn_dev \u003d evpn.lookup_vlan(bridge_device, bridge_vlan)"},{"line_number":651,"context_line":"    except KeyError:"},{"line_number":652,"context_line":"        msg \u003d \u0027EVPN has not been setup for bridge %s with vlan device %s\u0027"},{"line_number":653,"context_line":"        LOG.error(msg, bridge_device, bridge_vlan)"},{"line_number":654,"context_line":"        return"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    via \u003d via or {}  # make sure it is at least a empty dictionary"}],"source_content_type":"text/x-python","patch_set":20,"id":"b71033b0_6551c5c8","line":653,"range":{"start_line":653,"start_character":7,"end_line":653,"end_character":50},"in_reply_to":"4e6f6b10_a8230012","updated":"2024-05-14 12:25:18.000000000","message":"I have updated the message and made the log message a warning.","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"}],"ovn_bgp_agent/drivers/openstack/watchers/base_watcher.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        except (AttributeError, KeyError):"},{"line_number":146,"context_line":"            return"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _get_ips_info(self, row):"},{"line_number":149,"context_line":"        return {"},{"line_number":150,"context_line":"            \u0027mac\u0027: row.mac,"},{"line_number":151,"context_line":"            \u0027cidrs\u0027: row.networks,"}],"source_content_type":"text/x-python","patch_set":2,"id":"a3b09bd1_54ae46f1","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":21},"updated":"2024-01-29 10:05:45.000000000","message":"same here: the changes on this file look completely unrelated to adding L3VNI. Perhaps it can be moved to a different patch to simplify this one and merge this more quickly","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"03723d8feb7c8acf238600f820403bcb2a37ca00","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        except (AttributeError, KeyError):"},{"line_number":146,"context_line":"            return"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _get_ips_info(self, row):"},{"line_number":149,"context_line":"        return {"},{"line_number":150,"context_line":"            \u0027mac\u0027: row.mac,"},{"line_number":151,"context_line":"            \u0027cidrs\u0027: row.networks,"}],"source_content_type":"text/x-python","patch_set":2,"id":"021b429d_01d0c282","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":21},"in_reply_to":"9dc02668_3f94abfe","updated":"2024-01-29 16:52:00.000000000","message":"https://review.opendev.org/c/openstack/ovn-bgp-agent/+/907075","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":145,"context_line":"        except (AttributeError, KeyError):"},{"line_number":146,"context_line":"            return"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _get_ips_info(self, row):"},{"line_number":149,"context_line":"        return {"},{"line_number":150,"context_line":"            \u0027mac\u0027: row.mac,"},{"line_number":151,"context_line":"            \u0027cidrs\u0027: row.networks,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9dc02668_3f94abfe","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":21},"in_reply_to":"a3b09bd1_54ae46f1","updated":"2024-01-29 11:12:04.000000000","message":"Yes, will create separate issue for it.","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":85,"context_line":"                                   constants.OVN_LB_VIP_FIP_EXT_ID_KEY)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class LogicalSwitchChassisEvent(Event):"},{"line_number":89,"context_line":"    def __init__(self, bgp_agent, events):"},{"line_number":90,"context_line":"        self.agent \u003d bgp_agent"},{"line_number":91,"context_line":"        table \u003d \u0027Logical_Switch\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"80aa2411_8d1ced9d","line":88,"updated":"2024-04-25 17:34:56.000000000","message":"It seems the whole purpose of this class is to introduce the instance method `_get_vrf_settings` that does not use any of the instance state. That is a good indicator that `_get_vrf_settings` should be a standalone function instead.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":85,"context_line":"                                   constants.OVN_LB_VIP_FIP_EXT_ID_KEY)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class LogicalSwitchChassisEvent(Event):"},{"line_number":89,"context_line":"    def __init__(self, bgp_agent, events):"},{"line_number":90,"context_line":"        self.agent \u003d bgp_agent"},{"line_number":91,"context_line":"        table \u003d \u0027Logical_Switch\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"da92f165_296005d4","line":88,"in_reply_to":"80aa2411_8d1ced9d","updated":"2024-05-02 09:23:56.000000000","message":"sure, makes sense. i will move this to the driver_utils file.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                                   constants.OVN_LB_VIP_FIP_EXT_ID_KEY)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"class LogicalSwitchChassisEvent(Event):"},{"line_number":89,"context_line":"    def __init__(self, bgp_agent, events):"},{"line_number":90,"context_line":"        self.agent \u003d bgp_agent"},{"line_number":91,"context_line":"        table \u003d \u0027Logical_Switch\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"a42c084c_b6ae0d63","line":88,"in_reply_to":"da92f165_296005d4","updated":"2024-05-02 13:54:52.000000000","message":"The class is still there, as it is used for an event on the Logical_Switch table. There was no parent class for this table yet.","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"81c461e1e1b249f546dee697caa01c35ea145109","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        will return a string value. Either an empty string or a concatenation"},{"line_number":101,"context_line":"        of the type and vni, e.g. l3::1001"},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        if not hasattr(row, \u0027external_ids\u0027):"},{"line_number":104,"context_line":"            return"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        vrf_type \u003d row.external_ids.get(constants.OVN_EVPN_TYPE_EXT_ID_KEY)"},{"line_number":107,"context_line":"        vrf_vni \u003d row.external_ids.get(constants.OVN_EVPN_VNI_EXT_ID_KEY)"},{"line_number":108,"context_line":"        if not vrf_type or not vrf_vni:"},{"line_number":109,"context_line":"            return \u0027\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Return the vrf_type and vrf_vni as string, which is easily comparable"},{"line_number":112,"context_line":"        return f\u0027{vrf_type}::{vrf_vni}\u0027"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class LSPChassisEvent(Event):"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a071459_1354d585","line":112,"range":{"start_line":103,"start_character":0,"end_line":112,"end_character":39},"updated":"2024-04-25 17:34:56.000000000","message":"Would this do the same with less complexity?\n\n```\nif hasattr(row, \u0027external_ids\u0027):\n    try:\n        return \"%s::%s\" % (\n            row.external_ids[constants.OVN_EVPN_TYPE_EXT_ID_KEY],\n            row.external_ids[constants.OVN_EVPN_VNI_EXT_ID_KEY])\n    except KeyError:\n        return \u0027\u0027\n```","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"5a9fef4d0a358490fc7d377707b8e54b28e7906a","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        will return a string value. Either an empty string or a concatenation"},{"line_number":101,"context_line":"        of the type and vni, e.g. l3::1001"},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        if not hasattr(row, \u0027external_ids\u0027):"},{"line_number":104,"context_line":"            return"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        vrf_type \u003d row.external_ids.get(constants.OVN_EVPN_TYPE_EXT_ID_KEY)"},{"line_number":107,"context_line":"        vrf_vni \u003d row.external_ids.get(constants.OVN_EVPN_VNI_EXT_ID_KEY)"},{"line_number":108,"context_line":"        if not vrf_type or not vrf_vni:"},{"line_number":109,"context_line":"            return \u0027\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Return the vrf_type and vrf_vni as string, which is easily comparable"},{"line_number":112,"context_line":"        return f\u0027{vrf_type}::{vrf_vni}\u0027"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class LSPChassisEvent(Event):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa0ef7ef_d0bb9947","line":112,"range":{"start_line":103,"start_character":0,"end_line":112,"end_character":39},"in_reply_to":"5a071459_1354d585","updated":"2024-05-02 09:23:56.000000000","message":"Not sure if it is less complex, but i guess i just try to avoid writing try/except statements (as it indents the code), but i can adapt it to this, no problem 😊","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"197acd0322fe53ab5f9e704cbf9b9973217079bb","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        will return a string value. Either an empty string or a concatenation"},{"line_number":101,"context_line":"        of the type and vni, e.g. l3::1001"},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        if not hasattr(row, \u0027external_ids\u0027):"},{"line_number":104,"context_line":"            return"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        vrf_type \u003d row.external_ids.get(constants.OVN_EVPN_TYPE_EXT_ID_KEY)"},{"line_number":107,"context_line":"        vrf_vni \u003d row.external_ids.get(constants.OVN_EVPN_VNI_EXT_ID_KEY)"},{"line_number":108,"context_line":"        if not vrf_type or not vrf_vni:"},{"line_number":109,"context_line":"            return \u0027\u0027"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        # Return the vrf_type and vrf_vni as string, which is easily comparable"},{"line_number":112,"context_line":"        return f\u0027{vrf_type}::{vrf_vni}\u0027"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"class LSPChassisEvent(Event):"}],"source_content_type":"text/x-python","patch_set":18,"id":"8462df83_3e439b11","line":112,"range":{"start_line":103,"start_character":0,"end_line":112,"end_character":39},"in_reply_to":"fa0ef7ef_d0bb9947","updated":"2024-05-02 13:54:52.000000000","message":"Done","commit_id":"ee9d357b4e8e6a23ba1359c6a2bcc407f9afea41"}],"ovn_bgp_agent/drivers/openstack/watchers/nb_bgp_watcher.py":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"d7da5f116431d6d5f73a4cc78ca4bee2baf22dda","unresolved":true,"context_lines":[{"line_number":303,"context_line":"            bgp_agent, events)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":306,"context_line":"        try:"},{"line_number":307,"context_line":"            if not row.networks:"},{"line_number":308,"context_line":"                return False"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            # check if hosting-chassis is being added"},{"line_number":311,"context_line":"            hosting_chassis \u003d row.status.get(constants.OVN_STATUS_CHASSIS)"}],"source_content_type":"text/x-python","patch_set":2,"id":"b1802b11_e365d4ee","line":308,"range":{"start_line":306,"start_character":1,"end_line":308,"end_character":28},"updated":"2024-01-29 10:05:45.000000000","message":"the changes on this file look completely unrelated to adding L3VNI. Perhaps it can be moved to a different patch to simplify this one and merge this more quickly","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"03723d8feb7c8acf238600f820403bcb2a37ca00","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            bgp_agent, events)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":306,"context_line":"        try:"},{"line_number":307,"context_line":"            if not row.networks:"},{"line_number":308,"context_line":"                return False"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            # check if hosting-chassis is being added"},{"line_number":311,"context_line":"            hosting_chassis \u003d row.status.get(constants.OVN_STATUS_CHASSIS)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5aa9744b_99b297dc","line":308,"range":{"start_line":306,"start_character":1,"end_line":308,"end_character":28},"in_reply_to":"7340522c_2882f8ee","updated":"2024-01-29 16:52:00.000000000","message":"cobined in with https://review.opendev.org/c/openstack/ovn-bgp-agent/+/907075","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"763278b7ffdfb6e0f46161036c8551a594e77ef3","unresolved":true,"context_lines":[{"line_number":303,"context_line":"            bgp_agent, events)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":306,"context_line":"        try:"},{"line_number":307,"context_line":"            if not row.networks:"},{"line_number":308,"context_line":"                return False"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"            # check if hosting-chassis is being added"},{"line_number":311,"context_line":"            hosting_chassis \u003d row.status.get(constants.OVN_STATUS_CHASSIS)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7340522c_2882f8ee","line":308,"range":{"start_line":306,"start_character":1,"end_line":308,"end_character":28},"in_reply_to":"b1802b11_e365d4ee","updated":"2024-01-29 11:12:04.000000000","message":"Yes, will create separate issue for it (maybe together with previous comment)","commit_id":"09eaeebdf06b265efaa9890f46d80607af91ad7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"4585a635fbefa3f19eff0008b320e376f0ebe5d9","unresolved":true,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def _run(self, event, row, old):"},{"line_number":343,"context_line":"        with _SYNC_STATE_LOCK.read_lock():"},{"line_number":344,"context_line":"            self.agent.sync()"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"class LocalnetCreateDeleteEvent(base_watcher.LSPChassisEvent):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7c37524f_a4c1ada5","line":344,"range":{"start_line":344,"start_character":12,"end_line":344,"end_character":29},"updated":"2024-05-13 11:51:03.000000000","message":"I understand the simplicity here, but not sure if triggering a whole sync everytime a new setting is added to a logical switch is desired, we can leave it for now but I would add a TODO here for some optimization/filtering in the future","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0631ab1cbada55c9e61821949260716136730275","unresolved":false,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    def _run(self, event, row, old):"},{"line_number":343,"context_line":"        with _SYNC_STATE_LOCK.read_lock():"},{"line_number":344,"context_line":"            self.agent.sync()"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"class LocalnetCreateDeleteEvent(base_watcher.LSPChassisEvent):"}],"source_content_type":"text/x-python","patch_set":20,"id":"bdb6da1f_446c3985","line":344,"range":{"start_line":344,"start_character":12,"end_line":344,"end_character":29},"in_reply_to":"7c37524f_a4c1ada5","updated":"2024-05-14 12:25:18.000000000","message":"Added the remark in the code","commit_id":"95cd013fe372f1efaf282e7ffff53d745330e374"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bc7274ba8619e777a4ab790fed8dbc5d0feda9df","unresolved":true,"context_lines":[{"line_number":326,"context_line":"        been updated"},{"line_number":327,"context_line":"        \u0027\u0027\u0027"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        settings \u003d driver_utils.get_port_vrf_settings(row)"},{"line_number":330,"context_line":"        if settings and event \u003d\u003d self.ROW_DELETE:"},{"line_number":331,"context_line":"            # Always run sync method if we are deleting this network (and it"},{"line_number":332,"context_line":"            # had settings applied)"}],"source_content_type":"text/x-python","patch_set":21,"id":"05ee4e7d_bd23b0ec","line":329,"range":{"start_line":329,"start_character":32,"end_line":329,"end_character":53},"updated":"2024-05-20 19:18:08.000000000","message":"This can be done as a followup patch but I think it would make more sense to avoid `hasattr` in `get_port_vrf_settings` for the following reasons:\n - it is always true on L329, hence we care for the external_ids column only for `old` entry\n - if there was no update to `external_ids` the whole match is `False` - then I would explicitly check for `external_ids` column as the first thing in this method and return immediately without inspecting the new settings - because there was no update.\n - with this code we check the condition twice - first with `hastattr` and then again on L336\n - for case where external_ids was updated but not our attribute of interest, condition on L340 is sufficient","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"988aab2b8caba4abcfca510eadb0cc5071984451","unresolved":true,"context_lines":[{"line_number":326,"context_line":"        been updated"},{"line_number":327,"context_line":"        \u0027\u0027\u0027"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        settings \u003d driver_utils.get_port_vrf_settings(row)"},{"line_number":330,"context_line":"        if settings and event \u003d\u003d self.ROW_DELETE:"},{"line_number":331,"context_line":"            # Always run sync method if we are deleting this network (and it"},{"line_number":332,"context_line":"            # had settings applied)"}],"source_content_type":"text/x-python","patch_set":21,"id":"2863c10f_2a744875","line":329,"range":{"start_line":329,"start_character":32,"end_line":329,"end_character":53},"in_reply_to":"05ee4e7d_bd23b0ec","updated":"2024-05-21 09:46:27.000000000","message":"+1","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"bc7274ba8619e777a4ab790fed8dbc5d0feda9df","unresolved":true,"context_lines":[{"line_number":342,"context_line":"    def _run(self, event, row, old):"},{"line_number":343,"context_line":"        with _SYNC_STATE_LOCK.read_lock():"},{"line_number":344,"context_line":"            # NOTE(mnederlof): For now it makes sense to run the sync method"},{"line_number":345,"context_line":"            # as this is triggered with a configured interval anyway and it"},{"line_number":346,"context_line":"            # will add/remove the triggered logical switch."},{"line_number":347,"context_line":"            # It might make sense in the future to optimize this behaviour."},{"line_number":348,"context_line":"            self.agent.sync()"}],"source_content_type":"text/x-python","patch_set":21,"id":"32550661_1806c1bb","line":345,"updated":"2024-05-20 19:18:08.000000000","message":"If we expose the LS configuration through the Neutron API then it will cause sync on every API call change, right?","commit_id":"b3ca890f471fc2694342edc1f22670913cece934"}]}
