Skip to content

feat(testing): support independent test images - #1

Open
Bobbins228 wants to merge 130 commits into
mainfrom
feat/3315-independent-test-images/Bobbins228
Open

Bobbins228 wants to merge 130 commits into
mainfrom
feat/3315-independent-test-images/Bobbins228

Conversation

@Bobbins228

Copy link
Copy Markdown
Owner

Add backward-compatible gateway and supervisor image overrides to the container and Kubernetes test wrappers. Preserve registry and tag defaults, support complete tagged or digest-pinned references, and document the new behavior.

Closes NVIDIA#3315

Summary

Related Issue

Changes

Testing

  • mise run pre-commit passes
  • Unit tests added/updated
  • E2E tests added/updated (if applicable)

Checklist

  • Follows Conventional Commits
  • Commits are signed off (DCO)
  • Architecture docs updated (if applicable)

@Bobbins228 Bobbins228 left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review finding: complete supervisor image references fail in CI without IMAGE_TAG.

Before this PR, CI required IMAGE_TAG only when no supervisor override was provided. With this PR, setting SUPERVISOR_IMAGE=registry.example/supervisor:branch or a digest-pinned reference still exits when CI is set and IMAGE_TAG is unset. This contradicts the documented support for complete references and prevents CI callers from using immutable overrides independently of IMAGE_TAG.

Please apply the IMAGE_TAG validation only when SUPERVISOR_IMAGE is repository-only.

Affected locations:

  • e2e/with-docker-gateway.sh:330-335
  • e2e/with-podman-gateway.sh:332-337

@Bobbins228

Copy link
Copy Markdown
Owner Author

Addressed in commit 10f307fa7. CI now requires IMAGE_TAG only when SUPERVISOR_IMAGE is repository-only; complete tagged and digest-pinned references work without IMAGE_TAG. Added focused regression coverage.

@Bobbins228
Bobbins228 force-pushed the feat/3315-independent-test-images/Bobbins228 branch from 10f307f to a9e5c27 Compare September 15, 2026 13:41
shiju-nv and others added 16 commits September 15, 2026 13:46
…3207)

Show configured tool server addresses and their last observed connection
results together in sandbox status. Keep sandbox lifecycle readiness
separate so an external connection failure does not mark the sandbox unready.

Expose direct endpoint records through the CLI and SDKs, with plain-language
failure explanations and gateway acceptance times. Keep observation tracking,
runtime reporting, and gateway validation in dedicated endpoint status modules.

Preserve bounded reporting, request attribution, retry ordering, and
configuration and supervisor authority checks. Clear obsolete observations
while retaining the configured addresses, and document the distinction
between an observed HTTP response, current availability, and tool success.

Signed-off-by: Shiju <[email protected]>
* fix(auth): harden OIDC trust root retrieval

Signed-off-by: Mrunal Patel <[email protected]>

* fix(e2e): pass OIDC HTTP acknowledgement value

Signed-off-by: Mrunal Patel <[email protected]>

---------

Signed-off-by: Mrunal Patel <[email protected]>
* feat(api): expose structured gateway errors across SDKs

Refs NVIDIA#3051. Add standard validation, conflict, and retry details; preserve raw transport status in Rust, Go, TypeScript, and Python; document status and recovery guidance.

This is the structured-error foundation only. Mutation result shapes, allow_missing, durable request deduplication, and exec retry semantics remain follow-up work.

Signed-off-by: Mrunal Patel <[email protected]>

* fix(python): preserve wrapped RPC cleanup handling

Inspect the original gRPC call when handling missing sandboxes during deletion waits and managed cleanup. Add intercepted cleanup regressions and clarify the error-wrapper migration contract.

Addresses the cleanup review on NVIDIA#3313; part of NVIDIA#3051.

Signed-off-by: Mrunal Patel <[email protected]>

---------

Signed-off-by: Mrunal Patel <[email protected]>
Previously, metadata events omitted both HTTP request and response objects,
early proxy rejections used HTTP Activity without request context, and
unsupported-scheme events did not expose enough safe HTTP context to satisfy
the OCSF 1.8 schema.

Now, metadata events include a method-only request and their actual HTTP
response codes without recording the metadata URL. Unsupported-scheme events
also include a method-only request plus the generated 400 response. Authority
mismatches and credential-resolution denials use HTTP Activity with their
generated 403 or 500 responses, and HTTP activity IDs are derived from the
request method.

Additionally, HttpActivityBuilder now enforces the OCSF request-or-response
constraint at compile time.

Signed-off-by: Kris Hicks <[email protected]>
* fix(gator): run supervisor as sandbox main process

Signed-off-by: John Myers <[email protected]>

* feat(gator): persist supervised state history

Signed-off-by: John Myers <[email protected]>

* refactor(gator): remove obsolete background launch mode

Signed-off-by: John Myers <[email protected]>

---------

