idrac: inherit driver interface from redfish

With the removal of the wsman interfaces in the idrac driver and only
redfish being supported, the idrac driver should inherit from the
redfish driver to ensure that it properly supports all the redfish
supported interfaces. Furthermore with several of the interfaces being
no-op passthru to the redfish implementation there is no reason to not
let the user select those interfaces as well. With an eye towards not
having to support these in the future, direct users to use the stock
redfish versions in the docs as well.

Change-Id: I79ab44f31660e6d5311db46223e8bd60d2b3f213
Signed-off-by: Doug Goldstein <cardoe@cardoe.com>
This commit is contained in:
Doug Goldstein 2024-08-13 12:01:13 -05:00
parent 58a79bedfa
commit 52fdbb743d
No known key found for this signature in database
7 changed files with 85 additions and 46 deletions

View File

@ -26,7 +26,8 @@ Key features of the Dell iDRAC driver include:
Ironic Features
---------------
The ``idrac`` hardware type supports the following Ironic interfaces:
The ``idrac`` hardware type extends the ``redfish`` hardware type
and supports the following Ironic interfaces:
* `BIOS Interface`_: BIOS management
* `Inspect Interface`_: Hardware inspection
@ -61,7 +62,7 @@ To enable the ``idrac`` hardware type, add the following to your
[DEFAULT]
enabled_hardware_types=idrac
enabled_management_interfaces=idrac-redfish
enabled_power_interfaces=idrac-redfish
enabled_power_interfaces=redfish
To enable all optional features (BIOS, inspection, RAID, and vendor passthru),
use the following configuration:
@ -70,7 +71,7 @@ use the following configuration:
[DEFAULT]
enabled_hardware_types=idrac
enabled_bios_interfaces=idrac-redfish
enabled_bios_interfaces=redfish
enabled_firmware_interfaces=redfish
enabled_inspect_interfaces=idrac-redfish
enabled_management_interfaces=idrac-redfish
@ -85,7 +86,8 @@ order:
Interface Supported Implementations
================ ===================================================
``bios`` ``idrac-redfish``, ``no-bios``
``boot`` ``ipxe``, ``pxe``, ``idrac-redfish-virtual-media``
``boot`` ``ipxe``, ``pxe``, ``http-ipxe``, ``http``,
``redfish-https``, ``idrac-redfish-virtual-media``
``console`` ``no-console``
``deploy`` ``direct``, ``ansible``, ``ramdisk``
``firmware`` ``redfish``, ``no-firmware``
@ -93,11 +95,11 @@ Interface Supported Implementations
``inspector``, ``no-inspect``
``management`` ``idrac-redfish``
``network`` ``flat``, ``neutron``, ``noop``
``power`` ``idrac-redfish``
``power`` ``redfish``, ``idrac-redfish``
``raid`` ``idrac-redfish``, ``no-raid``
``rescue`` ``no-rescue``, ``agent``
``storage`` ``noop``, ``cinder``, ``external``
``vendor`` ``idrac-redfish``,
``vendor`` ``redfish``, ``idrac-redfish``,
``no-vendor``
================ ===================================================
@ -135,12 +137,12 @@ hardware type using Redfish for all interfaces:
--driver-info redfish_password=pa$$w0rd \
--driver-info redfish_address=drac.host \
--driver-info redfish_system_id=/redfish/v1/Systems/System.Embedded.1 \
--bios-interface idrac-redfish \
--bios-interface redfish \
--inspect-interface idrac-redfish \
--management-interface idrac-redfish \
--power-interface idrac-redfish \
--power-interface redfish \
--raid-interface idrac-redfish \
--vendor-interface idrac-redfish
--vendor-interface redfish
BIOS Interface
==============

View File

