ironic-tempest-plugin/ironic_tempest_plugin/tests/scenario/test_introspection_basic.py

144 lines
5.5 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from tempest.common import utils
from tempest.config import CONF
from tempest.lib import decorators
from ironic_tempest_plugin.tests.scenario import baremetal_manager
from ironic_tempest_plugin.tests.scenario import introspection_manager
class InspectorBasicTest(introspection_manager.InspectorScenarioTest):
def verify_node_introspection_data(self, node):
data = self.introspection_data(node['uuid'])
self.assertEqual(data['cpu_arch'],
self.flavor['properties']['cpu_arch'])
self.assertGreater(int(data['memory_mb']), 0)
self.assertGreater(int(data['cpus']), 0)
def verify_node_flavor(self, node):
expected_cpu_arch = self.flavor['properties']['cpu_arch']
self.assertGreater(int(node['properties']['cpus']), 0)
self.assertGreater(int(node['properties']['memory_mb']), 0)
self.assertGreater(int(node['properties']['local_gb']), 0)
self.assertEqual(expected_cpu_arch,
node['properties']['cpu_arch'])
def verify_introspection_aborted(self, uuid):
status = self.introspection_status(uuid)
self.assertEqual('Canceled by operator', status['error'])
self.assertTrue(status['finished'])
self.wait_provisioning_state(
uuid, 'inspect failed',
timeout=CONF.baremetal.active_timeout,
interval=self.wait_provisioning_state_interval)
@decorators.idempotent_id('03bf7990-bee0-4dd7-bf74-b97ad7b52a4b')
@decorators.attr(type='smoke')
@utils.services('compute', 'image', 'network')
def test_baremetal_introspection(self):
"""This smoke test case follows this set of operations:
* Fetches expected properties from baremetal flavor
* Removes all properties from nodes
* Sets nodes to manageable state
* Imports introspection rule basic_ops_rule.json
* Inspects nodes
* Verifies all properties are inspected
* Verifies introspection data
* Sets node to available state
* Creates a keypair
* Boots an instance using the keypair
* Deletes the instance
"""
# prepare introspection rule
rule_path = self.get_rule_path("basic_ops_rule.json")
self.rule_import(rule_path)
self.addCleanup(self.rule_purge)
for node_id in self.node_ids:
self.introspect_node(node_id)
# settle down introspection
self.wait_for_introspection_finished(self.node_ids)
for node_id in self.node_ids:
self.wait_provisioning_state(
node_id, 'manageable',
timeout=CONF.baremetal_introspection.ironic_sync_timeout,
interval=self.wait_provisioning_state_interval)
for node_id in self.node_ids:
node = self.node_show(node_id)
self.assertEqual('yes', node['extra']['rule_success'])
data_store = CONF.baremetal_introspection.data_store
if data_store is None:
# Backward compatibility, the option is not set.
data_store = ('swift' if CONF.service_available.swift
else 'none')
if data_store != 'none':
self.verify_node_introspection_data(node)
self.verify_node_flavor(node)
for node_id in self.node_ids:
self.baremetal_client.set_node_provision_state(node_id, 'provide')
for node_id in self.node_ids:
self.wait_provisioning_state(
node_id, baremetal_manager.BaremetalProvisionStates.AVAILABLE,
timeout=CONF.baremetal.active_timeout,
interval=self.wait_provisioning_state_interval)
self.wait_for_nova_aware_of_bvms()
self.add_keypair()
ins, _node = self.boot_instance()
self.terminate_instance(ins)
@decorators.idempotent_id('70ca3070-184b-4b7d-8892-e977d2bc2870')
def test_introspection_abort(self):
"""This smoke test case follows this very basic set of operations:
* Start nodes introspection
* Wait until nodes power on
* Abort introspection
* Verifies nodes status and power state
"""
# start nodes introspection
for node_id in self.node_ids:
self.introspect_node(node_id, remove_props=False)
# wait for nodes power on
for node_id in self.node_ids:
self.wait_power_state(
node_id,
baremetal_manager.BaremetalPowerStates.POWER_ON)
# abort introspection
for node_id in self.node_ids:
self.introspection_abort(node_id)
# wait for nodes power off
for node_id in self.node_ids:
self.wait_power_state(
node_id,
baremetal_manager.BaremetalPowerStates.POWER_OFF)
# verify nodes status and provision state
for node_id in self.node_ids:
self.verify_introspection_aborted(node_id)