blob: 3880f6086937d6a99e1c7c863200c0b1c16f3217 [file] [log] [blame]
Anton Arefiev6b003562016-09-13 12:17:29 +03001# Licensed under the Apache License, Version 2.0 (the "License"); you may
2# not use this file except in compliance with the License. You may obtain
3# a copy of the License at
4#
5# http://www.apache.org/licenses/LICENSE-2.0
6#
7# Unless required by applicable law or agreed to in writing, software
8# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10# License for the specific language governing permissions and limitations
11# under the License.
12
13import six
14
15from ironic_tempest_plugin.tests.scenario import baremetal_manager
16from tempest import config
ghanshyam159fe892017-01-27 06:35:37 +000017from tempest.lib import decorators
Anton Arefiev6b003562016-09-13 12:17:29 +030018from tempest import test # noqa
19
20from ironic_inspector.test.inspector_tempest_plugin.tests import manager
21
22CONF = config.CONF
23
24ProvisionStates = baremetal_manager.BaremetalProvisionStates
25
26
27class InspectorDiscoveryTest(manager.InspectorScenarioTest):
28 @classmethod
29 def skip_checks(cls):
30 super(InspectorDiscoveryTest, cls).skip_checks()
31 if not CONF.baremetal_introspection.auto_discovery_feature:
32 msg = ("Please, provide a value for node_not_found_hook in "
33 "processing section of inspector.conf for enable "
34 "auto-discovery feature.")
35 raise cls.skipException(msg)
36
37 def setUp(self):
38 super(InspectorDiscoveryTest, self).setUp()
39
40 discovered_node = self._get_discovery_node()
41 self.node_info = self._get_node_info(discovered_node)
42
43 rule = self._generate_discovery_rule(self.node_info)
44
45 self.rule_import_from_dict(rule)
46 self.addCleanup(self.rule_purge)
47
48 def _get_node_info(self, node_uuid):
49 node = self.node_show(node_uuid)
50 ports = self.node_port_list(node_uuid)
51 node['port_macs'] = [port['address'] for port in ports]
52 return node
53
54 def _get_discovery_node(self):
55 nodes = self.node_list()
56
57 discovered_node = None
58 for node in nodes:
59 if (node['provision_state'] == ProvisionStates.AVAILABLE or
60 node['provision_state'] == ProvisionStates.ENROLL or
61 node['provision_state'] is ProvisionStates.NOSTATE):
62 discovered_node = node['uuid']
63 break
64
65 self.assertIsNotNone(discovered_node)
66 return discovered_node
67
68 def _generate_discovery_rule(self, node):
69 rule = dict()
70 rule["description"] = "Node %s discovery rule" % node['name']
71 rule["actions"] = [
72 {"action": "set-attribute", "path": "/name",
73 "value": "%s" % node['name']},
74 {"action": "set-attribute", "path": "/driver",
75 "value": "%s" % node['driver']},
76 ]
77
78 for key, value in node['driver_info'].items():
79 rule["actions"].append(
80 {"action": "set-attribute", "path": "/driver_info/%s" % key,
81 "value": "%s" % value})
82 rule["conditions"] = [
83 {"op": "eq", "field": "data://auto_discovered", "value": True}
84 ]
85 return rule
86
87 def verify_node_introspection_data(self, node):
88 data = self.introspection_data(node['uuid'])
89 self.assertEqual(data['cpu_arch'],
90 self.flavor['properties']['cpu_arch'])
91 self.assertEqual(int(data['memory_mb']),
92 int(self.flavor['ram']))
93 self.assertEqual(int(data['cpus']), int(self.flavor['vcpus']))
94
95 def verify_node_flavor(self, node):
96 expected_cpus = self.flavor['vcpus']
97 expected_memory_mb = self.flavor['ram']
98 expected_cpu_arch = self.flavor['properties']['cpu_arch']
99 disk_size = self.flavor['disk']
100 ephemeral_size = self.flavor['OS-FLV-EXT-DATA:ephemeral']
101 expected_local_gb = disk_size + ephemeral_size
102
103 self.assertEqual(expected_cpus,
104 int(node['properties']['cpus']))
105 self.assertEqual(expected_memory_mb,
106 int(node['properties']['memory_mb']))
107 self.assertEqual(expected_local_gb,
108 int(node['properties']['local_gb']))
109 self.assertEqual(expected_cpu_arch,
110 node['properties']['cpu_arch'])
111
112 def verify_node_driver_info(self, node_info, inspected_node):
113 for key in node_info['driver_info']:
114 self.assertEqual(six.text_type(node_info['driver_info'][key]),
115 inspected_node['driver_info'].get(key))
116
ghanshyam159fe892017-01-27 06:35:37 +0000117 @decorators.idempotent_id('dd3abe5e-0d23-488d-bb4e-344cdeff7dcb')
Mario Villaplanafc2e62b2016-11-16 19:12:40 +0000118 def test_bearmetal_auto_discovery(self):
Anton Arefiev6b003562016-09-13 12:17:29 +0300119 """This test case follows this set of operations:
120
121 * Choose appropriate node, based on provision state;
122 * Get node info;
123 * Generate discovery rule;
124 * Delete discovered node from ironic;
125 * Start baremetal vm via virsh;
126 * Wating for node introspection;
127 * Verify introspected node.
128 """
129 # NOTE(aarefiev): workaround for infra, 'tempest' user doesn't
130 # have virsh privileges, so lets power on the node via ironic
131 # and then delete it. Because of node is blacklisted in inspector
132 # we can't just power on it, therefor start introspection is used
133 # to whitelist discovered node first.
134 self.baremetal_client.set_node_provision_state(
135 self.node_info['uuid'], 'manage')
136 self.introspection_start(self.node_info['uuid'])
137 self.wait_power_state(
138 self.node_info['uuid'],
139 baremetal_manager.BaremetalPowerStates.POWER_ON)
140 self.node_delete(self.node_info['uuid'])
141
142 self.wait_for_node(self.node_info['name'])
143
144 inspected_node = self.node_show(self.node_info['name'])
145 self.verify_node_flavor(inspected_node)
146 self.verify_node_introspection_data(inspected_node)
147 self.verify_node_driver_info(self.node_info, inspected_node)
Mario Villaplanafc2e62b2016-11-16 19:12:40 +0000148 self.assertEqual(ProvisionStates.ENROLL,
149 inspected_node['provision_state'])