Make agent creation swarm-only and refuse a name placed on another hive
swarm-controller's POST /api/agents now refuses (409) a name the swarm
has already placed on a different hive: a non-Destroyed declaration in
that hive's wanted state, or a SetAgentWanted node still queued for it.
The same name on the same hive is that agent being re-created and goes
through. A wanted state that cannot be read refuses (503/500) instead of
reading as "placed nowhere". Creations are serialised from that read to
the graph insert so two concurrent creations of one name cannot both
pass.
Hive-level creation is removed: hivectl `agent create` / `request-create`,
HostRequest::Spawn / RequestSpawn, the dashboard POST /api/request-spawn
route, and ApprovalKind::Spawn with its approve/resolve arms and the
approval-carrying `templates::spawn`. The swarm path (deploy request or
wanted-state sweep -> queue_first_deploy -> templates::first_deploy) used
none of them. Old `spawn` approval rows are skipped by collect_lenient,
as `init_config` rows were in a3b672d1.
policy.rs's comment on agent_object_name stated swarm-wide name
uniqueness as a fact; it now says where it is enforced and what that
check cannot see.
Refs #4396
This commit is contained in:
parent
1d8ec00ddc
commit
5785c0024c
35 changed files with 376 additions and 434 deletions
|
|
@ -83,10 +83,12 @@ pub const AGENT_PREFIX: &str = "hive-agent-";
|
|||
/// attaches the policy and matches the subject by spelling all three the same.
|
||||
///
|
||||
/// Injective in `agent` — the prefix is fixed and [`checked_segment`] has
|
||||
/// already refused anything that could re-punctuate the suffix — and agent
|
||||
/// names are one swarm-wide namespace (an agent's path is
|
||||
/// `swarm/agents/<agent>`, with no hive segment to disambiguate two that
|
||||
/// matched), so two agents cannot land on one name.
|
||||
/// already refused anything that could re-punctuate the suffix. Agent names
|
||||
/// are one swarm-wide namespace (an agent's path is `swarm/agents/<agent>`,
|
||||
/// with no hive segment), so two agents sharing a name would share every
|
||||
/// object this names. swarm-controller's `create_agent`, the one place an
|
||||
/// agent is created, refuses a name the swarm has already placed on another
|
||||
/// hive. An agent no hive's wanted state declares is invisible to that check.
|
||||
///
|
||||
/// # Errors
|
||||
/// [`Error::PathSegment`] when `agent` holds anything but `[A-Za-z0-9_-]`.
|
||||
|
|
|
|||
Loading…
Reference in a new issue