)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ec4e6e433230eccc0a1de82fc76cc584a4420b40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b8f9a113_ce66b829","updated":"2026-05-21 08:27:00.000000000","message":"-1 for visibility","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"}],"neutron/agent/ovn/extensions/bgp/bridge.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"40ec3d38f2c959b37e29076ed09e20c00c05b330","unresolved":true,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    @staticmethod"},{"line_number":258,"context_line":"    def _is_provider_port(port_name):"},{"line_number":259,"context_line":"        # FIXME(jlibosva):  the ovn-localnet-port references the LSP in OVN"},{"line_number":260,"context_line":"        #                   It would be better to look it up there and not"},{"line_number":261,"context_line":"        #                   rely on the naming convention."},{"line_number":262,"context_line":"        return port_name.startswith("}],"source_content_type":"text/x-python","patch_set":6,"id":"0c984973_257a37d0","line":259,"range":{"start_line":259,"start_character":0,"end_line":259,"end_character":75},"updated":"2026-05-27 22:57:33.000000000","message":"Is this a pre-merge or post-merge fixme?","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"33e01749556ed6c65808c4db368707c2f089d392","unresolved":true,"context_lines":[{"line_number":256,"context_line":""},{"line_number":257,"context_line":"    @staticmethod"},{"line_number":258,"context_line":"    def _is_provider_port(port_name):"},{"line_number":259,"context_line":"        # FIXME(jlibosva):  the ovn-localnet-port references the LSP in OVN"},{"line_number":260,"context_line":"        #                   It would be better to look it up there and not"},{"line_number":261,"context_line":"        #                   rely on the naming convention."},{"line_number":262,"context_line":"        return port_name.startswith("}],"source_content_type":"text/x-python","patch_set":6,"id":"18fb39de_b9cb4abd","line":259,"range":{"start_line":259,"start_character":0,"end_line":259,"end_character":75},"in_reply_to":"0c984973_257a37d0","updated":"2026-05-28 15:47:10.000000000","message":"post-merge - we rely on the port name in this patch because all patch ports have the OVN_PHYSNET_EXT_ID_KEY","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"40ec3d38f2c959b37e29076ed09e20c00c05b330","unresolved":true,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        flows \u003d ["},{"line_number":342,"context_line":"            (f\"priority\u003d10,in_port\u003d{self.provider_patch_ofport},\""},{"line_number":343,"context_line":"             f\"actions\u003dmod_dl_dst:{self.ic_lrp_mac},\""},{"line_number":344,"context_line":"             f\"output:{self.bgp_patch_ofport}\"),"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            (f\"priority\u003d10,in_port\u003d{self.bgp_patch_ofport},\""}],"source_content_type":"text/x-python","patch_set":6,"id":"e1ac761e_9b8fd807","line":343,"range":{"start_line":343,"start_character":35,"end_line":343,"end_character":50},"updated":"2026-05-27 22:57:33.000000000","message":"Technically, since this does a new txn to look up this value with a Command, it could be a different result than the lookup we do in `check_requirements_for_flows_met()`. It seems unlikely, but possible.","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"40ec3d38f2c959b37e29076ed09e20c00c05b330","unresolved":true,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        flows \u003d ["},{"line_number":342,"context_line":"            (f\"priority\u003d10,in_port\u003d{self.provider_patch_ofport},\""},{"line_number":343,"context_line":"             f\"actions\u003dmod_dl_dst:{self.ic_lrp_mac},\""},{"line_number":344,"context_line":"             f\"output:{self.bgp_patch_ofport}\"),"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            (f\"priority\u003d10,in_port\u003d{self.bgp_patch_ofport},\""}],"source_content_type":"text/x-python","patch_set":6,"id":"de323a0b_70ef9d54","line":343,"range":{"start_line":343,"start_character":35,"end_line":343,"end_character":50},"updated":"2026-05-27 22:57:33.000000000","message":"nit: Theoretically (though it seems quite unlikely), this call could return a different result (e.g. None) than the one that is returned in `check_requirements_for_flows_met()` since they are in different transactions. If we cared, check_requirements could return the things it finds.","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"33e01749556ed6c65808c4db368707c2f089d392","unresolved":true,"context_lines":[{"line_number":340,"context_line":""},{"line_number":341,"context_line":"        flows \u003d ["},{"line_number":342,"context_line":"            (f\"priority\u003d10,in_port\u003d{self.provider_patch_ofport},\""},{"line_number":343,"context_line":"             f\"actions\u003dmod_dl_dst:{self.ic_lrp_mac},\""},{"line_number":344,"context_line":"             f\"output:{self.bgp_patch_ofport}\"),"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"            (f\"priority\u003d10,in_port\u003d{self.bgp_patch_ofport},\""}],"source_content_type":"text/x-python","patch_set":6,"id":"01a0460e_b899874f","line":343,"range":{"start_line":343,"start_character":35,"end_line":343,"end_character":50},"in_reply_to":"e1ac761e_9b8fd807","updated":"2026-05-28 15:47:10.000000000","message":"It should be the value that is currently in the DB and what ovn-controller implements in the flows. Also remember there is this great algorithm that creates predictable MAC based on the LRP name. So that would mean the LRP name changed - which could happen only if the Neutron provider network changed its UUID.","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"}],"neutron/agent/ovn/extensions/bgp/commands.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ec4e6e433230eccc0a1de82fc76cc584a4420b40","unresolved":true,"context_lines":[{"line_number":59,"context_line":"            match\u003dself.localnet_lsp_name)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def run_idl(self, txn):"},{"line_number":62,"context_line":"        lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.localnet_lsp_name)"},{"line_number":63,"context_line":"        ls \u003d self._find_parent_switch(lsp)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        for port in ls.ports:"}],"source_content_type":"text/x-python","patch_set":5,"id":"46dfb7d0_5fde0089","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":76},"updated":"2026-05-21 08:27:00.000000000","message":"What happens if this LSP doesn\u0027t exist? Should you handle this?","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a1ab7cdf8078cd1306855d1b6c420b7c82b8f449","unresolved":true,"context_lines":[{"line_number":59,"context_line":"            match\u003dself.localnet_lsp_name)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def run_idl(self, txn):"},{"line_number":62,"context_line":"        lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.localnet_lsp_name)"},{"line_number":63,"context_line":"        ls \u003d self._find_parent_switch(lsp)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        for port in ls.ports:"}],"source_content_type":"text/x-python","patch_set":5,"id":"bdf9b439_2cf9b242","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":76},"in_reply_to":"46dfb7d0_5fde0089","updated":"2026-05-21 12:05:09.000000000","message":"Good point, maybe I should handle it at https://review.opendev.org/c/openstack/neutron/+/988830/5/neutron/agent/ovn/extensions/bgp/bridge.py#317 instead of the if, that guards against this.","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"16a79c209324951748966580ab2d66ce1735169d","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            match\u003dself.localnet_lsp_name)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def run_idl(self, txn):"},{"line_number":62,"context_line":"        lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.localnet_lsp_name)"},{"line_number":63,"context_line":"        ls \u003d self._find_parent_switch(lsp)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        for port in ls.ports:"}],"source_content_type":"text/x-python","patch_set":5,"id":"076e3807_1c7709b9","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":76},"in_reply_to":"bdf9b439_2cf9b242","updated":"2026-05-21 18:46:13.000000000","message":"Done","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ec4e6e433230eccc0a1de82fc76cc584a4420b40","unresolved":true,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def run_idl(self, txn):"},{"line_number":62,"context_line":"        lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.localnet_lsp_name)"},{"line_number":63,"context_line":"        ls \u003d self._find_parent_switch(lsp)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        for port in ls.ports:"},{"line_number":66,"context_line":"            if port.type \u003d\u003d ovn_const.LSP_TYPE_ROUTER:"}],"source_content_type":"text/x-python","patch_set":5,"id":"a384795f_ee60f47f","line":63,"range":{"start_line":63,"start_character":8,"end_line":63,"end_character":12},"updated":"2026-05-21 08:27:00.000000000","message":"ditto","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"16a79c209324951748966580ab2d66ce1735169d","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def run_idl(self, txn):"},{"line_number":62,"context_line":"        lsp \u003d self.api.lookup(\u0027Logical_Switch_Port\u0027, self.localnet_lsp_name)"},{"line_number":63,"context_line":"        ls \u003d self._find_parent_switch(lsp)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        for port in ls.ports:"},{"line_number":66,"context_line":"            if port.type \u003d\u003d ovn_const.LSP_TYPE_ROUTER:"}],"source_content_type":"text/x-python","patch_set":5,"id":"73bf752d_b7920b4b","line":63,"range":{"start_line":63,"start_character":8,"end_line":63,"end_character":12},"in_reply_to":"a384795f_ee60f47f","updated":"2026-05-21 18:46:13.000000000","message":"Done","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ec4e6e433230eccc0a1de82fc76cc584a4420b40","unresolved":true,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        for port in ls.ports:"},{"line_number":66,"context_line":"            if port.type \u003d\u003d ovn_const.LSP_TYPE_ROUTER:"},{"line_number":67,"context_line":"                lrp_name \u003d port.options.get(\u0027router-port\u0027)"},{"line_number":68,"context_line":"                if not lrp_name:"},{"line_number":69,"context_line":"                    continue"},{"line_number":70,"context_line":"                lrp \u003d self.api.lookup(\u0027Logical_Router_Port\u0027, lrp_name)"},{"line_number":71,"context_line":"                self.result \u003d lrp.mac"},{"line_number":72,"context_line":"                return"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"d3d38e20_40569e73","line":70,"range":{"start_line":67,"start_character":16,"end_line":70,"end_character":70},"updated":"2026-05-21 08:27:00.000000000","message":"question: this localnet is the BGP external network? don\u0027t we have each compute local LR connected to this network?\n\nFor sure I\u0027m missing something here.","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a1ab7cdf8078cd1306855d1b6c420b7c82b8f449","unresolved":true,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        for port in ls.ports:"},{"line_number":66,"context_line":"            if port.type \u003d\u003d ovn_const.LSP_TYPE_ROUTER:"},{"line_number":67,"context_line":"                lrp_name \u003d port.options.get(\u0027router-port\u0027)"},{"line_number":68,"context_line":"                if not lrp_name:"},{"line_number":69,"context_line":"                    continue"},{"line_number":70,"context_line":"                lrp \u003d self.api.lookup(\u0027Logical_Router_Port\u0027, lrp_name)"},{"line_number":71,"context_line":"                self.result \u003d lrp.mac"},{"line_number":72,"context_line":"                return"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"0fe7d202_625eb021","line":70,"range":{"start_line":67,"start_character":16,"end_line":70,"end_character":70},"in_reply_to":"d3d38e20_40569e73","updated":"2026-05-21 12:05:09.000000000","message":"The localnet we pass in as an argument and store on L51 is the localnet on ls-inter-public https://opendev.org/openstack/neutron-specs/src/branch/master/images/ovn-bgp-topology.jpg\n\nAnd we need to get a MAC address of the \"LRP - ls-public GW\" from the diagram. So egress all traffic coming from the \"Neutron world\" (ls-public) to the \"br-bgp\" (aka br-ex) should go to the \"BGP distributed router\" because it needs to enter the BGP world.","commit_id":"0830fac790170d4e5825945fa059d9c91a446ac9"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"40ec3d38f2c959b37e29076ed09e20c00c05b330","unresolved":true,"context_lines":[{"line_number":20,"context_line":"from neutron.common.ovn import constants as ovn_const"},{"line_number":21,"context_line":"from neutron.services.bgp import constants"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class SetChassisBgpBridgesCommand(ovs_cmd.BaseCommand):"}],"source_content_type":"text/x-python","patch_set":6,"id":"4b0ba25c_9f877dfd","line":23,"updated":"2026-05-27 22:57:33.000000000","message":"nit: unused, but pep8 doesn\u0027t seem to care.","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"33e01749556ed6c65808c4db368707c2f089d392","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from neutron.common.ovn import constants as ovn_const"},{"line_number":21,"context_line":"from neutron.services.bgp import constants"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class SetChassisBgpBridgesCommand(ovs_cmd.BaseCommand):"}],"source_content_type":"text/x-python","patch_set":6,"id":"417630cf_e8b6c181","line":23,"in_reply_to":"4b0ba25c_9f877dfd","updated":"2026-05-28 15:47:10.000000000","message":"Done","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"}],"neutron/agent/ovn/extensions/bgp/events.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"40ec3d38f2c959b37e29076ed09e20c00c05b330","unresolved":true,"context_lines":[{"line_number":332,"context_line":"            return False"},{"line_number":333,"context_line":"        old_br \u003d old.external_ids.get(constants.AGENT_BGP_INTERCONNECT_BRIDGE)"},{"line_number":334,"context_line":"        new_br \u003d row.external_ids.get(constants.AGENT_BGP_INTERCONNECT_BRIDGE)"},{"line_number":335,"context_line":"        return old_br !\u003d new_br"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def run(self, event, row, old):"},{"line_number":338,"context_line":"        name \u003d row.external_ids.get("}],"source_content_type":"text/x-python","patch_set":6,"id":"8e1bebed_77e282c9","line":335,"range":{"start_line":335,"start_character":15,"end_line":335,"end_character":31},"updated":"2026-05-27 22:57:33.000000000","message":"nit: since `run()` and `_get_interconnect_bridge_name()` make a point of calling `strip()` should the comparison also do so?","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"33e01749556ed6c65808c4db368707c2f089d392","unresolved":true,"context_lines":[{"line_number":332,"context_line":"            return False"},{"line_number":333,"context_line":"        old_br \u003d old.external_ids.get(constants.AGENT_BGP_INTERCONNECT_BRIDGE)"},{"line_number":334,"context_line":"        new_br \u003d row.external_ids.get(constants.AGENT_BGP_INTERCONNECT_BRIDGE)"},{"line_number":335,"context_line":"        return old_br !\u003d new_br"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def run(self, event, row, old):"},{"line_number":338,"context_line":"        name \u003d row.external_ids.get("}],"source_content_type":"text/x-python","patch_set":6,"id":"513fa163_819c5068","line":335,"range":{"start_line":335,"start_character":15,"end_line":335,"end_character":31},"in_reply_to":"8e1bebed_77e282c9","updated":"2026-05-28 15:47:10.000000000","message":"It should go to the previous patch.","commit_id":"c796380eae0d060f51037d479b1637d75f8734dc"}]}
