)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":true,"context_lines":[{"line_number":11,"context_line":"network to be marked as unexposed until the next sync interval"},{"line_number":12,"context_line":"(at which this could happen again)."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch proposes to keep track of when the sync method is acrive,"},{"line_number":15,"context_line":"so we do not cache invalid references in the is_ls_provider method,"},{"line_number":16,"context_line":"unless the sync method has initialized all the relevant routes."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"6893efbc_733f56a2","line":14,"range":{"start_line":14,"start_character":61,"end_line":14,"end_character":67},"updated":"2024-10-03 21:25:08.000000000","message":"nit: active","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[{"line_number":11,"context_line":"network to be marked as unexposed until the next sync interval"},{"line_number":12,"context_line":"(at which this could happen again)."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch proposes to keep track of when the sync method is acrive,"},{"line_number":15,"context_line":"so we do not cache invalid references in the is_ls_provider method,"},{"line_number":16,"context_line":"unless the sync method has initialized all the relevant routes."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"b2254864_e3adc719","line":14,"range":{"start_line":14,"start_character":61,"end_line":14,"end_character":67},"in_reply_to":"6893efbc_733f56a2","updated":"2024-10-04 09:24:03.000000000","message":"Done","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"0fd689374f4ed732cf4f47774ee09286d660e909","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8b189e13_a4919e0f","updated":"2024-09-03 11:39:00.000000000","message":"Should fix this related bug","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"33f9c4c4b414e65029f51316e6b967060a62f359","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"1bcd82e9_0953697f","updated":"2024-09-03 13:26:10.000000000","message":"Should we maybe also acquire a write lock for the watchers? (so the events would wait until sync is done?)\n\ne.g.\n```\ndef sync(self):\n    with watcher._SYNC_STATE_LOCK.write_lock():\n        self._sync()\n\ndef _sync(self):\n   ... (the original code ...\n```\n\nThis might prevent the run of an event while sync is running, but not yet the matching of an event.. so there is still room for race conditions on that end still..","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"3a4e05c8_c61e3ddc","updated":"2024-10-03 21:25:08.000000000","message":"Thanks for the patch and sorry it took so long :) I had to read a lot of code around to understand why bridge_dev can be None. I still don\u0027t understand why the modified method","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a7d521933259f3ca8e69992389f799522d782e76","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"6dab3251_e362fa4a","updated":"2024-10-03 21:27:00.000000000","message":"accidentally hit Enter when typing, sorry about that 😊\n\nThanks for the patch and sorry it took so long :) I had to read a lot of code around to understand why bridge_dev can be None. I still don\u0027t understand why the modified method accepts None as legitimate input and then returns bunch of Nones back. It seems the None could be coming from an erroneous state and in such case it may be ignored, I reflected that in the suggestion.","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"c8b3809b_10a8b672","in_reply_to":"6dab3251_e362fa4a","updated":"2024-10-04 09:24:03.000000000","message":"I personally do not expect it to happen, but this is adapted from before [1].\n\nAs the logical_switch in a lot of cases is fetched like `logical_switch \u003d port.external_ids.get(constants.OVN_LS_NAME_EXT_ID_KEY)`, the value _could_ be `None`.\n\nAnd since the method always returns a tuple of 3, we just return a bunch of Nones\n\n\n\n[1] https://opendev.org/openstack/ovn-bgp-agent/commit/31c241ce6cf98d8ac7bd7c3472da93dbf592cdb8","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"f3a62ed4b38843b2af50b53fb428c847d7801d0b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9583211f_8441a56a","updated":"2025-02-14 17:45:18.000000000","message":"LGTM - applied in sandbox and it seems that described issue went away","commit_id":"7d43e7ecfbc841cfea150d86caf1494135272766"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"b4d44e70_09b1db66","updated":"2024-10-04 09:24:03.000000000","message":"Thanks for your review, i\u0027ve adapted most of your comments 😊","commit_id":"7d43e7ecfbc841cfea150d86caf1494135272766"},{"author":{"_account_id":28619,"name":"Dmitriy Rabotyagov","email":"noonedeadpunk@gmail.com","username":"noonedeadpunk"},"change_message_id":"5de350374c048668dcca027bdaea49f9e5ad36bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e2d6d9a2_f009eaf8","updated":"2025-11-28 16:51:54.000000000","message":"I rebased to master and applied signed-off for the future rebases.\n\n@libosvar@redhat.com can we get some reviews on this one please?\n\nI am just going through cherry-picks we\u0027re using on production right now and that makes agent work as expected.","commit_id":"38501235fb826160aa96000e1181e611c9c16885"}],"ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":true,"context_lines":[{"line_number":533,"context_line":"            localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info("},{"line_number":534,"context_line":"                logical_switch)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"            if self._sync_done is False and bridge_dev is None:"},{"line_number":537,"context_line":"                # When the sync is running we might not have information"},{"line_number":538,"context_line":"                # about the bridge_dev yet, so we should not cache it unless"},{"line_number":539,"context_line":"                # the bridge_dev is found."}],"source_content_type":"text/x-python","patch_set":4,"id":"b1372dc1_e91d44ec","line":536,"range":{"start_line":536,"start_character":58,"end_line":536,"end_character":62},"updated":"2024-10-03 21:25:08.000000000","message":"I\u0027m failing to understand this condition - does it mean we don\u0027t want to cache this information in case the sync is on going AND the localnet port doesn\u0027t have `network_name` set or has it set to `None`? That\u0027s based on where the `bridge_dev` can be set to `None` which seems to be only in this place https://opendev.org/openstack/ovn-bgp-agent/src/commit/59ad44aca5fac502010914c547f40e7b0f201c29/ovn_bgp_agent/drivers/openstack/nb_ovn_bgp_driver.py#L320 ?","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":true,"context_lines":[{"line_number":533,"context_line":"            localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info("},{"line_number":534,"context_line":"                logical_switch)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"            if self._sync_done is False and bridge_dev is None:"},{"line_number":537,"context_line":"                # When the sync is running we might not have information"},{"line_number":538,"context_line":"                # about the bridge_dev yet, so we should not cache it unless"},{"line_number":539,"context_line":"                # the bridge_dev is found."}],"source_content_type":"text/x-python","patch_set":4,"id":"9e971c4d_f0e03346","line":536,"range":{"start_line":536,"start_character":44,"end_line":536,"end_character":62},"updated":"2024-10-03 21:25:08.000000000","message":"To my understanding the `bridge_dev` is a name from ovn-bridge mappings which can never be an empty string, so it might be better to be idiomatic here and also use `not bridge_dev`","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":true,"context_lines":[{"line_number":533,"context_line":"            localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info("},{"line_number":534,"context_line":"                logical_switch)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"            if self._sync_done is False and bridge_dev is None:"},{"line_number":537,"context_line":"                # When the sync is running we might not have information"},{"line_number":538,"context_line":"                # about the bridge_dev yet, so we should not cache it unless"},{"line_number":539,"context_line":"                # the bridge_dev is found."}],"source_content_type":"text/x-python","patch_set":4,"id":"e3ad1307_426d7824","line":536,"range":{"start_line":536,"start_character":15,"end_line":536,"end_character":39},"updated":"2024-10-03 21:25:08.000000000","message":"`not self._sync_done`","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[{"line_number":533,"context_line":"            localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info("},{"line_number":534,"context_line":"                logical_switch)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"            if self._sync_done is False and bridge_dev is None:"},{"line_number":537,"context_line":"                # When the sync is running we might not have information"},{"line_number":538,"context_line":"                # about the bridge_dev yet, so we should not cache it unless"},{"line_number":539,"context_line":"                # the bridge_dev is found."}],"source_content_type":"text/x-python","patch_set":4,"id":"34bbfe4e_b94c4179","line":536,"range":{"start_line":536,"start_character":44,"end_line":536,"end_character":62},"in_reply_to":"9e971c4d_f0e03346","updated":"2024-10-04 09:24:03.000000000","message":"sure, fine with that.","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":true,"context_lines":[{"line_number":533,"context_line":"            localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info("},{"line_number":534,"context_line":"                logical_switch)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"            if self._sync_done is False and bridge_dev is None:"},{"line_number":537,"context_line":"                # When the sync is running we might not have information"},{"line_number":538,"context_line":"                # about the bridge_dev yet, so we should not cache it unless"},{"line_number":539,"context_line":"                # the bridge_dev is found."}],"source_content_type":"text/x-python","patch_set":4,"id":"c175dad7_e3ac9ed5","line":536,"range":{"start_line":536,"start_character":58,"end_line":536,"end_character":62},"in_reply_to":"b1372dc1_e91d44ec","updated":"2024-10-04 09:24:03.000000000","message":"It is a bit elaborate, but here it goes 😊\n\nbridge_dev is a fetched from an internal dictionary (`self.ovn_bridge_mappings`), that is emptied and re-populated during the `sync` method by using the output when calling `wire_utils.ensure_base_wiring_config`.\n\nIf an event comes by, which calls is_ls_provider (e.g. `LogicalSwitchPortProviderCreateEvent:match_fn`, which could be triggered by any `Logical_Switch_Port` update), then it would look it up in the internal dict. \n\nIf this internal dict is unpopulated/empty (which it is when `sync` is started and `wire_utils.ensure_base_wiring_config` has not finished yet), bridge_dev would be None and we do _not_ want to cache this result.\n\nIf we would cache this result, then any consecutive call to is_ls_provider for a the same logical_switch will return this None result, basically telling the code to ignore this logical switch for any exposure.\n\n\nSo what happened in our env in some rare cases, is that when a sync ran (because of the sync_interval), an event came along, it cached the faulty bridge_dev None for a provider network, and any exposed ip for that provider network was removed because of the cleanup in the final stage.\n\nIt took some time to figure out that this race condition was the culprit, so i hope this explanation makes sense 😊","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"6cefbbdc5b8efc9f731b2d048c8110330e67dd50","unresolved":false,"context_lines":[{"line_number":533,"context_line":"            localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info("},{"line_number":534,"context_line":"                logical_switch)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"            if self._sync_done is False and bridge_dev is None:"},{"line_number":537,"context_line":"                # When the sync is running we might not have information"},{"line_number":538,"context_line":"                # about the bridge_dev yet, so we should not cache it unless"},{"line_number":539,"context_line":"                # the bridge_dev is found."}],"source_content_type":"text/x-python","patch_set":4,"id":"c97694b6_d4927897","line":536,"range":{"start_line":536,"start_character":58,"end_line":536,"end_character":62},"in_reply_to":"c175dad7_e3ac9ed5","updated":"2025-01-29 08:55:29.000000000","message":"Done","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[{"line_number":533,"context_line":"            localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info("},{"line_number":534,"context_line":"                logical_switch)"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"            if self._sync_done is False and bridge_dev is None:"},{"line_number":537,"context_line":"                # When the sync is running we might not have information"},{"line_number":538,"context_line":"                # about the bridge_dev yet, so we should not cache it unless"},{"line_number":539,"context_line":"                # the bridge_dev is found."}],"source_content_type":"text/x-python","patch_set":4,"id":"8b523d8f_21904cba","line":536,"range":{"start_line":536,"start_character":15,"end_line":536,"end_character":39},"in_reply_to":"e3ad1307_426d7824","updated":"2024-10-04 09:24:03.000000000","message":"fine by me.","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":true,"context_lines":[{"line_number":546,"context_line":"            }"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"        ls \u003d self.ovn_provider_ls[logical_switch]"},{"line_number":549,"context_line":"        return ls[\u0027localnet\u0027], ls[\u0027bridge_device\u0027], ls[\u0027bridge_vlan\u0027]"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def _get_ls_localnet_info(self, logical_switch):"},{"line_number":552,"context_line":"        localnet_ports \u003d self.nb_idl.ls_get_localnet_ports("}],"source_content_type":"text/x-python","patch_set":4,"id":"e56d3dcf_10918904","line":549,"updated":"2024-10-03 21:25:08.000000000","message":"I\u0027m thinking if the whole method should be rewritten with the opposite logic - get the cached info and if it\u0027s not there, obtain it and cache it.\n```\ntry:\n    ls \u003d self.ovn_provider_ls[logical_switch]\nexcept KeyError:\n    localnet, bridge_dev, bridge_vlan \u003d self._get_ls_localnet_info(\n        logical_switch)\n    if self._sync_done:\n        self.ovn_provider_ls[logical_switch] \u003d {\n            \u0027bridge_device\u0027: bridge_dev,\n            \u0027bridge_vlan\u0027: bridge_vlan,\n            \u0027localnet\u0027: localnet,\n        }        \nelse:\n    localnet, bridge_dev, bridge_vlan \u003d (ls[\u0027localnet\u0027], ls[\u0027bridge_device\u0027],\n        ls[\u0027bridge_vlan\u0027])\n        \nreturn localnet, bridge_dev, bridge_vlan\n```","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[{"line_number":546,"context_line":"            }"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"        ls \u003d self.ovn_provider_ls[logical_switch]"},{"line_number":549,"context_line":"        return ls[\u0027localnet\u0027], ls[\u0027bridge_device\u0027], ls[\u0027bridge_vlan\u0027]"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def _get_ls_localnet_info(self, logical_switch):"},{"line_number":552,"context_line":"        localnet_ports \u003d self.nb_idl.ls_get_localnet_ports("}],"source_content_type":"text/x-python","patch_set":4,"id":"f6a0ec48_73cfcc58","line":549,"in_reply_to":"e56d3dcf_10918904","updated":"2024-10-04 09:24:03.000000000","message":"sure, i can adapt. Only difference i will be making, is that if the sync is not done yet, but it will return a valid bridge_dev, that we _do_ cache it.\n\nAs this method is also used during sync, it makes sense to cache it during sync method, as that would save on ovndb queries.","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"}],"ovn_bgp_agent/tests/unit/drivers/openstack/test_nb_ovn_bgp_driver.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":true,"context_lines":[{"line_number":464,"context_line":"            self.nb_bgp_driver._get_provider_ls_info(\u0027fake-ls\u0027))"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def test__get_provider_ls_info_during_sync(self):"},{"line_number":467,"context_line":"        _exec \u003d mock.Mock()"},{"line_number":468,"context_line":"        _exec.execute.return_value \u003d []"},{"line_number":469,"context_line":"        self.nb_bgp_driver.nb_idl.ls_get_localnet_ports.return_value \u003d _exec"},{"line_number":470,"context_line":"        self.nb_bgp_driver.ovn_provider_ls \u003d {}"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        result \u003d self.nb_bgp_driver._get_provider_ls_info(\u0027fake-ls\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"da7fda98_33f0f1b4","line":469,"range":{"start_line":467,"start_character":0,"end_line":469,"end_character":76},"updated":"2024-10-03 21:25:08.000000000","message":"```\n_exec \u003d self.nb_bgp_driver.nb_idl.ls_get_localnet_ports.return_value\n_exec.execute.return_value \u003d []\n```","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[{"line_number":464,"context_line":"            self.nb_bgp_driver._get_provider_ls_info(\u0027fake-ls\u0027))"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"    def test__get_provider_ls_info_during_sync(self):"},{"line_number":467,"context_line":"        _exec \u003d mock.Mock()"},{"line_number":468,"context_line":"        _exec.execute.return_value \u003d []"},{"line_number":469,"context_line":"        self.nb_bgp_driver.nb_idl.ls_get_localnet_ports.return_value \u003d _exec"},{"line_number":470,"context_line":"        self.nb_bgp_driver.ovn_provider_ls \u003d {}"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        result \u003d self.nb_bgp_driver._get_provider_ls_info(\u0027fake-ls\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"d48cc237_e3062842","line":469,"range":{"start_line":467,"start_character":0,"end_line":469,"end_character":76},"in_reply_to":"da7fda98_33f0f1b4","updated":"2024-10-04 09:24:03.000000000","message":"Done","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"f569b39b0790eb080ac9e0b5d4857cd6db13ff0b","unresolved":true,"context_lines":[{"line_number":468,"context_line":"        _exec.execute.return_value \u003d []"},{"line_number":469,"context_line":"        self.nb_bgp_driver.nb_idl.ls_get_localnet_ports.return_value \u003d _exec"},{"line_number":470,"context_line":"        self.nb_bgp_driver.ovn_provider_ls \u003d {}"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        result \u003d self.nb_bgp_driver._get_provider_ls_info(\u0027fake-ls\u0027)"},{"line_number":473,"context_line":"        self.assertEqual(result, (None, None, None))"},{"line_number":474,"context_line":"        self.assertNotIn(\u0027fake-ls\u0027, self.nb_bgp_driver.ovn_provider_ls)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3514969b_b9619aee","line":471,"updated":"2024-10-03 21:25:08.000000000","message":"I\u0027d explicitly set the sync to false here\n`self.nb_bgp_driver._sync_done \u003d False`\nto make the sync has not been done, even though it\u0027s already set.","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"},{"author":{"_account_id":25468,"name":"Michel Nederlof","email":"michel@nederlof.info","username":"pellucid"},"change_message_id":"c87d15d2f995644325fc32daa7fb2b7bf058f506","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        _exec.execute.return_value \u003d []"},{"line_number":469,"context_line":"        self.nb_bgp_driver.nb_idl.ls_get_localnet_ports.return_value \u003d _exec"},{"line_number":470,"context_line":"        self.nb_bgp_driver.ovn_provider_ls \u003d {}"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        result \u003d self.nb_bgp_driver._get_provider_ls_info(\u0027fake-ls\u0027)"},{"line_number":473,"context_line":"        self.assertEqual(result, (None, None, None))"},{"line_number":474,"context_line":"        self.assertNotIn(\u0027fake-ls\u0027, self.nb_bgp_driver.ovn_provider_ls)"}],"source_content_type":"text/x-python","patch_set":4,"id":"092e8a36_97ea38f3","line":471,"in_reply_to":"3514969b_b9619aee","updated":"2024-10-04 09:24:03.000000000","message":"Done","commit_id":"9ca2f82642e5302f5597eb4af5df1dbd42639d6b"}]}
