Server

Server Status Transitions and Update State

The overall state of a server is tracked by a combination of different elements:

Server state:

        stateDiagram-v2
    state "Unknown" as ServerUnknown
    state "Pending" as ServerPending
    state "Ready" as ServerReady
    state "Offline" as ServerOffline

    ServerUnknown --> ServerPending: create
    ServerPending --> ServerReady: configuration done
    ServerReady --> ServerPending: trigger reconfiguration
    ServerReady --> ServerOffline: reboot|shutdown|unresponsive
    ServerOffline --> ServerReady: online
    

Each server state can have a secondary state (status detail):

  • Pending:

    • re-configuring

  • Ready:

    • none

    • updating

  • Offline:

    • rebooting

    • shut down

    • unresponsive

Each server has a maintenance state:

        stateDiagram-v2
    state "not in maintenance" as InMaintenanceNotInMaintenance
    state "evacuating" as InMaintenanceEvacuating
    state "evacuated" as InMaintenanceEvacuated
    state "restoring" as InMaintenanceRestoring

    InMaintenanceNotInMaintenance --> InMaintenanceEvacuating: evacuation triggered
    InMaintenanceEvacuating --> InMaintenanceEvacuated: evacuation completed life cycle event received
    InMaintenanceEvacuated --> InMaintenanceRestoring: restore triggered
    InMaintenanceRestoring --> InMaintenanceNotInMaintenance: restore completed life cycle event received
    

The combination of the server state (incl. status detail) and maintenance state then allows to track the servers update cycle as follows:

        stateDiagram-v2
    state "Up to date" as UpdateReady
    state "update pending" as UpdatePending
    state "updating" as UpdateUpdating
    state if_requires_reboot <<choice>>
    state if_incus <<choice>>
    state "Evacuation pending" as UpdateNeedsEvacuation
    state "Reboot pending" as UpdateNeedsReboot
    state "Rebooting" as UpdateRebooting
    state "Evacuating" as UpdateEvacuating
    state "In maintenance (reboot pending)" as UpdateInMaintenanceRebootPending
    state "In maintenance (rebooting)" as UpdateInMaintenanceRebooting
    state "In maintenance (restore pending)" as UpdateInMaintenanceRestorePending
    state "Restoring" as UpdateRestoring

    UpdateReady --> UpdatePending: update available
    UpdatePending --> UpdateUpdating: update triggered
    UpdateUpdating --> if_requires_reboot
    if_requires_reboot --> UpdateReady: requires reboot == false
    if_requires_reboot --> if_incus: requires reboot == true
    if_incus --> UpdateNeedsEvacuation: if clusterd Incus
    if_incus --> UpdateNeedsReboot: else
    UpdateNeedsReboot --> UpdateRebooting: trigger reboot
    UpdateRebooting --> UpdateReady: self register or polling

    UpdateNeedsEvacuation --> UpdateEvacuating: evacuation triggered
    UpdateEvacuating --> UpdateInMaintenanceRebootPending: evacuation completed life cycle received
    UpdateInMaintenanceRebootPending --> UpdateInMaintenanceRebooting: trigger reboot
    UpdateInMaintenanceRebooting --> UpdateInMaintenanceRestorePending: self register or polling
    UpdateInMaintenanceRestorePending --> UpdateRestoring: restore triggered
    UpdateRestoring --> UpdateReady: restore completed life cycle event received