)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"1faadaa77348a1d2b0b9c8c0b79f7ad7d8614b4e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f958f280_e2ca9a3c","updated":"2026-04-06 13:16:54.000000000","message":"Good feature, I like it.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5826ab18a1985ab7bcfbee9a2ff9c20a8985c81d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c37635a2_34ed815d","updated":"2026-04-06 18:59:19.000000000","message":"The spec seems solid to me :) I have a question regarding the API and ability to modify the priority.\n\nAre we going to test this just with the functional test suite? ie. we care only about the values in the OVN NB DB?","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"8084ce55f100b9e7d01ed1f3a6baa96e07e37ca6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d5761df6_a94cb038","updated":"2026-04-07 16:10:08.000000000","message":"Just put -1 because a of the incompleted sentence in the spec but it is a minor issue. Apart from that it looks great.","commit_id":"484eba7cfc9248a68cb90e90440877bbea79e5d3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"da8548065f1b9d858e02c15f7ec5c1c1ef3e1c23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9df4f990_92ee005b","updated":"2026-04-07 17:41:23.000000000","message":"LGTM - I\u0027d like to discuss the PUT option too, not advocating, just collecting opinions if it would make sense to have.","commit_id":"484eba7cfc9248a68cb90e90440877bbea79e5d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"71ff0a372651d6ae1482fc3558db37a307e02885","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3815221d_877abb46","updated":"2026-04-07 07:50:52.000000000","message":"NOTE: I\u0027ve updated the spec addressing Jakub\u0027s comments. The API calls POST/DELETE will never reschedule the other chassis priorities. If the requested priority is already taken, the API will fail.","commit_id":"484eba7cfc9248a68cb90e90440877bbea79e5d3"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"58887ec199d839f0eb50ca693d8ba7558a5a6b19","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"edb43147_0521418c","updated":"2026-04-09 13:23:00.000000000","message":"LGTM, thanks Rodolfo!","commit_id":"52db32e0a939f22e503e9f61a439965685613332"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"07ca9fb2b97d54fc95380259ba742e0f6d1dd3fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"815232ea_ffa284d0","updated":"2026-04-09 06:10:05.000000000","message":"Ping fellow reviewers","commit_id":"52db32e0a939f22e503e9f61a439965685613332"}],"specs/2026.2/l3-agent-scheduler-api-for-ovn.rst":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5826ab18a1985ab7bcfbee9a2ff9c20a8985c81d","unresolved":true,"context_lines":[{"line_number":210,"context_line":"  Example: a router is scheduled on chassis A (priority 3), B"},{"line_number":211,"context_line":"  (priority 2) and C (priority 1). Adding chassis D with"},{"line_number":212,"context_line":"  ``ha_chassis_priority\u003d3`` will shift A down: the result is D\u003d3,"},{"line_number":213,"context_line":"  A\u003d2, B\u003d1 — but this exceeds ``MAX_GW_CHASSIS`` considerations and"},{"line_number":214,"context_line":"  C would be evicted if the limit is reached. In practice the"},{"line_number":215,"context_line":"  priorities are renumbered contiguously: D\u003d4, A\u003d3, B\u003d2, C\u003d1"},{"line_number":216,"context_line":"  (since we are still within the limit of 5)."}],"source_content_type":"text/x-rst","patch_set":6,"id":"27c3863f_34b3122d","line":213,"range":{"start_line":213,"start_character":13,"end_line":213,"end_character":47},"updated":"2026-04-06 18:59:19.000000000","message":"I don\u0027t get why it exceeds? Should there be a sentence about what happens if?","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa35d3f5b231009c8337662d25c03060075d5791","unresolved":false,"context_lines":[{"line_number":210,"context_line":"  Example: a router is scheduled on chassis A (priority 3), B"},{"line_number":211,"context_line":"  (priority 2) and C (priority 1). Adding chassis D with"},{"line_number":212,"context_line":"  ``ha_chassis_priority\u003d3`` will shift A down: the result is D\u003d3,"},{"line_number":213,"context_line":"  A\u003d2, B\u003d1 — but this exceeds ``MAX_GW_CHASSIS`` considerations and"},{"line_number":214,"context_line":"  C would be evicted if the limit is reached. In practice the"},{"line_number":215,"context_line":"  priorities are renumbered contiguously: D\u003d4, A\u003d3, B\u003d2, C\u003d1"},{"line_number":216,"context_line":"  (since we are still within the limit of 5)."}],"source_content_type":"text/x-rst","patch_set":6,"id":"3e7fece4_335142ac","line":213,"range":{"start_line":213,"start_character":13,"end_line":213,"end_character":47},"in_reply_to":"27c3863f_34b3122d","updated":"2026-04-07 07:24:38.000000000","message":"This is a leftover. I\u0027m not sure why this is here. We are not reaching the `MAX_GW_CHASSIS \u003d 5` limit here.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5826ab18a1985ab7bcfbee9a2ff9c20a8985c81d","unresolved":true,"context_lines":[{"line_number":213,"context_line":"  A\u003d2, B\u003d1 — but this exceeds ``MAX_GW_CHASSIS`` considerations and"},{"line_number":214,"context_line":"  C would be evicted if the limit is reached. In practice the"},{"line_number":215,"context_line":"  priorities are renumbered contiguously: D\u003d4, A\u003d3, B\u003d2, C\u003d1"},{"line_number":216,"context_line":"  (since we are still within the limit of 5)."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"  Setting ``ha_chassis_priority`` to a value higher than any existing"},{"line_number":219,"context_line":"  priority makes the new chassis the **primary** (active) gateway."}],"source_content_type":"text/x-rst","patch_set":6,"id":"e013213b_d008c921","line":216,"updated":"2026-04-06 18:59:19.000000000","message":"An idea for discussing/consideration. I find the API behavior a bit strange. Let\u0027s say I have 1 chassis A in the group. I add a new one, B, with priority 2. And I add another one, C, with priority 2. Now the B that I just added before does not have the priority specified by an explicit API call.\n\nI\u0027d consider a different behavior, we can implement a PUT operation over `/v2.0/agents/{agent_id}/l3-routers` that allows changing the priority. The behavior would just change the priority value in the HA_Chassis table, no extra logic required.\n\nWith that, we would not allow scheduling a router to another chassis if the router already has a chassis with the same priority as it is in the body.\n\nWhat do you think? I think it gives more flexibility and responsibility to the user and is less error prone since we won\u0027t need to recalculate the priorities in the code.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"da8548065f1b9d858e02c15f7ec5c1c1ef3e1c23","unresolved":false,"context_lines":[{"line_number":213,"context_line":"  A\u003d2, B\u003d1 — but this exceeds ``MAX_GW_CHASSIS`` considerations and"},{"line_number":214,"context_line":"  C would be evicted if the limit is reached. In practice the"},{"line_number":215,"context_line":"  priorities are renumbered contiguously: D\u003d4, A\u003d3, B\u003d2, C\u003d1"},{"line_number":216,"context_line":"  (since we are still within the limit of 5)."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"  Setting ``ha_chassis_priority`` to a value higher than any existing"},{"line_number":219,"context_line":"  priority makes the new chassis the **primary** (active) gateway."}],"source_content_type":"text/x-rst","patch_set":6,"id":"dbc6b530_0b0e6423","line":216,"in_reply_to":"c5ba25d0_a124c1c7","updated":"2026-04-07 17:41:23.000000000","message":"But in order to modify, we\u0027d need to implement a `PUT /v2.0/agents/{agent_id}/l3-routers/{router_id}` action, wouldn\u0027t we? I think it is worth it because the action would really just be updating the value in the sql model and then in the OVN (just like create). No extra complex logic required.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c8a02f1d30d3e65ca60a81f00064c4599c8a23e0","unresolved":false,"context_lines":[{"line_number":213,"context_line":"  A\u003d2, B\u003d1 — but this exceeds ``MAX_GW_CHASSIS`` considerations and"},{"line_number":214,"context_line":"  C would be evicted if the limit is reached. In practice the"},{"line_number":215,"context_line":"  priorities are renumbered contiguously: D\u003d4, A\u003d3, B\u003d2, C\u003d1"},{"line_number":216,"context_line":"  (since we are still within the limit of 5)."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"  Setting ``ha_chassis_priority`` to a value higher than any existing"},{"line_number":219,"context_line":"  priority makes the new chassis the **primary** (active) gateway."}],"source_content_type":"text/x-rst","patch_set":6,"id":"855ae211_42669f2b","line":216,"in_reply_to":"dbc6b530_0b0e6423","updated":"2026-04-08 07:28:59.000000000","message":"Yes, you are right: we are missing here the PUT call. I\u0027ll add it.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa35d3f5b231009c8337662d25c03060075d5791","unresolved":false,"context_lines":[{"line_number":213,"context_line":"  A\u003d2, B\u003d1 — but this exceeds ``MAX_GW_CHASSIS`` considerations and"},{"line_number":214,"context_line":"  C would be evicted if the limit is reached. In practice the"},{"line_number":215,"context_line":"  priorities are renumbered contiguously: D\u003d4, A\u003d3, B\u003d2, C\u003d1"},{"line_number":216,"context_line":"  (since we are still within the limit of 5)."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"  Setting ``ha_chassis_priority`` to a value higher than any existing"},{"line_number":219,"context_line":"  priority makes the new chassis the **primary** (active) gateway."}],"source_content_type":"text/x-rst","patch_set":6,"id":"c5ba25d0_a124c1c7","line":216,"in_reply_to":"e013213b_d008c921","updated":"2026-04-07 07:24:38.000000000","message":"This specific API call (add a chassis to a router with and without defining priority) is challenging. I\u0027m going to ask today, during the Neutron team meeting, to review this part in particular.\n\nAs you commented, the API calls with explicit priorities defined should be preserved. Actually any chassis+priority (`HA_Chassis` register) in a `HA_Chassis_Group` should be explicitly changed by the user, not by the API in a reordering strategy.\n\nTo be honest, these operations (manual chassis+priority scheduling) should be very infrequent; the burden of ordering the priorities must fall 100% on the user. That will resolve any uncertainty derived from the API:\n* If we try to add a chassis without priority but there is \"no room\" at the end, that means we are actually using the lowest priority\u003d0 (32767 max, 0 min), the API will fail.\n* If we try to add a chassis+priority but this priority is already taken, the API will fail.\n\nThe user (admin by default) can reorder the chassis list adding/removing/modifying chassis+priorities manually.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5826ab18a1985ab7bcfbee9a2ff9c20a8985c81d","unresolved":true,"context_lines":[{"line_number":230,"context_line":"This operation removes a chassis from the ``HA_Chassis_Group`` of the"},{"line_number":231,"context_line":"router\u0027s gateway ``Logical_Router_Port``. The implementation will:"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"#. Validate that the agent is associated with the router\u0027s"},{"line_number":234,"context_line":"   ``HA_Chassis_Group``."},{"line_number":235,"context_line":"#. Delete the ``HA_Chassis`` row for this chassis from the"},{"line_number":236,"context_line":"   ``HA_Chassis_Group``."},{"line_number":237,"context_line":"#. Renumber the remaining ``HA_Chassis`` priorities to keep them"}],"source_content_type":"text/x-rst","patch_set":6,"id":"a91dd364_8b06207c","line":234,"range":{"start_line":233,"start_character":0,"end_line":234,"end_character":24},"updated":"2026-04-06 18:59:19.000000000","message":"Do we need this? We can just attempt to delete and if the delete fails, we say the agent was not associated with the router.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa35d3f5b231009c8337662d25c03060075d5791","unresolved":false,"context_lines":[{"line_number":230,"context_line":"This operation removes a chassis from the ``HA_Chassis_Group`` of the"},{"line_number":231,"context_line":"router\u0027s gateway ``Logical_Router_Port``. The implementation will:"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"#. Validate that the agent is associated with the router\u0027s"},{"line_number":234,"context_line":"   ``HA_Chassis_Group``."},{"line_number":235,"context_line":"#. Delete the ``HA_Chassis`` row for this chassis from the"},{"line_number":236,"context_line":"   ``HA_Chassis_Group``."},{"line_number":237,"context_line":"#. Renumber the remaining ``HA_Chassis`` priorities to keep them"}],"source_content_type":"text/x-rst","patch_set":6,"id":"e5d1b449_ac2a1a7c","line":234,"range":{"start_line":233,"start_character":0,"end_line":234,"end_character":24},"in_reply_to":"a91dd364_8b06207c","updated":"2026-04-07 07:24:38.000000000","message":"Yes, the failed deletion will is considered as validation. The `try/catch` or `if_exists` flag is part of the implementation details.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5826ab18a1985ab7bcfbee9a2ff9c20a8985c81d","unresolved":true,"context_lines":[{"line_number":234,"context_line":"   ``HA_Chassis_Group``."},{"line_number":235,"context_line":"#. Delete the ``HA_Chassis`` row for this chassis from the"},{"line_number":236,"context_line":"   ``HA_Chassis_Group``."},{"line_number":237,"context_line":"#. Renumber the remaining ``HA_Chassis`` priorities to keep them"},{"line_number":238,"context_line":"   contiguous (e.g. if priorities were 3, 2, 1 and the chassis with"},{"line_number":239,"context_line":"   priority 2 is removed, the remaining are renumbered to 2, 1)."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"If the removed chassis was the **primary** (highest priority), OVN will"},{"line_number":242,"context_line":"automatically fail over the gateway ``Logical_Router_Port`` to the next"}],"source_content_type":"text/x-rst","patch_set":6,"id":"10f0bcfe_db8b1e3b","line":239,"range":{"start_line":237,"start_character":0,"end_line":239,"end_character":64},"updated":"2026-04-06 18:59:19.000000000","message":"With my suggestion from L216 - we can also avoid doing this, unless OVN requires the priorities to be contiguous.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa35d3f5b231009c8337662d25c03060075d5791","unresolved":false,"context_lines":[{"line_number":234,"context_line":"   ``HA_Chassis_Group``."},{"line_number":235,"context_line":"#. Delete the ``HA_Chassis`` row for this chassis from the"},{"line_number":236,"context_line":"   ``HA_Chassis_Group``."},{"line_number":237,"context_line":"#. Renumber the remaining ``HA_Chassis`` priorities to keep them"},{"line_number":238,"context_line":"   contiguous (e.g. if priorities were 3, 2, 1 and the chassis with"},{"line_number":239,"context_line":"   priority 2 is removed, the remaining are renumbered to 2, 1)."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"If the removed chassis was the **primary** (highest priority), OVN will"},{"line_number":242,"context_line":"automatically fail over the gateway ``Logical_Router_Port`` to the next"}],"source_content_type":"text/x-rst","patch_set":6,"id":"673046c0_ed9098b5","line":239,"range":{"start_line":237,"start_character":0,"end_line":239,"end_character":64},"in_reply_to":"10f0bcfe_db8b1e3b","updated":"2026-04-07 07:24:38.000000000","message":"Right, the API will never modify the chassis priorities (**when these API calls are used, of course the OVN L3 scheduler can do this**)","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5826ab18a1985ab7bcfbee9a2ff9c20a8985c81d","unresolved":true,"context_lines":[{"line_number":331,"context_line":"logical router), not one per gateway ``Logical_Router_Port``. All"},{"line_number":332,"context_line":"gateway LRPs on the same router share the same ``HA_Chassis_Group``"},{"line_number":333,"context_line":"and therefore the same set of chassis with the same priorities."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The multi-homing anti-affinity is achieved at the **scheduler"},{"line_number":336,"context_line":"selection** level: the ``OVNGatewayLeastLoadedScheduler`` receives the"},{"line_number":337,"context_line":"``target_lrouter`` and penalizes chassis that already host other LRPs"},{"line_number":338,"context_line":"for the same router, making it less likely that two gateway ports end"},{"line_number":339,"context_line":"up with the same primary chassis. But the resulting chassis list is"},{"line_number":340,"context_line":"written to the shared ``HA_Chassis_Group``."},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Because of this one-HCG-per-router model, the L3 Agent Scheduler API"},{"line_number":343,"context_line":"mapping is straightforward: one router maps to one"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1f87d0b8_36e92eee","line":340,"range":{"start_line":334,"start_character":0,"end_line":340,"end_character":43},"updated":"2026-04-06 18:59:19.000000000","message":"I didn\u0027t get this. Does it mean we have two DGPs, they both have the same ha_chassis_group ID reference. Then it means both LRPs get the same priorities and will be bound to the same chassis by OVN, doesn\u0027t it?","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c8a02f1d30d3e65ca60a81f00064c4599c8a23e0","unresolved":false,"context_lines":[{"line_number":331,"context_line":"logical router), not one per gateway ``Logical_Router_Port``. All"},{"line_number":332,"context_line":"gateway LRPs on the same router share the same ``HA_Chassis_Group``"},{"line_number":333,"context_line":"and therefore the same set of chassis with the same priorities."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The multi-homing anti-affinity is achieved at the **scheduler"},{"line_number":336,"context_line":"selection** level: the ``OVNGatewayLeastLoadedScheduler`` receives the"},{"line_number":337,"context_line":"``target_lrouter`` and penalizes chassis that already host other LRPs"},{"line_number":338,"context_line":"for the same router, making it less likely that two gateway ports end"},{"line_number":339,"context_line":"up with the same primary chassis. But the resulting chassis list is"},{"line_number":340,"context_line":"written to the shared ``HA_Chassis_Group``."},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Because of this one-HCG-per-router model, the L3 Agent Scheduler API"},{"line_number":343,"context_line":"mapping is straightforward: one router maps to one"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ced02d54_8f3ef047","line":340,"range":{"start_line":334,"start_character":0,"end_line":340,"end_character":43},"in_reply_to":"00a26c01_086e454e","updated":"2026-04-08 07:28:59.000000000","message":"The anti-affinity filter applies to the","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"aa35d3f5b231009c8337662d25c03060075d5791","unresolved":false,"context_lines":[{"line_number":331,"context_line":"logical router), not one per gateway ``Logical_Router_Port``. All"},{"line_number":332,"context_line":"gateway LRPs on the same router share the same ``HA_Chassis_Group``"},{"line_number":333,"context_line":"and therefore the same set of chassis with the same priorities."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The multi-homing anti-affinity is achieved at the **scheduler"},{"line_number":336,"context_line":"selection** level: the ``OVNGatewayLeastLoadedScheduler`` receives the"},{"line_number":337,"context_line":"``target_lrouter`` and penalizes chassis that already host other LRPs"},{"line_number":338,"context_line":"for the same router, making it less likely that two gateway ports end"},{"line_number":339,"context_line":"up with the same primary chassis. But the resulting chassis list is"},{"line_number":340,"context_line":"written to the shared ``HA_Chassis_Group``."},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Because of this one-HCG-per-router model, the L3 Agent Scheduler API"},{"line_number":343,"context_line":"mapping is straightforward: one router maps to one"}],"source_content_type":"text/x-rst","patch_set":6,"id":"562eeb59_fea4b4d2","line":340,"range":{"start_line":334,"start_character":0,"end_line":340,"end_character":43},"in_reply_to":"1f87d0b8_36e92eee","updated":"2026-04-07 07:24:38.000000000","message":"Yes, this is how the OVN router multi-homing feature was implemented. The `HA_Chassis_Group` is associated to the LR. The GW LRPs will use the LR HCG.\n\nThis could be improved but this is out of scope of this RFE.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"da8548065f1b9d858e02c15f7ec5c1c1ef3e1c23","unresolved":false,"context_lines":[{"line_number":331,"context_line":"logical router), not one per gateway ``Logical_Router_Port``. All"},{"line_number":332,"context_line":"gateway LRPs on the same router share the same ``HA_Chassis_Group``"},{"line_number":333,"context_line":"and therefore the same set of chassis with the same priorities."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The multi-homing anti-affinity is achieved at the **scheduler"},{"line_number":336,"context_line":"selection** level: the ``OVNGatewayLeastLoadedScheduler`` receives the"},{"line_number":337,"context_line":"``target_lrouter`` and penalizes chassis that already host other LRPs"},{"line_number":338,"context_line":"for the same router, making it less likely that two gateway ports end"},{"line_number":339,"context_line":"up with the same primary chassis. But the resulting chassis list is"},{"line_number":340,"context_line":"written to the shared ``HA_Chassis_Group``."},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Because of this one-HCG-per-router model, the L3 Agent Scheduler API"},{"line_number":343,"context_line":"mapping is straightforward: one router maps to one"}],"source_content_type":"text/x-rst","patch_set":6,"id":"00a26c01_086e454e","line":340,"range":{"start_line":334,"start_character":0,"end_line":340,"end_character":43},"in_reply_to":"562eeb59_fea4b4d2","updated":"2026-04-07 17:41:23.000000000","message":"But then it\u0027s not anti-affinity if it\u0027s placed on the same node, is it? They will both end up placed on the same node.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"44c85d348d4fdd7315b453823dc191f126bc9199","unresolved":false,"context_lines":[{"line_number":331,"context_line":"logical router), not one per gateway ``Logical_Router_Port``. All"},{"line_number":332,"context_line":"gateway LRPs on the same router share the same ``HA_Chassis_Group``"},{"line_number":333,"context_line":"and therefore the same set of chassis with the same priorities."},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"The multi-homing anti-affinity is achieved at the **scheduler"},{"line_number":336,"context_line":"selection** level: the ``OVNGatewayLeastLoadedScheduler`` receives the"},{"line_number":337,"context_line":"``target_lrouter`` and penalizes chassis that already host other LRPs"},{"line_number":338,"context_line":"for the same router, making it less likely that two gateway ports end"},{"line_number":339,"context_line":"up with the same primary chassis. But the resulting chassis list is"},{"line_number":340,"context_line":"written to the shared ``HA_Chassis_Group``."},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Because of this one-HCG-per-router model, the L3 Agent Scheduler API"},{"line_number":343,"context_line":"mapping is straightforward: one router maps to one"}],"source_content_type":"text/x-rst","patch_set":6,"id":"d6505406_4bd828fa","line":340,"range":{"start_line":334,"start_character":0,"end_line":340,"end_character":43},"in_reply_to":"ced02d54_8f3ef047","updated":"2026-04-08 11:14:08.000000000","message":"Sorry.\n\nThe anti-affinity filter is calculated per HA_Chassis_Group, although it considers how many LRPs have each chassis, but for the next schedules. This is how this multi-homing feature. It could be considered to improve it but this is out of scope in this RFE.","commit_id":"9e876bb14672de994e2cbf2be1caabaf3f9b026a"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"8084ce55f100b9e7d01ed1f3a6baa96e07e37ca6","unresolved":true,"context_lines":[{"line_number":195,"context_line":"  priority among all chassis currently in the ``HA_Chassis_Group``. If"},{"line_number":196,"context_line":"  the group is empty, the chassis receives priority 1. This makes the"},{"line_number":197,"context_line":"  new chassis a backup with the lowest failover preference."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"  If the ``HA_Chassis_Group`` has a chassis with the lowest priority assigned,"},{"line_number":200,"context_line":"  the API call will fail. The API does not reschedule existing priorities."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"* **Priority provided:** the new chassis is inserted at the requested"},{"line_number":203,"context_line":"  priority. If any existing ``HA_Chassis`` register matches the provided"}],"source_content_type":"text/x-rst","patch_set":7,"id":"7eb5bcb6_a5f47cd0","line":200,"range":{"start_line":198,"start_character":1,"end_line":200,"end_character":74},"updated":"2026-04-07 16:10:08.000000000","message":"Should we be specific here with how priorities work? i.e. Specifically saying 0 is the minimum (not sure about the maximum)","commit_id":"484eba7cfc9248a68cb90e90440877bbea79e5d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c8a02f1d30d3e65ca60a81f00064c4599c8a23e0","unresolved":false,"context_lines":[{"line_number":195,"context_line":"  priority among all chassis currently in the ``HA_Chassis_Group``. If"},{"line_number":196,"context_line":"  the group is empty, the chassis receives priority 1. This makes the"},{"line_number":197,"context_line":"  new chassis a backup with the lowest failover preference."},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"  If the ``HA_Chassis_Group`` has a chassis with the lowest priority assigned,"},{"line_number":200,"context_line":"  the API call will fail. The API does not reschedule existing priorities."},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"* **Priority provided:** the new chassis is inserted at the requested"},{"line_number":203,"context_line":"  priority. If any existing ``HA_Chassis`` register matches the provided"}],"source_content_type":"text/x-rst","patch_set":7,"id":"00a4241f_9c25e497","line":200,"range":{"start_line":198,"start_character":1,"end_line":200,"end_character":74},"in_reply_to":"7eb5bcb6_a5f47cd0","updated":"2026-04-08 07:28:59.000000000","message":"I can make the comment, for reference, of the `HA_Chassis` priority range.\nI\u0027ve added this comment at the end of \"Overview\" section.","commit_id":"484eba7cfc9248a68cb90e90440877bbea79e5d3"},{"author":{"_account_id":32586,"name":"Elvira García Ruiz","display_name":"Elvira","email":"egarciar@redhat.com","username":"elvira"},"change_message_id":"8084ce55f100b9e7d01ed1f3a6baa96e07e37ca6","unresolved":true,"context_lines":[{"line_number":202,"context_line":"* **Priority provided:** the new chassis is inserted at the requested"},{"line_number":203,"context_line":"  priority. If any existing ``HA_Chassis`` register matches the provided"},{"line_number":204,"context_line":"  priority, the API call will fail. This is the same consideration as in the"},{"line_number":205,"context_line":"  previous section: the API does not reschedule the existing priorities. The"},{"line_number":206,"context_line":"  user needs to"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"The request without the extension loaded uses the standard body"},{"line_number":209,"context_line":"``{\"router_id\": \"\u003cuuid\u003e\"}`` and the chassis is added at the lowest"}],"source_content_type":"text/x-rst","patch_set":7,"id":"dd0e9ead_6d42ac8a","line":206,"range":{"start_line":205,"start_character":72,"end_line":206,"end_character":15},"updated":"2026-04-07 16:10:08.000000000","message":"I think this setence is unfinished, not sure if not needed anymore or if it should be something like \"the users need to do the rescheduling of the priorities themselves.\"","commit_id":"484eba7cfc9248a68cb90e90440877bbea79e5d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c8a02f1d30d3e65ca60a81f00064c4599c8a23e0","unresolved":false,"context_lines":[{"line_number":202,"context_line":"* **Priority provided:** the new chassis is inserted at the requested"},{"line_number":203,"context_line":"  priority. If any existing ``HA_Chassis`` register matches the provided"},{"line_number":204,"context_line":"  priority, the API call will fail. This is the same consideration as in the"},{"line_number":205,"context_line":"  previous section: the API does not reschedule the existing priorities. The"},{"line_number":206,"context_line":"  user needs to"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"The request without the extension loaded uses the standard body"},{"line_number":209,"context_line":"``{\"router_id\": \"\u003cuuid\u003e\"}`` and the chassis is added at the lowest"}],"source_content_type":"text/x-rst","patch_set":7,"id":"947a0d63_6058a49a","line":206,"range":{"start_line":205,"start_character":72,"end_line":206,"end_character":15},"in_reply_to":"dd0e9ead_6d42ac8a","updated":"2026-04-08 07:28:59.000000000","message":"Yeah, I need to finish this sentence.","commit_id":"484eba7cfc9248a68cb90e90440877bbea79e5d3"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b8dfe60629d9df2bee015b1608f342380e968091","unresolved":true,"context_lines":[{"line_number":230,"context_line":"This API call is currently not provided by the L3 Agent Scheduler API [3]_"},{"line_number":231,"context_line":"because it wasn\u0027t needed to update the ``ha_chassis_priority``. This API call"},{"line_number":232,"context_line":"will be also implemented in the L3 agent (non OVN) and will raise a"},{"line_number":233,"context_line":"``NotImplementedError`` exception."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"The implementation will:"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"8aa9a651_90a1cb8a","line":233,"updated":"2026-04-09 16:50:28.000000000","message":"This paragraph is a little confusing. I think what you\u0027re saying is this extension will not be provided for the L3 agent scheduler since it is not applicable. Maybe this works?\n\nThis API call is currently not applicable to the L3 Agent Scheduler API [3]_\nbecause it does not support ``ha_chassis_priority``. As such it\nwill not be implemented for the L3 agent (non OVN) and will raise a\n``NotImplementedError`` exception.","commit_id":"d7d024aab89dbb49f48303ad2b12bcfc533ae813"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d35011203074073d1136b77a4651627060c1f24c","unresolved":true,"context_lines":[{"line_number":228,"context_line":"extension is not loaded, the endpoint returns ``404 Not Found``."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"This API call is currently not provided by the L3 Agent Scheduler API [3]_"},{"line_number":231,"context_line":"because it wasn\u0027t needed to update the ``ha_chassis_priority``. This API call"},{"line_number":232,"context_line":"will be also implemented in the L3 agent (non OVN) and will raise a"},{"line_number":233,"context_line":"``NotImplementedError`` exception."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"The implementation will:"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"2d9c6c02_25f4e93b","line":233,"range":{"start_line":231,"start_character":64,"end_line":233,"end_character":34},"updated":"2026-04-10 12:58:08.000000000","message":"can\u0027t we simply make that new API extension to be supported only by \"ovn-router\" service plugin and not by the \"router\" service plugin? That way this new API call should simply be not available for the L3 agent based clusters, no?","commit_id":"d7d024aab89dbb49f48303ad2b12bcfc533ae813"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"53d41434a9020fe7de82dce2a44a1da2673e83b3","unresolved":false,"context_lines":[{"line_number":228,"context_line":"extension is not loaded, the endpoint returns ``404 Not Found``."},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"This API call is currently not provided by the L3 Agent Scheduler API [3]_"},{"line_number":231,"context_line":"because it wasn\u0027t needed to update the ``ha_chassis_priority``. This API call"},{"line_number":232,"context_line":"will be also implemented in the L3 agent (non OVN) and will raise a"},{"line_number":233,"context_line":"``NotImplementedError`` exception."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"The implementation will:"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"2e94aa2b_76eaafb3","line":233,"range":{"start_line":231,"start_character":64,"end_line":233,"end_character":34},"in_reply_to":"2d9c6c02_25f4e93b","updated":"2026-04-10 13:14:32.000000000","message":"Hmmm better what Slawek commented. This is an API extension only for OVN, so the \"L3 agent\" plugin [1] won\u0027t support this. But the \"OVN L3 agent\" [2] will do (hardcoded in the `ML2_SUPPORTED_API_EXTENSIONS_OVN_L3`) variable.\n\nI\u0027ll add this info.\n\nThanks for your comments!\n\n[1]https://github.com/openstack/neutron/blob/2f6f25a5bb9d87052679cebefb53e5d028d4742c/neutron/services/l3_router/l3_router_plugin.py#L81\n[2]https://github.com/openstack/neutron/blob/2f6f25a5bb9d87052679cebefb53e5d028d4742c/neutron/services/ovn_l3/plugin.py#L65","commit_id":"d7d024aab89dbb49f48303ad2b12bcfc533ae813"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"53d41434a9020fe7de82dce2a44a1da2673e83b3","unresolved":false,"context_lines":[{"line_number":230,"context_line":"This API call is currently not provided by the L3 Agent Scheduler API [3]_"},{"line_number":231,"context_line":"because it wasn\u0027t needed to update the ``ha_chassis_priority``. This API call"},{"line_number":232,"context_line":"will be also implemented in the L3 agent (non OVN) and will raise a"},{"line_number":233,"context_line":"``NotImplementedError`` exception."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"The implementation will:"},{"line_number":236,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"6c66c797_ab98f32e","line":233,"in_reply_to":"8aa9a651_90a1cb8a","updated":"2026-04-10 13:14:32.000000000","message":"https://review.opendev.org/c/openstack/neutron-specs/+/982743/comment/2d9c6c02_25f4e93b/","commit_id":"d7d024aab89dbb49f48303ad2b12bcfc533ae813"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d35011203074073d1136b77a4651627060c1f24c","unresolved":true,"context_lines":[{"line_number":433,"context_line":""},{"line_number":434,"context_line":"   Operators who rely on manual scheduling via this API should maintain"},{"line_number":435,"context_line":"   an external record of their chassis assignments and priorities so that"},{"line_number":436,"context_line":"   they can be re-applied after a full Northbound database recovery."},{"line_number":437,"context_line":""},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"Implementation approach"}],"source_content_type":"text/x-rst","patch_set":10,"id":"a47292b8_64a61f51","line":436,"updated":"2026-04-10 12:58:08.000000000","message":"no action reguired; this should be IMO documented also somewhere in the ML2/OVN documentaion to avoid bug reports related to that behavior","commit_id":"d7d024aab89dbb49f48303ad2b12bcfc533ae813"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"53d41434a9020fe7de82dce2a44a1da2673e83b3","unresolved":false,"context_lines":[{"line_number":433,"context_line":""},{"line_number":434,"context_line":"   Operators who rely on manual scheduling via this API should maintain"},{"line_number":435,"context_line":"   an external record of their chassis assignments and priorities so that"},{"line_number":436,"context_line":"   they can be re-applied after a full Northbound database recovery."},{"line_number":437,"context_line":""},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"Implementation approach"}],"source_content_type":"text/x-rst","patch_set":10,"id":"4f141325_777caa18","line":436,"in_reply_to":"a47292b8_64a61f51","updated":"2026-04-10 13:14:32.000000000","message":"Yes, this will be both in a reno and the documentation.","commit_id":"d7d024aab89dbb49f48303ad2b12bcfc533ae813"}]}
