)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"2d0b8306e9b6fa464ba5e8fb4d2eaf2c6463a445","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"0e72b1a5_3ee2a9e5","updated":"2026-07-24 20:36:04.000000000","message":"check experimental","commit_id":"9de9d8e5981ff9ccb5cf98b16f36bb4d2b234768"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"7a2e210db88b36c32671add41f70f82bb665329e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"f656d1a3_2019f20e","updated":"2026-08-04 20:42:52.000000000","message":"I\u0027ll redo this patch to not use the pattern\n```\nobjects \u003d object.get_objects()\nget_other_objects \u003d object.get_objects(objects)\n```\nbut do a single query instead","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"43993c7adbd870933adf55d26af157060bb91078","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e0a54f2e_a6d9d5d3","updated":"2026-07-27 12:53:45.000000000","message":"check experimental","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"06fa4be06e00932c933ec1cdef78afc9ff2e6a1b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"549bf012_c35df08a","updated":"2026-08-31 18:26:27.000000000","message":"Couple of small optimization suggestions, though neither are particularly important.","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"704efa9e0690ef4baf3e51cba0ace39aa30bfc2a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"84b1e6e0_ae5db42b","updated":"2026-09-01 23:45:40.000000000","message":"recheck depending patch merged","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"184b7a30ccfc6c7904062a86be28496b0eb2e1c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"563b5826_f03c3839","updated":"2026-09-02 05:29:09.000000000","message":"I\u0027ve rebased this patch on top of master due to an error in the CI","commit_id":"e20d2f9843b405a42e887c04ddfb33d82f2f3d17"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5cf27690fbfca6e60e3770be5432ccf0ce2b94a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3d4bd0b3_782fb3d0","updated":"2026-09-02 11:25:20.000000000","message":"The CI gate was stuck for 14 hours","commit_id":"e20d2f9843b405a42e887c04ddfb33d82f2f3d17"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8e3ad1afa1c0d5988c6d23c7c2d1c0e06aa9b507","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"36926324_ecf4c7ae","updated":"2026-09-02 13:32:59.000000000","message":"recheck openstack-tox-pep8","commit_id":"e20d2f9843b405a42e887c04ddfb33d82f2f3d17"}],"neutron/objects/router.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"06fa4be06e00932c933ec1cdef78afc9ff2e6a1b","unresolved":true,"context_lines":[{"line_number":352,"context_line":"        ).filter("},{"line_number":353,"context_line":"            models_v2.IPAllocation.subnet_id \u003d\u003d subnet_id,"},{"line_number":354,"context_line":"            l3.RouterPort.port_type.in_(n_const.ROUTER_INTERFACE_OWNERS),"},{"line_number":355,"context_line":"            l3.Router.gw_port_id.isnot(None),"},{"line_number":356,"context_line":"            models_v2.Subnet.ip_version \u003d\u003d ip_version,"},{"line_number":357,"context_line":"        ).first()"},{"line_number":358,"context_line":"        if result:"}],"source_content_type":"text/x-python","patch_set":4,"id":"422e4965_ef4c58f3","line":355,"range":{"start_line":355,"start_character":0,"end_line":355,"end_character":45},"updated":"2026-08-31 18:26:27.000000000","message":"I think this is guaranteed by line 343.","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"3d811bdea7f212c755dd5a0dfe1ec01381dccbc8","unresolved":true,"context_lines":[{"line_number":352,"context_line":"        ).filter("},{"line_number":353,"context_line":"            models_v2.IPAllocation.subnet_id \u003d\u003d subnet_id,"},{"line_number":354,"context_line":"            l3.RouterPort.port_type.in_(n_const.ROUTER_INTERFACE_OWNERS),"},{"line_number":355,"context_line":"            l3.Router.gw_port_id.isnot(None),"},{"line_number":356,"context_line":"            models_v2.Subnet.ip_version \u003d\u003d ip_version,"},{"line_number":357,"context_line":"        ).first()"},{"line_number":358,"context_line":"        if result:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9bc2fd3b_3a6aef24","line":355,"range":{"start_line":355,"start_character":0,"end_line":355,"end_character":45},"in_reply_to":"422e4965_ef4c58f3","updated":"2026-08-31 19:16:51.000000000","message":"Thanks, TIL.","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"}],"neutron/services/bgp/commands.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"2bf9e5906b7536e30bbe3f831953884a9e8c759c","unresolved":true,"context_lines":[{"line_number":893,"context_line":"            self.tenant_ls_name,"},{"line_number":894,"context_line":"        ).run_idl(txn)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"        try:"},{"line_number":897,"context_line":"            provider_switch \u003d _get_provider_switch(self.api)"},{"line_number":898,"context_line":"        except exceptions.ReconcileError:"},{"line_number":899,"context_line":"            LOG.warning(\"Provider switch not found, skipping static \""},{"line_number":900,"context_line":"                        \"route creation for subnet %s.\","},{"line_number":901,"context_line":"                        self.subnet_cidr)"},{"line_number":902,"context_line":"            return"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"        interconnect_switch_name \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"5a77b63a_fde9cc86","line":901,"range":{"start_line":896,"start_character":0,"end_line":901,"end_character":41},"updated":"2026-08-04 20:43:19.000000000","message":"Just asking. If this error is raised, the `ConnectRouterToSwitchCommand` will still the tenant LS to the main router. Is that OK?","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"63d3e41f7dcfbc20b3a72ece284700681649a9b2","unresolved":false,"context_lines":[{"line_number":893,"context_line":"            self.tenant_ls_name,"},{"line_number":894,"context_line":"        ).run_idl(txn)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"        try:"},{"line_number":897,"context_line":"            provider_switch \u003d _get_provider_switch(self.api)"},{"line_number":898,"context_line":"        except exceptions.ReconcileError:"},{"line_number":899,"context_line":"            LOG.warning(\"Provider switch not found, skipping static \""},{"line_number":900,"context_line":"                        \"route creation for subnet %s.\","},{"line_number":901,"context_line":"                        self.subnet_cidr)"},{"line_number":902,"context_line":"            return"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"        interconnect_switch_name \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"0b2a0ea6_776caf91","line":901,"range":{"start_line":896,"start_character":0,"end_line":901,"end_character":41},"in_reply_to":"3cf01d59_bbcb8a31","updated":"2026-08-14 20:11:48.000000000","message":"Acknowledged","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9a26d73aeae00435f872cb422028a4ff9aeaba7a","unresolved":true,"context_lines":[{"line_number":893,"context_line":"            self.tenant_ls_name,"},{"line_number":894,"context_line":"        ).run_idl(txn)"},{"line_number":895,"context_line":""},{"line_number":896,"context_line":"        try:"},{"line_number":897,"context_line":"            provider_switch \u003d _get_provider_switch(self.api)"},{"line_number":898,"context_line":"        except exceptions.ReconcileError:"},{"line_number":899,"context_line":"            LOG.warning(\"Provider switch not found, skipping static \""},{"line_number":900,"context_line":"                        \"route creation for subnet %s.\","},{"line_number":901,"context_line":"                        self.subnet_cidr)"},{"line_number":902,"context_line":"            return"},{"line_number":903,"context_line":""},{"line_number":904,"context_line":"        interconnect_switch_name \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"3cf01d59_bbcb8a31","line":901,"range":{"start_line":896,"start_character":0,"end_line":901,"end_character":41},"in_reply_to":"5a77b63a_fde9cc86","updated":"2026-08-10 13:37:15.000000000","message":"yes, though the error means the router we leak to is likely not connected to a provider network","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"}],"neutron/services/bgp/plugin.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"eeaec0cda2c80624612d2b1ce499c7e978d1e131","unresolved":true,"context_lines":[{"line_number":210,"context_line":"    def _is_last_leaked_subnet_on_network(context, network_id):"},{"line_number":211,"context_line":"        leaked \u003d bgp_objects.SubnetBGPLeakRoutes.get_objects(context)"},{"line_number":212,"context_line":"        leaked_subnet_ids \u003d [e.subnet_id for e in leaked]"},{"line_number":213,"context_line":"        if not leaked_subnet_ids:"},{"line_number":214,"context_line":"            return True"},{"line_number":215,"context_line":"        subnets \u003d subnet_objects.Subnet.get_objects("},{"line_number":216,"context_line":"            context, id\u003dleaked_subnet_ids)"},{"line_number":217,"context_line":"        return not any(s.network_id \u003d\u003d network_id for s in subnets)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a318a63_b678ec94","line":214,"range":{"start_line":213,"start_character":0,"end_line":214,"end_character":23},"updated":"2026-08-04 20:33:32.000000000","message":"nit: you could return as soon as `if not leaked` without needing that for loop","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"7a2e210db88b36c32671add41f70f82bb665329e","unresolved":false,"context_lines":[{"line_number":210,"context_line":"    def _is_last_leaked_subnet_on_network(context, network_id):"},{"line_number":211,"context_line":"        leaked \u003d bgp_objects.SubnetBGPLeakRoutes.get_objects(context)"},{"line_number":212,"context_line":"        leaked_subnet_ids \u003d [e.subnet_id for e in leaked]"},{"line_number":213,"context_line":"        if not leaked_subnet_ids:"},{"line_number":214,"context_line":"            return True"},{"line_number":215,"context_line":"        subnets \u003d subnet_objects.Subnet.get_objects("},{"line_number":216,"context_line":"            context, id\u003dleaked_subnet_ids)"},{"line_number":217,"context_line":"        return not any(s.network_id \u003d\u003d network_id for s in subnets)"}],"source_content_type":"text/x-python","patch_set":2,"id":"20f75b3c_a60d33f7","line":214,"range":{"start_line":213,"start_character":0,"end_line":214,"end_character":23},"in_reply_to":"3a318a63_b678ec94","updated":"2026-08-04 20:42:52.000000000","message":"Done","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"eeaec0cda2c80624612d2b1ce499c7e978d1e131","unresolved":true,"context_lines":[{"line_number":212,"context_line":"        leaked_subnet_ids \u003d [e.subnet_id for e in leaked]"},{"line_number":213,"context_line":"        if not leaked_subnet_ids:"},{"line_number":214,"context_line":"            return True"},{"line_number":215,"context_line":"        subnets \u003d subnet_objects.Subnet.get_objects("},{"line_number":216,"context_line":"            context, id\u003dleaked_subnet_ids)"},{"line_number":217,"context_line":"        return not any(s.network_id \u003d\u003d network_id for s in subnets)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _leak_subnet(self, context, subnet, tenant_ls_name):"},{"line_number":220,"context_line":"        subnet_id \u003d subnet[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"8c9d20df_edc58437","line":217,"range":{"start_line":215,"start_character":0,"end_line":217,"end_character":67},"updated":"2026-08-04 20:33:32.000000000","message":"This looked like an expensive call to me(if you consider a large deployment). Claude recommended using `object_exist` as that will make the DB do the work and should be faster\n```\n    leaked_subnet_ids \u003d [e.subnet_id for e in leaked]\n    return not subnet_objects.Subnet.objects_exist(\n        context, id\u003dleaked_subnet_ids, network_id\u003dnetwork_id)\n```","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9a26d73aeae00435f872cb422028a4ff9aeaba7a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        leaked_subnet_ids \u003d [e.subnet_id for e in leaked]"},{"line_number":213,"context_line":"        if not leaked_subnet_ids:"},{"line_number":214,"context_line":"            return True"},{"line_number":215,"context_line":"        subnets \u003d subnet_objects.Subnet.get_objects("},{"line_number":216,"context_line":"            context, id\u003dleaked_subnet_ids)"},{"line_number":217,"context_line":"        return not any(s.network_id \u003d\u003d network_id for s in subnets)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _leak_subnet(self, context, subnet, tenant_ls_name):"},{"line_number":220,"context_line":"        subnet_id \u003d subnet[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"c3ab715c_c171de33","line":217,"range":{"start_line":215,"start_character":0,"end_line":217,"end_character":67},"in_reply_to":"8c9d20df_edc58437","updated":"2026-08-10 13:37:15.000000000","message":"Done","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"eeaec0cda2c80624612d2b1ce499c7e978d1e131","unresolved":true,"context_lines":[{"line_number":224,"context_line":"        router_port \u003d self._get_router_port_for_subnet(context, subnet_id)"},{"line_number":225,"context_line":"        router \u003d router_objects.Router.get_object("},{"line_number":226,"context_line":"            context, id\u003drouter_port.device_id)"},{"line_number":227,"context_line":"        nexthop_ip \u003d self._get_nexthop_ip(context, router, ip_version)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        bgp_commands.LeakSubnetCommand("},{"line_number":230,"context_line":"            self._nb_ovn,"}],"source_content_type":"text/x-python","patch_set":2,"id":"2d693646_3f381fe0","line":227,"updated":"2026-08-04 20:33:32.000000000","message":"`_get_next_hop` can return `None`. Maybe you can guard it and log warning?","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9a26d73aeae00435f872cb422028a4ff9aeaba7a","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        router_port \u003d self._get_router_port_for_subnet(context, subnet_id)"},{"line_number":225,"context_line":"        router \u003d router_objects.Router.get_object("},{"line_number":226,"context_line":"            context, id\u003drouter_port.device_id)"},{"line_number":227,"context_line":"        nexthop_ip \u003d self._get_nexthop_ip(context, router, ip_version)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        bgp_commands.LeakSubnetCommand("},{"line_number":230,"context_line":"            self._nb_ovn,"}],"source_content_type":"text/x-python","patch_set":2,"id":"ab684d5c_4420fde1","line":227,"in_reply_to":"2d693646_3f381fe0","updated":"2026-08-10 13:37:15.000000000","message":"Done","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"eeaec0cda2c80624612d2b1ce499c7e978d1e131","unresolved":true,"context_lines":[{"line_number":265,"context_line":"        tenant_ls_name \u003d ovn_utils.ovn_name(network_id)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        for cidr in cidrs:"},{"line_number":268,"context_line":"            last_on_network \u003d self._is_last_leaked_subnet_on_network("},{"line_number":269,"context_line":"                context, network_id)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"            bgp_commands.UnleakSubnetCommand("},{"line_number":272,"context_line":"                self._nb_ovn,"}],"source_content_type":"text/x-python","patch_set":2,"id":"87ceb3c6_2f44e2c7","line":269,"range":{"start_line":268,"start_character":0,"end_line":269,"end_character":36},"updated":"2026-08-04 20:33:32.000000000","message":"I think you can do this outside of the for loop, no? Does `context` change on each iteration?","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"9a26d73aeae00435f872cb422028a4ff9aeaba7a","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        tenant_ls_name \u003d ovn_utils.ovn_name(network_id)"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"        for cidr in cidrs:"},{"line_number":268,"context_line":"            last_on_network \u003d self._is_last_leaked_subnet_on_network("},{"line_number":269,"context_line":"                context, network_id)"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"            bgp_commands.UnleakSubnetCommand("},{"line_number":272,"context_line":"                self._nb_ovn,"}],"source_content_type":"text/x-python","patch_set":2,"id":"06d9535a_c353922f","line":269,"range":{"start_line":268,"start_character":0,"end_line":269,"end_character":36},"in_reply_to":"87ceb3c6_2f44e2c7","updated":"2026-08-10 13:37:15.000000000","message":"Done","commit_id":"6b1d90ef2a0222662018422f781ae544dcf3b8c2"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"3674a7475c9c3b8d5642765f50c7e99d1d246211","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        except IndexError:"},{"line_number":251,"context_line":"            LOG.warning(\"No subnet on router interface %s\", port[\u0027id\u0027])"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        if len(cidrs) \u003e 1:"},{"line_number":254,"context_line":"            LOG.warning(\"Unexpected number of subnets on router interface %s: \""},{"line_number":255,"context_line":"                        \"%s\", port[\u0027id\u0027], cidrs)"},{"line_number":256,"context_line":"        tenant_ls_name \u003d ovn_utils.ovn_name(network_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da0861d0_4d6cd250","line":253,"range":{"start_line":253,"start_character":4,"end_line":253,"end_character":26},"updated":"2026-08-10 20:06:18.000000000","message":"no issue, but this implies there is not dual stack (ipv4 and ipv6) suppoty?","commit_id":"022f58a1718ede4896526a2aca02d669b618d865"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"e87894b5663edc04d1e6182e62bdfe5ec92b01ad","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        except IndexError:"},{"line_number":251,"context_line":"            LOG.warning(\"No subnet on router interface %s\", port[\u0027id\u0027])"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        if len(cidrs) \u003e 1:"},{"line_number":254,"context_line":"            LOG.warning(\"Unexpected number of subnets on router interface %s: \""},{"line_number":255,"context_line":"                        \"%s\", port[\u0027id\u0027], cidrs)"},{"line_number":256,"context_line":"        tenant_ls_name \u003d ovn_utils.ovn_name(network_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"db6f2f47_653b0d55","line":253,"range":{"start_line":253,"start_character":4,"end_line":253,"end_character":26},"in_reply_to":"da0861d0_4d6cd250","updated":"2026-08-10 20:08:05.000000000","message":"each subnet has its own LRP with a single IP. So if you have a dualstack, you\u0027d get two LRPs, one with ipv4 and one with ivp6.","commit_id":"022f58a1718ede4896526a2aca02d669b618d865"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"63d3e41f7dcfbc20b3a72ece284700681649a9b2","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        except IndexError:"},{"line_number":251,"context_line":"            LOG.warning(\"No subnet on router interface %s\", port[\u0027id\u0027])"},{"line_number":252,"context_line":"            return"},{"line_number":253,"context_line":"        if len(cidrs) \u003e 1:"},{"line_number":254,"context_line":"            LOG.warning(\"Unexpected number of subnets on router interface %s: \""},{"line_number":255,"context_line":"                        \"%s\", port[\u0027id\u0027], cidrs)"},{"line_number":256,"context_line":"        tenant_ls_name \u003d ovn_utils.ovn_name(network_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"48c829ed_b10ef17a","line":253,"range":{"start_line":253,"start_character":4,"end_line":253,"end_character":26},"in_reply_to":"db6f2f47_653b0d55","updated":"2026-08-14 20:11:48.000000000","message":"Acknowledged","commit_id":"022f58a1718ede4896526a2aca02d669b618d865"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"06fa4be06e00932c933ec1cdef78afc9ff2e6a1b","unresolved":true,"context_lines":[{"line_number":156,"context_line":"            self._validate_gateway_router_for_subnet(context, subnet_id)"},{"line_number":157,"context_line":"            self._validate_no_cidr_overlap(context, updated[\u0027cidr\u0027])"},{"line_number":158,"context_line":"            ip_version \u003d netaddr.IPNetwork(updated[\u0027cidr\u0027]).version"},{"line_number":159,"context_line":"            nexthop_ip \u003d router_objects.Router.get_gateway_ip_for_subnet("},{"line_number":160,"context_line":"                context, subnet_id, ip_version)"},{"line_number":161,"context_line":"            if not nexthop_ip:"},{"line_number":162,"context_line":"                raise n_exc.BadRequest("},{"line_number":163,"context_line":"                    resource\u003d\u0027subnet\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"371f29f4_c23e2c41","line":160,"range":{"start_line":159,"start_character":0,"end_line":160,"end_character":47},"updated":"2026-08-31 18:26:27.000000000","message":"If I\u0027m reading things right, this method essentially does the same work as `get_gateway_router_for_subnet()` (plus a little more) which is what `self._validate_gateway_router_for_subnet(context, subnet_id)` calls above, so maybe we don\u0027t have to call `_validate_gateway_router_for_subnet()` (and this looks like its only call).","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"8aea46a4af9a08e7b1405b2d4fbc56843a3e99c5","unresolved":true,"context_lines":[{"line_number":156,"context_line":"            self._validate_gateway_router_for_subnet(context, subnet_id)"},{"line_number":157,"context_line":"            self._validate_no_cidr_overlap(context, updated[\u0027cidr\u0027])"},{"line_number":158,"context_line":"            ip_version \u003d netaddr.IPNetwork(updated[\u0027cidr\u0027]).version"},{"line_number":159,"context_line":"            nexthop_ip \u003d router_objects.Router.get_gateway_ip_for_subnet("},{"line_number":160,"context_line":"                context, subnet_id, ip_version)"},{"line_number":161,"context_line":"            if not nexthop_ip:"},{"line_number":162,"context_line":"                raise n_exc.BadRequest("},{"line_number":163,"context_line":"                    resource\u003d\u0027subnet\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"409ce25d_102e51e5","line":160,"range":{"start_line":159,"start_character":0,"end_line":160,"end_character":47},"in_reply_to":"2abee170_846d7307","updated":"2026-09-01 11:58:17.000000000","message":"I think given that this is called only on update operations, I\u0027ll be fine having it as is.","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e544e1b6b3e18ae10751b9ea4929d6d28e1d8c7f","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            self._validate_gateway_router_for_subnet(context, subnet_id)"},{"line_number":157,"context_line":"            self._validate_no_cidr_overlap(context, updated[\u0027cidr\u0027])"},{"line_number":158,"context_line":"            ip_version \u003d netaddr.IPNetwork(updated[\u0027cidr\u0027]).version"},{"line_number":159,"context_line":"            nexthop_ip \u003d router_objects.Router.get_gateway_ip_for_subnet("},{"line_number":160,"context_line":"                context, subnet_id, ip_version)"},{"line_number":161,"context_line":"            if not nexthop_ip:"},{"line_number":162,"context_line":"                raise n_exc.BadRequest("},{"line_number":163,"context_line":"                    resource\u003d\u0027subnet\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"6413e3a7_540d08b5","line":160,"range":{"start_line":159,"start_character":0,"end_line":160,"end_character":47},"in_reply_to":"2abee170_846d7307","updated":"2026-09-01 13:13:31.000000000","message":"Sounds good to me.","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"3d811bdea7f212c755dd5a0dfe1ec01381dccbc8","unresolved":true,"context_lines":[{"line_number":156,"context_line":"            self._validate_gateway_router_for_subnet(context, subnet_id)"},{"line_number":157,"context_line":"            self._validate_no_cidr_overlap(context, updated[\u0027cidr\u0027])"},{"line_number":158,"context_line":"            ip_version \u003d netaddr.IPNetwork(updated[\u0027cidr\u0027]).version"},{"line_number":159,"context_line":"            nexthop_ip \u003d router_objects.Router.get_gateway_ip_for_subnet("},{"line_number":160,"context_line":"                context, subnet_id, ip_version)"},{"line_number":161,"context_line":"            if not nexthop_ip:"},{"line_number":162,"context_line":"                raise n_exc.BadRequest("},{"line_number":163,"context_line":"                    resource\u003d\u0027subnet\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"2abee170_846d7307","line":160,"range":{"start_line":159,"start_character":0,"end_line":160,"end_character":47},"in_reply_to":"371f29f4_c23e2c41","updated":"2026-08-31 19:16:51.000000000","message":"You mean just keep the `get_gateway_ip_for_subnet` function and remove `get_gateway_router_for_subnet` completely, assuming `get_gateway_ip_for_subnet` would return nothing in case the router doesn\u0027t exist? How would we differentiate between the missing router and missing external gateway then?","commit_id":"3c5dcb81eb0a84391eb3103b23cf71fa8c83004c"}]}
