hivectl: rename hivectl agents to hivectl agent <name> <verb>
This commit is contained in:
parent
f48ba3ca0d
commit
03afbd1316
19 changed files with 367 additions and 525 deletions
|
|
@ -295,7 +295,7 @@ pub async fn graceful_restart(
|
|||
/// `Reconcile` (nothing to stop). Restart never writes `wanted`, so the
|
||||
/// tail `Reconcile` converges each agent to its EXISTING intent — a
|
||||
/// deliberately-stopped agent stays down. The whole hive-wide
|
||||
/// `hivectl restart` / `restart-all` is one DAG.
|
||||
/// `hivectl restart` is one DAG.
|
||||
pub async fn restart_many(
|
||||
coord: &Arc<Coordinator>,
|
||||
agents: &[String],
|
||||
|
|
|
|||
|
|
@ -104,7 +104,6 @@ async fn dispatch(req: &HostRequest, coord: Arc<Coordinator>) -> HostResponse {
|
|||
HostRequest::SetPaused { name, paused } => {
|
||||
handle_set_paused(&coord, name, *paused).await
|
||||
}
|
||||
HostRequest::RestartAll => handle_restart_all(&coord).await?,
|
||||
HostRequest::RestartScoped { scope, graceful } => {
|
||||
handle_restart_scoped(&coord, scope, *graceful).await?
|
||||
}
|
||||
|
|
@ -447,7 +446,7 @@ async fn handle_set_resource_limits(
|
|||
"{name}: CPUQuota={cpu} MemoryMax={mem} — the cgroup cap itself is live now (restart \
|
||||
the container if it's running and needs the new cap immediately), but the derived \
|
||||
Claude/JSC heap ceiling is baked in at build time, so it needs a REBUILD \
|
||||
(`hivectl agents rebuild {name}`) to actually track this change"
|
||||
(`hivectl agent {name} rebuild`) to actually track this change"
|
||||
)]))
|
||||
}
|
||||
|
||||
|
|
@ -612,7 +611,7 @@ async fn handle_quota_show(name: Option<&str>) -> Result<HostResponse> {
|
|||
// varies across btrfs-progs versions).
|
||||
if msg.to_ascii_lowercase().contains("quota not enabled") {
|
||||
return Ok(HostResponse::error(
|
||||
"btrfs quota not enabled — run `hivectl agents quota enable` first",
|
||||
"btrfs quota not enabled — run `hivectl quota-enable` first",
|
||||
));
|
||||
}
|
||||
// A plain-dir agent (no subvolume) has no qgroup; note it
|
||||
|
|
@ -787,41 +786,11 @@ async fn submit_single(coord: &Arc<Coordinator>, name: &str, verb: Verb) -> Host
|
|||
HostResponse::queued(vec![id])
|
||||
}
|
||||
|
||||
/// Restart every container in **one** DAG — a per-agent restart subgraph
|
||||
/// each, running concurrently on their own leases (so unrelated agents'
|
||||
/// restarts overlap while nothing races an in-flight rebuild). Returns
|
||||
/// once queued; per-node progress surfaces on the single DAG.
|
||||
async fn handle_restart_all(coord: &Arc<Coordinator>) -> Result<HostResponse> {
|
||||
tracing::info!("restart-all");
|
||||
let containers = lifecycle::list().await?;
|
||||
let agents: Vec<String> = containers
|
||||
.iter()
|
||||
.filter_map(|a| a.strip_prefix(lifecycle::AGENT_PREFIX).map(str::to_owned))
|
||||
.collect();
|
||||
let queued = if agents.is_empty() {
|
||||
Vec::new()
|
||||
} else {
|
||||
vec![
|
||||
crate::job_queue::submit::restart_many(
|
||||
coord,
|
||||
&agents,
|
||||
false,
|
||||
crate::job_queue::Source::Manual,
|
||||
"manual restart via hivectl restart-all".to_owned(),
|
||||
)
|
||||
.await,
|
||||
]
|
||||
};
|
||||
let mut resp = HostResponse::list(agents);
|
||||
resp.queued_dags = Some(queued);
|
||||
Ok(resp)
|
||||
}
|
||||
|
||||
/// Stop the given `agents` (resolved logical names) then `infra` containers
|
||||
/// (`hivectl stop`). Agents go down before infra so they're not mid-request
|
||||
/// against a forge/matrix that's already gone. Per-target failures are
|
||||
/// aggregated rather than aborting on the first error, mirroring
|
||||
/// `handle_restart_all`. Callers resolve the [`LifecycleScope`] to these
|
||||
/// `finish_lifecycle` below. Callers resolve the [`LifecycleScope`] to these
|
||||
/// explicit name lists up front — this never sees the "all" flag.
|
||||
///
|
||||
/// Every agent rides the job queue: a `graceful` stop submits the
|
||||
|
|
@ -1105,7 +1074,7 @@ fn scoped_infra(scope: &LifecycleScope) -> Vec<InfraContainer> {
|
|||
|
||||
/// Build the aggregated lifecycle response: `ok` with the touched names when
|
||||
/// every target succeeded, otherwise `ok: false` with the joined errors and
|
||||
/// the partial success list (matches `handle_restart_all`).
|
||||
/// the partial success list.
|
||||
fn finish_lifecycle(ok_items: Vec<String>, errors: &[String]) -> HostResponse {
|
||||
if errors.is_empty() {
|
||||
HostResponse::list(ok_items)
|
||||
|
|
|
|||
Loading…
Reference in a new issue