Skip to content

feat(network): support additional destination CAs - #3292

Open
jhjaggars wants to merge 15 commits into
NVIDIA:mainfrom
jhjaggars:feat/network-supervisor-additional-ca
Open

jhjaggars wants to merge 15 commits into
NVIDIA:mainfrom
jhjaggars:feat/network-supervisor-additional-ca

Conversation

@jhjaggars

@jhjaggars jhjaggars commented Sep 11, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Add a global network-supervisor configuration for additional destination CA certificates so sandbox egress can trust private PKI without replacing default roots or changing gateway control-plane trust.

This series adopts the mechanism merged to main in #3996 (from #3781) and extends it to every first-party compute driver: one operator pre-assembled PEM bundle, the --additional-ca-bundle supervisor flag, and the /etc/openshell/tls/additional/ca-bundle.pem staging path.

Related Issue

Fixes #3295

Changes

  • Add [openshell.supervisor.network].additional_ca_bundle (single pre-assembled PEM file) with strict, bounded startup validation and fail-closed capability-based driver handling.
  • Keep effective-config preflight side-effect-free; stage gateway-owned trust material only after the selected driver passes compatibility checks.
  • Extend the shared network supervisor with additive rustls and child-process trust while preserving user TLS variables in direct mode and keeping proxy CA and gateway mTLS trust separate.
  • Stage the normalized bundle through read-only Docker/Podman mounts, Kubernetes immutable content-addressed ConfigMaps, and VM overlays, all at the upstream mount path.
  • Record and validate the expected trust generation at the gateway/driver boundary so mutable or stale runtime material fails closed.
  • Reconcile stopped sandboxes whose recorded trust generation differs from the restarted gateway snapshot while retaining sandbox identity and supported durable workspace contents.
  • Restrict Kubernetes ConfigMap RBAC to the operations required for immutable generation creation and validation; do not grant list, watch, patch, update, or delete for this feature.
  • Enforce one deployable, bounded trust-bundle limit across gateway, Kubernetes, VM, and supervisor consumers.
  • Reject additional_ca_bundle in operator driver JSON config so the global gateway setting stays the single source; standalone drivers self-source the same bundle from --sandbox-additional-ca-bundle with identical validation.
  • Add shared cross-driver additional-CA coverage for private/public trust, hostname enforcement, invalid staged material, callback isolation, and removal/restart behavior.
  • Update gateway reference, architecture, RFC, Helm, compute-driver, and cluster-debugging documentation.

Why lifecycle reconciliation is included

Additional CA sources are startup-only gateway configuration. Updating the source file or Helm source ConfigMap does not hot-reload running supervisors. To roll certificates, an operator updates the source, restarts or redeploys the gateway, and explicitly stop/starts each affected sandbox.

Each runtime records the immutable trust generation it was created with. Without reconciliation, ordinary stop/start cannot reliably move an existing sandbox to the new generation: Docker and Podman retain old container metadata, Kubernetes retains the old content-addressed ConfigMap mount, and VM retains the old writable overlay. Replacing only the staged file would conflict with the recorded digest and correctly fail closed.

The only existing manual alternative is to delete and recreate each affected sandbox, or create a replacement sandbox and move work to it. Sandbox deletion normally removes its driver-owned mutable filesystem storage—Docker/Podman workspace volumes, the Kubernetes sandbox PVC, or the VM writable overlay. Operators would therefore need to back up and restore required /sandbox contents, use external persistent storage, and re-establish any sandbox-specific state. The reconciliation implemented here avoids that migration by rebuilding stale runtime resources during stop/start while preserving the sandbox record and supported durable workspace data.

This lifecycle work can be split into a follow-up only if destructive replacement plus explicit data migration is an acceptable interim certificate-rotation procedure.

