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')):