Skip to content

Commit da6c348

Browse files
committed
Clear idrac jobs earlier in enroll and optionally reset drac completely
1 parent 01a5618 commit da6c348

3 files changed

Lines changed: 40 additions & 17 deletions

File tree

python/understack-workflows/tests/test_enroll_server.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -300,24 +300,24 @@ def test_enrol_happy_path_uses_virtual_media_inspect_and_flips_back(mocker):
300300
),
301301
call(
302302
created_node.uuid,
303-
"inspect", # OOB redfish inspect for bios_name / basic info
304-
cleansteps=None,
303+
"clean",
304+
cleansteps=[{"interface": "management", "step": "clear_job_queue"}],
305305
runbook=None,
306-
disable_ramdisk=None,
306+
disable_ramdisk=True,
307307
),
308308
call(
309309
created_node.uuid,
310-
"inspect", # agent inspect via virtual media
310+
"inspect", # OOB redfish inspect for bios_name / basic info
311311
cleansteps=None,
312312
runbook=None,
313313
disable_ramdisk=None,
314314
),
315315
call(
316316
created_node.uuid,
317-
"clean",
318-
cleansteps=[{"interface": "management", "step": "clear_job_queue"}],
317+
"inspect", # agent inspect
318+
cleansteps=None,
319319
runbook=None,
320-
disable_ramdisk=True,
320+
disable_ramdisk=None,
321321
),
322322
call(
323323
created_node.uuid,
@@ -432,24 +432,24 @@ def test_enrol_existing_failed_node_recovers_and_updates(mocker):
432432
),
433433
call(
434434
existing_node.uuid,
435-
"inspect", # OOB inspect
436-
cleansteps=None,
435+
"clean",
436+
cleansteps=[{"interface": "management", "step": "clear_job_queue"}],
437437
runbook=None,
438-
disable_ramdisk=None,
438+
disable_ramdisk=True,
439439
),
440440
call(
441441
existing_node.uuid,
442-
"inspect", # Agent inspect via virtual media
442+
"inspect", # OOB inspect
443443
cleansteps=None,
444444
runbook=None,
445445
disable_ramdisk=None,
446446
),
447447
call(
448448
existing_node.uuid,
449-
"clean",
450-
cleansteps=[{"interface": "management", "step": "clear_job_queue"}],
449+
"inspect", # Agent inspect
450+
cleansteps=None,
451451
runbook=None,
452-
disable_ramdisk=True,
452+
disable_ramdisk=None,
453453
),
454454
call(
455455
existing_node.uuid,

python/understack-workflows/understack_workflows/ironic_node.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,17 @@ def clear_pending_idrac_jobs(node: Node):
173173
)
174174

175175

176+
def reset_idrac_to_known_good_state(node: Node):
177+
logger.info("%s performing known_good_state clean step", node.uuid)
178+
transition(
179+
node,
180+
target_state="clean",
181+
expected_state="manageable",
182+
clean_steps=[{"interface": "management", "step": "known_good_state"}],
183+
disable_ramdisk=True,
184+
)
185+
186+
176187
def _driver_for(manufacturer: str) -> tuple[str, str]:
177188
"""Answer the (driver, inspect_interface) for this server."""
178189
if manufacturer.startswith("Dell"):

python/understack-workflows/understack_workflows/main/enroll_server.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def main() -> None:
6666
firmware_update=args.firmware_update,
6767
raid_configure=args.raid_configure,
6868
external_cmdb_id=args.external_cmdb_id,
69+
reset_idrac=args.reset_idrac,
6970
)
7071

7172

@@ -75,6 +76,7 @@ def enroll(
7576
raid_configure: bool,
7677
old_password: str | None,
7778
external_cmdb_id: str | None = None,
79+
reset_idrac: bool = False,
7880
) -> None:
7981
logger.info("Starting enroll workflow for bmc_ip_address=%s", ip_address)
8082

@@ -91,6 +93,13 @@ def enroll(
9193
external_cmdb_id=external_cmdb_id,
9294
)
9395

96+
# Clear stale iDRAC jobs before virtual-media inspection, or optionally
97+
# reset the controller to a broader known-good state.
98+
if reset_idrac:
99+
ironic_node.reset_idrac_to_known_good_state(node)
100+
else:
101+
ironic_node.clear_pending_idrac_jobs(node)
102+
94103
# Out-of-band redfish inspection populates data including baremetal ports.
95104
#
96105
# Our hooks augment the ironic baremetal port with the BMC-reported
@@ -124,9 +133,6 @@ def enroll(
124133
)
125134
logger.info("[node:%s] Selected PXE interface %s", node.uuid, pxe_interface)
126135

127-
# Clear the job queue - stale jobs can conflict with the ones we create:
128-
ironic_node.clear_pending_idrac_jobs(node)
129-
130136
# This sets the boot device to use for all future HTTP boots:
131137
if update_dell_bios_settings(bmc, pxe_interface=pxe_interface):
132138
logger.info("%s performing second inspection write BIOS settings", node.uuid)
@@ -225,6 +231,12 @@ def argument_parser():
225231
default=True,
226232
help="Configure RAID before inspection",
227233
)
234+
parser.add_argument(
235+
"--reset-idrac",
236+
type=parse_bool,
237+
default=False,
238+
help="Reset iDRAC to known_good_state instead of clear_job_queue",
239+
)
228240
parser.add_argument(
229241
"--external-cmdb-id",
230242
required=False,

0 commit comments

Comments
 (0)