Do not boot nodes if not set in standalone tests

For several standalone tests, there is no need to have an active
node, but just an available one. Add a flag to only boot the node
if the test specifies to do it.

Change-Id: If879c4f43626641f455a8b58e060347a109d6976
diff --git a/ironic_tempest_plugin/tests/scenario/baremetal_standalone_manager.py b/ironic_tempest_plugin/tests/scenario/baremetal_standalone_manager.py
index 8650b76..74367f9 100644
--- a/ironic_tempest_plugin/tests/scenario/baremetal_standalone_manager.py
+++ b/ironic_tempest_plugin/tests/scenario/baremetal_standalone_manager.py
@@ -35,6 +35,9 @@
     # attach VIF to a node.
     min_microversion = '1.28'
 
+    image_ref = None
+    image_checksum = None
+
     @classmethod
     def skip_checks(cls):
         """Defines conditions to skip these tests."""
@@ -218,30 +221,28 @@
         return nodes[0]
 
     @classmethod
-    def boot_node(cls, driver, image_ref, image_checksum=None, **interfaces):
+    def boot_node(cls, image_ref=None, image_checksum=None):
         """Boot ironic node.
 
         The following actions are executed:
-          * Randomly pick an available node for deployment and reserve it.
-          * Update node driver.
           * Create/Pick networks to boot node in.
           * Create Neutron port and attach it to node.
           * Update node image_source/root_gb.
           * Deploy node.
           * Wait until node is deployed.
 
-        :param driver: Node driver to use.
         :param image_ref: Reference to user image to boot node with.
         :param image_checksum: md5sum of image specified in image_ref.
                                Needed only when direct HTTP link is provided.
-        :param interfaces: driver interfaces to set on the node
-        :returns: Ironic node.
         """
-        node = cls.get_and_reserve_node()
-        cls.update_node_driver(node['uuid'], driver, **interfaces)
+        if image_ref is None:
+            image_ref = cls.image_ref
+        if image_checksum is None:
+            image_checksum = cls.image_checksum
+
         network, subnet, router = cls.create_networks()
         n_port = cls.create_neutron_port(network_id=network['id'])
-        cls.vif_attach(node_id=node['uuid'], vif_id=n_port['id'])
+        cls.vif_attach(node_id=cls.node['uuid'], vif_id=n_port['id'])
         patch = [{'path': '/instance_info/image_source',
                   'op': 'add',
                   'value': image_ref}]
@@ -253,14 +254,14 @@
                       'op': 'add',
                       'value': CONF.baremetal.adjusted_root_disk_size_gb})
         # TODO(vsaienko) add testing for custom configdrive