Testing

  • mise run pre-commit passes
  • Workspace formatting and Clippy with warnings denied pass
  • Targeted Rust tests pass across core, sandbox, supervisor-network, Docker, Kubernetes, Podman, VM, server, and gateway packages
  • Helm tests pass: gateway and workspace chart suites including Rust loader validation of the rendered gateway TOML
  • Unit and process-level tests added/updated
  • Cross-driver E2E coverage added and feature combinations compile
  • Rootless Podman manually verified against a private-PKI GitLab endpoint: TLS failed without the additional CA and succeeded with it while default public trust remained enabled
  • Full mise run test task run as a single validation command
  • Docker, Kubernetes combined/sidecar, and VM E2E runtime lanes (configured for CI; not run locally)

Checklist

  • Follows Conventional Commits
  • Commits are signed off (DCO)
  • Architecture and user-facing configuration documentation updated

@copy-pr-bot

copy-pr-bot Bot commented Sep 11, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@jhjaggars

Copy link
Copy Markdown
Contributor Author
 [openshell.supervisor.network]
   additional_ca_cert_paths = [
     "/tmp/openshell-e2e-podman.McovxM/additional-ca/ca.crt",
   ]

@politerealism politerealism left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Summary

The design is sound and directly addresses both #3781 (Podman TLS-trust regression) and #3295 (general additional-destination-CA feature): trust material is scoped to the supervisor container only, root-store construction is fixed for both the bundled-ca-roots and native-store variants, validation is fail-closed end-to-end, and the gateway-mTLS trust boundary is provably untouched (new destination_ca_cannot_authenticate_gateway regression test). However, the branch as submitted (eb2db3f65) doesn't compile its own test suite, so CI can't pass yet.

Blocking

