diff --git a/swarm-controller/src/main.rs b/swarm-controller/src/main.rs index 1ad2af1d..d7657dfb 100644 --- a/swarm-controller/src/main.rs +++ b/swarm-controller/src/main.rs @@ -914,9 +914,22 @@ async fn create_agent( }) .after_ok(create_repo) .after_ok(create_forge_user); - let _init_config = b - .node(SwarmNodeKind::InitAgentConfigRepo { agent }) + let init_config = b + .node(SwarmNodeKind::InitAgentConfigRepo { + agent: agent.clone(), + }) .after_ok(create_repo); + // Last, and specifically after the config repo is seeded: the + // hive deploys by reading that repo, so a deploy asked for any + // earlier would find nothing to build. This is the edge that + // makes creating an agent at swarm level actually put it on a + // hive, rather than leaving a provisioned name nobody runs. + let _trigger_deploy = b + .node(SwarmNodeKind::TriggerDeploy { + hive: hive.clone(), + agent, + }) + .after_ok(init_config); vec![create_identity.guid()] }) .map_err(|e| { @@ -1529,6 +1542,7 @@ mod tests { let deps = WorkerDeps { auth: None, forge: None, + queue: None, }; let runner = hive_jobq::scheduler::Scheduler::claim_next(&sched, move |id, kind, builder| { @@ -1580,6 +1594,7 @@ mod tests { let deps = WorkerDeps { auth: None, forge: None, + queue: None, }; let runner = hive_jobq::scheduler::Scheduler::claim_next(&sched, move |id, kind, builder| {