feat: make the bootstrap/root container destroyable (drop stale destroy guard + redundant hive-priv manager allows)
This commit is contained in:
parent
20e26ad28d
commit
e593547063
2 changed files with 9 additions and 15 deletions
|
|
@ -6,10 +6,10 @@
|
|||
use std::sync::Arc;
|
||||
|
||||
use anyhow::{Context as _, Result, bail};
|
||||
use hive_sh4re::{ApprovalKind, ApprovalStatus, HelperEvent, MANAGER_AGENT};
|
||||
use hive_sh4re::{ApprovalKind, ApprovalStatus, HelperEvent};
|
||||
|
||||
use crate::coordinator::{Coordinator, TransientKind};
|
||||
use crate::lifecycle::{self, MANAGER_NAME};
|
||||
use crate::lifecycle;
|
||||
|
||||
/// Approve a pending request. Marks the approval row durably, then
|
||||
/// either runs the work inline (`InitConfig`, sub-second git ops) or
|
||||
|
|
@ -915,11 +915,11 @@ async fn deploy_applied_target(
|
|||
/// is cleared because its contents (the mcp socket) don't survive restarts
|
||||
/// anyway. With `purge=true` the persistent trees are also wiped — config
|
||||
/// history, claude creds, notes — there is no undo.
|
||||
/// Refuses the manager (declarative; would fight with the host's nixos config).
|
||||
/// The bootstrap/root container is destroyable like any other: it's
|
||||
/// imperative infra that `auto_update::ensure_root_agent` recreates on the
|
||||
/// next hive-c0re startup if absent, so destroying it is transient rather
|
||||
/// than something to refuse at the API.
|
||||
pub async fn destroy(coord: &Arc<Coordinator>, name: &str, purge: bool) -> Result<()> {
|
||||
if name == MANAGER_NAME || name == MANAGER_AGENT {
|
||||
bail!("refusing to destroy the manager ({name})");
|
||||
}
|
||||
tracing::info!(%name, purge, "destroy");
|
||||
// Guard auto-clears on the success path's final scope exit and on
|
||||
// every early-return / cancellation along the way.
|
||||
|
|
|
|||
|
|
@ -21,9 +21,9 @@ use std::path::{Path, PathBuf};
|
|||
|
||||
use anyhow::{Context as _, Result, bail};
|
||||
use hive_sh4re::priv_proto::{
|
||||
AGENT_PREFIX, AGENT_STATE_ROOT, BindMount, InfraAction, InfraContainer, JournalQuery,
|
||||
MANAGER_NAME, META_DIR, NetworkIsolation, PRIV_SOCK, PrivEvent, PrivRequest, PrivResponse,
|
||||
PrivStream, PrivStreamLine, SIBLING_CONTAINERS,
|
||||
AGENT_PREFIX, AGENT_STATE_ROOT, BindMount, InfraAction, InfraContainer, JournalQuery, META_DIR,
|
||||
NetworkIsolation, PRIV_SOCK, PrivEvent, PrivRequest, PrivResponse, PrivStream, PrivStreamLine,
|
||||
SIBLING_CONTAINERS,
|
||||
};
|
||||
use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader};
|
||||
use tokio::net::unix::OwnedWriteHalf;
|
||||
|
|
@ -1237,18 +1237,12 @@ fn socket_dir_path(agent_name: &str) -> PathBuf {
|
|||
/// Validate a logical agent name (the name hive-c0re uses internally,
|
||||
/// before the `h-` container prefix is applied).
|
||||
fn validate_agent_name(name: &str) -> Result<()> {
|
||||
if name == MANAGER_NAME {
|
||||
return Ok(());
|
||||
}
|
||||
validate_name_chars(name)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Validate a logical agent name and check it maps to a hive-managed container.
|
||||
fn validate_container_name(name: &str) -> Result<()> {
|
||||
if name == MANAGER_NAME {
|
||||
return Ok(());
|
||||
}
|
||||
if SIBLING_CONTAINERS.contains(&name) {
|
||||
return Ok(());
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue