)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a701e73b429c81bc4fec9781b345051aa256d892","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8f588ada_10480b09","updated":"2025-11-05 15:20:21.000000000","message":"Sof -1, just for the questions.","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b9bc852ccd317f1718eb5b490e3f69fd683e0551","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e0f648c4_8400438e","updated":"2025-12-11 13:20:42.000000000","message":"LGTM but please rebase it","commit_id":"81658d299b21cda535b623be560857240eb00498"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"417d4cf50735157ab98d2df976c63c5cb65d036c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"7e8e2ef9_d54dbd77","updated":"2026-01-26 08:11:17.000000000","message":"recheck neutron-functional","commit_id":"682ac7f580ce88f2ac3fb3e5330ec90a805e4d7b"}],"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":"a701e73b429c81bc4fec9781b345051aa256d892","unresolved":true,"context_lines":[{"line_number":26,"context_line":"def _get_external_ids_list(row, key):"},{"line_number":27,"context_line":"    try:"},{"line_number":28,"context_line":"        value \u003d row.external_ids[key]"},{"line_number":29,"context_line":"    except KeyError:"},{"line_number":30,"context_line":"        return []"},{"line_number":31,"context_line":"    except AttributeError:"},{"line_number":32,"context_line":"        return []"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    if not value:"},{"line_number":35,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":3,"id":"e8ade66f_d17b60d5","line":32,"range":{"start_line":29,"start_character":4,"end_line":32,"end_character":17},"updated":"2025-11-05 15:20:21.000000000","message":"nit: `except (KeyError, AttributeError):`","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d2b982e543e56e14c49c1f3e9c25fcc1c53628e0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"def _get_external_ids_list(row, key):"},{"line_number":27,"context_line":"    try:"},{"line_number":28,"context_line":"        value \u003d row.external_ids[key]"},{"line_number":29,"context_line":"    except KeyError:"},{"line_number":30,"context_line":"        return []"},{"line_number":31,"context_line":"    except AttributeError:"},{"line_number":32,"context_line":"        return []"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    if not value:"},{"line_number":35,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":3,"id":"8bd777d1_d90f4210","line":32,"range":{"start_line":29,"start_character":4,"end_line":32,"end_character":17},"in_reply_to":"e8ade66f_d17b60d5","updated":"2025-11-05 23:34:00.000000000","message":"Done","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a701e73b429c81bc4fec9781b345051aa256d892","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def run(self, event, row, old):"},{"line_number":96,"context_line":"        desired_mappings \u003d self._get_desired_mappings(row, old)"},{"line_number":97,"context_line":"        ovsdb.set_ovn_bridge_mapping("},{"line_number":98,"context_line":"            self.agent_api.ovs_idl, desired_mappings)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"class CreateLocalOVSEvent(LocalOVSEvent):"}],"source_content_type":"text/x-python","patch_set":3,"id":"38df6c07_050d72a4","line":98,"range":{"start_line":97,"start_character":8,"end_line":98,"end_character":53},"updated":"2025-11-05 15:20:21.000000000","message":"So any change in the physical devices will be mapped into the OVS openvswitch register now, right?","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d2b982e543e56e14c49c1f3e9c25fcc1c53628e0","unresolved":true,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def run(self, event, row, old):"},{"line_number":96,"context_line":"        desired_mappings \u003d self._get_desired_mappings(row, old)"},{"line_number":97,"context_line":"        ovsdb.set_ovn_bridge_mapping("},{"line_number":98,"context_line":"            self.agent_api.ovs_idl, desired_mappings)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"class CreateLocalOVSEvent(LocalOVSEvent):"}],"source_content_type":"text/x-python","patch_set":3,"id":"974d0713_1701968e","line":98,"range":{"start_line":97,"start_character":8,"end_line":98,"end_character":53},"in_reply_to":"38df6c07_050d72a4","updated":"2025-11-05 23:34:00.000000000","message":"The LocalOVSEvet is not watched by the notifier, only inherited on L101 and L111.\n\nCreateLocalOVSEvent is when we connect to the db and configures the bridge mappings if the bgp-bridges are configured in OVS.\n\nUpdateLocalOVSEvent monitors the changes and if a bgp-bridge is added or removed, it updates the ovn-bridge-mappings accordingly because OVN needs to create patch ports between br-int and the bgp bridges.","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2f9c5cd7e334a1061374fb1fa02d84f0d090141f","unresolved":true,"context_lines":[{"line_number":33,"context_line":"        return []"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    return [stripped for item in value.split(\u0027,\u0027)"},{"line_number":36,"context_line":"            if (stripped :\u003d item.strip())]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def _get_bgp_peer_bridges(row):"}],"source_content_type":"text/x-python","patch_set":11,"id":"2f868b5f_271a01ba","line":36,"updated":"2026-01-23 08:31:49.000000000","message":"I didn\u0027t know about this assignement operator in python, thx for that 😊","commit_id":"682ac7f580ce88f2ac3fb3e5330ec90a805e4d7b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a3aaefeb5cac0db6e683521e012498b3f0a65ab9","unresolved":true,"context_lines":[{"line_number":33,"context_line":"        return []"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    return [stripped for item in value.split(\u0027,\u0027)"},{"line_number":36,"context_line":"            if (stripped :\u003d item.strip())]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def _get_bgp_peer_bridges(row):"}],"source_content_type":"text/x-python","patch_set":11,"id":"7bccc54d_20baa42d","line":36,"in_reply_to":"0b99e0ba_90b9773d","updated":"2026-01-23 12:55:06.000000000","message":"Yeah :) The credit goes to Terry - he taught me it here https://review.opendev.org/c/openstack/neutron/+/960422/22..24/neutron/services/bgp/helpers.py#b56","commit_id":"682ac7f580ce88f2ac3fb3e5330ec90a805e4d7b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"f286b2130282774b4e577d5f84510c2f19489adf","unresolved":true,"context_lines":[{"line_number":33,"context_line":"        return []"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    return [stripped for item in value.split(\u0027,\u0027)"},{"line_number":36,"context_line":"            if (stripped :\u003d item.strip())]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def _get_bgp_peer_bridges(row):"}],"source_content_type":"text/x-python","patch_set":11,"id":"0b99e0ba_90b9773d","line":36,"in_reply_to":"2f868b5f_271a01ba","updated":"2026-01-23 10:27:49.000000000","message":"I remembered because it is the walrus operator and those are funny 😊","commit_id":"682ac7f580ce88f2ac3fb3e5330ec90a805e4d7b"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"4e97a4fe7c719f9f471f41d1c16a9a53274862b0","unresolved":true,"context_lines":[{"line_number":33,"context_line":"        return []"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    return [stripped for item in value.split(\u0027,\u0027)"},{"line_number":36,"context_line":"            if (stripped :\u003d item.strip())]"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"def _get_bgp_peer_bridges(row):"}],"source_content_type":"text/x-python","patch_set":11,"id":"089154fc_956bb604","line":36,"in_reply_to":"7bccc54d_20baa42d","updated":"2026-01-23 15:58:48.000000000","message":"Terry ++ , i also learned about it from another patch where he mentioned it. 😊","commit_id":"682ac7f580ce88f2ac3fb3e5330ec90a805e4d7b"}],"neutron/tests/functional/agent/ovn/extensions/bgp/test_events.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a701e73b429c81bc4fec9781b345051aa256d892","unresolved":true,"context_lines":[{"line_number":206,"context_line":"            \u0027Open_vSwitch\u0027, \u0027.\u0027,"},{"line_number":207,"context_line":"            external_ids\u003d{\u0027bgp-peer-bridges\u0027: \u0027br-bgp-1,br-bgp-2\u0027}"},{"line_number":208,"context_line":"        ).execute(check_error\u003dTrue)"},{"line_number":209,"context_line":"        self.trigger_event()"},{"line_number":210,"context_line":"        expected_bridge_mappings \u003d [\u0027br-bgp-1:br-bgp-1\u0027, \u0027br-bgp-2:br-bgp-2\u0027]"},{"line_number":211,"context_line":"        self._verify_bridge_mappings(expected_bridge_mappings)"},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"a674ab31_13f4b739","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":28},"updated":"2025-11-05 15:20:21.000000000","message":"That connection restart should trigger the creation event of all registered tables. But are we sure we are calling `CreateLocalOVSEvent`? I mean, the OVS database will be populated after the reconnection but do we actually know we are calling this event.\n\nFor sure, in the update tests we have new values updated and we can state the OVS openvswitch update method has been called.","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"f65e24d1cec814e53008c8383fdcd83f73261cd0","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            \u0027Open_vSwitch\u0027, \u0027.\u0027,"},{"line_number":207,"context_line":"            external_ids\u003d{\u0027bgp-peer-bridges\u0027: \u0027br-bgp-1,br-bgp-2\u0027}"},{"line_number":208,"context_line":"        ).execute(check_error\u003dTrue)"},{"line_number":209,"context_line":"        self.trigger_event()"},{"line_number":210,"context_line":"        expected_bridge_mappings \u003d [\u0027br-bgp-1:br-bgp-1\u0027, \u0027br-bgp-2:br-bgp-2\u0027]"},{"line_number":211,"context_line":"        self._verify_bridge_mappings(expected_bridge_mappings)"},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1eedfe1e_c24ce715","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":28},"in_reply_to":"6a83ffe4_cb195b94","updated":"2026-01-22 15:34:06.000000000","message":"Mostly just informative. Honestly, seeing as this particular case is the \"ovs\" connection and not an ovn connection, the likelihood of an Open_vSwitch db being configured in cluster mode is pretty infinitesimal.","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"9063897af96b625fc5938a27f03281c731a72743","unresolved":true,"context_lines":[{"line_number":206,"context_line":"            \u0027Open_vSwitch\u0027, \u0027.\u0027,"},{"line_number":207,"context_line":"            external_ids\u003d{\u0027bgp-peer-bridges\u0027: \u0027br-bgp-1,br-bgp-2\u0027}"},{"line_number":208,"context_line":"        ).execute(check_error\u003dTrue)"},{"line_number":209,"context_line":"        self.trigger_event()"},{"line_number":210,"context_line":"        expected_bridge_mappings \u003d [\u0027br-bgp-1:br-bgp-1\u0027, \u0027br-bgp-2:br-bgp-2\u0027]"},{"line_number":211,"context_line":"        self._verify_bridge_mappings(expected_bridge_mappings)"},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"db9c5a7a_44c37342","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":28},"in_reply_to":"6d44f9b5_ced770d4","updated":"2026-01-21 21:57:38.000000000","message":"Just to be pedantically clear, restarting the connection without creating a new Idl will only cause the CREATE events to be re-emitted on non-clustered DBs (unless a bunch of txns have passed since last connect, at least) because clustered DBs use monitor_cond_since which will not dump the DBs when reconnecting.\n\nThis doesn\u0027t affect us in the current test environment, but if a test environment is set up against clustered DBs, we can\u0027t rely on the initial CREATE events except at the first connection.\n\nTo show the behavior, you can do a `make sandbox` in the ovn tree and run\n```\nfrom contextlib import contextmanager\nimport os\nfrom ovsdbapp.backend.ovs_idl import connection, event\nfrom ovsdbapp.schema.ovn_northbound import impl_idl\n\n\n@contextmanager\ndef wait_for_event(handler):\n    e \u003d event.WaitEvent((\"create\",), \"NB_Global\", None, timeout\u003d3)\n    handler.watch_event(e)\n    yield e\n    try:\n        e.result \u003d e.wait()\n    except Exception:\n        e.result \u003d False\n\n\nconn \u003d os.getenv(\"OVN_NB_DB\")\ni \u003d connection.OvsdbIdl.from_server(conn, \u0027OVN_Northbound\u0027)\nhandler \u003d event.RowEventHandler()\ni.notify \u003d handler.notify\nc \u003d connection.Connection(idl\u003di, timeout\u003d3)\n\nwith wait_for_event(handler) as e:\n    api \u003d impl_idl.OvnNbApiIdlImpl(c)\nprint(e.result)\n\nwith wait_for_event(handler) as e:\n    api.restart_connection()\nprint(e.result)\n```\nand see the behavior you expect, but if you do `SANDBOXFLAGS\u003d\"--nbdb-model\u003dclustered\" make sandbox` you\u0027ll see it fail.","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d2b982e543e56e14c49c1f3e9c25fcc1c53628e0","unresolved":true,"context_lines":[{"line_number":206,"context_line":"            \u0027Open_vSwitch\u0027, \u0027.\u0027,"},{"line_number":207,"context_line":"            external_ids\u003d{\u0027bgp-peer-bridges\u0027: \u0027br-bgp-1,br-bgp-2\u0027}"},{"line_number":208,"context_line":"        ).execute(check_error\u003dTrue)"},{"line_number":209,"context_line":"        self.trigger_event()"},{"line_number":210,"context_line":"        expected_bridge_mappings \u003d [\u0027br-bgp-1:br-bgp-1\u0027, \u0027br-bgp-2:br-bgp-2\u0027]"},{"line_number":211,"context_line":"        self._verify_bridge_mappings(expected_bridge_mappings)"},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"6d44f9b5_ced770d4","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":28},"in_reply_to":"a674ab31_13f4b739","updated":"2025-11-05 23:34:00.000000000","message":"That\u0027s what we\u0027re testing. The bridge mappings is not configured before we call `trigger_event()` because we run the test on an empty new database. If the `CreateLocalOVSEvent` is not called then the `_verify_bridge_mappings` should fail. Unless I\u0027m missing something.","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"d8720748b8bc7aa0fb6d15a511787ac270507b06","unresolved":true,"context_lines":[{"line_number":206,"context_line":"            \u0027Open_vSwitch\u0027, \u0027.\u0027,"},{"line_number":207,"context_line":"            external_ids\u003d{\u0027bgp-peer-bridges\u0027: \u0027br-bgp-1,br-bgp-2\u0027}"},{"line_number":208,"context_line":"        ).execute(check_error\u003dTrue)"},{"line_number":209,"context_line":"        self.trigger_event()"},{"line_number":210,"context_line":"        expected_bridge_mappings \u003d [\u0027br-bgp-1:br-bgp-1\u0027, \u0027br-bgp-2:br-bgp-2\u0027]"},{"line_number":211,"context_line":"        self._verify_bridge_mappings(expected_bridge_mappings)"},{"line_number":212,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"6a83ffe4_cb195b94","line":209,"range":{"start_line":209,"start_character":8,"end_line":209,"end_character":28},"in_reply_to":"db9c5a7a_44c37342","updated":"2026-01-22 13:18:23.000000000","message":"Are you suggesting I should change the test to create a new IDL instead or just stating that this won\u0027t work if we ever use clustered DB in the functional tests?","commit_id":"52b8513e6d707db580c95fc693b0ed2631b04f6b"}]}
