)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7d235c4e8a11647a0e9a49f3168940b2288852f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3026de40_56eaef34","updated":"2026-01-26 13:34:43.000000000","message":"check experimental","commit_id":"bbb81d8db90f274178d7b1b43c4fe3262f46cdf8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ded5cb71b7075e7c20d870147c94e534988e876b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c03ecb48_3f3ca2ce","updated":"2026-01-26 14:49:08.000000000","message":"recheck neutron-functional","commit_id":"bbb81d8db90f274178d7b1b43c4fe3262f46cdf8"}],"neutron/services/ovn_l3/ovsdb_monitor.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"86584497c389bf21a946c0d188937525088c86ac","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        super().__init__(events, table, None)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":42,"context_line":"        print(\u0027RAH: called match_fn\u0027)"},{"line_number":43,"context_line":"        ls_name \u003d row.external_ids.get(ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY)"},{"line_number":44,"context_line":"        lr_name \u003d row.external_ids.get(ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":45,"context_line":"        if not ls_name or not lr_name:"}],"source_content_type":"text/x-python","patch_set":2,"id":"682967a9_8dae0c3a","line":42,"updated":"2026-01-27 19:11:08.000000000","message":"I do not think we need this print :)","commit_id":"4c6eb1fed098f320e125acdbdcfcc6286fd953e8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d27df88f000ca629bd3696b52b87364c6c11caea","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super().__init__(events, table, None)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":42,"context_line":"        print(\u0027RAH: called match_fn\u0027)"},{"line_number":43,"context_line":"        ls_name \u003d row.external_ids.get(ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY)"},{"line_number":44,"context_line":"        lr_name \u003d row.external_ids.get(ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":45,"context_line":"        if not ls_name or not lr_name:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a0ae414_34f41a39","line":42,"in_reply_to":"682967a9_8dae0c3a","updated":"2026-01-29 08:44:19.000000000","message":"Done","commit_id":"4c6eb1fed098f320e125acdbdcfcc6286fd953e8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"86584497c389bf21a946c0d188937525088c86ac","unresolved":true,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":42,"context_line":"        print(\u0027RAH: called match_fn\u0027)"},{"line_number":43,"context_line":"        ls_name \u003d row.external_ids.get(ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY)"},{"line_number":44,"context_line":"        lr_name \u003d row.external_ids.get(ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":45,"context_line":"        if not ls_name or not lr_name:"},{"line_number":46,"context_line":"            # The Logical_Router_Port doesn\u0027t have the Neutron owned resources"},{"line_number":47,"context_line":"            # external_ids (\"neutron:network_name\", \"neutron:router_name\")."},{"line_number":48,"context_line":"            return False"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        if event \u003d\u003d self.ROW_DELETE:"},{"line_number":51,"context_line":"            # Check if the LR has another port in the same network. If that is"}],"source_content_type":"text/x-python","patch_set":2,"id":"95ead23a_b50f3725","line":48,"range":{"start_line":43,"start_character":0,"end_line":48,"end_character":24},"updated":"2026-01-27 19:11:08.000000000","message":"Suggestion: Since we do not care about the value in this patch and the values are considered later, the try-except may fit here better, just wrap the original code:\n```\ntry:\n    ls_name \u003d row.external_ids[ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY]\n    lr_name \u003d row.external_ids[ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY]\nexcept KeyError:\n    return False\n```","commit_id":"4c6eb1fed098f320e125acdbdcfcc6286fd953e8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d27df88f000ca629bd3696b52b87364c6c11caea","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":42,"context_line":"        print(\u0027RAH: called match_fn\u0027)"},{"line_number":43,"context_line":"        ls_name \u003d row.external_ids.get(ovn_const.OVN_NETWORK_NAME_EXT_ID_KEY)"},{"line_number":44,"context_line":"        lr_name \u003d row.external_ids.get(ovn_const.OVN_ROUTER_NAME_EXT_ID_KEY)"},{"line_number":45,"context_line":"        if not ls_name or not lr_name:"},{"line_number":46,"context_line":"            # The Logical_Router_Port doesn\u0027t have the Neutron owned resources"},{"line_number":47,"context_line":"            # external_ids (\"neutron:network_name\", \"neutron:router_name\")."},{"line_number":48,"context_line":"            return False"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        if event \u003d\u003d self.ROW_DELETE:"},{"line_number":51,"context_line":"            # Check if the LR has another port in the same network. If that is"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4d5296_f5ac435b","line":48,"range":{"start_line":43,"start_character":0,"end_line":48,"end_character":24},"in_reply_to":"95ead23a_b50f3725","updated":"2026-01-29 08:44:19.000000000","message":"Done","commit_id":"4c6eb1fed098f320e125acdbdcfcc6286fd953e8"}],"neutron/tests/functional/services/ovn_l3/test_ovsdb_monitor.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"c82dff3481f6bf5616eba92ae81698b8988dc329","unresolved":true,"context_lines":[{"line_number":136,"context_line":"            except AssertionError:"},{"line_number":137,"context_line":"                return False"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        # Remove the ``Logical_Router.external_ids`` router ID. This router"},{"line_number":140,"context_line":"        # now doesn\u0027t have a link to a Neutron router."},{"line_number":141,"context_line":"        self.l3_plugin._nb_ovn.db_remove("},{"line_number":142,"context_line":"            \u0027Logical_Router_Port\u0027, self.router_id, \u0027external_ids\u0027,"},{"line_number":143,"context_line":"            ovn_constants.OVN_ROUTER_NAME_EXT_ID_KEY, if_exists\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e2c8ab4f_f0471e31","line":140,"range":{"start_line":139,"start_character":0,"end_line":140,"end_character":54},"updated":"2026-01-27 16:35:05.000000000","message":"nit: This comment is not clear to me without the context of this patch.\nMaybe:\n```\n# Remove the ``OVN_ROUTER_NAME_EXT_ID_KEY`` from the router LRP to simulate\n# a OVN router not created by Neutron.\n```","commit_id":"bbb81d8db90f274178d7b1b43c4fe3262f46cdf8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8c3ff343bc417373a3ed01c9c1955ac0a76e8ed8","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            except AssertionError:"},{"line_number":137,"context_line":"                return False"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        # Remove the ``Logical_Router.external_ids`` router ID. This router"},{"line_number":140,"context_line":"        # now doesn\u0027t have a link to a Neutron router."},{"line_number":141,"context_line":"        self.l3_plugin._nb_ovn.db_remove("},{"line_number":142,"context_line":"            \u0027Logical_Router_Port\u0027, self.router_id, \u0027external_ids\u0027,"},{"line_number":143,"context_line":"            ovn_constants.OVN_ROUTER_NAME_EXT_ID_KEY, if_exists\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ec26d931_e95d9395","line":140,"range":{"start_line":139,"start_character":0,"end_line":140,"end_character":54},"in_reply_to":"10959a70_71675d02","updated":"2026-01-29 09:41:19.000000000","message":"Done","commit_id":"bbb81d8db90f274178d7b1b43c4fe3262f46cdf8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"86584497c389bf21a946c0d188937525088c86ac","unresolved":true,"context_lines":[{"line_number":136,"context_line":"            except AssertionError:"},{"line_number":137,"context_line":"                return False"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        # Remove the ``Logical_Router.external_ids`` router ID. This router"},{"line_number":140,"context_line":"        # now doesn\u0027t have a link to a Neutron router."},{"line_number":141,"context_line":"        self.l3_plugin._nb_ovn.db_remove("},{"line_number":142,"context_line":"            \u0027Logical_Router_Port\u0027, self.router_id, \u0027external_ids\u0027,"},{"line_number":143,"context_line":"            ovn_constants.OVN_ROUTER_NAME_EXT_ID_KEY, if_exists\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"10959a70_71675d02","line":140,"range":{"start_line":139,"start_character":0,"end_line":140,"end_character":54},"in_reply_to":"e2c8ab4f_f0471e31","updated":"2026-01-27 19:11:08.000000000","message":"The comment makes sense in the context of the test name though","commit_id":"bbb81d8db90f274178d7b1b43c4fe3262f46cdf8"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"86584497c389bf21a946c0d188937525088c86ac","unresolved":true,"context_lines":[{"line_number":127,"context_line":"            self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":128,"context_line":"                              is_called, timeout\u003d5)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_event_router_not_in_the_neutron_db(self):"},{"line_number":131,"context_line":"        def is_called():"},{"line_number":132,"context_line":"            try:"},{"line_number":133,"context_line":"                mock_link.assert_called_once_with("},{"line_number":134,"context_line":"                    mock.ANY, self.net_ext_id, self.router_id)"},{"line_number":135,"context_line":"                return True"},{"line_number":136,"context_line":"            except AssertionError:"},{"line_number":137,"context_line":"                return False"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        with mock.patch.object("},{"line_number":140,"context_line":"                self.l3_plugin._ovn_client,"},{"line_number":141,"context_line":"                \u0027link_network_ha_chassis_group\u0027) as mock_link,\\"},{"line_number":142,"context_line":"                mock.patch.object("},{"line_number":143,"context_line":"                self.l3_plugin._ovn_client,"},{"line_number":144,"context_line":"                \u0027_gen_router_port_ext_ids\u0027) as mock_port_options:"},{"line_number":145,"context_line":"            # If ``_gen_router_port_ext_ids`` is mocked, no external_ids keys"},{"line_number":146,"context_line":"            # will be added; the Logical_Router_Port will be like an externally"},{"line_number":147,"context_line":"            # managed port, not a Neutron resource."},{"line_number":148,"context_line":"            mock_port_options.return_value \u003d {}"},{"line_number":149,"context_line":"            self._router_interface_action("},{"line_number":150,"context_line":"                \u0027add\u0027, self.router_id, self.subnet_id, None)"},{"line_number":151,"context_line":"            self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":152,"context_line":"                              is_called, timeout\u003d10)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class TestLogicalRouterPortGatewayChassisEvent("}],"source_content_type":"text/x-python","patch_set":2,"id":"7fdf225e_3db5964b","line":152,"range":{"start_line":130,"start_character":0,"end_line":152,"end_character":52},"updated":"2026-01-27 19:11:08.000000000","message":"This is imho not a functional test. I understand it keeps up with the code above but I would say we should not extend on the above as the tests are terrible and don\u0027t actually test anything or belong to unittests directory at best.\n\nWhat we should do here is to have an empty OVN NB DB and create a router in the setUp().\n\nThen have two tests, one that creates the logical router port without the external IDS set but everything else should be matched.\nThen do the same as above and delete the LRP. The test can just make sure the run_idl was not executed.","commit_id":"4c6eb1fed098f320e125acdbdcfcc6286fd953e8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d27df88f000ca629bd3696b52b87364c6c11caea","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":128,"context_line":"                              is_called, timeout\u003d5)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_event_router_not_in_the_neutron_db(self):"},{"line_number":131,"context_line":"        def is_called():"},{"line_number":132,"context_line":"            try:"},{"line_number":133,"context_line":"                mock_link.assert_called_once_with("},{"line_number":134,"context_line":"                    mock.ANY, self.net_ext_id, self.router_id)"},{"line_number":135,"context_line":"                return True"},{"line_number":136,"context_line":"            except AssertionError:"},{"line_number":137,"context_line":"                return False"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        with mock.patch.object("},{"line_number":140,"context_line":"                self.l3_plugin._ovn_client,"},{"line_number":141,"context_line":"                \u0027link_network_ha_chassis_group\u0027) as mock_link,\\"},{"line_number":142,"context_line":"                mock.patch.object("},{"line_number":143,"context_line":"                self.l3_plugin._ovn_client,"},{"line_number":144,"context_line":"                \u0027_gen_router_port_ext_ids\u0027) as mock_port_options:"},{"line_number":145,"context_line":"            # If ``_gen_router_port_ext_ids`` is mocked, no external_ids keys"},{"line_number":146,"context_line":"            # will be added; the Logical_Router_Port will be like an externally"},{"line_number":147,"context_line":"            # managed port, not a Neutron resource."},{"line_number":148,"context_line":"            mock_port_options.return_value \u003d {}"},{"line_number":149,"context_line":"            self._router_interface_action("},{"line_number":150,"context_line":"                \u0027add\u0027, self.router_id, self.subnet_id, None)"},{"line_number":151,"context_line":"            self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":152,"context_line":"                              is_called, timeout\u003d10)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"class TestLogicalRouterPortGatewayChassisEvent("}],"source_content_type":"text/x-python","patch_set":2,"id":"99dbd9b0_ac9f6f95","line":152,"range":{"start_line":130,"start_character":0,"end_line":152,"end_character":52},"in_reply_to":"7fdf225e_3db5964b","updated":"2026-01-29 08:44:19.000000000","message":"Only the FT FW has the capability to spawn an OVN DB.\n\nThis class tries to use the Neutron API to build the resources. That is better, in terms of coverage, than just creating single OVN resources. It is not the first time we miss something that is actually done in the API.\n\nThe upper tests force the event trigger. By mocking the `run` methods I\u0027m just ensuring we are getting into the event and following the correct path.\n\nWhen I implemented the upper tests, I tried to cover all possible code branches in the OVN event: creation and deletion, normal LRPs and GW LRPs.\n\nAlthough because the new test should create non API resources, it makes sense to just manually create the LRPs. I\u0027ll refactor the test.","commit_id":"4c6eb1fed098f320e125acdbdcfcc6286fd953e8"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8733bfe6b67e9193a2e00e232bb71b7ae0137070","unresolved":true,"context_lines":[{"line_number":158,"context_line":"                self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":159,"context_line":"                                  mock_link_called, timeout\u003d5)"},{"line_number":160,"context_line":"                self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":161,"context_line":"                                  mock_update_router_called, timeout\u003d2)"},{"line_number":162,"context_line":"            except AssertionError as exc:"},{"line_number":163,"context_line":"                print(exc)"},{"line_number":164,"context_line":"                raise exc"}],"source_content_type":"text/x-python","patch_set":4,"id":"440b3fcd_af1da7a4","line":161,"updated":"2026-01-29 21:13:59.000000000","message":"Do these even need to be under a try/except?","commit_id":"c412644d5262898df63adb7ac313ebc9ca6d3d85"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7da38650f31bfe0a41d43807ebdd672578db6314","unresolved":false,"context_lines":[{"line_number":158,"context_line":"                self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":159,"context_line":"                                  mock_link_called, timeout\u003d5)"},{"line_number":160,"context_line":"                self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":161,"context_line":"                                  mock_update_router_called, timeout\u003d2)"},{"line_number":162,"context_line":"            except AssertionError as exc:"},{"line_number":163,"context_line":"                print(exc)"},{"line_number":164,"context_line":"                raise exc"}],"source_content_type":"text/x-python","patch_set":4,"id":"ac65918b_eebbb421","line":161,"in_reply_to":"440b3fcd_af1da7a4","updated":"2026-01-30 08:16:56.000000000","message":"Nope, my bad","commit_id":"c412644d5262898df63adb7ac313ebc9ca6d3d85"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8733bfe6b67e9193a2e00e232bb71b7ae0137070","unresolved":true,"context_lines":[{"line_number":160,"context_line":"                self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":161,"context_line":"                                  mock_update_router_called, timeout\u003d2)"},{"line_number":162,"context_line":"            except AssertionError as exc:"},{"line_number":163,"context_line":"                print(exc)"},{"line_number":164,"context_line":"                raise exc"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def test_remove_lrp_not_in_the_neutron_db(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"33e4de0e_85f8d150","line":163,"updated":"2026-01-29 21:13:59.000000000","message":"leftover debug?","commit_id":"c412644d5262898df63adb7ac313ebc9ca6d3d85"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7da38650f31bfe0a41d43807ebdd672578db6314","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                self.assertRaises(n_utils.WaitTimeout, n_utils.wait_until_true,"},{"line_number":161,"context_line":"                                  mock_update_router_called, timeout\u003d2)"},{"line_number":162,"context_line":"            except AssertionError as exc:"},{"line_number":163,"context_line":"                print(exc)"},{"line_number":164,"context_line":"                raise exc"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def test_remove_lrp_not_in_the_neutron_db(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"82fbc6ce_c3fa4961","line":163,"in_reply_to":"33e4de0e_85f8d150","updated":"2026-01-30 08:16:56.000000000","message":"Yeah... sorry","commit_id":"c412644d5262898df63adb7ac313ebc9ca6d3d85"}]}
