digraph BaremetalHost {
    Created [shape=house]
    Created -> Unmanaged [label="BMC.* == \"\""]
    Created -> Registering [label="BMC.* != \"\""]

    Unmanaged [shape=doublecircle]
    Unmanaged -> Registering [label="BMC.* != \"\""]
    Unmanaged -> Deleting1 [label="!DeletionTimestamp.IsZero()"]

    Deleting1 [shape=point]

    ExternallyProvisioned [label="Externally\nProvisioned"]

    Registering -> Inspecting [label="!externallyProvisioned && NeedsHardwareInspection()"]
    Registering -> ExternallyProvisioned [label="externallyProvisioned"]
    Registering -> Deleting2 [label="!DeletionTimestamp.IsZero()"]

    Deleting2 [shape=point]

    ExternallyProvisioned -> Inspecting [label="!externallyProvisioned && NeedsHardwareInspection()"]
    ExternallyProvisioned -> MatchProfile [label="!externallyProvisioned && NeedsHardwareProfile()"]
    ExternallyProvisioned -> Preparing [label="!externallyProvisioned"]
    Ready -> ExternallyProvisioned [label="externallyProvisioned"]

    Inspecting -> MatchProfile [label="done"]
    Inspecting -> Deleting3 [label="!DeletionTimestamp.IsZero()"]

    Deleting3 [shape=point]

    MatchProfile -> Preparing [label="done"]
    MatchProfile -> Deleting4 [label="!DeletionTimestamp.IsZero()"]

    Deleting4 [shape=point]

    Deleting5 [shape=point]

    Preparing -> Ready [label="done"]
    Preparing -> Deleting6 [label="!DeletionTimestamp.IsZero()"]

    Deleting6 [shape=point]

    Ready [shape=doublecircle]
    Ready -> Provisioning [label="NeedsProvisioning()"]
    Ready -> Preparing [label="saveHostProvisioningSettings()"]
    Ready -> Deleting7 [label="!DeletionTimestamp.IsZero()"]
    Ready -> Inspecting [label="hasInspectAnnotation()"]

    Deleting7 [shape=point]

    Provisioning -> Provisioned [label=done]
    Provisioning -> Deprovisioning [label="failed || !DeletionTimestamp.IsZero()"]

    Provisioned [shape=doublecircle]
    Provisioned -> Deprovisioning [label="NeedsDeprovisioning()"]
    Provisioned -> Deprovisioning [label="!DeletionTimestamp.IsZero()"]

    ExternallyProvisioned [shape=doublecircle]
    ExternallyProvisioned -> Deleting [label="!DeletionTimestamp.IsZero()"]

    Deprovisioning -> Provisioning [label="NeedsProvisioning()"]
    Deprovisioning -> Ready [label="!NeedsProvisioning()"]
    Deprovisioning -> Deleting [label="!DeletionTimestamp.IsZero()"]

    Deleting [shape=doublecircle]
}
