@startuml
hide empty description

state "./cryptic-net daemon -c ./daemon.yml" as init

state AppDir {

    note "All relative paths are relative to the root of the AppDir" as N1

    state "./AppRun" as AppRun {
        AppRun : * Set PATH to APPDIR/bin
    }

    state "./bin/cryptic-net-main entrypoint daemon -c ./daemon.yml" as entrypoint {
        entrypoint : * Create runtime dir at $_RUNTIME_DIR_PATH
        entrypoint : * Lock runtime dir
        entrypoint : * Merge given and default daemon.yml files
        entrypoint : * Copy bootstrap.tgz into $_DATA_DIR_PATH, if it's not there
        entrypoint : * Merge daemon.yml config into bootstrap.tgz
        entrypoint : * Create $_RUNTIME_DIR_PATH/garage-N.toml\n  (one per storage allocation)
        entrypoint : * Run child processes
    }

    init --> AppRun : exec
    AppRun --> entrypoint : exec

    state "./bin/dnsmasq-entrypoint" as dnsmasqEntrypoint {
        dnsmasqEntrypoint : * Create $_RUNTIME_DIR_PATH/dnsmasq.conf
    }

    state "./bin/dnsmasq -d -C $_RUNTIME_DIR_PATH/dnsmasq.conf" as dnsmasq

    entrypoint --> dnsmasqEntrypoint : child
    dnsmasqEntrypoint --> dnsmasq : exec

    state "./bin/cryptic-net-main nebula-entrypoint" as nebulaEntrypoint {
        nebulaEntrypoint : * Create $_RUNTIME_DIR_PATH/nebula.yml
    }

    state "./bin/nebula -config $_RUNTIME_DIR_PATH/nebula.yml" as nebula

    entrypoint --> nebulaEntrypoint : child
    nebulaEntrypoint --> nebula : exec

    state "Garage processes (only if any storage allocs are defined)" as garageChildren {

        state "./bin/garage -c $_RUNTIME_DIR_PATH/garage-N.toml server" as garage
        state "./bin/garage-apply-layout-diff" as garageApplyLayoutDiff {
            garageApplyLayoutDiff : * Runs once then exits
            garageApplyLayoutDiff : * Updates cluster topo
        }
    }

    entrypoint --> garage : child (one per storage allocation)
    entrypoint --> garageApplyLayoutDiff : child

    state "./bin/cryptic-net-main update-global-bucket" as updateGlobalBucket {
        updateGlobalBucket : * Runs once then exits
        updateGlobalBucket : * Updates the bootstrap data for the host in garage for other hosts to query
    }

    entrypoint --> updateGlobalBucket : child
}

@enduml