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

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

    Deleting1 [shape=point]

    ExternallyProvisioned [label="Externally\nProvisioned"]

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

    Deleting2 [shape=point]

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

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

    Deleting3 [shape=point]

    MatchProfile -> Ready [label="done"]
    MatchProfile -> Deleted4 [label="!DeletionTimestamp.IsZero()"]

    Deleting4 [shape=point]

    RegistrationError [shape=doublecircle label="Error"]
    RegistrationError -> Registering [label="(user edits settings)"]
    RegistrationError -> Deleted5 [label="!DeletionTimestamp.IsZero()"]

    Deleting5 [shape=point]

    Ready [shape=doublecircle]
    Ready -> Provisioning [label="NeedsProvisioning()"]
    Ready -> Deleting6 [label="!DeletionTimestamp.IsZero()"]

    Deleting6 [shape=point]

    Provisioning -> Provisioned [label=done]
    Provisioning -> ProvisioningError [label="provisioning error"]
    Provisioning -> Deprovisioning [label="!DeletionTimestamp.IsZero()"]

    ProvisioningError [shape=doublecircle label="Error"]
    ProvisioningError -> Provisioning [label="?"]
    ProvisioningError -> Deprovisioning [label="!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]
}
