Check inspection data and abortion in the standalone tests

Depends-On: https://review.opendev.org/c/openstack/ironic/+/930279
Change-Id: Iff8d1243d350a9e91910b2a3ebd1db92637d4a0f
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 be1262d..b385c28 100644
--- a/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
+++ b/ironic_tempest_plugin/services/baremetal/v1/json/baremetal_client.py
@@ -1008,3 +1008,19 @@
         }
 
         return self._create_request_no_response_body('heartbeat', kwargs)
+
+    @base.handle_errors
+    def show_inventory(self, uuid, api_version='1.81'):
+        """Gets hardware inventory for the specific node.
+
+        :param uuid: Unique identifier of the node in UUID format.
+        :param api_version: Ironic API version to use.
+        :return: Inventory as a dictionary.
+
+        """
+        extra_headers, headers = self._get_headers(api_version)
+        resp, body = self._show_request(
+            'inventory', uuid, headers=headers, extra_headers=extra_headers,
+            uri=f'{self.uri_prefix}/nodes/{uuid}/inventory')
+        self.expected_success(http_client.OK, resp.status)
+        return body
diff --git a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_inspection_basic.py b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_inspection_basic.py
index 2f367b1..7d1d602 100644
--- a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_inspection_basic.py
+++ b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_inspection_basic.py
@@ -70,8 +70,60 @@
     driver = 'redfish'
     inspect_interface = 'agent'
     wait_provisioning_state_interval = 15
+    # 1.81 adds support for inventory API
+    api_microversion = '1.81'
 
-    # TODO(dtantsur): test aborting inspection and fetching inspection data
+    def _verify_node_inspection_data(self, node):
+        super()._verify_node_inspection_data(node)
+        inspection_data = self.baremetal_client.show_inventory(
+            self.node['uuid'])
+        self.assertEqual({'inventory', 'plugin_data'}, set(inspection_data))
+
+        # Inventory sanity check
+        inventory = inspection_data['inventory']
+        self.assertGreater(inventory['cpu']['count'], 0)
+        self.assertGreater(inventory['memory']['physical_mb'], 256)
+        self.assertGreater(len(inventory['disks']), 0)
+        self.assertGreater(len(inventory['interfaces']), 0)
+
+    @decorators.idempotent_id('82670a85-49b7-4d28-b8a8-6e18b0d4c8d1')
+    def test_inspect_abort(self):
+        _, node = self.baremetal_client.show_node(self.node['uuid'])
+        current_state = node['provision_state']
+
+        def cleanup():
+            nonlocal current_state
+
+            if current_state == 'inspect failed':
+                self.baremetal_client.set_node_provision_state(
+                    self.node['uuid'], 'manage')
+                self.wait_provisioning_state(self.node['uuid'], 'manageable')
+                current_state = 'manageable'
+
+            if current_state == 'manageable':
+                self.baremetal_client.set_node_provision_state(
+                    self.node['uuid'], 'provide')
+                self.wait_provisioning_state(self.node['uuid'], 'available')
+
+        self.addCleanup(cleanup)
+
+        if current_state != 'manageable':
+            self.baremetal_client.set_node_provision_state(self.node['uuid'],
+                                                           'manage')
+        current_state = 'manageable'
+
+        self.baremetal_client.set_node_provision_state(self.node['uuid'],
+                                                       'inspect')
+        self.wait_provisioning_state(
+            self.node['uuid'], 'inspect wait',
+            timeout=300, interval=5)
+
+        self.baremetal_client.set_node_provision_state(self.node['uuid'],
+                                                       'abort')
+        self.wait_provisioning_state(
+            self.node['uuid'], 'inspect failed',
+            timeout=60, interval=1)
+        current_state = 'inspect failed'
 
 
 class BaremetalIdracInspect(BaremetalInspectBase,