Signed-off-by: John Myers <[email protected]>
Co-authored-by: John Myers <[email protected]>
Reject non-loopback plaintext Vault endpoints, disable redirects, and support private CA bundles without weakening hostname verification. Update Helm configuration, documentation, operator skills, and regression coverage for OSSR-002.

Signed-off-by: Seth Jennings <[email protected]>
…IA#3337)

Validate raw OPA object and array containers before normalization and
access-preset expansion can skip malformed values. Return one fixed
structural error without embedding authored policy data.

Preserve versionless and runtime-only OPA data and existing semantic
validation. Cover initial string/file loading, middleware callback order,
valid deny-rule enforcement, and rejected reload state and generation.
Document the loader contract and its engine-local rejection behavior.

Signed-off-by: Shiju <[email protected]>
* fix(ci): upstream Windows SDK validation support

Port remaining Windows validation tooling from GitLab independently of the combined MXC runtime port. Preserve locked SDK dependencies and guard temporary launcher cleanup.

Co-authored-by: Shailendra Singh <[email protected]>
Signed-off-by: Prekshi Vyas <[email protected]>

* fix(ci): install native TypeScript dependencies before validation

Signed-off-by: Prekshi Vyas <[email protected]>

---------

Signed-off-by: Prekshi Vyas <[email protected]>
Co-authored-by: Shailendra Singh <[email protected]>
…2942)

* feat(isolation): add RFC 0012 backend contract

Signed-off-by: Drew Newberry <[email protected]>

* refactor(isolation): name the interface crate explicitly

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): expose trusted host gateway

Signed-off-by: Drew Newberry <[email protected]>

* docs(agents): inventory the MXC driver

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): add mediated DNS transport

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): tighten interface error and digest contracts

Signed-off-by: Drew Newberry <[email protected]>

* docs(isolation): remove unrelated driver inventory

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): define capability-free launch contract

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): seal confirmed boundary state

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): validate confirmation for external backend implementations

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): clarify mediated DNS identity

Signed-off-by: Drew Newberry <[email protected]>

* refactor(isolation): generalize loopback connector

Signed-off-by: Drew Newberry <[email protected]>

* refactor(isolation): unify typed network mediation

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): bind launches to sandbox sessions

Signed-off-by: Drew Newberry <[email protected]>

* fix(mxc): initialize extended sandbox status

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): add boundary protocol and Linux primitives

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): harden signals and separate process status from transport

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): validate remote confirmation through public contract

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): validate wire state and propagate snapshot failures

Signed-off-by: Drew Newberry <[email protected]>

* test(isolation): import owned agent specification explicitly

Signed-off-by: Drew Newberry <[email protected]>

* docs(isolation): describe mediated DNS channel

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): bound mediation attach without nested retries

Signed-off-by: Drew Newberry <[email protected]>

* refactor(isolation): generalize loopback protocol

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): add transport-neutral session authentication

Signed-off-by: Drew Newberry <[email protected]>

* refactor(isolation): separate sandbox backend protocol

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): harden runtime boundary controls

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): add terminal boundary operation

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): split supervisor and sandbox runtimes

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): harden boundary isolation and lifecycle ownership

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): reject private root redirects and adopt typed errors

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): preserve accept thread ownership on musl

Signed-off-by: Drew Newberry <[email protected]>

* test(sandbox): isolate credential probes from filtered threads

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): return retained exec exit status to independent waiters

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): bound network mediation and preserve socket authorization

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): bound control admission and retire stale mediation

Signed-off-by: Drew Newberry <[email protected]>

* ci(e2e): select migrated drivers per stack layer

Signed-off-by: Drew Newberry <[email protected]>

* refactor(sandbox): implement loopback connector

Signed-off-by: Drew Newberry <[email protected]>

* feat(isolation): authenticate the Sandbox Protocol

Signed-off-by: Drew Newberry <[email protected]>

* feat(supervisor): rotate launch-scoped authentication

Signed-off-by: Drew Newberry <[email protected]>

* refactor(sandbox): consume dedicated backend crate

Signed-off-by: Drew Newberry <[email protected]>

* test(sandbox): align topology session fixture

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): align projected bootstrap bundle

Signed-off-by: Drew Newberry <[email protected]>

* fix(auth): validate refreshed credentials before rotation

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): fail closed across supervisor disconnects

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): repair rebased sandbox CI

Signed-off-by: Drew Newberry <[email protected]>

* build(runtime): publish separate sandbox and supervisor images

Signed-off-by: Drew Newberry <[email protected]>

* feat(config): configure the sandbox runtime image

Signed-off-by: Drew Newberry <[email protected]>

* fix(ci): validate sandbox binary linkage

Signed-off-by: Drew Newberry <[email protected]>

* refactor(isolation): use backend and runtime terminology

Signed-off-by: Drew Newberry <[email protected]>

* refactor(sandbox): use a scratch runtime image

Signed-off-by: Drew Newberry <[email protected]>

