refactor(runtime): retire Community image dependencies - #3386
Conversation
fd27bc3 to
b4c9762
Compare
drew
left a comment
There was a problem hiding this comment.
gator-agent
PR Review Status
This rebased change is project-valid and implements the maintainer-authored Alpine-default issue, but the initial review found five concrete blockers across default sandbox execution, Podman identity resolution, published guidance, multi-architecture builds, and build-input integrity.
Action required: @akram, please address the five findings below and push an updated head for a focused follow-up review.
Blocking findings:
GATOR-b4c97627-01: Stock Alpine's default shell is outside the fallback Landlock allowlist.GATOR-b4c97627-02: Podman rejects a USER-less image before the new fallback identity is applied.GATOR-b4c97627-03: Published docs and bundled skills still describe the retired community-image contract.GATOR-b4c97627-04: The new multistage builders always produce x86-64 binaries, including for ARM64 images.GATOR-b4c97627-05: The new builders execute an unpinned, unverified network installer as root.
Carried findings:
- None
Gator metadata
- Validation: Project-valid because this PR implements maintainer-authored issue #3116 and its Alpine-default acceptance criteria.
- Docs: Missing for the direct CLI, default-image, policy, and deployment UX changes.
- Checks: DCO is green; required workflows are not yet dispatched for this head and review blockers remain.
- E2E:
test:e2eand Kubernetes-specific coverage will be required after review feedback is resolved; not dispatched yet. - Head SHA:
b4c9762725ee9773632dfa82a643156e62e5a3e9 - Base SHA:
4cd5e547802c53112c8d5326b8ef8ce4c987ba7e - Merge base SHA:
4cd5e547802c53112c8d5326b8ef8ce4c987ba7e - Patch ID:
ad4df3e0b3dd28a9376be3eab9c80ae3efce35a4 - Gator payload:
9 - Review mode:
initial - Previous reviewed SHA: none
- Review budget exhausted: no
- Maintainer decision required: no
- Next state:
gator:in-review
1055e48 to
b4c9762
Compare
b4c9762 to
dd61749
Compare
|
Label |
|
/ok-to-test dd61749 |
779d434 to
863ebd7
Compare
|
/ok-to-test 863ebd7 |
|
The failing VM and Kubernetes lanes appear to have two separate causes:
We should update the kind setup to pull/save/load The managed/operator jobs surface only Failing jobs: |
default_sandbox_image() now returns docker.io/library/alpine:3.22, a generic version-qualified official image, so a fresh install no longer depends on the community sandbox image catalog. All compute drivers (docker, podman, kubernetes, vm) inherit this fallback. Part of NVIDIA#3116. Signed-off-by: Akram Signed-off-by: Akram <akram.benaissi@gmail.com>
…ox image Update the shared gateway default_image, Helm chart values, the standalone Kubernetes manifest, and the dev gateway task scripts to use docker.io/library/alpine:3.22 instead of the community base image, consistent with default_sandbox_image(). GPU e2e image-build base is left unchanged (CUDA needs a glibc base). Part of NVIDIA#3116. Signed-off-by: Akram Signed-off-by: Akram <akram.benaissi@gmail.com>
With the default sandbox image now Alpine, images that declare no OCI USER must start instead of being rejected. When the image declares no USER and the policy requests none, the Podman and Docker drivers now supply a numeric non-root identity (DEFAULT_SANDBOX_UID/GID = 1000) instead of rejecting, matching the numeric-identity behavior of the Kubernetes and VM drivers. The supervisor's resolved-identity path runs the sandbox as a synthesized non-root account without the account existing in the image. Images that declare a USER keep the OCI resolution path unchanged. Part of NVIDIA#3116. Signed-off-by: Akram <akram.benaissi@gmail.com> Signed-off-by: Evan Lezar <elezar@nvidia.com>
Signed-off-by: Evan Lezar <elezar@nvidia.com>
The restrictive default policy granted read-only access to /app, a directory that only existed in the community base image. A generic Alpine default has no /app, so remove it. Landlock best-effort already ignores absent paths; this just stops advertising a community-specific layout in the default. Part of NVIDIA#3116. Signed-off-by: Akram Signed-off-by: Akram <akram.benaissi@gmail.com>
Signed-off-by: Evan Lezar <elezar@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
|
/ok to test 06ea61e |
drew
left a comment
There was a problem hiding this comment.
gator-agent
PR Review Status
Thanks @drew. I reviewed the Community-retirement and provider-readiness fixture delta on the latest head in critical-only mode. It preserves the previously resolved findings and introduces no new Critical security, data-loss, or correctness defects.
Blocking findings:
- No blocking findings remain.
Carried findings:
- None; all seven prior findings remain resolved.
Gator metadata
- Validation: Project-valid because this PR implements the maintainer-authored Community-image retirement work in #3116.
- Docs: Published docs, examples, skills, and migration guidance are updated for explicit OCI references and the NVIDIA Ubuntu Noble default.
- Checks: The current-head mirror is synchronized; Branch Checks, Helm Lint, Windows, and required E2E workflows are dispatched and running.
- E2E: Required
test:e2e,test:e2e-kubernetes, andtest:e2e-centoscoverage is dispatched on the current head. - Head SHA:
06ea61e8a2316716d3fe8ca6c2acca7e3e3d9878 - Base SHA:
96c08f111b7ccf3d048a876c23e724014babb585 - Merge base SHA:
96c08f111b7ccf3d048a876c23e724014babb585 - Patch ID:
73b295b581bc122bbc2a63e2aa077be399329893 - Gator payload:
10 - Review mode:
critical_only - Previous reviewed SHA:
8ad3d42ab7d931c00009a3bc5137da65987af21b - Review budget exhausted: yes
- Maintainer decision required: no; all prior findings are resolved, no qualifying scope-growth decision is outstanding, and no new Critical was found.
- Next state:
gator:watch-pipeline
|
@drew The |
| "read_only": ["/usr", "/lib", "/proc", "/dev/urandom", "/etc", "/opt", "/var/log"], | ||
| "read_write": ["/sandbox", "/tmp", "/dev/null"]}, | ||
| "landlock": {"compatibility": "best_effort"}, | ||
| "process": {"run_as_user": "sandbox", "run_as_group": "sandbox"}, |
There was a problem hiding this comment.
The user sandbox does not exist in the new base image
There was a problem hiding this comment.
I have added a commit that adds a test image. We also need uv and python for the tests. I don't think pulling these back into the default sandbox image makes sense.
Signed-off-by: Evan Lezar <elezar@nvidia.com>
|
/ok-to-test c1bb9fd |
drew
left a comment
There was a problem hiding this comment.
gator-agent
PR Review Status
Thanks @akram for identifying that the Docker and Python E2E policies still expected the retired sandbox user, and thanks @elezar for the focused fixture update. I reviewed that latest delta in critical-only mode: the dedicated Noble fixture is confined to Docker E2E paths, explicit --from and --template selections remain intact, all seven prior findings remain resolved, and no newly introduced Critical defect was found.
Blocking findings:
- No blocking findings remain.
Carried findings:
- None; all seven prior findings remain resolved.
Gator metadata
- Validation: Project-valid because this PR implements the maintainer-authored Community-image retirement work in #3116.
- Docs: The dedicated E2E workload fixture and its separation from the product default are documented.
- Checks: Helm Lint and GPU disposition are green; Branch Checks and required E2E are running on the current head.
- E2E: Required
test:e2e,test:e2e-kubernetes, andtest:e2e-centoscoverage is dispatched on the current head. - Head SHA:
c1bb9fdc0d9bedb30d2096880dfeabeb4b8f8a69 - Base SHA:
96c08f111b7ccf3d048a876c23e724014babb585 - Merge base SHA:
96c08f111b7ccf3d048a876c23e724014babb585 - Patch ID:
b56eab79a052c0715c8019f4e8ee8a97b06e6116 - Gator payload:
10 - Review mode:
critical_only - Previous reviewed SHA:
06ea61e8a2316716d3fe8ca6c2acca7e3e3d9878 - Review budget exhausted: yes
- Maintainer decision required: no; all prior findings are resolved, there is no qualifying scope growth, and no new Critical was found.
- Next state:
gator:watch-pipeline
|
I am merging this. The vm failure seems like a race that I will address in a follow-up. The same tests have passed in https://github.com/NVIDIA/OpenShell/actions/runs/35712151180/job/106698284871 using the same images. |
Monitoring CompleteMonitoring is complete because this PR has merged. Final status: All seven Gator findings were resolved, the critical-only review found no new blocker, and maintainer @elezar accepted the remaining VM failure as a follow-up race before merging. I removed the active Gator metadata
|
|
Tracking the VM restart failure in #3546, with reproduction instructions and investigation evidence. Both CI attempts failed in The passing and failing local runs used the same workload image. This confirms a gateway shutdown race under controlled timing; it does not establish the exact scheduling in CI or rule out image-dependent timing exposing the race. The issue includes the proposed bounded cleanup-drain direction. No production fix has been applied yet. |
|
@elezar Related to the failing jobs due to Docker Hub 429 Too Many Requests one possible solution could be to use the Alpine ERC mirror mentioned here |
Summary
Retire the OpenShell Community workload-image dependency by making NVIDIA Ubuntu Noble the product default and removing Community catalog shorthand. Close the runtime gaps exposed by the smaller base image: shell selection now happens inside the workload boundary, SFTP runs as a native Rust sandbox helper, and E2E tests use explicit workload fixtures when they require extra tools.
Related Issue
Part of #3116.
Changes
nvcr.io/nvidia/base/ubuntu:24.04.OPENSHELL_COMMUNITY_REGISTRY; non-path--fromvalues are now treated as explicit OCI image references.openshell-sandbox, where the workload filesystem is visible, while preserving direct exec without a shell.openshell-sandbox, removing the workload image'ssftp-serverdependency.scp, VS Code Remote-SSH bootstrap, and external clients. Native bulk-transfer RPCs remain a separate follow-up.openat2resolution, including traversal and symlink-escape protection.curlassumptions with explicit fixtures and a Bash/dev/tcpHTTP client./binallowance, and Podman diagnostics from this PR.Testing
mise run pre-commitcargo test -p openshell-core imagecargo test -p openshell-cli resolve_fromcargo test --manifest-path e2e/rust/Cargo.toml harness::sandbox::testscargo check --manifest-path e2e/rust/Cargo.toml --features e2e-docker --test provider_readinessmise run testwith the ambient system gateway configuration isolated for the affected CLI testsftp-serverdisabled and with Noble where it is absentThe manual run found and fixed root-level create, read-only open, and recursive-upload
realpathcompatibility bugs. After the fix, both native lanes pass the functional, confinement, cancellation, and concurrency matrix. In the same-image 1 GiB comparison, native median throughput was 184.84 MiB/s upload and 135.81 MiB/s download, versus 300.29 MiB/s and 166.23 MiB/s on the legacy server. Upload throughput remains above the manual plan's 20% investigation threshold.mise run cicompleted all change-related checks locally. Its Go gateway test lane reads the real/etc/openshell/gatewaysdirectory and failed because this development host contains a systemdefaultgateway; clean GitHub runners do not have that host state.Checklist