Skip to main content

ContainerRuntimeHandle

Struct ContainerRuntimeHandle 

Source
pub struct ContainerRuntimeHandle {
    slot: RwLock<RuntimeSlot>,
    dev_proxy: RwLock<Option<DevProxyRegistry>>,
}
Expand description

Self-healing holder for the container runtime connection.

A plain Option<ContainerManager> fixed at process boot means a Docker daemon that starts (or a socket/named-pipe that appears) AFTER AgentMux launched is never picked up without an app restart — every consumer (the availability probe AND the actual container-launch code paths) would see a permanent None. This type retries on demand instead, so “start Docker Desktop while AgentMux is already running” is picked up within one call, everywhere container_manager is read.

See docs/retro/RETRO_DOCKER_DETECTION_DIVERGENCE_2026_07_04.md.

Fields§

§slot: RwLock<RuntimeSlot>§dev_proxy: RwLock<Option<DevProxyRegistry>>

Dev-proxy registry to attach to every ContainerManager this handle ever produces — including across reconnects, each of which creates a fresh manager instance with its own unset attach_dev_proxy_registry state. None until set_dev_proxy_registry is called (bootstrap wires this in once both this handle and the registry exist); tests using disabled() never set it, and get() never even constructs a manager in that case. See docs/specs/SPEC_NATIVE_CONTAINER_DEV_PROXY_2026_09_19.md.

Implementations§

Source§

impl ContainerRuntimeHandle

Source

pub fn connect_at_startup() -> Self

Boot-time constructor. Attempts one connect (same as the prior behavior) but never permanently gives up on failure — a failed attempt leaves the slot Empty so get()/is_available() retry later instead of staying stuck for the process lifetime.

Source

pub fn set_dev_proxy_registry(&self, registry: DevProxyRegistry)

Wire a dev-proxy registry into this handle so every ContainerManager it produces — now and after any future Docker reconnect — has stop/remove clear that agent’s routes. Call once at bootstrap, after both this handle and the registry exist (see bootstrap::build_app_state).

Source

pub async fn get(&self) -> Option<ContainerManager>

Returns a connected manager, retrying ContainerManager::connect() if the slot is currently Empty. Cheap on the happy path (a read-lock plus a cheap Arc-backed clone); only takes the write lock and re-dials when we don’t already have a manager.

Source

pub async fn is_available(&self) -> bool

True iff a manager is available AND its daemon answers a live ping right now. Never trusts a cached Connected slot alone — the daemon can go down again after a successful connect, and check_available is a real docker.ping(), not a cached flag.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync> ⓘ

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> PolicyExt for T
where T: ?Sized,

§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] only if self and other return Action::Follow. Read more
§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns [Action::Follow] if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more