-        cls.update_node(node['uuid'], patch=patch)
-        cls.set_node_provision_state(node['uuid'], 'active')
-        cls.wait_power_state(node['uuid'], bm.BaremetalPowerStates.POWER_ON)
-        cls.wait_provisioning_state(node['uuid'],
+        cls.update_node(cls.node['uuid'], patch=patch)
+        cls.set_node_provision_state(cls.node['uuid'], 'active')
+        cls.wait_power_state(cls.node['uuid'],
+                             bm.BaremetalPowerStates.POWER_ON)
+        cls.wait_provisioning_state(cls.node['uuid'],
                                     bm.BaremetalProvisionStates.ACTIVE,
                                     timeout=CONF.baremetal.active_timeout,
                                     interval=30)
-        return node
 
     @classmethod
     def terminate_node(cls, node_id):
@@ -347,13 +348,6 @@
         :param node: Ironic node to associate instance_uuid with, it is
             expected to be in 'active' state
         """
-        self.set_node_provision_state(node['uuid'], 'deleted')
-        self.wait_provisioning_state(
-            node['uuid'],
-            [bm.BaremetalProvisionStates.NOSTATE,
-             bm.BaremetalProvisionStates.AVAILABLE],
-            timeout=CONF.baremetal.unprovision_timeout,
-            interval=30)
         clean_steps = [
             {
                 "interface": "deploy",
@@ -386,15 +380,9 @@
     # been set via a different test).
     rescue_interface = None
 
-    # User image ref to boot node with.
-    image_ref = None
-
     # Boolean value specify if image is wholedisk or not.
     wholedisk_image = None
 
-    # Image checksum, required when image is stored on HTTP server.
-    image_checksum = None
-
     # If we need to set provision state 'deleted' for the node  after test
     delete_node = True
 
@@ -435,6 +423,18 @@
                 'Partitioned images are not supported with multitenancy.')
 
     @classmethod
+    def set_node_to_active(cls, image_ref=None, image_checksum=None):
+        cls.boot_node(image_ref, image_checksum)
+        if CONF.validation.connect_method == 'floating':
+            cls.node_ip = cls.add_floatingip_to_node(cls.node['uuid'])
+        elif CONF.validation.connect_method == 'fixed':
+            cls.node_ip = cls.get_server_ip(cls.node['uuid'])
+        else:
+            m = ('Configuration option "[validation]/connect_method" '
+                 'must be set.')
+            raise lib_exc.InvalidConfiguration(m)
+
+    @classmethod
     def resource_setup(cls):
         super(BaremetalStandaloneScenarioTest, cls).resource_setup()
         base.set_baremetal_api_microversion(cls.api_microversion)
@@ -450,20 +450,17 @@
             boot_kwargs['deploy_interface'] = cls.deploy_interface
         if cls.rescue_interface:
             boot_kwargs['rescue_interface'] = cls.rescue_interface
-        cls.node = cls.boot_node(cls.driver, cls.image_ref, **boot_kwargs)
-        if CONF.validation.connect_method == 'floating':
-            cls.node_ip = cls.add_floatingip_to_node(cls.node['uuid'])
-        elif CONF.validation.connect_method == 'fixed':
-            cls.node_ip = cls.get_server_ip(cls.node['uuid'])
-        else:
-            m = ('Configuration option "[validation]/connect_method" '
-                 'must be set.')
-            raise lib_exc.InvalidConfiguration(m)
+
+        # just get an available node
+        cls.node = cls.get_and_reserve_node()
+        cls.update_node_driver(cls.node['uuid'], cls.driver, **boot_kwargs)
 
     @classmethod
     def resource_cleanup(cls):
         if CONF.validation.connect_method == 'floating':
-            cls.cleanup_floating_ip(cls.node_ip)
+            if cls.node_ip:
+                cls.cleanup_floating_ip(cls.node_ip)
+
         vifs = cls.get_node_vifs(cls.node['uuid'])
         # Remove ports before deleting node, to catch regression for cases
         # when user did this prior unprovision node.
@@ -475,3 +472,9 @@
         cls.terminate_node(cls.node['uuid'])
         base.reset_baremetal_api_microversion()
         super(BaremetalStandaloneManager, cls).resource_cleanup()
+
+    def boot_and_verify_node(self, image_ref=None, image_checksum=None,
+                             should_succeed=True):
+        self.set_node_to_active(image_ref, image_checksum)
+        self.assertTrue(self.ping_ip_address(self.node_ip,
+                                             should_succeed=should_succeed))
diff --git a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_basic_ops.py b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_basic_ops.py
index f90f8ca..5aa7543 100644
--- a/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_basic_ops.py
+++ b/ironic_tempest_plugin/tests/scenario/ironic_standalone/test_basic_ops.py
@@ -32,8 +32,7 @@
     @decorators.idempotent_id('defff515-a6ff-44f6-9d8d-2ded51196d98')
     @utils.services('image', 'network', 'object_storage')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalAgentIpmitoolWholediskHttpLink(
@@ -54,8 +53,7 @@
     @decorators.idempotent_id('d926c683-1a32-44df-afd0-e60134346fd0')
     @utils.services('network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalAgentIpmitoolPartitioned(bsm.BaremetalStandaloneScenarioTest):
@@ -67,8 +65,7 @@
     @decorators.idempotent_id('27b86130-d8dc-419d-880a-fbbbe4ce3f8c')
     @utils.services('image', 'network', 'object_storage')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalPxeIpmitoolWholedisk(bsm.BaremetalStandaloneScenarioTest):
@@ -80,8 +77,7 @@
     @decorators.idempotent_id('d8c5badd-45db-4d05-bbe8-35babbed6e86')
     @utils.services('image', 'network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalPxeIpmitoolWholediskHttpLink(
@@ -102,8 +98,7 @@
     @decorators.idempotent_id('71ccf06f-6765-40fd-8252-1b1bfa423b9b')
     @utils.services('network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalPxeIpmitoolPartitioned(bsm.BaremetalStandaloneScenarioTest):
@@ -115,8 +110,7 @@
     @decorators.idempotent_id('ea85e19c-6869-4577-b9bb-2eb150f77c90')
     @utils.services('image', 'network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalIpmiIscsiWholedisk(bsm.BaremetalStandaloneScenarioTest):
@@ -130,8 +124,7 @@
     @decorators.idempotent_id('f25b71df-2150-45d7-a780-7f5b07124808')
     @utils.services('image', 'network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalIpmiDirectWholedisk(bsm.BaremetalStandaloneScenarioTest):
@@ -145,8 +138,7 @@
     @decorators.idempotent_id('c2db24e7-07dc-4a20-8f93-d4efae2bfd4e')
     @utils.services('image', 'network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalIpmiIscsiPartitioned(bsm.BaremetalStandaloneScenarioTest):
@@ -160,8 +152,7 @@
     @decorators.idempotent_id('7d0b205e-edbc-4e2d-9f6d-95cd74eefecb')
     @utils.services('image', 'network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalIpmiDirectPartitioned(bsm.BaremetalStandaloneScenarioTest):
@@ -175,8 +166,7 @@
     @decorators.idempotent_id('7b4b2dcd-2bbb-44f5-991f-0964300af6b7')
     @utils.services('image', 'network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalIpmiAnsibleWholedisk(bsm.BaremetalStandaloneScenarioTest):
@@ -190,8 +180,7 @@
     @decorators.idempotent_id('cde532cc-81ba-4489-b374-b4a85cc203eb')
     @utils.services('image', 'network')
     def test_ip_access_to_server(self):
-        self.assertTrue(self.ping_ip_address(self.node_ip,
-                                             should_succeed=True))
+        self.boot_and_verify_node()
 
 
 class BaremetalIpmiRescueWholedisk(bsm.BaremetalStandaloneScenarioTest):
@@ -212,6 +201,7 @@
     @decorators.idempotent_id('d6a1780f-c4bb-4136-8144-29e822e14d66')
     @utils.services('image', 'network')
     def test_rescue_mode(self):
+        self.set_node_to_active(self.image_ref)
         self.rescue_node(self.node['uuid'], 'abc123')
         self.assertTrue(self.ping_ip_address(self.node_ip,
                                              should_succeed=True))
@@ -239,6 +229,7 @@
     @decorators.idempotent_id('113acd0a-9872-4631-b3ee-54da7e3bb262')
     @utils.services('image', 'network')
     def test_rescue_mode(self):
+        self.set_node_to_active(self.image_ref)
         self.rescue_node(self.node['uuid'], 'abc123')
         self.assertTrue(self.ping_ip_address(self.node_ip,
                                              should_succeed=True))