Managed Host Firmware Updates
Managed host firmware updates keep an ingested host aligned with the default versions in the effective host firmware catalog. They are normally triggered by drift, scheduled by Machine Update Manager, and executed by the managed-host state machine.
This is different from pre-ingestion. Pre-ingestion uses a minimum-version threshold before the host is managed. The managed-host path compares a managed host with its steady-state defaults and performs the work as host reprovisioning.
Three parts of NICo cooperate in this workflow:
How an automatic update starts
Drift detection
Machine Update Manager snapshots the default version of each configured
component by vendor and model. Site Explorer independently stores the versions
reported by the host’s matching Redfish inventory entries. A host is drifted
when these two normalized Versions maps are not exactly equal.
This comparison is equality-based, not an ordering comparison. A version is
drifted whether it is older, newer, or formatted differently from the
configured default. preingest_upgrade_when_below is not used after ingestion.
The catalog can change through the Host Firmware Config API or legacy/static configuration. Machine Update Manager refreshes its desired-version snapshot when the runtime configuration changes or the legacy firmware directory is modified.
Scheduling gates
A drifted host becomes eligible only after the relevant gates pass:
Automatic machine updates do not start when both concurrency limits are
unset, because the resulting update ceiling is zero. Machine Update Manager
runs every machine_update_run_interval seconds; the default is 300 seconds.
Current limitation:
machine_updater.max_concurrent_machine_updates_percentis intended to set a percentage-based ceiling and account for unhealthy hosts. The current implementation passes the total and unhealthy host counts to that calculation in reverse, so setting the percentage option reduces the calculated ceiling to zero. Until that is corrected, configuremachine_updater.max_concurrent_machine_updates_absoluteand leave the percentage option unset.
When a host is selected, NICo creates a host reprovisioning request. The
managed-host state machine then adds the host-fw-update health report. This
report prevents a currently unassigned host from being allocated and suppresses
external health alerting caused by expected update operations.
Enable or disable one host
The per-machine policy overrides the global setting:
--clear returns the host to the firmware_global.autoupdate policy.
The static firmware_global.host_enable_autoupdate and
firmware_global.host_disable_autoupdate fields are legacy controls. The
current scheduler does not read host_enable_autoupdate, and it compares
host_disable_autoupdate entries only with machine IDs. A matching disabled
entry also ends host selection for that scheduler pass. Use the per-machine
command for new operational workflows.
Open an explicit-start window
For a model with explicit_start_needed = true, set a window on the affected
machines:
Use YYYY-MM-DDTHH:MM:SS+0000 for an explicit UTC offset, or
YYYY-MM-DDTHH:MM:SS for local time.
Omitting --start starts the window now. Omitting --end makes it last 24
hours. Cancel a pending window with:
This command opens a scheduler gate; it does not create an update request by
itself. Models without explicit_start_needed do not require this window.
Assigned hosts need reboot approval
An assigned host can have a pending reprovisioning request without immediately interrupting its instance. The request starts when either:
- the tenant approves updates while rebooting the instance; or
- the current time is inside the site-level
machine_updater.instance_autoreboot_period.
Tenant approval is expressed as:
The autoreboot period is separate from the per-machine firmware window. The firmware window lets Machine Update Manager create the request for a model that requires explicit start. The autoreboot period lets an assigned host consume an existing request without waiting for tenant approval.
After approval, NICo moves the assigned host through its platform configuration
and discovery-boot states before entering the same component-update loop used
for an unassigned host. HostReprovision is the internal state name; this is
not a return to pre-ingestion.
Request host reprovisioning directly
An operator can bypass automatic drift selection and scheduling by creating a host reprovisioning request:
The state machine still compares inventory with the catalog and returns the host to its prior steady state if nothing needs an update. A direct request is not constrained by Machine Update Manager’s concurrency calculation, although an assigned host still needs reboot approval. Use it only as part of an operator-controlled maintenance procedure.
The host reprovisioning command always enters firmware checking; its legacy
--update-firmware flag is not needed. A request that has not started can be
removed with host reprovision clear --id <machine-id>.
Update workflow
After the request can proceed, the managed-host state machine performs the following sequence:
- Protect the host. NICo records the update health report and, where needed, moves an assigned host into its discovery environment and disables platform lockdown.
- Refresh inventory. Site Explorer revisits the BMC. The state machine selects the effective catalog definition by BMC vendor and host model.
- Select a component. NICo walks
orderingand finds the first component for which any matching inventory entry differs from the default version. Pre-ingestion-only firmware entries are excluded. - Install it. NICo chooses the installation route described below. Multi-artifact entries are applied in sequence.
- Activate and verify. For Scout and Redfish updates, NICo performs component-specific resets, reboots, or configured power drains. A legacy local script owns its own activation procedure. NICo then requests fresh inventory and checks the reported versions.
- Repeat. NICo returns to the beginning of
orderingand selects the next mismatched component. - Restore service. When no mismatch remains, NICo restores lockdown when
required, returns the host to
Readyor its assigned-instance state, clears the reprovisioning request, and removes the update health report.
Installation route
The installation mechanism is selected per vendor, model, and component. It is not a separate top-level workflow.
The route precedence is:
- Scout script. NICo first looks for a packaged
/opt/carbide/scout-firmware-scripts/<vendor>/<model>/<component>/upgrade.shand itsmetadata.toml. If present, NICo sends Scout the verified script, artifact URLs and digests, and execution timeouts. Scout downloads and verifies the files, runs the script on the host, and reports the result. - Core-local script. If no Scout script exists and the firmware entry has
script, NICo runs that legacy script on the Core service with the BMC address and credentials in its environment. The script is responsible for installation and activation; after it succeeds, NICo returns to inventory checking. - Redfish. Otherwise NICo resolves the configured artifact, waits for a
shared
firmware_global.max_uploadsslot, uploads asynchronously, and polls the returned Redfish task.
All successful routes eventually return to component selection. Scout and Redfish updates first pass through NICo’s activation and inventory-verification states; the legacy script path returns directly to inventory checking.
Platform and OEM procedures
NICo selects the configured component, starts the integrated installation route, and verifies the resulting inventory. The approved platform or OEM procedure remains authoritative for package selection, prerequisites, preservation settings, activation requirements, and recovery.
Before adding an artifact or script to the catalog, verify that it implements the procedure for the exact platform and release. A successful Redfish task or script exit only shows that the installation mechanism completed; NICo still needs fresh inventory to confirm the configured version. Refer to the Redfish workflow for the request and task ownership boundaries.
Manual platform gate
When firmware_global.requires_manual_upgrade is enabled for an MNNVL-capable
host, NICo pauses in WaitingForManualUpgrade before selecting components.
GB200 is the common example. Complete the approved platform procedure, then
confirm it with:
NICo then refreshes inventory and runs the normal component loop for anything that still differs from the catalog. Marking the manual work complete does not assert that every component is compliant; verification still comes from discovered inventory.
Monitor and verify
List pending or active host reprovisioning requests:
Inspect the current state and recent state history:
Use the host BMC address to inspect the firmware inventory last stored by Site Explorer:
The principal host firmware substates are:
Refer to Managed Host State Diagrams for these firmware substates in the complete host lifecycle.
Completion requires more than leaving an installation state. Verify that the
host returned to Ready or Assigned/Ready, the reprovisioning request is no
longer listed, and Site Explorer reports the configured default versions.
Useful metrics are:
Refer to Core Metrics for the common metric labels and collection endpoint.
Failures and recovery
Transient upload failures and interrupted asynchronous uploads return to
firmware checking and are attempted again. A failed Scout result, failed local
script, terminal Redfish task, or firmware that exhausts its activation-reset
retries moves the host to FailedFirmwareUpgrade.
NICo waits firmware_global.host_firmware_upgrade_retry_interval before
retrying that workflow. The default interval is 60 minutes. An unassigned host
in the top-level HostReprovision state has a budget of five retries. After it
is exhausted, the host remains failed and is counted by
carbide_exhausted_reprovision_retry_count.
Current limitation: Assigned-host firmware work stores its substate under
Assignedwithout a persisted host retry counter. It therefore retries at the configured interval without reaching the five-retry limit or the exhausted-retry metric.
Correct the artifact, script, BMC, inventory matcher, or platform condition before forcing another attempt. Then reset host reprovisioning to firmware checking and, for an unassigned host, clear the retry count:
This command does not repair the platform or change the catalog. It only asks the state machine to start firmware checking again.
A Core-local script interrupted by a NICo restart is not resumed automatically
and can remain in WaitingForScript; use the same reset command after verifying
that the old script is no longer running.
If a host repeatedly appears as pending but immediately leaves the firmware
workflow, compare the catalog’s current_version_reported_as matcher with the
latest Redfish inventory. A missing matching inventory entry makes the desired
and reported Versions maps differ, but leaves the execution path without a
component it can install or verify.