)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30534,"name":"Marcin Wilk","email":"marcin.wilk@canonical.com","username":"wilkmar"},"change_message_id":"1243ab59dddeb611a7521d0cbe1b564f6cde7c37","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9bb47417_145d781d","updated":"2026-03-10 06:21:42.000000000","message":"Gear Neutron reviewers, please have a look at this patch and share your comments. Thank you.","commit_id":"d858eecdcfe95e740debd8a1b579c0580b460988"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"25b8cf46a711f33cc04ab960dae5d6e0696b4bc3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c1360495_0d81ae1a","updated":"2026-03-10 15:01:18.000000000","message":"1) I would like to know in what situations it is needed to manually add a `Gateway_Chassis` register to the LRP. If an ovn-controller is stopped and the `Chassis`/`Chassis_Private` SB registers deleted, the corresponding NB `Gateway_Chassis` is not.\n2) When a Chassis event happens, this is captured by the Neutron API. If a LRP looses any of the `Gateway_Chassis` registers, a re-schedule action happens [1]. The same happens when a new GW Chassis is added: all LRPs with less than 5 `Gateway_Chassis`, are re-scheduled to have this new GW Chassis.\n3) In other scenarios that I can\u0027t related, if the manual command is needed, as you mentioned it would be needed to rename the `Gateway_Chassis` register. I would not change this naming format if it is possible to update the name externally.\n\n[1]https://github.com/openstack/neutron/blob/12624b7d79066098599741ec84b6eeee664c596b/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py#L240","commit_id":"a9182752921634c8523cf2b77c6f0722f539d00f"},{"author":{"_account_id":30534,"name":"Marcin Wilk","email":"marcin.wilk@canonical.com","username":"wilkmar"},"change_message_id":"0b90a442317efecc3f37fd50cd87f0538b4487de","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"486ed2c4_dda6afe7","in_reply_to":"685f6792_07fbafab","updated":"2026-03-16 11:42:11.000000000","message":"ACK, I got your point. I reverted most of the changes in the patch, leaving only the extra logging piece, so as not to silently discard the `Gateway_Chassis` registers, which are not parsable.\n\nI added a couple of documentation updates to increase administrators\u0027 awareness about the fact that Neutron does not support manually adding/modifying registers with the `ovn-nbctl` command.\n\nPlease let me know your comments.","commit_id":"a9182752921634c8523cf2b77c6f0722f539d00f"},{"author":{"_account_id":30534,"name":"Marcin Wilk","email":"marcin.wilk@canonical.com","username":"wilkmar"},"change_message_id":"85991a7f3bc3414beac73b4ff8da4298ed49e0dd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ebf9dd5e_e2b81344","in_reply_to":"c1360495_0d81ae1a","updated":"2026-03-11 16:54:18.000000000","message":"Hey @ralonsoh@redhat.com, thank you for a very quick review.\nPlease find my answers/further clarification below.\n\nAd. 1) I am aware of two scenarios where people run the `ovn-nbctl` command to add GW chassis (but there might be more):\n1. If they need or want to adjust priorities. This may be needed if they don\u0027t have all physical networks connected to all hypervisors/chassis, or if they don\u0027t have equal HW resources on all hypervisors/chassis, and they want to schedule more active ports to the more powerful machines. Maybe some of the problems could be resolved with the Neutron AZs for OVN, but definitely not all of them.\n2. In case a highest priority chassis crashed (there was no graceful shutdown of the ovn-controller), the corresponding registers/records stay in the `Chassis/Chassis_private` SB -\u003e no rescheduling is triggered, `Gateway_Chassis` remains as it was, but the BFD + OVS actually failed over the GW ports to the second highest priority chassis. Upon subsequent startup of the failed chassis (without manual cleanup), GW port binding would fail on that chassis [2]. Using the `ovn-nbctl` to remove and add this LRP is one of the ways to recover from this situation.\n\nAd. 2) Yes, the `schedule_unhosted_gateways` gets called on the Chassis delete event, but Neturon can\u0027t parse LRP registers with the \u0027-\u0027 in the `Gateway_Chassis` and ignores them silently [1]. As a result, the highest-priority register for a given port remains in the NB DB, where it would have been removed if the port ID were parsed. As a result, upon subsequent startup of the shut-down chassis, the active port will be scheduled back to it (since it already has the highest priority). That wouldn\u0027t have happened if the port id was parsed correctly.\n\nAd. 3) Yes, it is possible to change it with the \u0027ovn-nbctl set\u0027 command, but the operator needs to be aware of it. If the operator leaves the register in the `Gateway_Chassis` table in NB, he will eventually encounter this problem, which is very hard to troubleshoot because Neutron silently ignores those names [1].\n\nI\u0027d be happy to provide more context, OVN db dumps, or the detailed steps for the reproducer if needed.\n\nBTW, do you recall why, back in the day, the Neutron project opted for using its own naming convention for the LRP registers in the `Gateway_Chassis`? IMHO, it would be good to have it in sync with the OVN cli tools, but I might be missing some details here.\n\n[1] https://opendev.org/openstack/neutron/src/commit/f9cb6dc869bdc6b822132e78cda7b92eed4550fd/neutron/services/ovn_l3/plugin.py#L310\n[2] https://bugs.launchpad.net/neutron/+bug/2136733/comments/6","commit_id":"a9182752921634c8523cf2b77c6f0722f539d00f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b944a2fedd5b972aa3c1eac5c1f299c61ee86b08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"685f6792_07fbafab","in_reply_to":"ebf9dd5e_e2b81344","updated":"2026-03-13 12:19:24.000000000","message":"1.1) Adjust priorities: that should not be done manually. And in case it is, the user/admin should be aware of the Neutron naming convention.\n1.2) In that case, the `Chassis`/`Chassis_Private` records must be manually removed from the SB database.\n2) Same issue: the register has been manually added and this is a non-supported operation.\n3) ditto\n\nWith this patch we are introducing the capability of supporting manual operations, that is by definition something no supported. Every OVN resource is managed by Neutron (*mostly). But `Gateway_Chassis` in particular are.\n\nFor the case of leftovers in case of crash, the admin should remove the registers. In case of changing the priority, there is a LP in progress to provide CLI commands to do this. I hope this LP will be addressed during this cycle.\n\nThe only output of the bug you created is a warning message in the documentation.","commit_id":"a9182752921634c8523cf2b77c6f0722f539d00f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"557764c42f187e96b625955c768b03dbd33bb045","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"424e1330_9d83d326","updated":"2026-03-17 16:59:02.000000000","message":"Just +1 until Rodolfo gets a chance to re-review","commit_id":"5a7308b776a69d100a058c842514f6e7bcbd236a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3403e7a27627328d57a3c236e6401fd91e068b6a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2937c7f1_ac7de3ce","updated":"2026-03-26 21:26:13.000000000","message":"recheck unrelated test failure","commit_id":"d781fac878700bc7e87992d731ce4c0c59c64b43"}],"neutron/common/ovn/constants.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"25b8cf46a711f33cc04ab960dae5d6e0696b4bc3","unresolved":true,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"# Loadbalancer constants"},{"line_number":302,"context_line":"LRP_PREFIX \u003d \"lrp-\""},{"line_number":303,"context_line":"RE_PORT_FROM_GWC \u003d re.compile(r\u0027(%s)([0-9a-fA-F-]{36})[_-]([\\w-]+)\u0027"},{"line_number":304,"context_line":"                              % LRP_PREFIX)"},{"line_number":305,"context_line":"LB_VIP_PORT_PREFIX \u003d \"ovn-lb-vip-\""},{"line_number":306,"context_line":"LB_EXT_IDS_LS_REFS_KEY \u003d \u0027ls_refs\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"c9ef5673_b965210a","line":303,"range":{"start_line":303,"start_character":32,"end_line":303,"end_character":66},"updated":"2026-03-10 15:01:18.000000000","message":"As you mention in the LP bug, the `Gateway_Chassis` register is manually added using the `ovn-nbctl lrp-set-gateway-chassis` command. In this command you can also use the LRP UUID instead of the name and this regex won\u0027t match.","commit_id":"a9182752921634c8523cf2b77c6f0722f539d00f"},{"author":{"_account_id":30534,"name":"Marcin Wilk","email":"marcin.wilk@canonical.com","username":"wilkmar"},"change_message_id":"06226f212500ce5ae84457e497f2fb1245ccf46e","unresolved":false,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"# Loadbalancer constants"},{"line_number":302,"context_line":"LRP_PREFIX \u003d \"lrp-\""},{"line_number":303,"context_line":"RE_PORT_FROM_GWC \u003d re.compile(r\u0027(%s)([0-9a-fA-F-]{36})[_-]([\\w-]+)\u0027"},{"line_number":304,"context_line":"                              % LRP_PREFIX)"},{"line_number":305,"context_line":"LB_VIP_PORT_PREFIX \u003d \"ovn-lb-vip-\""},{"line_number":306,"context_line":"LB_EXT_IDS_LS_REFS_KEY \u003d \u0027ls_refs\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"7e0fbb49_1aea4a31","line":303,"range":{"start_line":303,"start_character":32,"end_line":303,"end_character":66},"in_reply_to":"c9ef5673_b965210a","updated":"2026-03-11 17:33:55.000000000","message":"Thanks for spotting this. I updated the regexp to support both cases.","commit_id":"a9182752921634c8523cf2b77c6f0722f539d00f"}],"neutron/services/ovn_l3/plugin.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"557764c42f187e96b625955c768b03dbd33bb045","unresolved":true,"context_lines":[{"line_number":309,"context_line":"                    ports_impacted.append(utils.get_port_id_from_gwc_row(gwc))"},{"line_number":310,"context_line":"                except AttributeError:"},{"line_number":311,"context_line":"                    # Malformed GWC format."},{"line_number":312,"context_line":"                    LOG.warning(\u0027Malformed GW chassis format: %s.\u0027, gwc.name)"},{"line_number":313,"context_line":"                    pass"},{"line_number":314,"context_line":"            port_physnet_dict \u003d {"},{"line_number":315,"context_line":"                k: v"}],"source_content_type":"text/x-python","patch_set":4,"id":"709b95a2_49121bd3","line":312,"range":{"start_line":312,"start_character":64,"end_line":312,"end_character":65},"updated":"2026-03-17 16:59:02.000000000","message":"nit: maybe drop the \".\" since someone might copy/paste the output.\n\nCan probably remove the comment as well if you update.","commit_id":"5a7308b776a69d100a058c842514f6e7bcbd236a"},{"author":{"_account_id":30534,"name":"Marcin Wilk","email":"marcin.wilk@canonical.com","username":"wilkmar"},"change_message_id":"4cbcdedb27306d95e0b62045339d98f4d1419588","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                    ports_impacted.append(utils.get_port_id_from_gwc_row(gwc))"},{"line_number":310,"context_line":"                except AttributeError:"},{"line_number":311,"context_line":"                    # Malformed GWC format."},{"line_number":312,"context_line":"                    LOG.warning(\u0027Malformed GW chassis format: %s.\u0027, gwc.name)"},{"line_number":313,"context_line":"                    pass"},{"line_number":314,"context_line":"            port_physnet_dict \u003d {"},{"line_number":315,"context_line":"                k: v"}],"source_content_type":"text/x-python","patch_set":4,"id":"e57347b4_90cb961b","line":312,"range":{"start_line":312,"start_character":64,"end_line":312,"end_character":65},"in_reply_to":"709b95a2_49121bd3","updated":"2026-03-18 07:37:56.000000000","message":"Done, I also fixed a typo in the commit message: \u0027the the\u0027 -\u003e \u0027the\u0027","commit_id":"5a7308b776a69d100a058c842514f6e7bcbd236a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d6447e8f84eddcfab9dfeee83a958fed909a721b","unresolved":true,"context_lines":[{"line_number":308,"context_line":"                try:"},{"line_number":309,"context_line":"                    ports_impacted.append(utils.get_port_id_from_gwc_row(gwc))"},{"line_number":310,"context_line":"                except AttributeError:"},{"line_number":311,"context_line":"                    LOG.warning(\u0027Malformed GW chassis format: %s\u0027, gwc.name)"},{"line_number":312,"context_line":"                    pass"},{"line_number":313,"context_line":"            port_physnet_dict \u003d {"},{"line_number":314,"context_line":"                k: v"}],"source_content_type":"text/x-python","patch_set":5,"id":"ed4f120f_10086172","line":311,"range":{"start_line":311,"start_character":43,"end_line":311,"end_character":45},"updated":"2026-03-26 10:40:18.000000000","message":"In the log messages, let\u0027s not use acronyms","commit_id":"1a75ad91f9a1f01f7bfa4aae4d82883aa9af0f1a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8bbd325d608925cbfbb153301ad6c07a48bebc5d","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                try:"},{"line_number":309,"context_line":"                    ports_impacted.append(utils.get_port_id_from_gwc_row(gwc))"},{"line_number":310,"context_line":"                except AttributeError:"},{"line_number":311,"context_line":"                    LOG.warning(\u0027Malformed GW chassis format: %s\u0027, gwc.name)"},{"line_number":312,"context_line":"                    pass"},{"line_number":313,"context_line":"            port_physnet_dict \u003d {"},{"line_number":314,"context_line":"                k: v"}],"source_content_type":"text/x-python","patch_set":5,"id":"0802568d_90b710ef","line":311,"range":{"start_line":311,"start_character":43,"end_line":311,"end_character":45},"in_reply_to":"ed4f120f_10086172","updated":"2026-03-26 14:43:18.000000000","message":"Done","commit_id":"1a75ad91f9a1f01f7bfa4aae4d82883aa9af0f1a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d6447e8f84eddcfab9dfeee83a958fed909a721b","unresolved":true,"context_lines":[{"line_number":309,"context_line":"                    ports_impacted.append(utils.get_port_id_from_gwc_row(gwc))"},{"line_number":310,"context_line":"                except AttributeError:"},{"line_number":311,"context_line":"                    LOG.warning(\u0027Malformed GW chassis format: %s\u0027, gwc.name)"},{"line_number":312,"context_line":"                    pass"},{"line_number":313,"context_line":"            port_physnet_dict \u003d {"},{"line_number":314,"context_line":"                k: v"},{"line_number":315,"context_line":"                for k, v in port_physnet_dict.items()"}],"source_content_type":"text/x-python","patch_set":5,"id":"1065f986_5d99d86a","line":312,"range":{"start_line":312,"start_character":20,"end_line":312,"end_character":24},"updated":"2026-03-26 10:40:18.000000000","message":"to remove","commit_id":"1a75ad91f9a1f01f7bfa4aae4d82883aa9af0f1a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8bbd325d608925cbfbb153301ad6c07a48bebc5d","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                    ports_impacted.append(utils.get_port_id_from_gwc_row(gwc))"},{"line_number":310,"context_line":"                except AttributeError:"},{"line_number":311,"context_line":"                    LOG.warning(\u0027Malformed GW chassis format: %s\u0027, gwc.name)"},{"line_number":312,"context_line":"                    pass"},{"line_number":313,"context_line":"            port_physnet_dict \u003d {"},{"line_number":314,"context_line":"                k: v"},{"line_number":315,"context_line":"                for k, v in port_physnet_dict.items()"}],"source_content_type":"text/x-python","patch_set":5,"id":"8d7a7a7c_3398e97c","line":312,"range":{"start_line":312,"start_character":20,"end_line":312,"end_character":24},"in_reply_to":"1065f986_5d99d86a","updated":"2026-03-26 14:43:18.000000000","message":"Done","commit_id":"1a75ad91f9a1f01f7bfa4aae4d82883aa9af0f1a"}]}