cargo test -p openshell-driver-podman -p openshell-driver-docker -p openshell-server (and mise run pre-commit's rust:lint step) fail to compile, all four attributable to this PR's own commits:

  • crates/openshell-driver-podman/src/container.rs:1833 — new test additional_destination_trust_is_delivered_only_to_supervisor_with_digest is missing the pre-existing required field rootless on IsolationSpecInput.
  • crates/openshell-driver-podman/src/container.rs:2020 — existing rootful_specs = build_isolation_specs(...) wasn't updated with the new required field network_trust.
  • crates/openshell-driver-docker/src/tests.rs:135 — sets daemon_version: "28.0.0".to_string(), but DockerDriverRuntimeConfig has no such field.
  • crates/openshell-server/src/compute/mod.rs:13576 — new test start_sandbox_request_uses_optional_wire_field_six_for_durable_snapshot is missing the pre-existing required field expected_runtime_identity on StartSandboxRequest.

openshell-driver-kubernetes, openshell-driver-vm, and openshell-gateway build and test cleanly in isolation, so this is localized to four struct literals, not systemic.

Non-blocking notes

  • deploy/helm/openshell/templates/clusterrole.yaml:82-97 / role.yaml:65-70: RBAC grants unscoped get on ConfigMaps (in addition to create), since resourceNames can't restrict dynamically digest-named generations. That lets the gateway service account read any ConfigMap in the bound scope, not just its own CA generations. Reasoning is documented in-line and in the debug-openshell-cluster skill update, but worth a second look given it's a real (if bounded) privilege widening.
  • crates/openshell-supervisor-network/src/run.rs:212-219: the additional-CA load path fails closed correctly but doesn't emit a ConfigStateChangeBuilder OCSF event the way the adjacent TLS-termination code does at run.rs:401-429. Not required by AGENTS.md's OCSF scope (that's openshell-sandbox-specific), but would be a nice consistency improvement for operator visibility.

Testing

cargo fmt --all -- --check passes. cargo test -p openshell-supervisor-network -p openshell-core -p openshell-supervisor passes (1344/1345, one pre-existing unrelated flake). Docker/Kubernetes/VM e2e lanes haven't been run (not available in my review environment) and remain genuinely unverified — recommend running those before merge, in addition to fixing the compile errors above.

@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from eb2db3f to 60826fb Compare September 29, 2026 13:21
politerealism added a commit to politerealism/OpenShell that referenced this pull request Oct 13, 2026
Since v0.1.2 the Podman supervisor runs as its own container, separate
from the workload image, so it can no longer inherit a private CA
baked into the workload's system trust store. Policy-allowed,
inspected HTTPS requests to destinations signed by that CA fail
upstream TLS establishment, and the only workaround is rebuilding the
supervisor image with the CA baked in.

Add a Podman-only additional_ca_bundle setting, independent of the
existing proxy_ca_bundle (which requires https_proxy), that bind-mounts
an operator PEM into the supervisor container and folds it into the
upstream trust store alongside the system CA bundle. Validated on the
gateway host at sandbox-create time, matching the existing corporate
proxy CA bundle's validation, so a misconfigured path or
certificate-free bundle fails closed immediately rather than producing
a failed sandbox once the supervisor container starts.

Scoped to Podman only, reusing the existing additive-bundle mechanism
without new gateway.toml schema, proto fields, or cross-driver
plumbing -- a narrower alternative to the in-flight cross-driver
implementation in NVIDIA#3292, which remains the intended long-term
direction.

Fixes NVIDIA#3781.

Signed-off-by: politerealism <burdcat17@gmail.com>
@github-actions

Copy link
Copy Markdown

This pull request has had no activity for 14 days and is now marked stale.

@github-actions github-actions Bot added the state:stale Inactive item at risk of automatic closure. label Oct 14, 2026
@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from 5672597 to 309301d Compare October 15, 2026 20:51
opensource-fork-sync Bot pushed a commit to cla7aye15I4nd/opensource-NVIDIA__OpenShell that referenced this pull request Oct 15, 2026
…ss (NVIDIA#3996)

* fix(podman): trust an operator-supplied additional CA for direct egress

Since v0.1.2 the Podman supervisor runs as its own container, separate
from the workload image, so it can no longer inherit a private CA
baked into the workload's system trust store. Policy-allowed,
inspected HTTPS requests to destinations signed by that CA fail
upstream TLS establishment, and the only workaround is rebuilding the
supervisor image with the CA baked in.

Add a Podman-only additional_ca_bundle setting, independent of the
existing proxy_ca_bundle (which requires https_proxy), that bind-mounts
an operator PEM into the supervisor container and folds it into the
upstream trust store alongside the system CA bundle. Validated on the
gateway host at sandbox-create time, matching the existing corporate
proxy CA bundle's validation, so a misconfigured path or
certificate-free bundle fails closed immediately rather than producing
a failed sandbox once the supervisor container starts.

Scoped to Podman only, reusing the existing additive-bundle mechanism
without new gateway.toml schema, proto fields, or cross-driver
plumbing -- a narrower alternative to the in-flight cross-driver
implementation in NVIDIA#3292, which remains the intended long-term
direction.

Fixes NVIDIA#3781.

Signed-off-by: politerealism <burdcat17@gmail.com>

* fix(podman): keep additional CA mount on the supervisor

build_isolation_specs() keeps only trusted_mount() destinations on the
supervisor, and the additional CA path was not in that list. The bind
mount stayed on the workload while the supervisor received
--additional-ca-bundle for a file it did not have, so startup failed.

Add the path to trusted_mount() and cover the final supervisor and
workload specs with a test. Correct the docs and a code comment to say
the bundle is validated when the driver starts, and add Podman
troubleshooting guidance to the debug-openshell-cluster skill.

Signed-off-by: politerealism <burdcat17@gmail.com>

---------

Signed-off-by: politerealism <burdcat17@gmail.com>
@github-actions github-actions Bot removed the state:stale Inactive item at risk of automatic closure. label Oct 16, 2026
@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from 309301d to aaf328b Compare October 16, 2026 18:36
@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from f3ee4cb to 5b8e8e4 Compare October 20, 2026 22:07
@TaylorMutch

Copy link
Copy Markdown
Collaborator

gator-agent

Blocked

Issue #3295 is accepted and remains gator:validated. DCO and PR Issue Acceptance pass on the current head, and test:e2e is already applied. The test mirror still points to an older commit; Branch Checks, Helm Lint, and E2E have pending gate statuses without current-head workflow execution. Trivy Changes requires workflow approval. Independent Gator code review has not started because test dispatch remains blocked.

Thanks @TaylorMutch for requesting test execution. I checked your latest command and the mirror; both target an older head. Thanks @jhjaggars for explaining the supervisor-only refresh and restored recovery behavior in response to @mrunalp's upgrade concerns. I checked your response and the review history and verified @mrunalp's maintainer authority; whether the implementation resolves those concerns still needs independent code review.

Action required: a maintainer must post /ok to test 5b8e8e449e7c085771b318d0b480c691305125c5 as a separate command-only comment, approve required workflow execution including Trivy Changes, and follow the E2E Label Help instructions to re-apply test:e2e or rerun Branch E2E Checks after the mirror updates. Confirm Branch Checks, Helm Lint, Trivy Changes, and E2E actually execute for this head. Acceptance does not need a rerun. The operator has reserved test dispatch for a maintainer.

Gator metadata
  • Head SHA: 5b8e8e449e7c085771b318d0b480c691305125c5
  • Base SHA: 915a5d1553bdd48c15a85f7fa3266f0c695cbba1
  • Merge base SHA: 915a5d1553bdd48c15a85f7fa3266f0c695cbba1
  • Patch ID: 105251cde11666bb80d7d83ef52ee93584f6a8bb
  • Gator payload: 12
  • Code review: not started; process gate blocked
  • Next state: gator:blocked
  • Blocked reason: test_dispatch_required

@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from 5b8e8e4 to 14c2c1c Compare October 20, 2026 22:37
@TaylorMutch

Copy link
Copy Markdown
Collaborator

gator-agent

Blocked

Issue #3295 is accepted and remains gator:validated. DCO and PR Issue Acceptance pass on the current head, and test:e2e is already applied. Branch Checks, Helm Lint, and E2E are waiting for the test mirror, which still points to an older commit. Trivy Changes requires workflow approval. Independent Gator code review has not started because test dispatch remains blocked.

Thanks @TaylorMutch for requesting test execution. I checked your latest command and the mirror; both target an older head. Thanks @jhjaggars for explaining the supervisor-only refresh and restored recovery behavior in response to @mrunalp's upgrade concerns. I checked your response and the review history and verified @mrunalp's maintainer authority; whether the implementation resolves those concerns still needs independent code review.

Action required: a maintainer must post /ok to test 14c2c1cb02c15ab1d2903261403f39451089dc6e as a separate command-only comment, approve required workflow execution including Trivy Changes, and follow the E2E Label Help instructions to re-apply test:e2e or rerun Branch E2E Checks after the mirror updates. Confirm Branch Checks, Helm Lint, Trivy Changes, and E2E actually execute for this head. Acceptance does not need a rerun. The operator has reserved test dispatch for a maintainer.

Gator metadata
  • Head SHA: 14c2c1cb02c15ab1d2903261403f39451089dc6e
  • Base SHA: f7e37af1b794022420b18b67b052101c3069dd37
  • Merge base SHA: f7e37af1b794022420b18b67b052101c3069dd37
  • Patch ID: 105251cde11666bb80d7d83ef52ee93584f6a8bb
  • Gator payload: 12
  • Code review: not started; process gate blocked
  • Next state: gator:blocked
  • Blocked reason: test_dispatch_required

@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from 14c2c1c to 6369ae9 Compare October 20, 2026 23:07
@TaylorMutch

Copy link
Copy Markdown
Collaborator

gator-agent

Blocked

Issue #3295 is accepted and remains gator:validated. DCO and PR Issue Acceptance pass on the current head, and test:e2e is already applied. Branch Checks, Helm Lint, and E2E are waiting for the test mirror, which still points to an older commit. Trivy Changes requires workflow approval. Independent Gator code review has not started because test dispatch remains blocked.

Thanks @TaylorMutch for requesting test execution. I checked your latest command and the mirror; both target an older head. Thanks @jhjaggars for explaining the supervisor-only refresh and restored recovery behavior in response to @mrunalp's upgrade concerns. I checked your response and the review history and verified @mrunalp's maintainer authority; whether the implementation resolves those concerns still needs independent code review.

Action required: a maintainer must post /ok to test 6369ae9c6ff55476df39c1834c0bfb42a9354b27 as a separate command-only comment, approve required workflow execution including Trivy Changes, and follow the E2E Label Help instructions to re-apply test:e2e or rerun Branch E2E Checks after the mirror updates. Confirm Branch Checks, Helm Lint, Trivy Changes, and E2E actually execute for this head. Acceptance does not need a rerun. The operator has reserved test dispatch for a maintainer.

Gator metadata
  • Head SHA: 6369ae9c6ff55476df39c1834c0bfb42a9354b27
  • Base SHA: 465324a8311a2566e6e5e562b9e7b29e47d4b6a4
  • Merge base SHA: 465324a8311a2566e6e5e562b9e7b29e47d4b6a4
  • Patch ID: 105251cde11666bb80d7d83ef52ee93584f6a8bb
  • Gator payload: 12
  • Code review: not started; process gate blocked
  • Next state: gator:blocked
  • Blocked reason: test_dispatch_required

@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from 6369ae9 to 77187f3 Compare October 20, 2026 23:38
@TaylorMutch

Copy link
Copy Markdown
Collaborator

gator-agent

Blocked

Issue #3295 is accepted and remains gator:validated. DCO and PR Issue Acceptance pass on the current head, and test:e2e is already applied. Branch Checks, Helm Lint, and E2E are waiting for the test mirror, which still points to an older commit. Trivy Changes requires workflow approval. Independent Gator code review has not started because test dispatch remains blocked.

Thanks @TaylorMutch for requesting test execution. I checked your latest command and the mirror; both target an older head. Thanks @jhjaggars for explaining the supervisor-only refresh and restored recovery behavior in response to @mrunalp's upgrade concerns. I checked your response and the review history and verified @mrunalp's maintainer authority; whether the implementation resolves those concerns still needs independent code review.

Action required: a maintainer must post /ok to test 77187f3fa60eeecf42ce3ce852ccce51062957f1 as a separate command-only comment, approve required workflow execution including Trivy Changes, and follow the E2E Label Help instructions to re-apply test:e2e or rerun Branch E2E Checks after the mirror updates. Confirm Branch Checks, Helm Lint, Trivy Changes, and E2E actually execute for this head. Acceptance does not need a rerun. The operator has reserved test dispatch for a maintainer.

Gator metadata
  • Head SHA: 77187f3fa60eeecf42ce3ce852ccce51062957f1
  • Base SHA: a2b8022e073f44afebf71617d1edc1cd2aa23358
  • Merge base SHA: a2b8022e073f44afebf71617d1edc1cd2aa23358
  • Patch ID: 105251cde11666bb80d7d83ef52ee93584f6a8bb
  • Gator payload: 12
  • Code review: not started; process gate blocked
  • Next state: gator:blocked
  • Blocked reason: test_dispatch_required

@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from 77187f3 to c87db10 Compare October 21, 2026 00:07
@TaylorMutch

Copy link
Copy Markdown
Collaborator

gator-agent

Blocked

Issue #3295 is accepted and remains gator:validated. DCO and PR Issue Acceptance pass on the current head, and test:e2e is already applied. Branch Checks, Helm Lint, and E2E are waiting for the test mirror, which still points to an older commit. Trivy Changes requires workflow approval. Independent Gator code review has not started because test dispatch remains blocked.

Thanks @TaylorMutch for requesting test execution. I checked your latest command and the mirror; both target an older head. Thanks @jhjaggars for explaining the supervisor-only refresh and restored recovery behavior in response to @mrunalp's upgrade concerns. I checked your response and review history and verified @mrunalp's maintainer authority; whether the implementation resolves those concerns still needs independent code review.

Action required: a maintainer must post /ok to test c87db10b0530c1a9f60965979f403ef1bf472d77 as a separate command-only comment, approve required workflow execution including Trivy Changes, and follow the E2E Label Help instructions to re-apply test:e2e or rerun Branch E2E Checks after the mirror updates. Confirm Branch Checks, Helm Lint, Trivy Changes, and E2E actually execute for this head. Acceptance does not need a rerun. The operator has reserved test dispatch for a maintainer.

Gator metadata
  • Head SHA: c87db10b0530c1a9f60965979f403ef1bf472d77
  • Base SHA: 2071796a24ab51ce9b7617ef62e131b5f207a314
  • Merge base SHA: 2071796a24ab51ce9b7617ef62e131b5f207a314
  • Gator payload: 12
  • Code review: not started; process gate blocked
  • Next state: gator:blocked
  • Blocked reason: test_dispatch_required

@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch 3 times, most recently from 5578a05 to 093f38f Compare October 21, 2026 02:07
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Resolve rebase fallout against current upstream main after the series was
rebased 214 commits forward:

- follow upstream NVIDIA#3110: supervisor→gateway TLS is CA-only, so
  configure_gateway_tls and its isolation tests drop the client identity
- follow upstream tls_secret_names reduction to [String; 1] in the Podman
  driver while keeping the network trust bundle delivery
- port [openshell.supervisor.network] rendering into the
  openshell.gatewayConfigToml serializer in _toml.tpl
- adapt tests to upstream struct/function changes (DriverStartupContext,
  SandboxRunConfig, IsolationSpecInput, supervisor_pod, VM bootstrap image)
- drop conformance-artifact-prefix plumbing removed upstream

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Unify the additional destination CA series on the mechanism merged to
main in NVIDIA#3996: one operator pre-assembled PEM bundle, the
--additional-ca-bundle supervisor flag, and the
/etc/openshell/tls/additional/ca-bundle.pem staging path.

- Replace the gateway-level additional_ca_cert_paths list with a single
  additional_ca_bundle file validated and staged at gateway startup.
- Restore the upstream supervisor argument path and fold-into-roots
  behavior; drop the --network-additional-ca-bundle and
  --network-additional-ca-digest contracts.
- Keep gateway normalization bounds, content-addressed staging,
  digest-based driver reconciliation, and stop/start rotation; the
  freshness check now runs at the gateway/driver boundary instead of
  the supervisor boundary.
- Reject additional_ca_bundle in operator driver JSON config; standalone
  drivers self-source the bundle from --sandbox-additional-ca-bundle
  with the same validation.
- Extend the Kubernetes ConfigMap name digest segment to keep the full
  63-byte budget after the prefix rename.
- Box the persisted-sandbox reconciliation futures so callers stay
  under the clippy::large_futures threshold.

Updates Docker, Podman, Kubernetes, and VM delivery, Helm chart and
tests, e2e wiring, gateway configuration docs, and the cluster
debugging skill to the single mechanism.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
… lockfile

The network trust startup tests asserted on raw substrings of gateway
diagnostics, but the CLI renderer wraps output at a fixed width with
continuation markers and hard-breaks long paths. Compare assertions on
whitespace- and continuation-squashed text so they hold regardless of
wrap position.

Format the e2e workspace (separate cargo workspace, not covered by the
root cargo fmt run) and refresh examples/isolation-backend-v8/Cargo.lock
for the libc dependency added to the network trust crate.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
The additional CA e2e never ran in CI before the first maintainer test
dispatch, and its local container inspection was broken in two ways: it
located the supervisor container through e2e network membership (the
supervisor is host-networked or runtime-bridged, so the filter matched
the CI job container instead), and it required the gateway mTLS CA as a
bind mount (Podman delivers it as a container secret when user
namespaces remap UIDs). Select the supervisor by managed labels and
accept the secret delivery form.

The lifecycle leg then exposed a driver bug: stopped-pair trust
replacement re-created the per-sandbox TLS CA secret, colliding with
the secret still owned by the renamed stopped pair. Mirror the token
and resolver secret handling: require and reuse the existing secret
during replacement instead of creating it.

Validated end-to-end with the Podman additional CA e2e lane.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
…ilures

Recovery no longer marks sandboxes Error/InvalidPersistedSandbox when
driver_start_request fails during the startup or lifecycle sweeps.
Gateway configuration problems (for example a missing launch signer)
must not permanently fail unrelated sandbox records; the sweep logs a
warning and skips them, matching the behavior before the additional CA
work. Sandbox-record failures surface through the normal start path.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Replace the stopped-pair trust reconciliation with supervisor-only
recreation. The destination-trust generation label moves from the
workload to the supervisor container, and start_sandbox recreates only
the supervisor when its generation is missing or stale. The workload
container, its volumes, its secrets, and its workspace data are never
replaced: the additional CA bundle is mounted only into the supervisor.

Running sandboxes are never gated on trust labels, and recovery without
fresh launch credentials keeps the existing supervisor. The intentional
-removal fence machinery in the watcher existed only for workload
replacement and is removed with it.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
…nges

Delete the stopped-workload trust reconciliation path and all of its
machinery: the trust-generation label on workload containers, the
generation match check in the start fence, the stopped-sandbox
replacement, the bounded workspace archive copy with its 512 MiB cap
and regular-file-only validation, and the boundary-state rollback
helpers.

No replacement machinery is needed: the trusted supervisor container
is already re-created from the gateway's current configuration on
every start via ensure_control_process_for_container, so stop/start
picks up the current additional CA bundle while the workload
container, its volumes, and its workspace data are never replaced.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
…ifecycle

The stop/start lifecycle description already matches the
supervisor-only refresh model; remove the two remaining references to
restart reconciliation of workload containers.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Route the gateway TLS isolation test PKI, the destination CA source
fixtures, and the gateway startup trust tests through
openshell_crypto::pki now that rcgen access is centralized there:
generate_keypair/self_signed/signed_by replace the direct rcgen calls
and CertifiedKey field access follows the wrapper's shape.

Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
@jhjaggars
jhjaggars force-pushed the feat/network-supervisor-additional-ca branch from 093f38f to d8df06b Compare October 21, 2026 03:38
@TaylorMutch

Copy link
Copy Markdown
Collaborator

gator-agent

Blocked

Issue #3295 remains accepted and gator:validated. DCO and PR Issue Acceptance pass on the current head. The test mirror is still on an older commit; Branch Checks, Helm Lint, and E2E have pending gate statuses without current-head workflow execution. Trivy Changes requires workflow approval. Independent Gator code review has not started because test dispatch remains blocked.

Action required: a maintainer must post /ok to test d8df06b7e2853fad2b7c4a152d48994c0ee923ff as a separate command-only comment, approve required workflow execution including Trivy Changes, and follow E2E Label Help to re-apply test:e2e or rerun Branch E2E Checks after the mirror updates. Confirm the required workflows actually execute for this head. The operator has reserved test dispatch for a maintainer.

Gator metadata
  • Head SHA: d8df06b7e2853fad2b7c4a152d48994c0ee923ff
  • Base SHA: d22394370d2d8b27859ffa772cac3aaaa79feb2c
  • Gator payload: 12
  • Code review: not started; process gate blocked
  • Next state: gator:blocked
  • Blocked reason: test_dispatch_required

This branch has not been deployed

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

Labels

gator:blocked Gator is blocked by process or repository gates test:e2e Requires end-to-end coverage

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: trust additional destination CAs for sandbox egress TLS

6 participants