@ -17,7 +17,6 @@ DRAC Driver for remote system management using Dell Remote Access Card.
from oslo_config import cfg
from ironic.drivers import generic
from ironic.drivers.modules.drac import bios
from ironic.drivers.modules.drac import boot
from ironic.drivers.modules.drac import inspect as drac_inspect
@ -25,16 +24,16 @@ from ironic.drivers.modules.drac import management
from ironic.drivers.modules.drac import power
from ironic.drivers.modules.drac import raid
from ironic.drivers.modules.drac import vendor_passthru
from ironic.drivers.modules import ipxe
from ironic.drivers.modules import noop
from ironic.drivers.modules import pxe
from ironic.drivers.modules.redfish import firmware as redfish_firmware
from ironic.drivers.modules.redfish import boot as redfish_boot
from ironic.drivers.modules.redfish import inspect as redfish_inspect
from ironic.drivers.modules.redfish import raid as redfish_raid
from ironic.drivers import redfish
CONF = cfg.CONF
class IDRACHardware(generic.GenericHardware):
class IDRACHardware(redfish.RedfishHardware):
"""integrated Dell Remote Access Controller hardware type"""
# Required hardware interfaces
@ -42,7 +41,11 @@ class IDRACHardware(generic.GenericHardware):
@property
def supported_boot_interfaces(self):
"""List of supported boot interfaces."""
return [ipxe.iPXEBoot, pxe.PXEBoot, boot.DracRedfishVirtualMediaBoot]
inherited = super().supported_boot_interfaces
# remove the generic redfish one in favor of the Dell specific
idx = inherited.index(redfish_boot.RedfishVirtualMediaBoot)
inherited[idx] = boot.DracRedfishVirtualMediaBoot
return inherited
@property
def supported_management_interfaces(self):
@ -52,18 +55,16 @@ class IDRACHardware(generic.GenericHardware):
@property
def supported_power_interfaces(self):
"""List of supported power interfaces."""
return [power.DracRedfishPower]
return ([power.DracRedfishPower]
+ super().supported_power_interfaces)
# Optional hardware interfaces
@property
def supported_bios_interfaces(self):
"""List of supported bios interfaces."""
return [bios.DracRedfishBIOS, noop.NoBIOS]
@property
def supported_firmware_interfaces(self):
return [redfish_firmware.RedfishFirmware, noop.NoFirmware]
return ([bios.DracRedfishBIOS]
+ super().supported_bios_interfaces)
@property
def supported_inspect_interfaces(self):
@ -71,17 +72,23 @@ class IDRACHardware(generic.GenericHardware):
# 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.DracRedfishInspect] + super(
IDRACHardware, self).supported_inspect_interfaces
inherited = super().supported_inspect_interfaces
# remove the generic redfish one in favor of the Dell specific
idx = inherited.index(redfish_inspect.RedfishInspect)
inherited[idx] = drac_inspect.DracRedfishInspect
return inherited
@property
def supported_raid_interfaces(self):
"""List of supported raid interfaces."""
return [raid.DracRedfishRAID] + super(
IDRACHardware, self).supported_raid_interfaces
inherited = super().supported_raid_interfaces
# remove the generic redfish one in favor of the Dell specific
idx = inherited.index(redfish_raid.RedfishRAID)
inherited[idx] = raid.DracRedfishRAID
return inherited
@property
def supported_vendor_interfaces(self):
"""List of supported vendor interfaces."""
return [vendor_passthru.DracRedfishVendorPassthru,
noop.NoVendor]
return ([vendor_passthru.DracRedfishVendorPassthru]
+ super().supported_vendor_interfaces)

View File

@ -26,3 +26,5 @@ class DracRedfishBIOS(redfish_bios.RedfishBIOS):
specific incompatibilities and introduction of vendor value added
should be implemented by this class.
"""
# NOTE(cardoe): deprecated in favor of plain Redfish
supported = False

View File

@ -27,4 +27,5 @@ class DracRedfishPower(redfish_power.RedfishPower):
specific incompatibilities and introduction of vendor value added
should be implemented by this class.
"""
pass
# NOTE(cardoe): deprecated in favor of plain Redfish
supported = False

View File

