Source code for ironic.drivers.modules.drac.firmware
#
# 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.
"""
Dell iDRAC firmware update utilities.
Provides Dell-specific helpers used by the generic Redfish firmware
interface when running on iDRAC hardware.
"""
from oslo_log import log as logging
from ironic.drivers.modules.redfish import utils as redfish_utils
LOG = logging.getLogger(__name__)
[docs]
def check_scheduled_idrac_job(task, current_update):
"""Check Dell iDRAC for a scheduled Lifecycle Controller job.
Queries the Dell OEM job collection to check whether a scheduled
(unfinished) LC job matching the task monitor JID exists. This
distinguishes a successfully staged firmware update from a failed
download where no job was created.
:param task: a TaskManager instance
:param current_update: the current firmware update being processed
:returns: True if a matching scheduled job was found, False if no
matching job exists, None if the Dell OEM extension is not
available
"""
node = task.node
task_monitor_uri = current_update.get('task_monitor', '')
jid = (task_monitor_uri.rsplit('/', 1)[-1]
if task_monitor_uri else '')
if not jid:
return None
try:
system = redfish_utils.get_system(node)
except Exception as e:
LOG.warning('Cannot get system for Dell OEM job check on '
'node %(node)s: %(error)s. Falling back to '
'assuming firmware staging succeeded.',
{'node': node.uuid, 'error': e})
return None
if not system.managers:
return None
for manager in system.managers:
try:
manager_oem = manager.get_oem_extension('Dell')
except Exception as e:
LOG.warning('Dell OEM extension not found on iDRAC node '
'%(node)s: %(error)s. Falling back to '
'assuming firmware staging succeeded.',
{'node': node.uuid, 'error': e})
return None
try:
unfinished = (
manager_oem.job_collection.get_unfinished_jobs())
if jid in unfinished:
LOG.info(
'Dell iDRAC: found scheduled LC job %(jid)s '
'for node %(node)s, firmware staging succeeded.',
{'jid': jid, 'node': node.uuid})
return True
LOG.warning(
'Dell iDRAC: LC job %(jid)s not found among '
'unfinished jobs for node %(node)s. The firmware '
'download or staging likely failed.',
{'jid': jid, 'node': node.uuid})
return False
except Exception as e:
LOG.warning(
'Failed to query Dell iDRAC job collection for '
'node %(node)s: %(error)s. Falling back to '
'assuming firmware staging succeeded.',
{'node': node.uuid, 'error': e})
return None
return None