)]}'
{"neutron/agent/ovn/extensions/bgp/__init__.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3fb4be4b62675e2622d4004acfb0c8dee3ac9de1","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOCALHOST_ADDRESSES \u003d (\u0027127.0.0.1\u0027, \u0027::1\u0027)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class BGPAgentExtension(ovn_ext_mgr.OVNAgentExtension):"}],"source_content_type":"text/x-python","patch_set":2,"id":"6a1b993f_b05c45ea","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":19},"updated":"2025-09-24 10:40:07.000000000","message":"out of scope: I really don\u0027t know why we don\u0027t have these two addresses in n-lib","commit_id":"96e66e3cdeb011ea706bb2bf449dd04872d315c5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42342416c3472fcced9979319e08b0b82d80fae5","unresolved":true,"context_lines":[{"line_number":109,"context_line":"            if name"},{"line_number":110,"context_line":"        }"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _load_devices_with_ips(self):"},{"line_number":113,"context_line":"        \"\"\"Load the devices with IPs"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        Loads the bridges configured in OVS bgp-bridges and loopback addresses."}],"source_content_type":"text/x-python","patch_set":2,"id":"3c54e4e0_8c8a7c9b","line":112,"updated":"2025-09-25 17:59:43.000000000","message":"As this is dynamic, I think I should move it to the Bridge class itself and always reflect the real node configuration + treat the loopback addresses differently","commit_id":"96e66e3cdeb011ea706bb2bf449dd04872d315c5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"eb519ad7c99f7c71cf91eef23ed776f5ca14de76","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            if name"},{"line_number":110,"context_line":"        }"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def _load_devices_with_ips(self):"},{"line_number":113,"context_line":"        \"\"\"Load the devices with IPs"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        Loads the bridges configured in OVS bgp-bridges and loopback addresses."}],"source_content_type":"text/x-python","patch_set":2,"id":"a6ec1e33_aeeb5c69","line":112,"in_reply_to":"3c54e4e0_8c8a7c9b","updated":"2025-09-26 23:46:39.000000000","message":"Done","commit_id":"96e66e3cdeb011ea706bb2bf449dd04872d315c5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"325382e06eb3971e5576a4e61c550c6469661313","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOCALHOST_ADDRESSES \u003d (\u0027127.0.0.1\u0027, \u0027::1\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class BGPAgentExtension(ovn_ext_mgr.OVNAgentExtension):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7936512b_5add9077","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":19},"updated":"2025-10-14 08:44:30.000000000","message":"no action: we should have n-lib constants for this","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4d2c0d289785a9cf1b34f5799f280a6343b7d7b5","unresolved":false,"context_lines":[{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOCALHOST_ADDRESSES \u003d (\u0027127.0.0.1\u0027, \u0027::1\u0027)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class BGPAgentExtension(ovn_ext_mgr.OVNAgentExtension):"}],"source_content_type":"text/x-python","patch_set":7,"id":"063147fb_0a29f67b","line":28,"range":{"start_line":28,"start_character":0,"end_line":28,"end_character":19},"in_reply_to":"7936512b_5add9077","updated":"2025-10-14 17:07:04.000000000","message":"Pushed https://review.opendev.org/c/openstack/neutron-lib/+/963988","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"a55740fec23b8c4d80ed8786b081fe4b2e37b2c9","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOCALHOST_ADDRESSES \u003d [\u0027127.0.0.1\u0027, \u0027::1\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BGPAgentExtension(ovn_ext_mgr.OVNAgentExtension):"}],"source_content_type":"text/x-python","patch_set":18,"id":"10cc5ecd_1cdfde28","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":19},"updated":"2026-01-27 21:48:48.000000000","message":"seems like the imported `ip_lib` would be a better home for this constant.","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f934f7a20cc180fa87218c93666b013281fcd97c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"LOCALHOST_ADDRESSES \u003d [\u0027127.0.0.1\u0027, \u0027::1\u0027]"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class BGPAgentExtension(ovn_ext_mgr.OVNAgentExtension):"}],"source_content_type":"text/x-python","patch_set":18,"id":"a33fe9d6_926f44a0","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":19},"in_reply_to":"10cc5ecd_1cdfde28","updated":"2026-01-28 18:46:49.000000000","message":"Addressed with Terry\u0027s comment.","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"a55740fec23b8c4d80ed8786b081fe4b2e37b2c9","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        return host_ips"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @property"},{"line_number":78,"context_line":"    def loopback_ips(self):"},{"line_number":79,"context_line":"        cidrs \u003d [netaddr.IPNetwork(dev[\u0027cidr\u0027])"},{"line_number":80,"context_line":"                 for dev in ip_lib.get_devices_with_ip("},{"line_number":81,"context_line":"                 namespace\u003dNone, name\u003dip_lib.LOOPBACK_DEVNAME)]"}],"source_content_type":"text/x-python","patch_set":18,"id":"995dd407_558d21c0","line":78,"updated":"2026-01-27 21:48:48.000000000","message":"nit: this method name bothers me but I dont have better suggestion 😄. When I read it, I expect to return the common default 127.0.0.1. But it does opposite of that.\nMaybe `lo_dev_host_ips`","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f934f7a20cc180fa87218c93666b013281fcd97c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        return host_ips"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @property"},{"line_number":78,"context_line":"    def loopback_ips(self):"},{"line_number":79,"context_line":"        cidrs \u003d [netaddr.IPNetwork(dev[\u0027cidr\u0027])"},{"line_number":80,"context_line":"                 for dev in ip_lib.get_devices_with_ip("},{"line_number":81,"context_line":"                 namespace\u003dNone, name\u003dip_lib.LOOPBACK_DEVNAME)]"}],"source_content_type":"text/x-python","patch_set":18,"id":"f05639b3_a375d5ff","line":78,"in_reply_to":"995dd407_558d21c0","updated":"2026-01-28 18:46:49.000000000","message":"Done","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"f882f494ec5e564be0b537ce1971a17f6bac2567","unresolved":true,"context_lines":[{"line_number":80,"context_line":"                 for dev in ip_lib.get_devices_with_ip("},{"line_number":81,"context_line":"                 namespace\u003dNone, name\u003dip_lib.LOOPBACK_DEVNAME)]"},{"line_number":82,"context_line":"        return [cidr for cidr in cidrs"},{"line_number":83,"context_line":"                if str(cidr.ip) not in LOCALHOST_ADDRESSES]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def create_bgp_bridge(self, bridge_name):"},{"line_number":86,"context_line":"        bgp_bridge \u003d bridge.BGPChassisBridge(self, bridge_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"a5f6de19_87587894","line":83,"updated":"2026-01-23 22:45:25.000000000","message":"`netaddr.IPNetwork` has an `is_loopback()` method which might be able to simplify this to\n\n```\n    return [cidr for dev in ip_lib.get_devices_with_ip(\n                namespace\u003dNone, name\u003dip_lib.LOOPBACK_DEVNAME)\n            if not (cidr :\u003d netaddr.IPNetwork(dev[\u0027cidr\u0027])).is_loopback()]\n```\nwithout having to use string comparison, if the IPs on `lo` we are looking for are outside of the standard loopback ranges, anyway.","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f934f7a20cc180fa87218c93666b013281fcd97c","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                 for dev in ip_lib.get_devices_with_ip("},{"line_number":81,"context_line":"                 namespace\u003dNone, name\u003dip_lib.LOOPBACK_DEVNAME)]"},{"line_number":82,"context_line":"        return [cidr for cidr in cidrs"},{"line_number":83,"context_line":"                if str(cidr.ip) not in LOCALHOST_ADDRESSES]"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def create_bgp_bridge(self, bridge_name):"},{"line_number":86,"context_line":"        bgp_bridge \u003d bridge.BGPChassisBridge(self, bridge_name)"}],"source_content_type":"text/x-python","patch_set":18,"id":"e79477f4_51249a5c","line":83,"in_reply_to":"a5f6de19_87587894","updated":"2026-01-28 18:46:49.000000000","message":"Nice! Thanks!","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"}],"neutron/agent/ovn/extensions/bgp/bridge.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3fb4be4b62675e2622d4004acfb0c8dee3ac9de1","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class BGPBridge(Bridge):"},{"line_number":61,"context_line":"    \"\"\"BGP Bridge"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    The BGP bridge is the provider bridge that connects a chassis to a BGP"},{"line_number":64,"context_line":"    physical interface connected to a BGP peer, typically a leaf switch."},{"line_number":65,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"d60273cf_7e667860","line":62,"range":{"start_line":61,"start_character":7,"end_line":62,"end_character":1},"updated":"2025-09-24 10:40:07.000000000","message":"If I\u0027m not wrong, there are two BGP bridges: the `br-bgp` that conencted the public network with the `ls-inter-public` network, and the local BGP bridges in each compute. This seems to be the second one. Can you make this name more explicit? I don\u0027t know, something like BGPLocalBridge.","commit_id":"96e66e3cdeb011ea706bb2bf449dd04872d315c5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5a677f49d001fe61610e75db61a56eb89054c5a3","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class BGPBridge(Bridge):"},{"line_number":61,"context_line":"    \"\"\"BGP Bridge"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    The BGP bridge is the provider bridge that connects a chassis to a BGP"},{"line_number":64,"context_line":"    physical interface connected to a BGP peer, typically a leaf switch."},{"line_number":65,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"aa394c5b_92d73cf4","line":62,"range":{"start_line":61,"start_character":7,"end_line":62,"end_character":1},"in_reply_to":"9539adbd_8163ab3a","updated":"2025-09-25 18:50:17.000000000","message":"Done","commit_id":"96e66e3cdeb011ea706bb2bf449dd04872d315c5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"42342416c3472fcced9979319e08b0b82d80fae5","unresolved":true,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class BGPBridge(Bridge):"},{"line_number":61,"context_line":"    \"\"\"BGP Bridge"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    The BGP bridge is the provider bridge that connects a chassis to a BGP"},{"line_number":64,"context_line":"    physical interface connected to a BGP peer, typically a leaf switch."},{"line_number":65,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"9539adbd_8163ab3a","line":62,"range":{"start_line":61,"start_character":7,"end_line":62,"end_character":1},"in_reply_to":"d60273cf_7e667860","updated":"2025-09-25 17:59:43.000000000","message":"Yes, if that helps. I named the other bridge type ConnectingBridge - https://github.com/cubeek/neutron/blob/ovn-native-bgp/neutron/services/bgp/agent/bridge.py#L227\nas it connects the Neutron and the BGP world - but it could be connecting really anything :) Ideas for better naming are always welcome.","commit_id":"96e66e3cdeb011ea706bb2bf449dd04872d315c5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"325382e06eb3971e5576a4e61c550c6469661313","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        for iface in self.bridge_ifaces():"},{"line_number":100,"context_line":"            if iface[\u0027type\u0027] not in (\u0027patch\u0027, \u0027internal\u0027):"},{"line_number":101,"context_line":"                nics_ofports.append(iface[\u0027ofport\u0027])"},{"line_number":102,"context_line":"        if len(nics_ofports) !\u003d 1:"},{"line_number":103,"context_line":"            raise exc.BridgeNicException("},{"line_number":104,"context_line":"                f\"Expected 1 NIC for bridge {self.name}, \""},{"line_number":105,"context_line":"                f\"got {len(nics_ofports)}\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"a432b39c_8bdfdd4e","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":34},"updated":"2025-10-14 08:44:30.000000000","message":"nit: we are not considering here a OVS bond. Maybe we should highlight it here","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4d2c0d289785a9cf1b34f5799f280a6343b7d7b5","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        for iface in self.bridge_ifaces():"},{"line_number":100,"context_line":"            if iface[\u0027type\u0027] not in (\u0027patch\u0027, \u0027internal\u0027):"},{"line_number":101,"context_line":"                nics_ofports.append(iface[\u0027ofport\u0027])"},{"line_number":102,"context_line":"        if len(nics_ofports) !\u003d 1:"},{"line_number":103,"context_line":"            raise exc.BridgeNicException("},{"line_number":104,"context_line":"                f\"Expected 1 NIC for bridge {self.name}, \""},{"line_number":105,"context_line":"                f\"got {len(nics_ofports)}\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"0f332a64_7cacda4e","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":34},"in_reply_to":"a432b39c_8bdfdd4e","updated":"2025-10-14 17:07:04.000000000","message":"Good point.","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"325382e06eb3971e5576a4e61c550c6469661313","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                    namespace\u003dNone, name\u003dself.name)]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _get_lrp_flow(self, nic_ofport, patch_port_ofport):"},{"line_number":115,"context_line":"        if not self.lrp_mac:"},{"line_number":116,"context_line":"            LOG.debug(\"No LRP MAC map found for %s\", self.name)"},{"line_number":117,"context_line":"            return []"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e57674b6_030dff4d","line":115,"range":{"start_line":115,"start_character":20,"end_line":115,"end_character":27},"updated":"2025-10-14 08:44:30.000000000","message":"Where are we setting this value (most probably in a follow up patch).","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"39d45585fa77eb34ecd60fa504a681ec105a9ea5","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                    namespace\u003dNone, name\u003dself.name)]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _get_lrp_flow(self, nic_ofport, patch_port_ofport):"},{"line_number":115,"context_line":"        if not self.lrp_mac:"},{"line_number":116,"context_line":"            LOG.debug(\"No LRP MAC map found for %s\", self.name)"},{"line_number":117,"context_line":"            return []"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"23c880a0_86d583bc","line":115,"range":{"start_line":115,"start_character":20,"end_line":115,"end_character":27},"in_reply_to":"5691a55e_5996ef86","updated":"2025-10-14 17:07:15.000000000","message":"Done","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4d2c0d289785a9cf1b34f5799f280a6343b7d7b5","unresolved":true,"context_lines":[{"line_number":112,"context_line":"                    namespace\u003dNone, name\u003dself.name)]"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def _get_lrp_flow(self, nic_ofport, patch_port_ofport):"},{"line_number":115,"context_line":"        if not self.lrp_mac:"},{"line_number":116,"context_line":"            LOG.debug(\"No LRP MAC map found for %s\", self.name)"},{"line_number":117,"context_line":"            return []"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5691a55e_5996ef86","line":115,"range":{"start_line":115,"start_character":20,"end_line":115,"end_character":27},"in_reply_to":"e57674b6_030dff4d","updated":"2025-10-14 17:07:04.000000000","message":"Yes, this is for bridges that load their LRP MAC from what the server created - https://review.opendev.org/c/openstack/neutron/+/962727/2/neutron/agent/ovn/extensions/bgp/__init__.py#155","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"33b8fdc30ab54e4e14ed5be2442edeabca542658","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    __repr__ \u003d __str__"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @property"},{"line_number":80,"context_line":"    def nic_ofport(self):"},{"line_number":81,"context_line":"        # The NIC existed when the bridge was created but did not have an"},{"line_number":82,"context_line":"        # ofport assigned yet"},{"line_number":83,"context_line":"        if self._nic_ofport \u003d\u003d []:"}],"source_content_type":"text/x-python","patch_set":18,"id":"20cd62de_9fb6a0ab","line":80,"updated":"2026-01-27 22:28:03.000000000","message":"Like w/ my comment on the patch_port_ofport, I wonder if caching this value is the right choice instead of just pulling it from the in-memory Idl, or even creating a Command that does everything that the code that uses nic_ofport needs to do, so we know the value doesn\u0027t change in the middle of doing multiple related actions, etc.","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a360669c9b7d27452c11cd863913c1f4c820d855","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    __repr__ \u003d __str__"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    @property"},{"line_number":80,"context_line":"    def nic_ofport(self):"},{"line_number":81,"context_line":"        # The NIC existed when the bridge was created but did not have an"},{"line_number":82,"context_line":"        # ofport assigned yet"},{"line_number":83,"context_line":"        if self._nic_ofport \u003d\u003d []:"}],"source_content_type":"text/x-python","patch_set":18,"id":"a5ada23c_2e15d030","line":80,"in_reply_to":"20cd62de_9fb6a0ab","updated":"2026-01-28 22:14:02.000000000","message":"Done","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"33b8fdc30ab54e4e14ed5be2442edeabca542658","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        # The NIC existed when the bridge was created but did not have an"},{"line_number":82,"context_line":"        # ofport assigned yet"},{"line_number":83,"context_line":"        if self._nic_ofport \u003d\u003d []:"},{"line_number":84,"context_line":"            for i in range(11):"},{"line_number":85,"context_line":"                self._nic_ofport \u003d self._get_bridge_nic_ofport()"},{"line_number":86,"context_line":"                if self._nic_ofport \u003d\u003d []:"},{"line_number":87,"context_line":"                    time.sleep(0.1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"2878dfe3_fe311501","line":84,"updated":"2026-01-27 22:28:03.000000000","message":"Can we use a WaitEvent instead of this retry loop?","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d74712987ba83f75aaaea4c9d9bb13233923df00","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        # The NIC existed when the bridge was created but did not have an"},{"line_number":82,"context_line":"        # ofport assigned yet"},{"line_number":83,"context_line":"        if self._nic_ofport \u003d\u003d []:"},{"line_number":84,"context_line":"            for i in range(11):"},{"line_number":85,"context_line":"                self._nic_ofport \u003d self._get_bridge_nic_ofport()"},{"line_number":86,"context_line":"                if self._nic_ofport \u003d\u003d []:"},{"line_number":87,"context_line":"                    time.sleep(0.1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"fced6d5a_cffc959e","line":84,"range":{"start_line":84,"start_character":11,"end_line":84,"end_character":31},"updated":"2026-01-27 22:49:45.000000000","message":"what is the purpose of this? I dont see `i` used anywhere. `11` has no explanation.\nIs it to just try to get _nic_ports for next 10 x 0.1\u003d 1.0 second? Why so specific?\n\nnit: use `_` for i , set `11` to self describing variable i.e  `retrieval_intervals \u003d 11`","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a360669c9b7d27452c11cd863913c1f4c820d855","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        # The NIC existed when the bridge was created but did not have an"},{"line_number":82,"context_line":"        # ofport assigned yet"},{"line_number":83,"context_line":"        if self._nic_ofport \u003d\u003d []:"},{"line_number":84,"context_line":"            for i in range(11):"},{"line_number":85,"context_line":"                self._nic_ofport \u003d self._get_bridge_nic_ofport()"},{"line_number":86,"context_line":"                if self._nic_ofport \u003d\u003d []:"},{"line_number":87,"context_line":"                    time.sleep(0.1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"f02252e0_4cd8cd5c","line":84,"in_reply_to":"2878dfe3_fe311501","updated":"2026-01-28 22:14:02.000000000","message":"Done","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f934f7a20cc180fa87218c93666b013281fcd97c","unresolved":true,"context_lines":[{"line_number":81,"context_line":"        # The NIC existed when the bridge was created but did not have an"},{"line_number":82,"context_line":"        # ofport assigned yet"},{"line_number":83,"context_line":"        if self._nic_ofport \u003d\u003d []:"},{"line_number":84,"context_line":"            for i in range(11):"},{"line_number":85,"context_line":"                self._nic_ofport \u003d self._get_bridge_nic_ofport()"},{"line_number":86,"context_line":"                if self._nic_ofport \u003d\u003d []:"},{"line_number":87,"context_line":"                    time.sleep(0.1)"}],"source_content_type":"text/x-python","patch_set":18,"id":"d229387a_9f9bf04b","line":84,"range":{"start_line":84,"start_character":11,"end_line":84,"end_character":31},"in_reply_to":"fced6d5a_cffc959e","updated":"2026-01-28 18:46:49.000000000","message":"I know it\u0027s a common practice to use the underscore but _() is a localization function and should not be shadowed and it\u0027s discouraged to use for unused variable in the openstack codebase.","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"d74712987ba83f75aaaea4c9d9bb13233923df00","unresolved":true,"context_lines":[{"line_number":163,"context_line":"                  f\"from {self.nic_ofport} to {self.patch_port_ofport} using \""},{"line_number":164,"context_line":"                  f\"MAC {self.lrp_mac}\")"},{"line_number":165,"context_line":"        return ["},{"line_number":166,"context_line":"            f\"priority\u003d80,in_port\u003d{self.nic_ofport},\""},{"line_number":167,"context_line":"            f\"actions\u003dmod_dl_dst:{self.lrp_mac},\""},{"line_number":168,"context_line":"            f\"output:{self.patch_port_ofport}\""},{"line_number":169,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":18,"id":"4dc5d6a9_fd446d81","line":166,"range":{"start_line":166,"start_character":14,"end_line":166,"end_character":25},"updated":"2026-01-27 22:49:45.000000000","message":"Just asking. Are these priority values coming from somwhere or did you just pick them in order?\nWould it be make sense to define them as ENUM for better code readability?","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0259ad06ab0cb2509a0b4984722e48e618dedbb6","unresolved":false,"context_lines":[{"line_number":163,"context_line":"                  f\"from {self.nic_ofport} to {self.patch_port_ofport} using \""},{"line_number":164,"context_line":"                  f\"MAC {self.lrp_mac}\")"},{"line_number":165,"context_line":"        return ["},{"line_number":166,"context_line":"            f\"priority\u003d80,in_port\u003d{self.nic_ofport},\""},{"line_number":167,"context_line":"            f\"actions\u003dmod_dl_dst:{self.lrp_mac},\""},{"line_number":168,"context_line":"            f\"output:{self.patch_port_ofport}\""},{"line_number":169,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":18,"id":"74356144_c5a3b2e7","line":166,"range":{"start_line":166,"start_character":14,"end_line":166,"end_character":25},"in_reply_to":"4dc5d6a9_fd446d81","updated":"2026-01-28 18:22:07.000000000","message":"Actually disregard...I think that will just complicate the code for no reason","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0259ad06ab0cb2509a0b4984722e48e618dedbb6","unresolved":true,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        # Direct traffic meant for the host IPs"},{"line_number":192,"context_line":"        for host_ip in self.bgp_agent_api.host_ips:"},{"line_number":193,"context_line":"            if host_ip.version \u003d\u003d 4:"},{"line_number":194,"context_line":"                flows.append(f\"priority\u003d100,ip,in_port\u003d{self.nic_ofport},\""},{"line_number":195,"context_line":"                             f\"nw_dst\u003d{host_ip.ip} actions\u003dNORMAL\")"},{"line_number":196,"context_line":"            elif host_ip.version \u003d\u003d 6:"}],"source_content_type":"text/x-python","patch_set":18,"id":"d5dceafe_a6653ffc","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":35},"updated":"2026-01-28 18:22:07.000000000","message":"nit: use constants from neutron_lib\nhttps://opendev.org/openstack/neutron-lib/src/branch/master/neutron_lib/constants.py#L112","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a360669c9b7d27452c11cd863913c1f4c820d855","unresolved":false,"context_lines":[{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        # Direct traffic meant for the host IPs"},{"line_number":192,"context_line":"        for host_ip in self.bgp_agent_api.host_ips:"},{"line_number":193,"context_line":"            if host_ip.version \u003d\u003d 4:"},{"line_number":194,"context_line":"                flows.append(f\"priority\u003d100,ip,in_port\u003d{self.nic_ofport},\""},{"line_number":195,"context_line":"                             f\"nw_dst\u003d{host_ip.ip} actions\u003dNORMAL\")"},{"line_number":196,"context_line":"            elif host_ip.version \u003d\u003d 6:"}],"source_content_type":"text/x-python","patch_set":18,"id":"70b07835_04af8b4c","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":35},"in_reply_to":"d5dceafe_a6653ffc","updated":"2026-01-28 22:14:02.000000000","message":"Done, it will be much easier to change in case the IPv4 version changes to 5 in the future :)","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0259ad06ab0cb2509a0b4984722e48e618dedbb6","unresolved":true,"context_lines":[{"line_number":207,"context_line":"                        \"flows\", self.name)"},{"line_number":208,"context_line":"            return"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        LOG.debug(\"configuring BGP bridge flows for %s\", self.name)"},{"line_number":211,"context_line":"        # Allow ARP and ICMPv6"},{"line_number":212,"context_line":"        flows \u003d ["},{"line_number":213,"context_line":"            \"priority\u003d100,arp actions\u003dNORMAL\","}],"source_content_type":"text/x-python","patch_set":18,"id":"682d741a_18fbf20d","line":210,"range":{"start_line":210,"start_character":19,"end_line":210,"end_character":20},"updated":"2026-01-28 18:22:07.000000000","message":"nit: Start with a capital letter","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a360669c9b7d27452c11cd863913c1f4c820d855","unresolved":false,"context_lines":[{"line_number":207,"context_line":"                        \"flows\", self.name)"},{"line_number":208,"context_line":"            return"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        LOG.debug(\"configuring BGP bridge flows for %s\", self.name)"},{"line_number":211,"context_line":"        # Allow ARP and ICMPv6"},{"line_number":212,"context_line":"        flows \u003d ["},{"line_number":213,"context_line":"            \"priority\u003d100,arp actions\u003dNORMAL\","}],"source_content_type":"text/x-python","patch_set":18,"id":"80fbe0a4_c96d07ce","line":210,"range":{"start_line":210,"start_character":19,"end_line":210,"end_character":20},"in_reply_to":"682d741a_18fbf20d","updated":"2026-01-28 22:14:02.000000000","message":"Done","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"0259ad06ab0cb2509a0b4984722e48e618dedbb6","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        # Allow ARP and ICMPv6"},{"line_number":212,"context_line":"        flows \u003d ["},{"line_number":213,"context_line":"            \"priority\u003d100,arp actions\u003dNORMAL\","},{"line_number":214,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d133 actions\u003dNORMAL\","},{"line_number":215,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d134 actions\u003dNORMAL\","},{"line_number":216,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d135 actions\u003dNORMAL\","},{"line_number":217,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d136 actions\u003dNORMAL\","}],"source_content_type":"text/x-python","patch_set":18,"id":"f62b0f54_faa46fd0","line":214,"updated":"2026-01-28 18:22:07.000000000","message":"No issue I am just wondering, shall we add icmp_type 128 and 129 for icmpv6 pings (debugging purposes)","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"650288b6ca9bd1a18acdc0849f689357d46503fd","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        # Allow ARP and ICMPv6"},{"line_number":212,"context_line":"        flows \u003d ["},{"line_number":213,"context_line":"            \"priority\u003d100,arp actions\u003dNORMAL\","},{"line_number":214,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d133 actions\u003dNORMAL\","},{"line_number":215,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d134 actions\u003dNORMAL\","},{"line_number":216,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d135 actions\u003dNORMAL\","},{"line_number":217,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d136 actions\u003dNORMAL\","}],"source_content_type":"text/x-python","patch_set":18,"id":"941febfd_0e8f0ecc","line":214,"in_reply_to":"cc8eb237_aa2354ab","updated":"2026-01-30 21:19:45.000000000","message":"Lets just leave it as is, and we deal with it if we run into it.","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a360669c9b7d27452c11cd863913c1f4c820d855","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        # Allow ARP and ICMPv6"},{"line_number":212,"context_line":"        flows \u003d ["},{"line_number":213,"context_line":"            \"priority\u003d100,arp actions\u003dNORMAL\","},{"line_number":214,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d133 actions\u003dNORMAL\","},{"line_number":215,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d134 actions\u003dNORMAL\","},{"line_number":216,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d135 actions\u003dNORMAL\","},{"line_number":217,"context_line":"            \"priority\u003d100,icmp6,icmp_type\u003d136 actions\u003dNORMAL\","}],"source_content_type":"text/x-python","patch_set":18,"id":"cc8eb237_aa2354ab","line":214,"in_reply_to":"f62b0f54_faa46fd0","updated":"2026-01-28 22:14:02.000000000","message":"It\u0027s a good point, I remember also you wondered about the RAs and other icmpv6 things. I\u0027m afraid the ipv6 will be problematic if we want to use both control plane and data plane using the same NIC :-/ I don\u0027t have a solution for that.","commit_id":"dbb895f8c6bda28c3470f8ee8a64422628fa1e41"}],"neutron/agent/ovn/extensions/bgp/events.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"325382e06eb3971e5576a4e61c550c6469661313","unresolved":true,"context_lines":[{"line_number":79,"context_line":"            bgp_peer_bridges, ovn_bridge_mappings)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"class BGPChassisEvent(BGPAgentEvent):"},{"line_number":83,"context_line":"    \"\"\"Base class for BGP chassis events.\"\"\""},{"line_number":84,"context_line":"    TABLE \u003d \u0027Chassis\u0027"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"bdc52cfb_9d99d523","line":82,"range":{"start_line":82,"start_character":6,"end_line":82,"end_character":21},"updated":"2025-10-14 08:44:30.000000000","message":"nit: if this is a base class to be inherited by others, maybe it should have a private name","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"4d2c0d289785a9cf1b34f5799f280a6343b7d7b5","unresolved":true,"context_lines":[{"line_number":79,"context_line":"            bgp_peer_bridges, ovn_bridge_mappings)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"class BGPChassisEvent(BGPAgentEvent):"},{"line_number":83,"context_line":"    \"\"\"Base class for BGP chassis events.\"\"\""},{"line_number":84,"context_line":"    TABLE \u003d \u0027Chassis\u0027"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"4206988c_28e6719f","line":82,"range":{"start_line":82,"start_character":6,"end_line":82,"end_character":21},"in_reply_to":"bdc52cfb_9d99d523","updated":"2025-10-14 17:07:04.000000000","message":"Not opinionated but if this is in `bgp.events` then I would consider that to be meant for BGP. Let me know if I should add the underscore there.","commit_id":"c64d93078c478482c9dbf25c18dceebcf3128bb3"}],"neutron/tests/functional/agent/ovn/extensions/bgp/test_bridge.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"559dcab467c3c839c0ecdd2ae6b1f9b8f9833112","unresolved":true,"context_lines":[{"line_number":160,"context_line":"        self.assertIn(\u0027ipv6_dst\u003dfe80::/64 actions\u003dNORMAL\u0027, flow_strings)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        # 5. Default flow"},{"line_number":163,"context_line":"        self.assertIn(\u0027priority\u003d0 actions\u003dNORMAL\u0027, flow_strings)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        # 6. LRP MAC rewrite flow"},{"line_number":166,"context_line":"        self.assertIn("}],"source_content_type":"text/x-python","patch_set":19,"id":"0037ba64_efa3b541","line":163,"updated":"2026-01-30 16:10:08.000000000","message":"nit: I was expecting here and in the previous flows, to check the priority and the in_port","commit_id":"78700f8e0f12363ce9eb2649f15c94c55f6de776"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"559dcab467c3c839c0ecdd2ae6b1f9b8f9833112","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":19,"id":"8043e393_52b604f1","line":171,"updated":"2026-01-30 16:10:08.000000000","message":"nit: I was also expecting to see the flow installed by `_get_flows_for_patch_port`","commit_id":"78700f8e0f12363ce9eb2649f15c94c55f6de776"}]}
