Skip to navigation

Switch State Diagram

View as Markdown

This document describes the Finite State Machine (FSM) for Switches in NICo: lifecycle from creation through configuration, validation, ready, optional rack-level reprovisioning, operator maintenance, decommissioning, and deletion.

High-Level Overview

The main flow shows the primary states and transitions:

States

StateDescription
CreatedSwitch record exists in NICo; awaiting first controller tick.
InitializingController associates discovered NVOS interfaces and waits for the expected switch’s primary NVOS interface. Sub-state: WaitForOsMachineInterface.
ConfiguringSwitch is being configured. Sub-states: DisableMtls (Start → WaitForComplete { job_id }), ConfigureCertificate (Start → WaitForComplete { job_id }), then RotateOsPassword. Refer to Switch Certificate Configuration.
FetchInfoController fetches rack placement info (slot and tray) from the component manager backend and persists it on the switch record. Warn-and-continue on lookup failure.
ValidatingSwitch is being validated. Sub-state: ValidationComplete.
BomValidatingBOM (Bill of Materials) validation. Sub-state: BomValidationComplete.
ReadySwitch is ready for use. Can be deleted, enter decommissioning, enter operator maintenance, or enter rack-level reprovisioning.
DecommissioningSwitch is being removed from managed service. NICo suppresses discovery and DHCP, factory-resets NVOS and the BMC, and deletes managed credentials. Ends in terminal sub-state Decommissioned.
MaintenanceOperator-requested maintenance in progress. Operation is carried in operation: PowerOn, PowerOff, Reset, or ReconfigureCertificate. Certificate reconfiguration uses configure_certificate sub-states (Start → WaitForComplete { job_id }).
ReProvisioningRack-driven maintenance in progress. Sub-states: WaitingForRackFirmwareUpgrade, WaitingForNVOSUpgrade, WaitingForNMXCConfigure. The rack state machine sets per-switch status fields and clears switch_reprovisioning_requested when the cycle completes.
ErrorSwitch is in error (for example firmware upgrade failed, certificate job failed, or NVOS MAC conflict). Can transition to Deleting or Maintenance; otherwise waits for manual intervention.
DeletingSwitch is being removed; ends in final delete (terminal).

Transitions (by trigger)

FromToTrigger / Condition
(create)CreatedSwitch created
CreatedInitializing (WaitForOsMachineInterface)Controller processes switch
Initializing (WaitForOsMachineInterface)Configuring (DisableMtls Start)Primary NVOS interface associated for expected switch
Configuring (DisableMtls Start)Configuring (DisableMtls WaitForComplete)Component manager returns RMS BatchDisableSwitchMtls job ID
Configuring (DisableMtls Start)Configuring (ConfigureCertificate Start)No rack_id, no component manager, no services, or backend does not support the operation (skip disable step)
Configuring (DisableMtls Start)ErrorMissing BMC MAC or endpoint, or the submission outcome is unknown
Configuring (DisableMtls WaitForComplete)Configuring (ConfigureCertificate Start)RMS disable job and every child Completed
Configuring (DisableMtls WaitForComplete)ErrorRMS job Failed, or its outcome cannot be observed
Initializing (WaitForOsMachineInterface)ErrorExpected switch declares no NVOS ethernet ports, has no resolvable primary port, or declares a MAC owned by another switch
Configuring (ConfigureCertificate Start)Configuring (ConfigureCertificate WaitForComplete)Component manager returns RMS job ID (domain_name = rack_id)
Configuring (ConfigureCertificate Start)Configuring (RotateOsPassword)No rack_id or no component manager (skip certificate step)
Configuring (ConfigureCertificate WaitForComplete)Configuring (RotateOsPassword)RMS job Completed
Configuring (ConfigureCertificate WaitForComplete)ErrorRMS job Failed
Configuring (RotateOsPassword)FetchInfoNVOS credentials stored or already in the credential store
Configuring (RotateOsPassword)ErrorNo expected switch or missing BMC MAC
FetchInfoValidating (ValidationComplete)Slot/tray lookup attempted (always advances)
Validating (ValidationComplete)BomValidating (BomValidationComplete)Validation complete
BomValidating (BomValidationComplete)ReadyBOM validation complete
ReadyDeletingdeleted set (marked for deletion)
ReadyDecommissioning (SuppressingSiteExplorer)decommission_requested is set
ReadyMaintenanceswitch_maintenance_requested is set
ReadyReProvisioning (WaitingForRackFirmwareUpgrade)switch_reprovisioning_requested with initiator prefixed rack-
ReadyErrorUnknown switch_reprovisioning_requested initiator
Maintenance (PowerOn / PowerOff / Reset)ReadyBMC operation complete; maintenance request cleared
Maintenance (PowerOn / PowerOff / Reset)ErrorBMC operation failed
Maintenance (ReconfigureCertificate Start)Maintenance (ReconfigureCertificate WaitForComplete)Component manager returns RMS job ID
Maintenance (ReconfigureCertificate WaitForComplete)ReadyRMS job Completed; maintenance request cleared
Maintenance (ReconfigureCertificate WaitForComplete)ErrorRMS job Failed
ReProvisioning (WaitingForRackFirmwareUpgrade)ReProvisioning (WaitingForNVOSUpgrade)firmware_upgrade_status terminal Completed and continue_after_firmware_upgrade is true
ReProvisioning (WaitingForRackFirmwareUpgrade)Readyfirmware_upgrade_status terminal Completed and continue_after_firmware_upgrade is false
ReProvisioning (WaitingForRackFirmwareUpgrade)Errorfirmware_upgrade_status terminal Failed
ReProvisioning (WaitingForNVOSUpgrade)ReProvisioning (WaitingForNMXCConfigure)nvos_update_status terminal Completed
ReProvisioning (WaitingForNVOSUpgrade)Errornvos_update_status terminal Failed
ReProvisioning (WaitingForNMXCConfigure)Readyfabric_manager_status reports running
ReProvisioning (WaitingForNMXCConfigure)Errorfabric_manager_status reports an error message
ReProvisioning (any sub-state)ReadyParent rack entered Error; rack-level reprovision request cleared
ErrorDeletingdeleted set (marked for deletion)
ErrorMaintenanceswitch_maintenance_requested is set
Decommissioning (SuppressingSiteExplorer)Decommissioning (FactoryResetNvos)Site Explorer acknowledges the BMC suppression
Decommissioning (FactoryResetNvos)Decommissioning (WaitingForNvosFactoryReset { job_id })RMS returns a reset job ID; the controller persists it for polling
Decommissioning (FactoryResetNvos)Decommissioning (NvosFactoryResetOutcomeUnknown { error })Submission returns OperationOutcomeUnknown; operator recovery is required
Decommissioning (WaitingForNvosFactoryReset { job_id })Same sub-stateRMS reports Pending, or a transient polling error occurs; poll the same job again
Decommissioning (WaitingForNvosFactoryReset { job_id })Same sub-stateRMS reports Failed; handler reports ManualInterventionRequired
Decommissioning (WaitingForNvosFactoryReset { job_id })Decommissioning (SuppressingNvosDhcp)RMS reports Completed
Decommissioning (NvosFactoryResetOutcomeUnknown { error })Same sub-stateHandler reports ManualInterventionRequired; no automatic reset resubmission
Decommissioning (SuppressingNvosDhcp)Decommissioning (RebootingSwitch)NVOS DHCP suppression is recorded
Decommissioning (RebootingSwitch)Decommissioning (WaitingForNvosDhcpAcknowledgement)Redfish accepts ForceRestart
Decommissioning (WaitingForNvosDhcpAcknowledgement)Same sub-stateNVOS DHCP acknowledgement is required and not yet recorded
Decommissioning (WaitingForNvosDhcpAcknowledgement)Decommissioning (SuppressingBmcDhcp)No NVOS DHCP acknowledgement pending
Decommissioning (SuppressingBmcDhcp)Decommissioning (FactoryResetBmc)BMC DHCP suppression is recorded
Decommissioning (FactoryResetBmc)Decommissioning (WaitingForBmcDhcpAcknowledgement)Redfish accepts the BMC factory-reset request
Decommissioning (WaitingForBmcDhcpAcknowledgement)Same sub-stateBMC DHCP acknowledgement is required and not yet recorded
Decommissioning (WaitingForBmcDhcpAcknowledgement)Decommissioning (DeletingManagedCredentials)No BMC DHCP acknowledgement pending
Decommissioning (DeletingManagedCredentials)Decommissioning (Decommissioned)Managed BMC and NVOS credentials and convergence records are deleted
Deleting(end)Final delete committed

