539234f29e
Compose-up has owned per-container lifecycle since PRD 0018 ch3;
the .start() / .stop() methods on DockerPipelockProxy /
DockerEgress / DockerGitGate / DockerSupervise (and their
abstractmethod declarations in the four base ABCs) were already
documented as vestigial. With the bundle path in flight
(PRD 0024 ch2), they are truly dead — collapse to nothing.
Changes:
- Removed start/stop methods from the four DockerSidecar
classes. Plan dataclasses, image/path constants,
container-name helpers, and the .prepare() methods all stay
(the renderer + apply path still need them).
- Removed the matching @abstractmethod declarations in the
base ABCs so concrete subclasses don't have to stub them.
- launch.launch() and prepare.resolve_plan() no longer take
proxy/git_gate/egress/supervise instance parameters. backend.py
loses the four instance attributes it threaded through.
prepare.resolve_plan() instantiates the four classes itself
to call their .prepare() methods.
- Deleted four integration tests that only exercised the
removed lifecycle: test_pipelock_sidecar_smoke,
test_supervise_sidecar, test_git_gate_sidecar,
test_git_gate_mirror.
- Dropped the .stop-idempotency case in test_orphan_cleanup;
the network-cleanup cases stay (those test real production
code).
- Marked test_pipelock_apply @skip pending chunk 4 — its
bringup helper used .start; chunk 4 rewrites it with direct
`docker run`.
Dockerfile deletion deferred to chunk 5 (when the bundle flag
default flips) — the legacy compose path still needs
Dockerfile.{egress,git-gate,supervise} until then.
Net: 708 lines removed, 80 added.
533 unit tests + 27 integration tests passing (5 skipped: the
chunk-4-pending case + existing GITEA_ACTIONS guards).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
50 lines
1.5 KiB
Python
50 lines
1.5 KiB
Python
"""DockerSupervise — the Docker-specific lifecycle for the per-bottle
|
|
supervise sidecar (PRD 0013). Inherits the platform-agnostic prepare
|
|
step (queue dir + current-config staging) from `Supervise`."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
from pathlib import Path
|
|
|
|
from ...supervise import (
|
|
SUPERVISE_HOSTNAME,
|
|
SUPERVISE_PORT,
|
|
Supervise,
|
|
)
|
|
from . import util as docker_mod
|
|
|
|
|
|
SUPERVISE_IMAGE = os.environ.get(
|
|
"CLAUDE_BOTTLE_SUPERVISE_IMAGE",
|
|
"claude-bottle-supervise:latest",
|
|
)
|
|
|
|
SUPERVISE_DOCKERFILE = "Dockerfile.supervise"
|
|
|
|
_REPO_DIR = str(Path(__file__).resolve().parent.parent.parent.parent)
|
|
|
|
|
|
def supervise_container_name(slug: str) -> str:
|
|
return f"claude-bottle-supervise-{slug}"
|
|
|
|
|
|
def supervise_url() -> str:
|
|
"""Base URL the agent's MCP client dials. Stable across bottles
|
|
because the sidecar attaches `--network-alias supervise` on the
|
|
internal network."""
|
|
return f"http://{SUPERVISE_HOSTNAME}:{SUPERVISE_PORT}"
|
|
|
|
|
|
def build_supervise_image() -> None:
|
|
"""Build the supervise image from `Dockerfile.supervise`. Called
|
|
by `DockerSupervise.start`; exposed at module level so tests can
|
|
build it without running the full launch pipeline."""
|
|
docker_mod.build_image(SUPERVISE_IMAGE, _REPO_DIR, dockerfile=SUPERVISE_DOCKERFILE)
|
|
|
|
|
|
class DockerSupervise(Supervise):
|
|
"""Docker-flavored Supervise: inherits `.prepare()` from the base.
|
|
Container lifecycle is owned by compose; per-container
|
|
`.start()` / `.stop()` were removed in PRD 0024 chunk 3."""
|