diff --git a/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py b/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
index 182cacc..1fc87d8 100644
--- a/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
+++ b/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
@@ -79,14 +79,24 @@
         return self._list_request('/chassis/%s/nodes' % chassis_uuid)
 
     @base.handle_errors
-    def list_ports(self, **kwargs):
-        """List all existing ports."""
-        return self._list_request('ports', **kwargs)
+    def list_ports(self, api_version=None, **kwargs):
+        """List all existing ports.
+
+        :param api_version: Ironic API version to use.
+        """
+        extra_headers, headers = self._get_headers(api_version)
+        return self._list_request('ports', headers=headers,
+                                  extra_headers=headers, **kwargs)
 
     @base.handle_errors
-    def list_portgroups(self, **kwargs):
-        """List all existing port groups."""
-        return self._list_request('portgroups', **kwargs)
+    def list_portgroups(self, api_version=None, **kwargs):
+        """List all existing port groups.
+
+        :param api_version: Ironic API version to use.
+        """
+        extra_headers, headers = self._get_headers(api_version)
+        return self._list_request('portgroups', headers=headers,
+                                  extra_headers=extra_headers, **kwargs)
 
     @base.handle_errors
     def list_volume_connectors(self, **kwargs):
@@ -193,13 +203,17 @@
         return self._show_request('ports', uuid)
 
     @base.handle_errors
-    def show_portgroup(self, portgroup_ident):
+    def show_portgroup(self, portgroup_ident, api_version=None):
         """Gets a specific port group.
 
         :param portgroup_ident: Name or UUID of the port group.
+        :param api_version: Ironic API version to use.
         :return: Serialized port group as a dictionary.
         """
-        return self._show_request('portgroups', portgroup_ident)
+        extra_headers, headers = self._get_headers(api_version)
+        return self._show_request('portgroups', portgroup_ident,
+                                  headers=headers,
+                                  extra_headers=extra_headers)
 
     @base.handle_errors
     def show_volume_connector(self, volume_connector_ident):
diff --git a/ironic_tempest_plugin/tests/scenario/baremetal_manager.py b/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
index ad9e4c9..575d8d9 100644
--- a/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
+++ b/ironic_tempest_plugin/tests/scenario/baremetal_manager.py
@@ -161,6 +161,16 @@
             ports.append(p)
         return ports
 
+    def get_portgroups(self, node_uuid):
+        portgroups = []
+        _, body = self.baremetal_client.list_portgroups(
+            node=node_uuid, api_version='1.23')
+        for portgroup in body['portgroups']:
+            _, p = self.baremetal_client.show_portgroup(
+                portgroup['uuid'], api_version='1.23')
+            portgroups.append(p)
+        return portgroups
+
     def get_node_vifs(self, node_uuid, api_version='1.28'):
         _, body = self.baremetal_client.vif_list(node_uuid,
                                                  api_version=api_version)
diff --git a/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py b/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py
index 58bbf87..b90c2a3 100644
--- a/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py
+++ b/ironic_tempest_plugin/tests/scenario/test_baremetal_basic_ops.py
@@ -13,6 +13,7 @@
 # License for the specific language governing permissions and limitations
 # under the License.
 
+import json
 import re
 
 from oslo_log import log as logging
@@ -237,6 +238,38 @@
             # set the lessee.
             self.assertEqual(iinfo['project_id'], self.node['lessee'])
 
+    def validate_network_data(self, ssh_client):
+        portgroups = self.get_portgroups(self.node["uuid"])
+        if not portgroups:
+            return
+
+        ssh_client.mount_config_drive()
+        cmd_md = 'sudo cat /mnt/openstack/latest/network_data.json'
+        result = ssh_client.exec_command(cmd_md)
+        ssh_client.unmount_config_drive()
+        result = json.loads(result)
+
+        self.assertIn('links', result)
+        bond_seen = False
+        modes_to_check = []
+        expected_links_count = 0
+
+        for pg in portgroups:
+            modes_to_check.append(pg['mode'])
+            expected_links_count += 1
+            _, body = self.baremetal_client.list_ports(
+                portgroup=pg['uuid'], api_version='1.28')
+            expected_links_count += len(body['ports'])
+
+        for link in result["links"]:
+            if link["type"] == "bond":
+                bond_seen = True
+                self.assertIn('bond_mode', link)
+                self.assertIn('bond_mode', link)
+                self.assertIn(link['bond_mode'], modes_to_check)
+        self.assertEqual(len(result['links']), expected_links_count)
+        self.assertTrue(bond_seen)
+
     def baremetal_server_ops(self):
         self.add_keypair()
         self.instance, self.node = self.boot_instance(image_id=self.image_ref)
@@ -263,6 +296,8 @@
         if CONF.baremetal.boot_mode == "uefi":
             self.validate_uefi(vm_client)
 
+        self.validate_network_data(vm_client)
+
         # Test rescue mode
         if self.TEST_RESCUE_MODE:
             self.rescue_instance(self.instance, self.node, ip_address)
