summaryrefslogtreecommitdiff
path: root/ironic/tests/unit/drivers/test_base.py
diff options
context:
space:
mode:
authorDmitry Tantsur <divius.inside@gmail.com>2018-01-16 17:27:17 +0100
committerDmitry Tantsur <divius.inside@gmail.com>2018-01-26 21:17:26 +0000
commitcc6f7bc73e2b1c9dad9624f3bc9c4c6ac3d103de (patch)
tree016aa468cdbc15a9f31b5c73b5450f16e736aba6 /ironic/tests/unit/drivers/test_base.py
parent98570dc6addb4dbdac8cf394fcf29e6c640f1fff (diff)
downloadironic-cc6f7bc73e2b1c9dad9624f3bc9c4c6ac3d103de.tar.gz
Automatically migrate nodes to hardware types
This change adds a new data migration: migrate_to_hardware_types. It works by walking through known classic drivers, detecting matching hardware types and interfaces and updates nodes accordingly. Nodes that cannot be updated (e.g. matching hardware type is not enabled) are skipped. A new migration option reset_unsupported_interfaces can be set to True to allow resetting optional interfaces to their no-op versions. The example implementation are provided for the community supported IPMI and SNMP drivers, as well as for fake drivers based on them. Change-Id: I732b44f2ab1ef73f56b352415ffd9cdd8a0e232b Partial-Bug: #1690185
Diffstat (limited to 'ironic/tests/unit/drivers/test_base.py')
-rw-r--r--ironic/tests/unit/drivers/test_base.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/ironic/tests/unit/drivers/test_base.py b/ironic/tests/unit/drivers/test_base.py
index 52642ec15..ebf08ccf4 100644
--- a/ironic/tests/unit/drivers/test_base.py
+++ b/ironic/tests/unit/drivers/test_base.py
@@ -16,7 +16,9 @@
import json
import mock
+import stevedore
+from ironic.common import driver_factory
from ironic.common import exception
from ironic.common import raid
from ironic.drivers import base as driver_base
@@ -451,3 +453,56 @@ class TestBareDriver(base.TestCase):
'rescue', 'storage'),
driver_base.BareDriver.standard_interfaces
)
+
+
+class TestToHardwareType(base.TestCase):
+ def setUp(self):
+ super(TestToHardwareType, self).setUp()
+ self.driver_classes = list(
+ driver_factory.classic_drivers_to_migrate().values())
+ self.existing_ifaces = {}
+ for iface in driver_base.ALL_INTERFACES:
+ self.existing_ifaces[iface] = stevedore.ExtensionManager(
+ 'ironic.hardware.interfaces.%s' % iface,
+ invoke_on_load=False).names()
+ self.hardware_types = stevedore.ExtensionManager(
+ 'ironic.hardware.types', invoke_on_load=False).names()
+ # These are the interfaces that don't have a no-op version
+ self.mandatory_interfaces = ['boot', 'deploy', 'management', 'power']
+
+ def test_to_hardware_type_returns_hardware_type(self):
+ for driver in self.driver_classes:
+ try:
+ hw_type = driver.to_hardware_type()[0]
+ except NotImplementedError:
+ continue
+ self.assertIn(hw_type, self.hardware_types,
+ '%s returns unknown hardware type %s' %
+ (driver, hw_type))
+
+ def test_to_hardware_type_returns_existing_interfaces(self):
+ # Check that all defined implementations of to_hardware_type
+ # contain only existing interface types
+ for driver in self.driver_classes:
+ try:
+ delta = driver.to_hardware_type()[1]
+ except NotImplementedError:
+ continue
+ for iface, value in delta.items():
+ self.assertIn(iface, self.existing_ifaces,
+ '%s returns unknown interface %s' %
+ (driver, iface))
+ self.assertIn(value, self.existing_ifaces[iface],
+ '%s returns unknown %s interface %s' %
+ (driver, iface, value))
+
+ def test_to_hardware_type_mandatory_interfaces(self):
+ for driver in self.driver_classes:
+ try:
+ delta = driver.to_hardware_type()[1]
+ except NotImplementedError:
+ continue
+ for iface in self.mandatory_interfaces:
+ self.assertIn(iface, delta,
+ '%s does not return mandatory interface %s' %
+ (driver, iface))