feat(orchestrator): Phase 3.2 — wire Quadlet path behind feature flag
prod_orchestrator::install_fresh now branches on the new Config::use_quadlet_backends flag (default false): * off (today's production behavior) — unchanged: runtime.create_container + start_container, container parented under archipelago.service's cgroup, FM3 cascade SIGKILL on every archipelago restart. * on — install_via_quadlet renders the manifest as a Quadlet unit via QuadletUnit::from_manifest, writes it atomically into ~/.config/containers/systemd/, calls daemon-reload, and starts the generated <name>.service. Container ends up under user.slice — no more cgroup parented under archipelago, so archipelago restarts don't touch the container's lifetime. Default off so this commit is structurally safe to ship: nothing changes at runtime until an operator opts in. Flip the default once tests/lifecycle/run-20x.sh has gone green against the new path on .228 + .198 (the v1.7.52 release gate). Plumbing: * config.rs — `use_quadlet_backends: bool` w/ Default false * prod_orchestrator.rs — flag stored on the struct, threaded through new(), with set_use_quadlet_backends(bool) test setter * prod_orchestrator.rs — install_via_quadlet helper * dropped the Phase-3.1 #[allow(dead_code)] markers on from_manifest / parse_memory_mib / RestartPolicy::OnFailure now that the call path exists; if a future revert removes the wiring, the warnings come back. Tests: 624 passing, cargo check clean (0 warnings). Existing companion behavior unaffected — render_skips_backend_directives_when_default still passes byte-equal to before quadlet.rs grew the new fields. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -66,9 +66,8 @@ pub enum NetworkMode {
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||
pub enum RestartPolicy {
|
||||
Always,
|
||||
/// Used by `from_manifest` for backend manifests. Wired into the
|
||||
/// orchestrator in Phase 3.2 (see `project_v1_7_52_phase3_quadlet_design`).
|
||||
#[allow(dead_code)]
|
||||
/// Used by `from_manifest` for backend manifests. Wired through
|
||||
/// `install_via_quadlet` (gated by `Config::use_quadlet_backends`).
|
||||
OnFailure,
|
||||
}
|
||||
|
||||
@@ -253,10 +252,9 @@ fn shell_join(parts: &[String]) -> String {
|
||||
|
||||
impl QuadletUnit {
|
||||
/// Build a backend-flavour QuadletUnit from a parsed AppManifest.
|
||||
/// Wired into the orchestrator in Phase 3.2 (see
|
||||
/// `project_v1_7_52_phase3_quadlet_design`); marked allow(dead_code)
|
||||
/// here so the warning resurfaces if 3.2 doesn't actually call this.
|
||||
#[allow(dead_code)]
|
||||
/// Wired through `prod_orchestrator::install_via_quadlet`, gated by
|
||||
/// `Config::use_quadlet_backends`.
|
||||
///
|
||||
/// `name` is the on-disk container name (typically the manifest's
|
||||
/// `app.id`, but the orchestrator may rename — see
|
||||
/// `compute_container_name`). The returned unit is NOT yet written;
|
||||
@@ -329,7 +327,6 @@ impl QuadletUnit {
|
||||
/// Parse the manifest's memory_limit string into MiB. Recognises the
|
||||
/// forms our manifests actually use: "<n>", "<n>m"/"<n>M", "<n>g"/"<n>G".
|
||||
/// Returns None for anything else; the caller treats None as unlimited.
|
||||
#[allow(dead_code)] // called only from from_manifest (also dead until Phase 3.2)
|
||||
fn parse_memory_mib(raw: &str) -> Option<u32> {
|
||||
let trimmed = raw.trim();
|
||||
if trimmed.is_empty() {
|
||||
|
||||
Reference in New Issue
Block a user