Repository navigation
feat(observability): expose supervisor version and workload image IDs in sandbox status - #5140
Open
vineethsai7 wants to merge 2 commits into
Open
vineethsai7 wants to merge 2 commits into
vineethsai7 wants to merge 2 commits into
Conversation
Signed-off-by: Vineeth Sai Narajala <vnarajal@cisco.com>
Author
|
I have read the DCO document and I hereby sign the DCO. |
…idence Signed-off-by: Vineeth Sai Narajala <vnarajal@cisco.com>
vineethsai7
marked this pull request as ready for review
November 3, 2026 04:23
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Draft proposal: expose per-sandbox supervisor build information and the workload image ID observed by Docker or Podman in
GetSandboxandopenshell sandbox get --output json. This is a first slice of the runtime evidence requested in #4272; the issue remainsstate:triage-needed, and design feedback is welcome.Related Issue
Part of #4272
Changes
SandboxStatus.runtimeblock with independent supervisor and workload image fields.Design
The driver already observes the container image ID, and the supervisor already has its build version. The gateway stores those observations in sandbox status through the existing driver snapshot and supervisor session paths.
digest_kind: image_iddistinguishes a container image ID from a registry manifest digest. Thereferenceis the effective template image and can be a moving tag.This uses the current per-sandbox status path rather than adding a new RPC, gateway interceptor, or supervisor middleware. An interceptor sees the requested image reference but cannot prove what the driver booted; middleware observes network activity, not the runtime.
GetGatewayInfodescribes the gateway rather than the supervisor serving a particular sandbox. The VM driver'sresolved_identity.resource_digestcurrently identifies its rootfs cache layout, so exposing it as a source image digest would give the field the wrong meaning.Example
{ "supervisor": {"version": "0.1.6", "build_commit": null}, "workload_image": { "reference": "example/agent:latest", "digest": "sha256:...", "digest_kind": "image_id" } }The same block is available as
Sandbox.status.runtimefromGetSandbox. No configuration change is needed.Compatibility
The protobuf additions are optional and preserve existing field numbers. Older supervisors and drivers leave their respective fields absent; CLI output shows
nullwhen no runtime evidence is available. Existing policy hash and gateway version fields remain in their current locations. The supervisor version is reported by the process on an authenticated session; it is not an independent binary attestation. No default runtime behavior changes.Follow-ups
Review follow-up
Release Notes
openshell sandbox get --output jsonand the Go SDK now report the dedicated supervisor's version and the Docker or Podman workload image ID when those components supply them.Testing
All commands ran on the shared build box through
dcbat nice level 15:cargo fmt --all -- --check: passed.--all-targets -- -D warningsfor the six touched Rust crates: passed.go test -race ./...insdk/go: passed.buf lintand the generated Go protobuf comparison: passed.Checklist
Manual verification
Result: PASS. Repeated the Docker and rootless Podman cases on upstream main
be5e49499and PR head12bbf172d1. Both main sandboxes reachedReadywithout aruntimefield. Both PR sandboxes reported the supervisor version and the workload container's actual image ID insandbox get -o jsonand-o yaml.Environment
openshell,openshell-gateway,openshell-supervisor, andopenshell-sandboxbinaries were built on Ubuntu 24.04 throughdcbwithnice -n 15 cargo build --release --locked -p openshell-cli -p openshell-gateway -p openshell-supervisor -p openshell-sandbox --features openshell-gateway/vendored-z3. Main was built from a detached checkout atbe5e49499; the PR build used12bbf172d1. The CLI, gateway, supervisor, and sandbox for each case came from the same commit.libgcc_s.so.1; each sandbox binary was packaged in a scratch image. These match the relevant binary paths and entrypoints indeploy/docker/Dockerfile.supervisorandDockerfile.sandbox. The gateway config selected those local images anddocker.io/library/ubuntu:24.04as the workload image, withcompute_driver = "docker"or"podman", plaintext on loopback, and a private database. The Ubuntu-built gateway and CLI used an Ubuntu 24.04 glibc loader on RHEL.cpucgroup delegation. The delegation was removed during cleanup.openshell-supervisor --versionreported0.0.0. The status reports that actual supervisor value; it is not a missing version field.Steps
For each commit, start a gateway with the selected driver and its matching local supervisor and sandbox images, then create a sandbox. Run the status commands from a second shell while the sandbox is
Ready:The inspect commands target the workload containers, not their supervisor containers. The same procedure was run for main/Docker, main/Podman, PR/Docker, and PR/Podman.
Before: main
be5e49499Both main sandboxes were
Ready. Neither output format contained aruntimeblock:For example,
sandbox get -o json | jq '{phase, has_runtime: has("runtime")}'returned{"phase":"Ready","has_runtime":false}for each driver.sandbox get -o yamlshowedphase: Readyand noruntime:line.After: PR
12bbf172d1, Dockersandbox get -o json(runtime excerpt):sandbox get -o yaml(runtime excerpt):docker inspect --format '{{.Image}}' <docker-workload-container>returnedsha256:fe81560990fae86dc4743202b2cb4d3df98d0bcf949173cecef15ce1127ef852, exactly matching both status values.After: PR
12bbf172d1, rootless Podmansandbox get -o json(runtime excerpt):sandbox get -o yaml(runtime excerpt):podman inspect --format '{{.Image}}' <podman-workload-container>returnedd9b8c34d61a9b9a3c44cab883d7d2f2619d674966ab520186f799cf32e3e0377, exactly matching both status values.podman inspect --format '{{.Config.Image}}'returneddocker.io/library/ubuntu:24.04, the reference. The PR status contains the immutable ID, not that reference.Result and cleanup
Docker: PASS. Podman: PASS. In both runtimes, the supervisor version and workload image ID appear in JSON and YAML only with the PR head; the ID equals the workload container's engine inspect
.Image. Afterward the sandboxes, gateways, local proof images, disposable user and HOME, private staging, and temporary systemd delegation were removed. Readback found no proof processes, listeners, or containers; the host OpenShell 0.1.5 listener remained on port 17670 with its original PID.