@ -23,3 +23,5 @@ class DracRedfishVendorPassthru(redfish_vendor.RedfishVendorPassthru):
Use the Redfish implementation for vendor passthru.
"""
# NOTE(cardoe): deprecated in favor of plain Redfish
supported = False

View File

@ -21,6 +21,7 @@ from ironic.drivers.modules import inspector
from ironic.drivers.modules import ipxe
from ironic.drivers.modules.network import flat as flat_net
from ironic.drivers.modules import noop
from ironic.drivers.modules import redfish
from ironic.drivers.modules.storage import noop as noop_storage
from ironic.tests.unit.db import base as db_base
from ironic.tests.unit.objects import utils as obj_utils
@ -35,7 +36,7 @@ class IDRACHardwareTestCase(db_base.DbTestCase):
enabled_boot_interfaces=[
'idrac-redfish-virtual-media', 'ipxe', 'pxe'],
enabled_management_interfaces=['idrac-redfish'],
enabled_power_interfaces=['idrac-redfish'],
enabled_power_interfaces=['idrac-redfish', 'redfish'],
enabled_inspect_interfaces=[
'idrac-redfish', 'inspector',
'no-inspect'],
@ -43,8 +44,10 @@ class IDRACHardwareTestCase(db_base.DbTestCase):
enabled_raid_interfaces=[
'idrac-redfish', 'no-raid',
'agent'],
enabled_vendor_interfaces=['idrac-redfish', 'no-vendor'],
enabled_bios_interfaces=['idrac-redfish', 'no-bios'])
enabled_vendor_interfaces=[
'idrac-redfish', 'redfish', 'no-vendor'],
enabled_bios_interfaces=[
'idrac-redfish', 'redfish', 'no-bios'])
def _validate_interfaces(self, driver, **kwargs):
self.assertIsInstance(
@ -120,30 +123,37 @@ class IDRACHardwareTestCase(db_base.DbTestCase):
self._validate_interfaces(task.driver,
raid=drac.raid.DracRedfishRAID)
def test_override_no_vendor(self):
node = obj_utils.create_test_node(self.context, driver='idrac',
vendor_interface='no-vendor')
with task_manager.acquire(self.context, node.id) as task:
self._validate_interfaces(task.driver,
vendor=noop.NoVendor)
def test_override_with_redfish_vendor(self):
for iface, impl in [('redfish',
redfish.vendor.RedfishVendorPassthru),
('no-vendor', noop.NoVendor)]:
node = obj_utils.create_test_node(self.context,
uuid=uuidutils.generate_uuid(),
driver='idrac',
vendor_interface=iface)
with task_manager.acquire(self.context, node.id) as task:
self._validate_interfaces(task.driver,
vendor=impl)
def test_override_with_redfish_management_and_power(self):
node = obj_utils.create_test_node(self.context, driver='idrac',
management_interface='idrac-redfish',
power_interface='idrac-redfish')
power_interface='redfish')
with task_manager.acquire(self.context, node.id) as task:
self._validate_interfaces(
task.driver,
management=drac.management.DracRedfishManagement,
power=drac.power.DracRedfishPower)
power=redfish.power.RedfishPower)
def test_override_with_redfish_bios(self):
node = obj_utils.create_test_node(self.context, driver='idrac',
bios_interface='idrac-redfish')
with task_manager.acquire(self.context, node.id) as task:
self._validate_interfaces(
task.driver,
bios=drac.bios.DracRedfishBIOS)
for iface, impl in [('redfish', redfish.bios.RedfishBIOS),
('no-bios', noop.NoBIOS)]:
node = obj_utils.create_test_node(self.context,
uuid=uuidutils.generate_uuid(),
driver='idrac',
bios_interface=iface)
with task_manager.acquire(self.context, node.id) as task:
self._validate_interfaces(task.driver, bios=impl)
def test_override_with_redfish_inspect(self):
node = obj_utils.create_test_node(self.context, driver='idrac',

View File

@ -0,0 +1,15 @@
---
features:
- |
Make the ``idrac`` hardware type inherit from the ``redfish`` hardware
type since the ``idrac`` hardware type is an extension of the ``redfish``
with Dell specific overrides. This will ensure that features available
to the ``redfish`` hardware type will always be available to ``idrac``.
Added ``redfish`` interface as available for the ``bios``, ``power``
and ``vendor`` interfaces of the ``idrac`` hardware type.
deprecations:
- |
Deprecates the ``idrac-redfish`` interfaces in favor of the ``redfish``
interfaces for the ``bios``, ``power``, and ``vendor`` interfaces. This
is a no-op change as these interfaces wrapped the ``redfish`` interface
with no change already.