Skip to main content
Fleet Manager workflows do not form one device state machine by themselves. A workflow records job progress and performs operations against source systems such as NetBox, Ironic, Placement, Nova, SLURM, partner custody systems, or a BMC. Fleet Manager agents and condition derivation then turn those source-system changes into the device fields that users see. For the complete enum reference and condition rule ladder, see Device State Machines. For job and job-device status values, see Status Reference.

The Mental Model

There are three different kinds of state in play: Do not infer device readiness from job success alone. A workflow can complete successfully and still leave the device in quarantine because a separate condition is decisive, for example an Ironic maintenance flag, a missing SLURM node, a failed provision state, or a custody hold.

Locking And Concurrency

The Workflow.exclusive flag controls device-level conflict checks: Current non-contending workflows are report generation and firmware inventory. Burn-in and connectivity verification are non-exclusive, but they still conflict with an active exclusive workflow. A workflow can also hold a device it does not run on by naming it in a parameter (HELD_DEVICE_PARAMETERS in core/workflow/names.py). The node swap holds the spare named in replacement_host_name. While such a job is active, every contending job on the named device is refused, exclusive or not, so an enrolment of a swap’s spare waits until the swap finishes. Names match case-insensitively within the job’s site. Admission also checks and locks the named device as one of the holder’s own devices, so a node swap naming a busy spare is refused, and of two submissions touching the same device at the same moment, the second is refused. Cancellation is a job-level operation. Calling POST /api/v1/jobs/{id}/cancel/ moves the job to cancellation_requested; the workflow agent then dispatches Temporal cancellation for in-flight device workflows and later converges the job and device rows to terminal statuses. Fleet Manager only ever cancels the top-level (per-device or batch) workflow — child workflows, such as a burn-in’s per-test SingleTestWorkflow, are not tracked or cancelled directly. Parents start their children with cancellation_type=ABANDON and parent_close_policy=REQUEST_CANCEL so a cancel terminalizes the parent promptly and then cascades a graceful cancel to the child by workflow id — which reaches the child’s live run even after it has continue_as_new’d, where a run-id-pinned cancel would miss it.

Workflow Groups

Fleet Manager workflows are easier to read by operational intent. Each section below uses the same columns: when to use it, submission restrictions, parameters, and the device-state effect. The API stores workflow inputs in Job.parameters. Some values are operator-supplied; others, such as engagement_mode, are stamped by the workflow agent from site configuration so Temporal replay stays deterministic.

Enrolment

Enrollment Completion Proof

A normal Enrollment with run_inspection=true captures the request-time infrastructure identity and establishes or applies Device proof only at terminal completion. It does not need a start-of-work condition transition: workflow exclusivity prevents a concurrent workflow from consuming proof while Enrollment is active, and terminal failure uses the captured identity for a non-revoking guarded failure write. Matching proof is preserved; stale metadata is cleared when the operated identity still matches. Inspection-half success means the configured inspection checks passed against either fresh or cached Ironic inventory. An already available, active, or Nova-owned node is not reinspected because that could disrupt a deployed machine; its cached inventory must still be present and pass the same hardware, link, and cable validation. Missing or invalid cached data fails Enrollment and cannot produce proof. The versioned inspection activity returns the exact resolved Ironic infrastructure_ref, and the workflow returns qualifying proof for that reference only after cleaning and every later configured stage succeeds. A diagnostic Enrollment with run_inspection=false does not validate cached inspection data or return completion proof. It still captures the resolved Ironic reference so a later failure can be finalized against the correct infrastructure identity. At a site with temporalWorker.enrollmentSteps.ironicEnrol=false, Enrollment likewise runs every other enabled stage and returns a diagnostic completion, but skips the entire Ironic stage and retains the request-time identity for failure finalization. Because no Ironic validation runs, it neither invalidates older completion proof at start nor produces new proof on success. See Device State Machines for the proof lifecycle and terminal-write rules.

Burn-In Testing

Customer Release

Do not use force_reclaim=true under normal conditions. It can take an in-use node away from a customer by deleting the attached customer Nova instance before Fleet Manager moves the device back to quarantine. It is only supported on explicitly enabled fully managed trait-based sites; elsewhere the workflow fails before doing work. Treat it as an emergency/operator-approved reclaim path only.

In-Service Ops

In-band firmware collection

Deploy compatible satellite workers before the hub applies admission migrations 0202 and 0203. Confirm that no old Temporal worker remains. Before enabling temporalWorker.hardwareTests.firmwareInventoryInBandEnabled (default false) at a site:
  1. Confirm site readiness, SLURM node access, and resource-class mappings. This release supports GB300 and B200_8NIC. Unmapped classes fail before SLURM dispatch.
  2. Verify that the satellite worker’s credentials can PUT and GET objects in its configured Fleet Manager bucket. The worker checks storage access at startup.
  3. Set the flag to true and confirm that the new worker starts successfully.
The flag blocks new SLURM dispatch, but it does not block Job creation. Keep include_in_band=false until these checks pass. Disabling the flag preserves status, result, and cancellation activities for collectors already submitted. Both admission migrations are irreversible. Before a worker rollback, disable the flag and deploy a forward repair that closes include_in_band and dry_run admission. Remove these properties from stored workflow schemas and new-organisation defaults; keep additionalProperties=false. Drain or cancel incompatible Jobs before starting old workers. Reversing the migrations does not close admission.

Readable Split Transition Views

These views summarize the workflow and connector paths that commonly move devices between operational statuses. The canonical operational-status derivation remains Device State Machines. Each diagram stays focused on one lifecycle, while the aggregate map and table connect the paths back to workflows and parameters. The actual fully managed derivation is condition-based and ordered: Ironic failure, maintenance, enrollment state, validation allocation, customer allocation, customer-ready traits, and SLURM membership/schedulability all contribute. Custody states are connector/workflow-owned. If a diagram and the condition details appear to disagree, trust the conditions shown on the device detail page.

Aggregate Status Map

Use this as the quick orientation view. It shows which operational statuses can connect without trying to carry every workflow parameter on the graph.

Fully Managed Lifecycle

The in_use -> quarantine path uses force_reclaim=true. It is dangerous because it can take a node from a customer and should not be used under normal conditions. It is only supported for fully managed, trait-based sites where force reclaim is enabled.

Metal Delegated Lifecycle

External Partner Custody Lifecycle

Failure And Repair Overlay

These failure edges are condition-derived, not normal workflow requests. They appear when the infrastructure state reports a failed provision, cleaning, or maintenance outcome; Ironic node clean is the workflow that can recover the device back to quarantine.

Inventory And Health Are Separate

Workflows that affect operational_status usually do not affect inventory_status or health_status.

Why A Successful Workflow May Leave A Device Blocked

Common cases:

What To Check After Running A Workflow

  1. Check Job.status for the aggregate outcome.
  2. Check JobDeviceStatus.status, failure_code, phase, and failure_message for per-device detail.
  3. Open the device and inspect operational_status, health_status, and operational_status_conditions.
  4. If the device is ineligible for a next workflow, call POST /api/v1/eligibility/check/ with the target workflow and device set; the response gives structured reasons.
  5. For burn-in workflows, use the job Results tab and the Burn-in Testing Guide rather than treating device status as test evidence.