)]}'
{"networking_baremetal/agent/router_ha_binding.py":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"415056e93df23a706ccb639453074b759839af4c","unresolved":true,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"            try:"},{"line_number":234,"context_line":"                chunk_ports \u003d list(self.neutron_client.network.ports("},{"line_number":235,"context_line":"                    network_id\u003dchunk,"},{"line_number":236,"context_line":"                    device_owner\u003dn_const.DEVICE_OWNER_ROUTER_INTF))"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"                # Group ports by network_id"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fd08784_ab94131e","line":235,"updated":"2026-03-24 12:58:17.000000000","message":"Can you really send a list of network_ids here?","commit_id":"ad3c982ec25c4ac735bfad443d2984ada75c6fa4"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"bd8f1ffe8df1c5daee8e95226407a99d87cee589","unresolved":true,"context_lines":[{"line_number":232,"context_line":""},{"line_number":233,"context_line":"            try:"},{"line_number":234,"context_line":"                chunk_ports \u003d list(self.neutron_client.network.ports("},{"line_number":235,"context_line":"                    network_id\u003dchunk,"},{"line_number":236,"context_line":"                    device_owner\u003dn_const.DEVICE_OWNER_ROUTER_INTF))"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"                # Group ports by network_id"}],"source_content_type":"text/x-python","patch_set":1,"id":"6897cded_a6ffd316","line":235,"in_reply_to":"3fd08784_ab94131e","updated":"2026-03-24 15:31:52.000000000","message":"The neutron API supports it, ref: https://docs.openstack.org/api-ref/network/v2/#filtering-and-column-selection\n\n\u003e OpenStack Networking offers an OR mechanism for filters by repeating the\n\u003e field with the different OR criteria. For example, to find all networks \n\u003e named foobar OR bizbaz:\n\u003e\n\u003e   GET /v2.0/networks?name\u003dfoobar\u0026name\u003dbizbaz\n\nClaude\u0027s explanations on how it works in openstacksdk, python requests is doing the magic.\n\nWhen you pass a list to network_id parameter:\n  network.ports(network_id\u003d[\u0027uuid1\u0027, \u0027uuid2\u0027, \u0027uuid3\u0027], device_owner\u003d\u0027...\u0027)\n\nFlow:\n1. Proxy passes params to Resource.list() [1]\n2. Resource.list() passes params dict to session.get() [2]\n3. Requests library auto-converts list values to repeated params [3]\n\nResult URL:\n  GET /v2.0/ports?network_id\u003duuid1\u0026network_id\u003duuid2\u0026network_id\u003duuid3\u0026device_owner\u003d...\n\nThe magic: Python\u0027s requests library automatically expands list values \ninto multiple query parameters with the same name. No special handling \nneeded in openstacksdk - it just passes the dict through.\n\nReferences:\n[1] https://opendev.org/openstack/openstacksdk/src/branch/master/openstack/network/v2/_proxy.py#L2977-L2999\n[2] https://opendev.org/openstack/openstacksdk/src/branch/master/openstack/resource.py#L2079-L2084\n[3] requests.Request().prepare() does the list expansion automatically\n\nLogs from testing:\n```\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: DEBUG networking_baremetal.agent.router_ha_binding [-] Querying router ports for 4 networks in 1 chunk(s) {{(pid\u003d239892) _get_router_ports_for_networks /opt/stack/networking-baremetal/networking_baremetal/agent/router_ha_binding.py:227}}\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: DEBUG networking_baremetal.agent.router_ha_binding [-] Found 2 router ports across 2 networks {{(pid\u003d239892) _get_router_ports_for_networks /opt/stack/networking-baremetal/networking_baremetal/agent/router_ha_binding.py:252}}\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: DEBUG ovsdbapp.backend.ovs_idl.transaction [-] Running txn n\u003d1 command(idx\u003d0): LrpSetHaChassisGroupCommand(_result\u003dNone, port\u003dlrp-4bfd7ea3-1203-469f-aae2-cacc248eece2, ha_chassis_group\u003d494555ac-3249-40bd-88a1-d0b50a3cf42b) {{(pid\u003d239892) do_commit /opt/stack/data/venv/lib/python3.12/site-packages/ovsdbapp/backend/ovs_idl/transaction.py:89}}\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: DEBUG ovsdbapp.backend.ovs_idl.transaction [-] Transaction caused no change {{(pid\u003d239892) do_commit /opt/stack/data/venv/lib/python3.12/site-packages/ovsdbapp/backend/ovs_idl/transaction.py:129}}\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: INFO networking_baremetal.agent.router_ha_binding [-] Updated router port 4bfd7ea3-1203-469f-aae2-cacc248eece2 HA chassis group from HA_Chassis_Group(uuid\u003d494555ac-3249-40bd-88a1-d0b50a3cf42b, external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:network_id\u0027: \u00278d58ae65-6f74-4718-92d1-697b16d7ddf3\u0027, \u0027neutron:router_id\u0027: \u0027436fb2f4-b9d2-4be4-90d8-1f2333def22d\u0027}, ha_chassis\u003d[\u00278b425b83-0ae9-4d8d-a3f6-18972fe01e5a\u0027], name\u003dneutron-8d58ae65-6f74-4718-92d1-697b16d7ddf3) to 494555ac-3249-40bd-88a1-d0b50a3cf42b (network 8d58ae65-6f74-4718-92d1-697b16d7ddf3)\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: DEBUG ovsdbapp.backend.ovs_idl.transaction [-] Running txn n\u003d1 command(idx\u003d0): LrpSetHaChassisGroupCommand(_result\u003dNone, port\u003dlrp-74c763cc-cede-43c6-8fe6-86c643ce98eb, ha_chassis_group\u003de719af0b-5c10-4c1d-9b4a-455bc01a7e77) {{(pid\u003d239892) do_commit /opt/stack/data/venv/lib/python3.12/site-packages/ovsdbapp/backend/ovs_idl/transaction.py:89}}\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: DEBUG ovsdbapp.backend.ovs_idl.transaction [-] Transaction caused no change {{(pid\u003d239892) do_commit /opt/stack/data/venv/lib/python3.12/site-packages/ovsdbapp/backend/ovs_idl/transaction.py:129}}\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: INFO networking_baremetal.agent.router_ha_binding [-] Updated router port 74c763cc-cede-43c6-8fe6-86c643ce98eb HA chassis group from HA_Chassis_Group(uuid\u003de719af0b-5c10-4c1d-9b4a-455bc01a7e77, external_ids\u003d{\u0027neutron:availability_zone_hints\u0027: \u0027\u0027, \u0027neutron:network_id\u0027: \u0027ea504580-95fa-42bc-8d23-53a54d4b5f3e\u0027, \u0027neutron:router_id\u0027: \u0027436fb2f4-b9d2-4be4-90d8-1f2333def22d\u0027}, ha_chassis\u003d[\u002728d86d31-2d67-444b-9559-88e0a14d23a2\u0027], name\u003dneutron-ea504580-95fa-42bc-8d23-53a54d4b5f3e) to e719af0b-5c10-4c1d-9b4a-455bc01a7e77 (network ea504580-95fa-42bc-8d23-53a54d4b5f3e)\nMar 21 15:15:23 devstack ironic-neutron-agent[239892]: INFO networking_baremetal.agent.router_ha_binding [-] Router HA binding reconciliation complete: processed 4 networks, updated 2 router ports\n```","commit_id":"ad3c982ec25c4ac735bfad443d2984ada75c6fa4"}]}
