Source code for ironic.drivers.modules.drac.inspect
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""
DRAC inspection interface
"""
from ironic.common import boot_modes
from ironic.drivers.modules.drac import utils as drac_utils
from ironic.drivers.modules import inspect_utils
from ironic.drivers.modules.redfish import inspect as redfish_inspect
from ironic.drivers.modules.redfish import utils as redfish_utils
_PXE_DEV_ENABLED_INTERFACES = [('PxeDev1EnDis', 'PxeDev1Interface'),
('PxeDev2EnDis', 'PxeDev2Interface'),
('PxeDev3EnDis', 'PxeDev3Interface'),
('PxeDev4EnDis', 'PxeDev4Interface')]
_BIOS_ENABLED_VALUE = 'Enabled'
[docs]
class DracRedfishInspect(redfish_inspect.RedfishInspect):
"""iDRAC Redfish interface for inspection-related actions."""
[docs]
def inspect_hardware(self, task):
"""Inspect hardware to get the hardware properties.
Inspects hardware to get the essential properties.
It fails if any of the essential properties
are not received from the node.
:param task: a TaskManager instance.
:raises: HardwareInspectionFailure if essential properties
could not be retrieved successfully.
:returns: The resulting state of inspection.
"""
# Ensure we create a port for every NIC port found for consistency
# with our previous WSMAN inspect behavior and to work around a bug
# in some versions of the firmware where the port state is not being
# reported correctly.
ethernet_interfaces_mac = list(self._get_mac_address(task).values())
inspect_utils.create_ports_if_not_exist(task, ethernet_interfaces_mac)
return super(DracRedfishInspect, self).inspect_hardware(task)
def _get_mac_address(self, task):
"""Get a list of MAC addresses
:param task: a TaskManager instance.
:returns: a mapping of interface identities to MAC addresses.
"""
system = redfish_utils.get_system(task.node)
# Get dictionary of ethernet interfaces
if system.ethernet_interfaces and system.ethernet_interfaces.summary:
ethernet_interfaces = system.ethernet_interfaces.get_members()
ethernet_interfaces_mac = {
interface.identity: interface.mac_address
for interface in ethernet_interfaces}
return ethernet_interfaces_mac
else:
return {}
def _get_pxe_port_macs(self, task):
"""Get a list of PXE port MAC addresses.
:param task: a TaskManager instance.
:returns: Returns list of PXE port MAC addresses.
"""
system = redfish_utils.get_system(task.node)
ethernet_interfaces_mac = self._get_mac_address(task)
pxe_port_macs = []
if system.boot.mode == boot_modes.UEFI:
# When a server is in UEFI boot mode, the PXE NIC ports are
# stored in the PxeDevXEnDis and PxeDevXInterface BIOS
# settings. Get the PXE NIC ports from these settings and
# their MAC addresses.
for param, nic in _PXE_DEV_ENABLED_INTERFACES:
if system.bios.attributes[param] == _BIOS_ENABLED_VALUE:
nic_id = system.bios.attributes[nic]
# Get MAC address of the given nic_id
mac_address = ethernet_interfaces_mac[nic_id]
pxe_port_macs.append(mac_address)
elif system.boot.mode == boot_modes.LEGACY_BIOS:
# When a server is in BIOS boot mode, whether or not a
# NIC port is set to PXE boot is stored on the NIC port
# itself internally to the BMC. Getting this information
# requires using an OEM extension to export the system
# configuration, as the redfish standard does not specify
# how to get it, and Dell does not have OEM redfish calls
# to selectively retrieve it at this time.
# Get instance of Sushy OEM manager object
pxe_port_macs_list = drac_utils.execute_oem_manager_method(
task, 'get PXE port MAC addresses',
lambda m: m.get_pxe_port_macs_bios(ethernet_interfaces_mac))
pxe_port_macs = [mac for mac in pxe_port_macs_list]
return pxe_port_macs