From 3665cf150ba3eac95647dd148f387fff5b56e54b Mon Sep 17 00:00:00 2001 From: Yolanda Robla Date: Mon, 11 Jun 2018 13:52:20 +0200 Subject: [PATCH] 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 --- .../scenario/baremetal_standalone_manager.py | 77 ++++++++++--------- .../ironic_standalone/test_basic_ops.py | 35 ++++----- 2 files changed, 53 insertions(+), 59 deletions(-) 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 @@ class BaremetalStandaloneManager(bm.BaremetalScenarioTest, # 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 @@ class BaremetalStandaloneManager(bm.BaremetalScenarioTest, 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 @@ class BaremetalStandaloneManager(bm.BaremetalScenarioTest, '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 @@ class BaremetalStandaloneManager(bm.BaremetalScenarioTest, :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 @@ class BaremetalStandaloneScenarioTest(BaremetalStandaloneManager): # 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 @@ -434,6 +422,18 @@ class BaremetalStandaloneScenarioTest(BaremetalStandaloneManager): raise cls.skipException( '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() @@ -450,20 +450,17 @@ class BaremetalStandaloneScenarioTest(BaremetalStandaloneManager): 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 @@ class BaremetalStandaloneScenarioTest(BaremetalStandaloneManager): 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 @@ class BaremetalAgentIpmitoolWholedisk(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalAgentIpmitoolWholediskHttpLink( @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 @@ class BaremetalAgentIpmitoolPartitioned(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalPxeIpmitoolWholedisk(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalPxeIpmitoolWholediskHttpLink( @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 @@ class BaremetalPxeIpmitoolPartitioned(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalIpmiIscsiWholedisk(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalIpmiDirectWholedisk(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalIpmiIscsiPartitioned(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalIpmiDirectPartitioned(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalIpmiAnsibleWholedisk(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalIpmiRescueWholedisk(bsm.BaremetalStandaloneScenarioTest): @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 @@ class BaremetalIpmiRescuePartitioned(bsm.BaremetalStandaloneScenarioTest): @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))