c69642e568
Re-enables the macos-container backend on the shared per-host orchestrator + gateway, replacing the per-bottle companion container removed in #385. This is the last backend in PRD 0070's roadmap. Apple Container 1.0.0 forced three departures from the docker shape, each verified against the live CLI (findings recorded in the networking spike): - No `--ip`. The address is DHCP-assigned and knowable only once the container runs, so the order inverts: gateway up -> run agent -> read its address -> register. The identity token is minted by registration and therefore cannot be in the agent's run-time env; it rides the proxy URL applied at `container exec` time (bare `--env` names keep it off argv). - No container DNS. The gateway can only be handed the control plane's IP, so the orchestrator starts first and the gateway is pointed at its address. - No `network connect`. Networks are fixed at run time, so the shared host-only network is created up front; per-bottle networks would restart the gateway on every launch and defeat the consolidation. The agent runs with `--cap-drop CAP_NET_RAW`: Apple grants NET_RAW by default, which would let an agent forge a neighbour's source address on the shared segment. NET_ADMIN is already absent, so this closes the source-address half of PRD 0070's attribution invariant. Verified end-to-end on real Apple Container 1.0.0: both images build, the control plane comes up healthy, the gateway reaches it by IP, and a registered agent gets 200 for a host in its routes and 403 for one outside them. Bring-up is idempotent — a second launch does not churn the singletons. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
"""Host-side egress route-apply for the macos-container backend.
|
|
|
|
The per-bottle companion container this used to signal (`container kill
|
|
--signal HUP <container>`) was removed in the companion-container removal
|
|
(#385). In the consolidated model the shared gateway resolves egress policy
|
|
per-request against the orchestrator rather than reloading a per-bottle routes
|
|
file, so the live per-bottle reload is not supported here and fails closed
|
|
until the gateway-side apply lands — same posture as the docker backend.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from ..egress_apply import EgressApplicator, EgressApplyError
|
|
|
|
|
|
class MacOSContainerEgressApplicator(EgressApplicator):
|
|
def _signal_bundle_reload(self, slug: str) -> None:
|
|
del slug
|
|
raise EgressApplyError(
|
|
"live egress route-apply was removed with the per-bottle "
|
|
"companion container (#385); route changes will flow through "
|
|
"the consolidated gateway in a follow-up."
|
|
)
|
|
|
|
|
|
applicator = MacOSContainerEgressApplicator()
|
|
|
|
|
|
__all__ = ["MacOSContainerEgressApplicator", "EgressApplyError", "applicator"]
|