* fix(ci): refresh schema and dependency policy

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): bind reconnects to supervisor process

Signed-off-by: Drew Newberry <[email protected]>

* docs: align runtime split operational guidance

Signed-off-by: Drew Newberry <[email protected]>

* chore(security): document Kubernetes runtime RBAC

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): enforce runtime lifecycle invariants

Signed-off-by: Drew Newberry <[email protected]>

* feat(compute): identify sandbox start generations

Signed-off-by: Drew Newberry <[email protected]>

* fix(server): restore sandbox launch sessions

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): support authenticated runtime replacement

Signed-off-by: Drew Newberry <[email protected]>

* fix(auth): bind sandbox session successors

Signed-off-by: Drew Newberry <[email protected]>

* fix(auth): retry pending sandbox successors

Signed-off-by: Drew Newberry <[email protected]>

* feat(vm): run the supervisor outside the guest workload

Signed-off-by: Drew Newberry <[email protected]>

* refactor(vm): use sandbox backend protocol

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): repair rebase integration

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): use unified build toolchain

Signed-off-by: Drew Newberry <[email protected]>

* refactor(vm): use sandbox runtime terminology

Signed-off-by: Drew Newberry <[email protected]>

* refactor(vm): own guest network bootstrap

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): expose guest init version

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): select native supervisor artifacts

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): guard guest init Linux symbols

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): scope Linux test imports

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): avoid guest interface casts

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): reconcile admitted sandbox identity

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): share resolved sandbox identity

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): surface host supervisor failures

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): include guest logs on supervisor exit

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): rotate and clean runtime generations

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): make sandbox starts generation-aware

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): rotate restored sandbox sessions

Signed-off-by: Drew Newberry <[email protected]>

* refactor(vm): keep shared paths in the base layer

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): bind sandbox session lineage

Signed-off-by: Drew Newberry <[email protected]>

* feat(docker): isolate workloads behind the host supervisor

Signed-off-by: Drew Newberry <[email protected]>

* feat(docker): rotate launch-scoped authentication

Signed-off-by: Drew Newberry <[email protected]>

* refactor(docker): use sandbox backend protocol

Signed-off-by: Drew Newberry <[email protected]>

* refactor(docker): use host networking for supervisor

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): preserve host gateway alias resolution

Signed-off-by: Drew Newberry <[email protected]>

* feat(docker): use separate sandbox and supervisor images

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): restore startup validation after rebase

Signed-off-by: Drew Newberry <[email protected]>

* refactor(docker): name the sandbox runtime directly

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): narrow supervisor CA runtime storage

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): close companion isolation gaps

Signed-off-by: Drew Newberry <[email protected]>

* test(docker): align mediated network expectations

Signed-off-by: Drew Newberry <[email protected]>

* test(docker): exercise mediated network paths

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): attach supervisor to managed network

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): defer supervisor recovery until gateway is ready

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): make sandbox starts generation-aware

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): rotate restored sandbox sessions

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): preserve workloads during session rotation

Signed-off-by: Drew Newberry <[email protected]>

* refactor(docker): remove unrelated configuration RFC changes

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): bind sandbox session lineage

Signed-off-by: Drew Newberry <[email protected]>

* feat(kubernetes): add proxy-pod isolation topology

Signed-off-by: Drew Newberry <[email protected]>

* refactor(kubernetes): use sandbox backend protocol

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): use stable sandbox service authority

Signed-off-by: Drew Newberry <[email protected]>

* feat(kubernetes): split sandbox and supervisor images

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): adapt proxy pods to current runtime APIs

Signed-off-by: Drew Newberry <[email protected]>

* refactor(kubernetes): describe the single runtime placement

Signed-off-by: Drew Newberry <[email protected]>

* refactor(kubernetes): simplify sandbox orchestration

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): validate deployment prerequisites

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): update Trivy Helm profile inventory

Signed-off-by: Drew Newberry <[email protected]>

* test(kubernetes): update Trivy scan inventory count

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): reuse preloaded runtime images in e2e

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): type and clean runtime resources

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): make sandbox restarts recoverable

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): rotate restored sandbox sessions

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): preserve supervisor egress

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): bind sandbox session lineage

Signed-off-by: Drew Newberry <[email protected]>

* feat(podman): adopt isolated sandbox and supervisor containers

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): stage bootstrap archives at named volume destinations

Signed-off-by: Drew Newberry <[email protected]>

* feat(podman): rotate launch-scoped authentication

Signed-off-by: Drew Newberry <[email protected]>

* refactor(podman): use sandbox backend protocol

Signed-off-by: Drew Newberry <[email protected]>

* refactor(podman): use host networking for supervisor

Signed-off-by: Drew Newberry <[email protected]>

* feat(podman): split sandbox and supervisor images

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): repair rebase integration

Signed-off-by: Drew Newberry <[email protected]>

