Fix idrac-wsman deploy with existing non-BIOS jobs

As with WS-Man iDRAC API setting boot device requires creating BIOS
job and there can be only 1 open job per subsystem present in iDRAC,
there is validation to check that the job queue is empty before
continuing setting boot device. This does not work well for cases when
using autoupdatescheduler that creates `Repository Update` job that
stays Scheduled until executed and then followed by new Scheduled
`Repository Update` job.

This patch allows non-BIOS jobs to be present in the queue when setting
boot device. This will still fail for cases when there are BIOS jobs
present. In such cases should consider moving to idrac-redfish that
does not create BIOS or any other job to set boot device.

Story: 2009251
Task: 43437
Change-Id: I91e9ba3024a85897aeead21cede57464294b409b
(cherry picked from commit b1d08ae805)
This commit is contained in:
Aija Jauntēva 2021-11-03 10:39:32 -04:00
parent 0df43f7586
commit 969cfefee2
3 changed files with 19 additions and 4 deletions

View File

@ -207,7 +207,7 @@ def set_boot_device(node, device, persistent=False):
client.delete_jobs(job_ids=[job.id for job in unfinished_jobs])
if validate_job_queue:
drac_job.validate_job_queue(node)
drac_job.validate_job_queue(node, name_prefix="Configure: BIOS")
try:
drac_boot_devices = client.list_boot_devices()

View File

@ -278,7 +278,8 @@ class DracManagementInternalMethodsTestCase(test_utils.BaseDracTest):
self.assertEqual(0, mock_list_unfinished_jobs.call_count)
self.assertEqual(0, mock_client.delete_jobs.call_count)
mock_validate_job_queue.assert_called_once_with(self.node)
mock_validate_job_queue.assert_called_once_with(
self.node, name_prefix="Configure: BIOS")
mock_client.change_boot_device_order.assert_called_once_with(
'OneTime', 'BIOS.Setup.1-1#BootSeq#NIC.Embedded.1-1-1')
self.assertEqual(0, mock_client.set_bios_settings.call_count)
@ -542,7 +543,8 @@ class DracManagementInternalMethodsTestCase(test_utils.BaseDracTest):
self.assertEqual(0, mock_list_unfinished_jobs.call_count)
self.assertEqual(0, mock_client.delete_jobs.call_count)
mock_validate_job_queue.assert_called_once_with(self.node)
mock_validate_job_queue.assert_called_once_with(
self.node, name_prefix="Configure: BIOS")
@mock.patch.object(drac_job, 'validate_job_queue', spec_set=True,
autospec=True)
@ -593,7 +595,8 @@ class DracManagementInternalMethodsTestCase(test_utils.BaseDracTest):
self.assertEqual(0, mock_list_unfinished_jobs.call_count)
self.assertEqual(0, mock_client.delete_jobs.call_count)
mock_validate_job_queue.assert_called_once_with(self.node)
mock_validate_job_queue.assert_called_once_with(
self.node, name_prefix="Configure: BIOS")
@mock.patch.object(drac_mgmt, '_get_next_persistent_boot_mode',
spec_set=True, autospec=True)

View File

@ -0,0 +1,12 @@
---
fixes:
- |
Fixes ``idrac-wsman`` management interface ``set_boot_device`` method that
would fail deployment when there are existing jobs present with error
"Failed to change power state to ''power on'' by ''rebooting''. Error: DRAC
operation failed. Reason: Unfinished config jobs found: <list of existing
jobs>. Make sure they are completed before retrying.". Now there can be
non-BIOS jobs present during deployment. This will still fail for cases
when there are BIOS jobs present. In such cases should consider moving to
``idrac-redfish`` that does not have this limitation when setting boot
device.