Rack-Level Re-Provisioning

Rack maintenance drives switch reprovisioning by setting switch_reprovisioning_requested with an initiator prefixed rack-. The switch controller then walks these sub-states in order when continue_after_firmware_upgrade is true (the default):

WaitingForRackFirmwareUpgrade -> WaitingForNVOSUpgrade -> WaitingForNMXCConfigure -> Ready

The rack state machine updates per-switch firmware_upgrade_status, nvos_update_status, and fabric_manager_status while the switch waits in each sub-state. If the parent rack enters Error, the switch aborts reprovisioning and returns to Ready.

On-Demand Maintenance Operations

The Maintenance state is entered when switch_maintenance_requested is posted (from Ready or Error). Supported operations:

  • PowerOn — powers the switch on via the component manager.
  • PowerOff — powers the switch off.
  • Reset — force-restarts the switch.
  • ReconfigureCertificate — reinstalls or rotates NVOS mTLS certificates via component manager / RMS. Uses the same async certificate flow as bring-up; see Switch Certificate Configuration.

Decommissioning

Managed-switch decommissioning requires the RMS switch backend and starts only from Ready. After Site Explorer acknowledges suppression, the controller submits the NVOS factory reset, persists the returned job ID, and polls that job until RMS reports Completed. It then suppresses NVOS DHCP, requests a switch reboot through Redfish, and completes the NVOS DHCP wait before suppressing BMC DHCP and resetting the BMC. It then completes the BMC DHCP wait before deleting managed credentials. Either endpoint can complete its wait without acknowledgement. Refer to DHCP Suppression Acknowledgement for the shared rule.

Transient handler errors leave the switch in its current sub-state for a later retry. A failed RMS reset job reports ManualInterventionRequired while retaining the job ID in WaitingForNvosFactoryReset. An ambiguous submission outcome enters NvosFactoryResetOutcomeUnknown, which requires operator recovery and does not automatically resubmit the reset.

Refer to Decommission Managed Switches for the operator procedure and intended post-reset state.

Implementation

  • State type: SwitchControllerState in crates/api-model/src/switch/mod.rs.
  • Handlers: crates/switch-controller/src/ — one module per top-level state (created, initializing, configuring, fetch_info, validating, bom_validating, ready, decommissioning, maintenance, reprovisioning, error_state, deleting).
  • Certificate configuration design: switch_configure_certificate.md.
  • Orchestration: SwitchStateHandler in handler.rs delegates to the handler for the current controller_state.