* refactor(podman): name the sandbox runtime directly

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): provision supervisor CA runtime storage

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): address isolation review findings

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): inspect Debian supervisor provenance

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): use libpod-compatible tmpfs options

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): bind verified sandbox runtime binary

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): provide external driver data directory

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): start sandbox before joining user namespace

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): separate supervisor user namespace

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): make sandbox starts generation-aware

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): rotate restored sandbox sessions

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): bind sandbox session lineage

Signed-off-by: Drew Newberry <[email protected]>

* perf(isolation): add TCP and DNS benchmark harnesses

Signed-off-by: Drew Newberry <[email protected]>

* fix(perf): align benchmark timing and supported protocols

Signed-off-by: Drew Newberry <[email protected]>

* fix(perf): report TCP benchmark metrics accurately

Signed-off-by: Drew Newberry <[email protected]>

* fix(perf): cancel failed worker startup

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): build matching local supervisor image

Signed-off-by: Drew Newberry <[email protected]>

* fix(podman): make local sandbox smoke test runnable

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): wire local sandbox runtime image

Signed-off-by: Drew Newberry <[email protected]>

* fix(kubernetes): narrow sandbox service RBAC

Signed-off-by: Drew Newberry <[email protected]>

* fix(ci): validate split runtime artifacts

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): harden runtime session handling

Signed-off-by: Drew Newberry <[email protected]>

* feat(supervisor): add standalone network proxy role

Signed-off-by: Drew Newberry <[email protected]>

* docs(rfc): remove implementation companion notes

Signed-off-by: Drew Newberry <[email protected]>

* refactor(vm): standardize runtime release name

Signed-off-by: Drew Newberry <[email protected]>

* fix(vm): pin renamed runtime artifacts

Signed-off-by: Drew Newberry <[email protected]>

* fix(auth): persist sandbox runtime identity

Signed-off-by: Drew Newberry <[email protected]>

* fix(runtime): restore branch validation

Signed-off-by: Drew Newberry <[email protected]>

* fix(isolation): reconcile main after rebase

Signed-off-by: Drew Newberry <[email protected]>

* fix(network): close unframed HTTP 1.0 responses

Signed-off-by: Drew Newberry <[email protected]>

* chore(isolation): preserve upstream OCSF updates

Signed-off-by: Drew Newberry <[email protected]>

* fix(security): close credential and TLS replay paths

Signed-off-by: Drew Newberry <[email protected]>

* fix(auth): make sandbox refresh retries idempotent

Signed-off-by: Drew Newberry <[email protected]>

---------

Signed-off-by: Drew Newberry <[email protected]>
Signed-off-by: Drew Newberry <[email protected]>
* fix(ci): lock nextest for Windows ARM64

Signed-off-by: Drew Newberry <[email protected]>

* fix(docker): preserve GPU access in sandbox runtime

Signed-off-by: Drew Newberry <[email protected]>

* fix(windows): restore host proxy identity binding

Signed-off-by: Drew Newberry <[email protected]>

* fix(windows): satisfy cross-platform network lint

Signed-off-by: Drew Newberry <[email protected]>

* fix(windows): satisfy MXC lint

Signed-off-by: Drew Newberry <[email protected]>

* fix(windows): exclude Unix supervisor runtime

Signed-off-by: Drew Newberry <[email protected]>

* fix(mxc): satisfy Windows test lint

Signed-off-by: Drew Newberry <[email protected]>

* fix(windows): escape proxy test policy paths

Signed-off-by: Drew Newberry <[email protected]>

* fix(sandbox): accept admitted GPU runtime groups

Signed-off-by: Drew Newberry <[email protected]>

* test(docker): serialize proxy pipeline scenarios

Signed-off-by: Drew Newberry <[email protected]>

---------

Signed-off-by: Drew Newberry <[email protected]>
…3239)

* ci(release): advance seeded prereleases daily at Zurich time

Signed-off-by: Simon Scatton <[email protected]>

* ci(release): schedule prereleases on weekdays

Signed-off-by: Simon Scatton <[email protected]>

---------

Signed-off-by: Simon Scatton <[email protected]>
…IA#3371)

* test(tmachine): add Docker VM scenario

Signed-off-by: Simon Scatton <[email protected]>

* test(tmachine): add portable container scenarios

Signed-off-by: Simon Scatton <[email protected]>

* chore(tmachine): isolate downloaded Ansible roles

Signed-off-by: Simon Scatton <[email protected]>

* test(tmachine): increase VM resources

Signed-off-by: Simon Scatton <[email protected]>

* test(tmachine): improve artifact builds and diagnostics

Signed-off-by: Simon Scatton <[email protected]>

* fix(nix): pin tmachine runtime on macOS

Signed-off-by: Evan Lezar <[email protected]>

* feat(tests): enable tty and fix supervisor image path

* fix(nix): isolate testing tools from default shell

Signed-off-by: Simon Scatton <[email protected]>

