Merge "Automatically migrate nodes to hardware types"

This commit is contained in:
Zuul
2018-01-27 01:12:28 +00:00
committed by Gerrit Code Review
12 changed files with 519 additions and 0 deletions

View File

@@ -147,6 +147,18 @@ class BaseDriver(object):
properties.update(iface.get_properties())
return properties
@classmethod
def to_hardware_type(cls):
"""Return corresponding hardware type and hardware interfaces.
:returns: a tuple with two items:
* new driver field - the target hardware type
* dictionary containing interfaces to update, e.g.
{'deploy': 'iscsi', 'power': 'ipmitool'}
"""
raise NotImplementedError()
class BareDriver(BaseDriver):
"""A bare driver object which will have interfaces attached later.

View File

@@ -70,6 +70,14 @@ class FakeDriver(base.BaseDriver):
self.inspect = fake.FakeInspect()
self.raid = fake.FakeRAID()
@classmethod
def to_hardware_type(cls):
return 'fake-hardware', {
iface: 'fake'
for iface in ['boot', 'console', 'deploy', 'inspect',
'management', 'power', 'raid', 'rescue', 'vendor']
}
class FakeSoftPowerDriver(FakeDriver):
"""Example implementation of a Driver."""
@@ -89,6 +97,17 @@ class FakeIPMIToolDriver(base.BaseDriver):
self.vendor = ipmitool.VendorPassthru()
self.management = ipmitool.IPMIManagement()
@classmethod
def to_hardware_type(cls):
return 'fake-hardware', {
'boot': 'fake',
'console': 'ipmitool-shellinabox',
'deploy': 'fake',
'management': 'ipmitool',
'power': 'ipmitool',
'vendor': 'ipmitool'
}
class FakeIPMIToolSocatDriver(base.BaseDriver):
"""Example implementation of a Driver."""
@@ -100,6 +119,17 @@ class FakeIPMIToolSocatDriver(base.BaseDriver):
self.vendor = ipmitool.VendorPassthru()
self.management = ipmitool.IPMIManagement()
@classmethod
def to_hardware_type(cls):
return 'fake-hardware', {
'boot': 'fake',
'console': 'ipmitool-socat',
'deploy': 'fake',
'management': 'ipmitool',
'power': 'ipmitool',
'vendor': 'ipmitool'
}
class FakePXEDriver(base.BaseDriver):
"""Example implementation of a Driver."""
@@ -109,6 +139,15 @@ class FakePXEDriver(base.BaseDriver):
self.boot = pxe.PXEBoot()
self.deploy = iscsi_deploy.ISCSIDeploy()
@classmethod
def to_hardware_type(cls):
return 'fake-hardware', {
'boot': 'pxe',
'deploy': 'iscsi',
'management': 'fake',
'power': 'fake',
}
class FakeAgentDriver(base.BaseDriver):
"""Example implementation of an AgentDriver."""
@@ -119,6 +158,16 @@ class FakeAgentDriver(base.BaseDriver):
self.deploy = agent.AgentDeploy()
self.raid = agent.AgentRAID()
@classmethod
def to_hardware_type(cls):
return 'fake-hardware', {
'boot': 'pxe',
'deploy': 'direct',
'management': 'fake',
'power': 'fake',
'raid': 'agent'
}
class FakeIloDriver(base.BaseDriver):
"""Fake iLO driver, used in testing."""
@@ -162,6 +211,15 @@ class FakeSNMPDriver(base.BaseDriver):
self.power = snmp.SNMPPower()
self.deploy = fake.FakeDeploy()
@classmethod
def to_hardware_type(cls):
return 'snmp', {
'boot': 'fake',
'deploy': 'fake',
'management': 'fake',
'power': 'snmp',
}
class FakeIRMCDriver(base.BaseDriver):
"""Fake iRMC driver."""
@@ -191,6 +249,17 @@ class FakeIPMIToolInspectorDriver(base.BaseDriver):
# integration.
self.inspect = inspector.Inspector()
@classmethod
def to_hardware_type(cls):
return 'fake-hardware', {
'boot': 'fake',
'console': 'ipmitool-shellinabox',
'deploy': 'fake',
'inspect': 'inspector',
'management': 'ipmitool',
'power': 'ipmitool',
}
class FakeUcsDriver(base.BaseDriver):
"""Fake UCS driver."""

View File

@@ -14,6 +14,8 @@
Hardware types and classic drivers for IPMI (using ipmitool).
"""
from oslo_config import cfg
from ironic.drivers import base
from ironic.drivers import generic
from ironic.drivers.modules import agent
@@ -24,6 +26,9 @@ from ironic.drivers.modules import noop
from ironic.drivers.modules import pxe
CONF = cfg.CONF
class IPMIHardware(generic.GenericHardware):
"""IPMI hardware type.
@@ -53,6 +58,22 @@ class IPMIHardware(generic.GenericHardware):
return [ipmitool.VendorPassthru, noop.NoVendor]
def _to_hardware_type():
# NOTE(dtantsur): classic drivers are not affected by the
# enabled_inspect_interfaces configuration option.
if CONF.inspector.enabled:
inspect_interface = 'inspector'
else:
inspect_interface = 'no-inspect'
return {'boot': 'pxe',
'inspect': inspect_interface,
'management': 'ipmitool',
'power': 'ipmitool',
'raid': 'agent',
'vendor': 'ipmitool'}
class PXEAndIPMIToolDriver(base.BaseDriver):
"""PXE + IPMITool driver.
@@ -74,6 +95,12 @@ class PXEAndIPMIToolDriver(base.BaseDriver):
self.vendor = ipmitool.VendorPassthru()
self.raid = agent.AgentRAID()
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-shellinabox',
deploy='iscsi')
class PXEAndIPMIToolAndSocatDriver(PXEAndIPMIToolDriver):
"""PXE + IPMITool + socat driver.
@@ -93,6 +120,12 @@ class PXEAndIPMIToolAndSocatDriver(PXEAndIPMIToolDriver):
PXEAndIPMIToolDriver.__init__(self)
self.console = ipmitool.IPMISocatConsole()
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-socat',
deploy='iscsi')
class AgentAndIPMIToolDriver(base.BaseDriver):
"""Agent + IPMITool driver.
@@ -116,6 +149,12 @@ class AgentAndIPMIToolDriver(base.BaseDriver):
self.inspect = inspector.Inspector.create_if_enabled(
'AgentAndIPMIToolDriver')
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-shellinabox',
deploy='direct')
class AgentAndIPMIToolAndSocatDriver(AgentAndIPMIToolDriver):
"""Agent + IPMITool + socat driver.
@@ -134,3 +173,9 @@ class AgentAndIPMIToolAndSocatDriver(AgentAndIPMIToolDriver):
def __init__(self):
AgentAndIPMIToolDriver.__init__(self)
self.console = ipmitool.IPMISocatConsole()
@classmethod
def to_hardware_type(cls):
return 'ipmi', dict(_to_hardware_type(),
console='ipmitool-socat',
deploy='direct')

View File

@@ -100,6 +100,15 @@ class PXEAndSNMPDriver(base.BaseDriver):
# Only PXE as a boot device is supported.
self.management = None
@classmethod
def to_hardware_type(cls):
return 'snmp', {
'boot': 'pxe',
'deploy': 'iscsi',
'management': 'fake',
'power': 'snmp',
}
class PXEAndIRMCDriver(base.BaseDriver):
"""PXE + iRMC driver using SCCI.