How to reach one sandbox's sandboxd agent, right now.
Produced by CrowdControl.Provider.acquire/1 and
CrowdControl.Provider.reconnect/1, consumed by
CrowdControl.Backend.Sandboxd.API, and never persisted — see the third
load-bearing contract in CrowdControl.Provider.
Every field here is ephemeral for a different reason:
base_url— a loopback port assigned per-connection. Docker publishes the agent on127.0.0.1:0and the daemon picks the port; a GCE tunnel opens a fresh local listener each time. Persisting it means reattaching to whatever else claimed that port.token— derived, not stored. SeeCrowdControl.Provider.token/1.headers— extra request headers, merged over theauthorizationheader built fromtoken. This exists so a provider whose transport already claimsauthorization(the Kubernetes API server's pod proxy) can say so, rather than the transport silently sending the wrong credential.req_options— transport-specificReqoptions::unix_socket,:connect_options, custom CA certs. Merged intoReq.new/1byCrowdControl.Backend.Sandboxd.API.transport— a resource whose lifetime equals the endpoint's, such as an:sshconnection ref for a forwarded port. Closed byCrowdControl.Provider.release/1. A pid or ref here is precisely why this struct cannot round-trip through:erlang.term_to_binary/1usefully.
Inspect is overridden to redact token and headers, because endpoints
end up in Logger metadata and error tuples on every failure path.