Add port group network metadata config fix [PS-224] (#1507)
diff --git a/images/nova/Dockerfile b/images/nova/Dockerfile
index 5c86c24..e336f45 100644
--- a/images/nova/Dockerfile
+++ b/images/nova/Dockerfile
@@ -7,6 +7,8 @@
ARG NOVA_GIT_REF=c199becf52267ba37c5191f6f82e29bb5232b607
ADD --keep-git-dir=true https://opendev.org/openstack/nova.git#${NOVA_GIT_REF} /src/nova
RUN git -C /src/nova fetch --unshallow
+COPY patches/nova /patches/nova
+RUN git -C /src/nova apply --verbose /patches/nova/*
RUN --mount=type=cache,mode=0755,target=/root/.cache/pip,sharing=private <<EOF bash -xe
pip3 install \
--constraint /upper-constraints.txt \
diff --git a/images/nova/patches/nova/0000-Fix-port-group-network-metadata-generation.patch b/images/nova/patches/nova/0000-Fix-port-group-network-metadata-generation.patch
new file mode 100644
index 0000000..98be564
--- /dev/null
+++ b/images/nova/patches/nova/0000-Fix-port-group-network-metadata-generation.patch
@@ -0,0 +1,50 @@
+From 8558f59630f81beba2789e6deef2cb5e6b367f20 Mon Sep 17 00:00:00 2001
+From: Mohammed Naser <mnaser@vexxhost.com>
+Date: Thu, 04 Jul 2024 14:09:23 -0400
+Subject: [PATCH] Fix port group network metadata generation
+
+When switching to using OpenStack SDK, there was a change missed
+that didn't account for the SDK returning generators instead of
+a list, so the loop on ports and port groups made it so that it
+started returning an empty list afterwards.
+
+Since there is no a masse of ports for a baremetal system usually,
+we take the generator into a list right away to prevent this.
+
+Closes-Bug: #2071972
+Change-Id: I90766f8c225d834bb2eec606754107ea6a212f6d
+---
+
+diff --git a/nova/tests/unit/virt/ironic/test_driver.py b/nova/tests/unit/virt/ironic/test_driver.py
+index 736eac2..bf32918 100644
+--- a/nova/tests/unit/virt/ironic/test_driver.py
++++ b/nova/tests/unit/virt/ironic/test_driver.py
+@@ -2785,8 +2785,8 @@
+ node_id=self.node.id,
+ address='00:00:00:00:00:02',
+ port_group_id=portgroup.id)
+- self.mock_conn.ports.return_value = [port1, port2]
+- self.mock_conn.port_groups.return_value = [portgroup]
++ self.mock_conn.ports.return_value = iter([port1, port2])
++ self.mock_conn.port_groups.return_value = iter([portgroup])
+
+ metadata = self.driver._get_network_metadata(self.node,
+ self.network_info)
+diff --git a/nova/virt/ironic/driver.py b/nova/virt/ironic/driver.py
+index 3af85d3..c990218 100644
+--- a/nova/virt/ironic/driver.py
++++ b/nova/virt/ironic/driver.py
+@@ -1050,10 +1050,10 @@
+ :param network_info: Instance network information.
+ """
+ base_metadata = netutils.get_network_metadata(network_info)
+- ports = self.ironic_connection.ports(node=node.id, details=True)
+- port_groups = self.ironic_connection.port_groups(
++ ports = list(self.ironic_connection.ports(node=node.id, details=True))
++ port_groups = list(self.ironic_connection.port_groups(
+ node=node.id, details=True,
+- )
++ ))
+ vif_id_to_objects = {'ports': {}, 'portgroups': {}}
+ for collection, name in ((ports, 'ports'),
+ (port_groups, 'portgroups')):