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