Add API tests for setting/resetting hardware interfaces

Change-Id: Ie43d6ab6301d8296fc65888a2c1b02206d90c72c
Story: #2002868
Task: #22828
diff --git a/ironic_tempest_plugin/tests/api/admin/test_nodes.py b/ironic_tempest_plugin/tests/api/admin/test_nodes.py
index d5abd11..59695e6 100644
--- a/ironic_tempest_plugin/tests/api/admin/test_nodes.py
+++ b/ironic_tempest_plugin/tests/api/admin/test_nodes.py
@@ -409,6 +409,66 @@
         self.client.vif_detach(self.node['uuid'], self.nport_id)
 
 
+class TestHardwareInterfaces(base.BaseBaremetalTest):
+
+    min_microversion = '1.31'
+    # Subclasses can override this with more interfaces available in later API
+    # versions.
+    hardware_interfaces = [
+        'boot',
+        'console',
+        'deploy',
+        'inspect',
+        'management',
+        'power',
+        'raid',
+        'vendor',
+    ]
+
+    @classmethod
+    def skip_checks(cls):
+        super(TestHardwareInterfaces, cls).skip_checks()
+        if CONF.baremetal.driver != 'fake-hardware':
+            raise cls.skipException('These tests rely on fake-hardware')
+
+    @property
+    def optional_interfaces(self):
+        return set(self.hardware_interfaces) - {'boot', 'deploy',
+                                                'management', 'power'}
+
+    def setUp(self):
+        super(TestHardwareInterfaces, self).setUp()
+
+        _, self.chassis = self.create_chassis()
+        _, self.node = self.create_node(self.chassis['uuid'])
+
+        # Reset optional interfaces to non-default values
+        for iface in self.optional_interfaces:
+            self.client.update_node(self.node['uuid'],
+                                    [{'path': '/%s_interface' % iface,
+                                      'op': 'add',
+                                      'value': 'no-%s' % iface}])
+
+    def test_set_interfaces(self):
+        for iface in self.hardware_interfaces:
+            field = '%s_interface' % iface
+            self.client.update_node(self.node['uuid'],
+                                    [{'path': '/%s' % field,
+                                      'op': 'add',
+                                      'value': 'fake'}])
+            _, node = self.client.show_node(self.node['uuid'])
+            self.assertEqual('fake', node[field])
+
+    def test_reset_interfaces(self):
+        for iface in self.hardware_interfaces:
+            field = '%s_interface' % iface
+            self.client.update_node(self.node['uuid'],
+                                    [{'path': '/%s' % field,
+                                      'op': 'remove'}])
+            _, node = self.client.show_node(self.node['uuid'])
+            self.assertEqual('fake', node[field])
+
+
 class TestNodesTraits(base.BaseBaremetalTest):
 
     min_microversion = '1.37'