diff options
author | Dmitry Tantsur <divius.inside@gmail.com> | 2018-01-16 17:27:17 +0100 |
---|---|---|
committer | Dmitry Tantsur <divius.inside@gmail.com> | 2018-01-26 21:17:26 +0000 |
commit | cc6f7bc73e2b1c9dad9624f3bc9c4c6ac3d103de (patch) | |
tree | 016aa468cdbc15a9f31b5c73b5450f16e736aba6 /ironic/tests/unit/drivers/test_base.py | |
parent | 98570dc6addb4dbdac8cf394fcf29e6c640f1fff (diff) | |
download | ironic-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.py | 55 |
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)) |