* fix(tmachine): initialize test runner working directory

Signed-off-by: Simon Scatton <[email protected]>

* fix(tmachine): include Ansible sources in layer cache keys

Signed-off-by: Simon Scatton <[email protected]>

* fix(tmachine): build and load separate runtime images

Signed-off-by: Simon Scatton <[email protected]>

* fix(tmachine): use local runtime images for Docker

Signed-off-by: Simon Scatton <[email protected]>

---------

Signed-off-by: Simon Scatton <[email protected]>
Signed-off-by: Evan Lezar <[email protected]>
Co-authored-by: Evan Lezar <[email protected]>
* test(conformance): package CLI smoke test archive

Signed-off-by: Evan Lezar <[email protected]>

* test(tmachine): execute nextest archives in guests

Signed-off-by: Evan Lezar <[email protected]>

---------

Signed-off-by: Evan Lezar <[email protected]>
@Bobbins228
Bobbins228 force-pushed the feat/3315-independent-test-images/Bobbins228 branch 5 times, most recently from 0819e08 to 7dcc44d Compare September 16, 2026 15:46
krishicks and others added 6 commits September 16, 2026 09:04
setuptools-scm can select jj's Git-bridge dev tag when uv resolves the local
package. Pin a development-only version for every Python task that performs
that resolution.

The 0.0.0 value is valid local editable-package metadata for development tasks;
it is neither a release version nor a Git tag. Wheel builds remain unpinned and
derive their published version from the actual release tag.

Signed-off-by: Kris Hicks <[email protected]>
…VIDIA#3334)

* chore(policy): restart schema implementation

Signed-off-by: Johnny Greco <[email protected]>

* feat(policy-schema): add canonical authored policy model

Signed-off-by: Johnny Greco <[email protected]>

* refactor(policy): use canonical authored schema

Signed-off-by: Johnny Greco <[email protected]>

* refactor(prover): project canonical policy documents

Signed-off-by: Johnny Greco <[email protected]>

* docs(policy): describe shared schema boundary

Signed-off-by: Johnny Greco <[email protected]>

* fix(policy): close reviewed parser gaps

Signed-off-by: Johnny Greco <[email protected]>

* fix(policy-schema): fail closed on unsupported fields

Signed-off-by: Johnny Greco <[email protected]>

* fix(policy): preserve partial process identities

Signed-off-by: Johnny Greco <[email protected]>

* fix(policy-schema): harden authored policy inspection

Signed-off-by: Johnny Greco <[email protected]>

* refactor(policy): rename policy schema crate

Signed-off-by: Johnny Greco <[email protected]>

* revert(policy): restore policy schema crate

Signed-off-by: Johnny Greco <[email protected]>

* test(e2e): serialize OIDC PKCE scenarios

Signed-off-by: Johnny Greco <[email protected]>

---------

Signed-off-by: Johnny Greco <[email protected]>
* fix(ci): restore Windows build checks

Signed-off-by: Piotr Mlocek <[email protected]>

* test(windows): fix real MXC clippy warnings

Signed-off-by: Piotr Mlocek <[email protected]>

* test(windows): fix native test execution

Signed-off-by: Piotr Mlocek <[email protected]>

* ci(gator): require Windows checks for support changes

Signed-off-by: Piotr Mlocek <[email protected]>

* docs(gator): remove arbitrary line breaks

Signed-off-by: Piotr Mlocek <[email protected]>

* chore(ci): drop superseded Windows fixes

Signed-off-by: Piotr Mlocek <[email protected]>

* chore(mise): refresh Windows ARM64 lock metadata

Signed-off-by: Piotr Mlocek <[email protected]>

---------

Signed-off-by: Piotr Mlocek <[email protected]>
* refactor(proto)!: use well-known time types

Signed-off-by: Derek Carr <[email protected]>

* fix(proto): preserve time migration behavior

Signed-off-by: Derek Carr <[email protected]>

* fix(proto): preserve timestamp boundary semantics

Signed-off-by: Derek Carr <[email protected]>

* fix(proto): convert sandbox token expiry to timestamp

Signed-off-by: Derek Carr <[email protected]>

* fix(proto): preserve time compatibility semantics

Signed-off-by: Derek Carr <[email protected]>

* fix(proto): preserve exact endpoint and profile times

Signed-off-by: Derek Carr <[email protected]>

* test(e2e): use duration for interactive exec timeout

Signed-off-by: Derek Carr <[email protected]>

* fix(sdk-go)!: remove legacy profile duration fields

BREAKING CHANGE: Go provider profile callers must use RefreshBefore, MaxLifetime, and CacheTTL with ProfileDuration instead of the whole-second fields.

Signed-off-by: Derek Carr <[email protected]>

---------

