Add 'hardware type' for Dell EMC iDRACs
The ironic project is engaged in a driver composition reform [0] which introduces dynamic drivers. That reform places hardware vendors in charge of defining a new form of drivers for their hardware. The new form is called 'hardware type'. The reform will deprecate [1] the existing ironic drivers, which are now referred to as 'classic drivers'. This change adds a single new 'hardware type', 'idrac', for servers controlled by Dell EMC integrated Dell Remote Access Controllers (iDRAC). [0] http://specs.openstack.org/openstack/ironic-specs/specs/7.0/driver-composition-reform.html [1] http://specs.openstack.org/openstack/ironic-specs/specs/not-implemented/classic-drivers-future.html Change-Id: Ie332a5adebfc229a79663c771c9f4409174dd8c9 Closes-Bug: #1705741 Related-Bug: #1676387
This commit is contained in:
parent
86e3a100a3
commit
d75fecc974
@ -20,6 +20,7 @@ from oslo_utils import importutils
|
|||||||
from ironic.common import exception
|
from ironic.common import exception
|
||||||
from ironic.common.i18n import _
|
from ironic.common.i18n import _
|
||||||
from ironic.drivers import base
|
from ironic.drivers import base
|
||||||
|
from ironic.drivers import generic
|
||||||
from ironic.drivers.modules.drac import inspect as drac_inspect
|
from ironic.drivers.modules.drac import inspect as drac_inspect
|
||||||
from ironic.drivers.modules.drac import management
|
from ironic.drivers.modules.drac import management
|
||||||
from ironic.drivers.modules.drac import power
|
from ironic.drivers.modules.drac import power
|
||||||
@ -27,9 +28,46 @@ from ironic.drivers.modules.drac import raid
|
|||||||
from ironic.drivers.modules.drac import vendor_passthru
|
from ironic.drivers.modules.drac import vendor_passthru
|
||||||
from ironic.drivers.modules import inspector
|
from ironic.drivers.modules import inspector
|
||||||
from ironic.drivers.modules import iscsi_deploy
|
from ironic.drivers.modules import iscsi_deploy
|
||||||
|
from ironic.drivers.modules import noop
|
||||||
from ironic.drivers.modules import pxe
|
from ironic.drivers.modules import pxe
|
||||||
|
|
||||||
|
|
||||||
|
class IDRACHardware(generic.GenericHardware):
|
||||||
|
"""integrated Dell Remote Access Controller hardware type"""
|
||||||
|
|
||||||
|
# Required hardware interfaces
|
||||||
|
|
||||||
|
@property
|
||||||
|
def supported_management_interfaces(self):
|
||||||
|
"""List of supported management interfaces."""
|
||||||
|
return [management.DracManagement]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def supported_power_interfaces(self):
|
||||||
|
"""List of supported power interfaces."""
|
||||||
|
return [power.DracPower]
|
||||||
|
|
||||||
|
# Optional hardware interfaces
|
||||||
|
|
||||||
|
@property
|
||||||
|
def supported_inspect_interfaces(self):
|
||||||
|
"""List of supported inspect interfaces."""
|
||||||
|
# Inspector support should have a higher priority than NoInspect
|
||||||
|
# if it is enabled by an operator (implying that the service is
|
||||||
|
# installed).
|
||||||
|
return [drac_inspect.DracInspect, inspector.Inspector, noop.NoInspect]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def supported_raid_interfaces(self):
|
||||||
|
"""List of supported raid interfaces."""
|
||||||
|
return [raid.DracRAID, noop.NoRAID]
|
||||||
|
|
||||||
|
@property
|
||||||
|
def supported_vendor_interfaces(self):
|
||||||
|
"""List of supported vendor interfaces."""
|
||||||
|
return [vendor_passthru.DracVendorPassthru]
|
||||||
|
|
||||||
|
|
||||||
class PXEDracDriver(base.BaseDriver):
|
class PXEDracDriver(base.BaseDriver):
|
||||||
"""DRAC driver using PXE for deploy."""
|
"""DRAC driver using PXE for deploy."""
|
||||||
|
|
||||||
|
@ -19,14 +19,18 @@ import mock
|
|||||||
from oslo_utils import importutils
|
from oslo_utils import importutils
|
||||||
|
|
||||||
from ironic.common import exception
|
from ironic.common import exception
|
||||||
|
from ironic.conductor import task_manager
|
||||||
from ironic.drivers import drac as drac_drivers
|
from ironic.drivers import drac as drac_drivers
|
||||||
|
from ironic.drivers.modules import agent
|
||||||
from ironic.drivers.modules import drac
|
from ironic.drivers.modules import drac
|
||||||
from ironic.drivers.modules import inspector
|
from ironic.drivers.modules import inspector
|
||||||
from ironic.drivers.modules import iscsi_deploy
|
from ironic.drivers.modules import iscsi_deploy
|
||||||
from ironic.drivers.modules.network import flat as flat_net
|
from ironic.drivers.modules.network import flat as flat_net
|
||||||
|
from ironic.drivers.modules import noop
|
||||||
from ironic.drivers.modules import pxe
|
from ironic.drivers.modules import pxe
|
||||||
from ironic.drivers.modules.storage import noop as noop_storage
|
from ironic.drivers.modules.storage import noop as noop_storage
|
||||||
from ironic.tests.unit.db import base as db_base
|
from ironic.tests.unit.db import base as db_base
|
||||||
|
from ironic.tests.unit.objects import utils as obj_utils
|
||||||
|
|
||||||
|
|
||||||
class BaseIDRACTestCase(db_base.DbTestCase):
|
class BaseIDRACTestCase(db_base.DbTestCase):
|
||||||
@ -82,6 +86,51 @@ class BaseIDRACTestCase(db_base.DbTestCase):
|
|||||||
kwargs.get('vendor', drac.vendor_passthru.DracVendorPassthru))
|
kwargs.get('vendor', drac.vendor_passthru.DracVendorPassthru))
|
||||||
|
|
||||||
|
|
||||||
|
class IDRACHardwareTestCase(BaseIDRACTestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
super(IDRACHardwareTestCase, self).setUp()
|
||||||
|
self.config(enabled_hardware_types=['idrac'],
|
||||||
|
enabled_management_interfaces=['idrac'],
|
||||||
|
enabled_power_interfaces=['idrac'],
|
||||||
|
enabled_inspect_interfaces=[
|
||||||
|
'idrac', 'inspector', 'no-inspect'],
|
||||||
|
enabled_network_interfaces=['flat', 'neutron', 'noop'],
|
||||||
|
enabled_raid_interfaces=['idrac', 'no-raid'],
|
||||||
|
enabled_vendor_interfaces=['idrac'])
|
||||||
|
|
||||||
|
def test_default_interfaces(self):
|
||||||
|
node = obj_utils.create_test_node(self.context, driver='idrac')
|
||||||
|
with task_manager.acquire(self.context, node.id) as task:
|
||||||
|
self._validate_interfaces(task.driver, console=noop.NoConsole)
|
||||||
|
|
||||||
|
def test_override_with_inspector(self):
|
||||||
|
node = obj_utils.create_test_node(self.context, driver='idrac',
|
||||||
|
inspect_interface='inspector')
|
||||||
|
with task_manager.acquire(self.context, node.id) as task:
|
||||||
|
self._validate_interfaces(task.driver,
|
||||||
|
console=noop.NoConsole,
|
||||||
|
inspect=inspector.Inspector)
|
||||||
|
|
||||||
|
def test_override_with_agent(self):
|
||||||
|
node = obj_utils.create_test_node(self.context, driver='idrac',
|
||||||
|
deploy_interface='direct',
|
||||||
|
inspect_interface='inspector')
|
||||||
|
with task_manager.acquire(self.context, node.id) as task:
|
||||||
|
self._validate_interfaces(task.driver,
|
||||||
|
console=noop.NoConsole,
|
||||||
|
deploy=agent.AgentDeploy,
|
||||||
|
inspect=inspector.Inspector)
|
||||||
|
|
||||||
|
def test_override_with_raid(self):
|
||||||
|
node = obj_utils.create_test_node(self.context, driver='idrac',
|
||||||
|
raid_interface='no-raid')
|
||||||
|
with task_manager.acquire(self.context, node.id) as task:
|
||||||
|
self._validate_interfaces(task.driver,
|
||||||
|
console=noop.NoConsole,
|
||||||
|
raid=noop.NoRAID)
|
||||||
|
|
||||||
|
|
||||||
@mock.patch.object(importutils, 'try_import', spec_set=True, autospec=True)
|
@mock.patch.object(importutils, 'try_import', spec_set=True, autospec=True)
|
||||||
class DracClassicDriversTestCase(BaseIDRACTestCase):
|
class DracClassicDriversTestCase(BaseIDRACTestCase):
|
||||||
|
|
||||||
|
17
releasenotes/notes/idrac-hardware-type-54383960af3459d0.yaml
Normal file
17
releasenotes/notes/idrac-hardware-type-54383960af3459d0.yaml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Adds a new hardware type, ``idrac``, for Dell EMC integrated Dell Remote
|
||||||
|
Access Controllers (iDRAC). ``idrac`` hardware type supports PXE-based
|
||||||
|
provisioning using an iDRAC. It supports the following driver interfaces:
|
||||||
|
|
||||||
|
* boot: ``pxe``
|
||||||
|
* console: ``no-console``
|
||||||
|
* deploy: ``iscsi`` and ``direct``
|
||||||
|
* inspect: ``idrac``, ``inspector``, and ``no-inspect``
|
||||||
|
* management: ``idrac``
|
||||||
|
* network: ``flat``, ``neutron``, and ``noop``
|
||||||
|
* power: ``idrac``
|
||||||
|
* raid: ``idrac`` and ``no-raid``
|
||||||
|
* storage: ``noop`` and ``cinder``
|
||||||
|
* vendor: ``idrac``
|
@ -103,6 +103,7 @@ ironic.hardware.interfaces.deploy =
|
|||||||
|
|
||||||
ironic.hardware.interfaces.inspect =
|
ironic.hardware.interfaces.inspect =
|
||||||
fake = ironic.drivers.modules.fake:FakeInspect
|
fake = ironic.drivers.modules.fake:FakeInspect
|
||||||
|
idrac = ironic.drivers.modules.drac.inspect:DracInspect
|
||||||
ilo = ironic.drivers.modules.ilo.inspect:IloInspect
|
ilo = ironic.drivers.modules.ilo.inspect:IloInspect
|
||||||
inspector = ironic.drivers.modules.inspector:Inspector
|
inspector = ironic.drivers.modules.inspector:Inspector
|
||||||
irmc = ironic.drivers.modules.irmc.inspect:IRMCInspect
|
irmc = ironic.drivers.modules.irmc.inspect:IRMCInspect
|
||||||
@ -112,6 +113,7 @@ ironic.hardware.interfaces.inspect =
|
|||||||
ironic.hardware.interfaces.management =
|
ironic.hardware.interfaces.management =
|
||||||
cimc = ironic.drivers.modules.cimc.management:CIMCManagement
|
cimc = ironic.drivers.modules.cimc.management:CIMCManagement
|
||||||
fake = ironic.drivers.modules.fake:FakeManagement
|
fake = ironic.drivers.modules.fake:FakeManagement
|
||||||
|
idrac = ironic.drivers.modules.drac.management:DracManagement
|
||||||
ilo = ironic.drivers.modules.ilo.management:IloManagement
|
ilo = ironic.drivers.modules.ilo.management:IloManagement
|
||||||
ipmitool = ironic.drivers.modules.ipmitool:IPMIManagement
|
ipmitool = ironic.drivers.modules.ipmitool:IPMIManagement
|
||||||
irmc = ironic.drivers.modules.irmc.management:IRMCManagement
|
irmc = ironic.drivers.modules.irmc.management:IRMCManagement
|
||||||
@ -127,6 +129,7 @@ ironic.hardware.interfaces.network =
|
|||||||
ironic.hardware.interfaces.power =
|
ironic.hardware.interfaces.power =
|
||||||
cimc = ironic.drivers.modules.cimc.power:Power
|
cimc = ironic.drivers.modules.cimc.power:Power
|
||||||
fake = ironic.drivers.modules.fake:FakePower
|
fake = ironic.drivers.modules.fake:FakePower
|
||||||
|
idrac = ironic.drivers.modules.drac.power:DracPower
|
||||||
ilo = ironic.drivers.modules.ilo.power:IloPower
|
ilo = ironic.drivers.modules.ilo.power:IloPower
|
||||||
ipmitool = ironic.drivers.modules.ipmitool:IPMIPower
|
ipmitool = ironic.drivers.modules.ipmitool:IPMIPower
|
||||||
irmc = ironic.drivers.modules.irmc.power:IRMCPower
|
irmc = ironic.drivers.modules.irmc.power:IRMCPower
|
||||||
@ -138,6 +141,7 @@ ironic.hardware.interfaces.power =
|
|||||||
ironic.hardware.interfaces.raid =
|
ironic.hardware.interfaces.raid =
|
||||||
agent = ironic.drivers.modules.agent:AgentRAID
|
agent = ironic.drivers.modules.agent:AgentRAID
|
||||||
fake = ironic.drivers.modules.fake:FakeRAID
|
fake = ironic.drivers.modules.fake:FakeRAID
|
||||||
|
idrac = ironic.drivers.modules.drac.raid:DracRAID
|
||||||
no-raid = ironic.drivers.modules.noop:NoRAID
|
no-raid = ironic.drivers.modules.noop:NoRAID
|
||||||
|
|
||||||
ironic.hardware.interfaces.rescue =
|
ironic.hardware.interfaces.rescue =
|
||||||
@ -150,6 +154,7 @@ ironic.hardware.interfaces.storage =
|
|||||||
|
|
||||||
ironic.hardware.interfaces.vendor =
|
ironic.hardware.interfaces.vendor =
|
||||||
fake = ironic.drivers.modules.fake:FakeVendorB
|
fake = ironic.drivers.modules.fake:FakeVendorB
|
||||||
|
idrac = ironic.drivers.modules.drac.vendor_passthru:DracVendorPassthru
|
||||||
ipmitool = ironic.drivers.modules.ipmitool:VendorPassthru
|
ipmitool = ironic.drivers.modules.ipmitool:VendorPassthru
|
||||||
no-vendor = ironic.drivers.modules.noop:NoVendor
|
no-vendor = ironic.drivers.modules.noop:NoVendor
|
||||||
|
|
||||||
@ -157,6 +162,7 @@ ironic.hardware.types =
|
|||||||
cisco-ucs-managed = ironic.drivers.cisco_ucs:CiscoUCSManaged
|
cisco-ucs-managed = ironic.drivers.cisco_ucs:CiscoUCSManaged
|
||||||
cisco-ucs-standalone = ironic.drivers.cisco_ucs:CiscoUCSStandalone
|
cisco-ucs-standalone = ironic.drivers.cisco_ucs:CiscoUCSStandalone
|
||||||
fake-hardware = ironic.drivers.fake_hardware:FakeHardware
|
fake-hardware = ironic.drivers.fake_hardware:FakeHardware
|
||||||
|
idrac = ironic.drivers.drac:IDRACHardware
|
||||||
ilo = ironic.drivers.ilo:IloHardware
|
ilo = ironic.drivers.ilo:IloHardware
|
||||||
ipmi = ironic.drivers.ipmi:IPMIHardware
|
ipmi = ironic.drivers.ipmi:IPMIHardware
|
||||||
irmc = ironic.drivers.irmc:IRMCHardware
|
irmc = ironic.drivers.irmc:IRMCHardware
|
||||||
|
Loading…
x
Reference in New Issue
Block a user