Signed-off-by: Derek Carr <[email protected]>
…t semantics (NVIDIA#3317)

* feat(api): return typed deletion outcomes with explicit missing-target semantics

Implement phase 2 of NVIDIA#3051 across the public gateway API and first-party SDKs. Preserve asynchronous sandbox deletion and observed resource identities, reserve legacy wire fields, and document the coordinated migration.

Signed-off-by: Mrunal Patel <[email protected]>

* fix(sdk): bind deletion waits to sandbox identity

Track accepted deletions by original sandbox identity in Rust and TypeScript. Preserve name-only waits and cover replacement races and lookup failures.

Merge the phase-one cleanup fix and adapt its interceptor regressions to typed deletion outcomes.

Refs NVIDIA#3051.

Signed-off-by: Mrunal Patel <[email protected]>

* test(e2e): accept asynchronous stopped sandbox deletion

Allow either completed or accepted deletion output, then continue polling for actual sandbox absence. This preserves the lifecycle assertion under the phase-two deletion contract.

Refs NVIDIA#3051.

Signed-off-by: Mrunal Patel <[email protected]>

---------

Signed-off-by: Mrunal Patel <[email protected]>
elezar and others added 9 commits September 23, 2026 00:30
)

* test(podman): cover user namespace configurations

Signed-off-by: Evan Lezar <[email protected]>

* fix(podman): support keep-id runtime groups

Signed-off-by: Evan Lezar <[email protected]>

refactor(podman): generalize keep-id group handling

Signed-off-by: Evan Lezar <[email protected]>

* ci(podman): run driver integration tests

Signed-off-by: Evan Lezar <[email protected]>

---------

Signed-off-by: Evan Lezar <[email protected]>
…A#3580)

* fix(vm): scope GPU filesystem enrichment to assigned workloads

Signed-off-by: Drew Newberry <[email protected]>

* refactor(supervisor): clarify proxy baseline enrichment

Signed-off-by: Drew Newberry <[email protected]>

---------

Signed-off-by: Drew Newberry <[email protected]>
…col (NVIDIA#3456)

CA certificates are PEM-encoded text. Using String instead of Vec<u8>
avoids base64 overhead in the JSON wire format, keeping large CA bundles
within the 1 MiB control frame limit without needing to raise it.

Signed-off-by: Florent Benoit <[email protected]>
…ath (NVIDIA#3544)

The VM driver bound control.sock and ssh.sock inside the per-sandbox
state directory, which defaults to
$HOME/.local/state/openshell/vm-driver/sandboxes/<uuid>/. On macOS the
sun_path field of sockaddr_un holds 104 bytes, so a normal home
directory plus the sandbox UUID already pushes the socket path past the
limit and bind fails with "path too long".

Bind both sockets under a short driver-owned namespace instead:
/tmp/os-<uid>-<128-bit-hex>/<sandbox-id>/. The worst case with a UUID
sandbox id is 101 bytes.

Security properties of the new location:

- The root is created with mkdir mode 0700 and a random 128-bit name,
  retrying on EEXIST, so a local user cannot pre-create the path to
  block the driver or plant a symlink.
- The root's directory FD is held for the driver lifetime. Per-sandbox
  leaves are created and removed with mkdirat/unlinkat relative to that
  FD, so there is no path re-resolution between check and mutation.
- Leaf creation rejects any sandbox id whose socket path would still
  exceed sun_path, returning a clear error instead of a bind failure.

The driver removes the whole root on shutdown so restarts do not
accumulate orphaned roots in /tmp. VM children are kill_on_drop, so no
socket is live at that point. Restore-on-restart goes through the
normal launch path and recreates leaves under the new root.

Signed-off-by: Florent Benoit <[email protected]>
@Bobbins228
Bobbins228 force-pushed the feat/3315-independent-test-images/Bobbins228 branch from a95fb75 to 1c1ca77 Compare September 23, 2026 14:56
purp and others added 16 commits September 23, 2026 15:35
…2e-kubernetes (NVIDIA#3626)

PRs labeled test:e2e-kubernetes now run the Kubernetes HA suite and the
Kubernetes credential-driver suite (Kubernetes Secrets and Vault). Both stay
optional and off in merge groups.

- Read the test:e2e-kubernetes label for the HA and credential-driver
  lanes in Branch E2E Checks.
- Point gator at test:e2e for Helm and Kubernetes coverage and at
  test:e2e-kubernetes for gateway high availability and credential
  driver storage.

Refs NVIDIA#3481

Signed-off-by: Kris Hicks <[email protected]>
Bumps [anyio](https://github.com/agronholm/anyio) from 4.13.0 to 4.14.2.
- [Release notes](https://github.com/agronholm/anyio/releases)
- [Commits](agronholm/anyio@4.13.0...4.14.2)

---
updated-dependencies:
- dependency-name: anyio
  dependency-version: 4.14.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
… available (NVIDIA#3572)

* fix(supervisor): explain unavailable main terminal attachments

Signed-off-by: Piotr Mlocek <[email protected]>

* fix(supervisor): reset cursor after terminal attachment errors

Signed-off-by: Piotr Mlocek <[email protected]>

* fix(supervisor): format read-only warnings for terminal clients

Signed-off-by: Piotr Mlocek <[email protected]>

* docs: drop terminal attachment documentation additions

Signed-off-by: Piotr Mlocek <[email protected]>

* fix(supervisor): exit read-only viewers on Ctrl-C

Signed-off-by: Piotr Mlocek <[email protected]>

* docs: simplify read-only viewer Ctrl-C guidance

Signed-off-by: Piotr Mlocek <[email protected]>

---------

Signed-off-by: Piotr Mlocek <[email protected]>
…#3635)

* fix(server): retry runtime identity persistence on sandbox create

With multiple gateway replicas, another replica can update a new sandbox
record between the create path's read and its compare-and-swap write of the
runtime identity. The create path made one attempt, so the conflict failed
the request and deleted the backend sandbox. Persist the identity through
the same retrying helper that start and startup recovery use, which rereads
the record and retries while the sandbox stays in the same generation and a
Provisioning or Ready phase.

Signed-off-by: Kris Hicks <[email protected]>

* ci(e2e): run Kubernetes HA tests one at a time

The two HA tests scale and roll the shared gateway Deployment. Their
in-process lock does not apply under nextest, which runs each test in its
own process, so one test could delete a gateway pod while the other was
executing through it. Put both tests in a nextest test group limited to one
thread in the e2e-kubernetes profile. The override matches test names
because a binary() filter fails in workspaces that lack the HA test binary.

Signed-off-by: Kris Hicks <[email protected]>

---------

Signed-off-by: Kris Hicks <[email protected]>
* fix(network): honor HTTP response connection closure

Signed-off-by: Drew Newberry <[email protected]>

* test(network): fix EOF fixture socket setup

Signed-off-by: Drew Newberry <[email protected]>

* test(network): keep pipeline probe response reusable

Signed-off-by: Drew Newberry <[email protected]>

---------

Signed-off-by: Drew Newberry <[email protected]>
…#3279)

* fix(pagination): document list contract and harden SDK pagers

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(pagination): bound pager token history

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(pagination): preflight token history limits

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(pagination): paginate sandbox providers

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(pagination): harden TypeScript pager

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(pagination): expose provider pagers in SDKs

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* docs(pagination): describe a uniform list contract

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(pagination): use stable provider cursors

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* docs(pagination): clarify mutation semantics

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(cli): expose sandbox provider pagination

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(proto): refresh pagination schema inventory

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>

* fix(proto): refresh rebased schema inventory

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>
Signed-off-by: Kris Hicks <[email protected]>

---------

Signed-off-by: Gaizka Menendez Hernandez <[email protected]>
Signed-off-by: Kris Hicks <[email protected]>
* docs: add 0.1.0 upgrade guide outline

Signed-off-by: Drew Newberry <[email protected]>

* docs: add upgrade change provenance

Signed-off-by: Drew Newberry <[email protected]>

* docs: update 0.1.0 upgrade guidance

Signed-off-by: Drew Newberry <[email protected]>

* docs: move upgrade navigation below security

Signed-off-by: Drew Newberry <[email protected]>

* docs: remove release notes page

Signed-off-by: Drew Newberry <[email protected]>

* docs: announce OpenShell 0.1.0

Signed-off-by: Drew Newberry <[email protected]>

* docs: reorganize guides and require user-owned images

Signed-off-by: Drew Newberry <[email protected]>

* docs: reorganize navigation around core concepts

Signed-off-by: Drew Newberry <[email protected]>

* docs: simplify navigation and tutorial catalog

Signed-off-by: Drew Newberry <[email protected]>

* docs: refine 0.1.0 release highlights

Signed-off-by: Drew Newberry <[email protected]>

* docs: align navigation and 0.1.0 guidance

Signed-off-by: Drew Newberry <[email protected]>

---------

Signed-off-by: Drew Newberry <[email protected]>
…#3633)

* fix(security): pin supplied executable identity chains

Signed-off-by: Jim Meyer <[email protected]>

* docs(security): document executable identity chain pinning

Signed-off-by: Jim Meyer <[email protected]>

* fix(binary-identity): compile Linux ancestry hashing

Signed-off-by: Jim Meyer <[email protected]>

* test(binary-identity): avoid cross-label ancestry fixture

Signed-off-by: Jim Meyer <[email protected]>

* test(e2e): choose distinct denied TCP port

Fix flaky test due to sequential port assignment on MacOS

Signed-off-by: Jim Meyer <[email protected]>

* fix(identity): bound executable evidence cache

Reject identity chains atomically when the supervisor cache reaches its hard limit, and preserve existing pins without eviction. Classify malformed or conflicting evidence separately from policy denials at the staged TCP boundary.

Signed-off-by: Jim Meyer <[email protected]>

---------

Signed-off-by: Jim Meyer <[email protected]>
* fix(driver-kubernetes-secrets)!: store provider credentials in one namespace

The Kubernetes Secrets credential driver now stores every credential in its
configured namespace in all workspace modes and rejects handles that reference
any other namespace before contacting the Kubernetes API. The gateway reaches
credential Secrets through the Role in that namespace; this allows removing the
Secret rules from the ClusterRole.

- Remove the workspace_mode, gateway_id, and allow_reference_namespace driver
  settings and stop rendering them from Helm. Configurations that set them fail
  at startup. Existing credential state is not migrated.
- Add server.credentialDrivers.kubernetesSecrets.createNamespace to provision a
  dedicated credential namespace. The namespace is kept on uninstall, adopted
  by a reinstall of the same release, and left untouched when something else owns
  it.
- Update the gateway config reference, Kubernetes setup docs, 0.1.0
  upgrade guide, compute-runtime architecture, and cluster debugging skill.

Signed-off-by: Kris Hicks <[email protected]>

* fix(helm): reduce gateway Secret permissions

Remove the gateway's Secret list permission in every workspace mode and
grant source Secret reads through a Role in the sandbox namespace.
Bootstrap Secret cleanup deletes Secrets by exact name instead of listing
them.

- Grant get on the copied client TLS and image-pull Secrets through a Role in
  the sandbox namespace. The ClusterRole keeps get and patch on those names
  for the ownership check and server-side apply into workspace namespaces.
- Delete sandbox and supervisor bootstrap Secrets by exact name, derived from
  the runtime generation recorded on the Sandbox and, on restart, the target
  generation, tolerating 404. The generation annotation is cleared only after
  cleanup succeeds, and each bootstrap Secret has a Pod owner reference, so
  garbage collection removes any generation the driver does not name.
- Drop Secret list from the ClusterRole and the shared-mode sandbox Role.
- Extend the managed e2e RBAC checks to Secret list.
- Update the Kubernetes setup and sandbox runtime docs, compute-runtime
  architecture, and cluster debugging skill.

Signed-off-by: Kris Hicks <[email protected]>

* fix(driver-kubernetes): stage workspace Secrets per runtime generation

Every Secret the Kubernetes driver writes into a workspace namespace is
now scoped to one sandbox runtime generation, immutable, and created
with create only, so the gateway never reads, patches, or adopts an
existing Secret there. This removes the gateway's cluster-wide get and
patch on the copied client TLS and image-pull Secret names.

- In managed mode, create an immutable copy of each configured
  image-pull Secret per generation, named os-pull-<id>-<generation>-<n>
  and owned by the generation's workload and supervisor Pods. Pods and
  the restarted Sandbox template reference those names, and generation
  cleanup deletes them by name. A Secret already holding a generation
  name fails the create.
- Outside shared mode, stage the gateway client TLS material into the
  supervisor bootstrap Secret instead of copying the client TLS Secret
  into the workspace namespace.
- Remove the fixed-name TLS and image-pull copies, the target ownership
  read, and the ClusterRole get and patch rule on the copied names.
  Source reads stay in the sandbox-namespace Role.
- Update the managed e2e to expect generation image-pull Secrets and
  client TLS material in the supervisor bootstrap Secret, and to check
  that the gateway cannot read the copied names in workspace namespaces.
- Update the gateway config and compute driver references, Kubernetes
  setup and sandbox runtime docs, compute-runtime architecture, driver
  README, and cluster debugging skill.

Signed-off-by: Kris Hicks <[email protected]>

* fix(helm)!: grant operator-mode Secret permissions through the workspace chart

The operator-mode gateway ClusterRole grants no Secret permissions.
The openshell-workspace chart Role, installed in each operator-managed
namespace, grants the gateway create and delete on Secrets for sandbox
runtime generations. Operator-managed namespaces require the workspace
chart.

- Fail the chart tests on any ClusterRole rule that includes Secrets in
  operator and shared modes.
- Install the workspace chart when the operator e2e provisions a
  namespace, and assert that the gateway has no Secret permissions in a
  namespace without it.
- Update the Kubernetes setup docs, 0.1.0 upgrade guide, compute-runtime
  architecture, and cluster debugging skill.

Signed-off-by: Kris Hicks <[email protected]>

---------

Signed-off-by: Kris Hicks <[email protected]>
Signed-off-by: Bobbins228 <[email protected]>
Signed-off-by: Kris Hicks <[email protected]>
Signed-off-by: Bobbins228 <[email protected]>
Signed-off-by: Kris Hicks <[email protected]>
@krishicks
krishicks force-pushed the feat/3315-independent-test-images/Bobbins228 branch from 8624632 to d6a9792 Compare September 23, 2026 21:52
@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown

This pull request has had no activity for 14 days and is now marked stale. It may be closed in 7 days if there is no further activity.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(testing): support independent gateway and supervisor image overrides