feat(onboard): preserve Jetson GPU device groups - #8910
Conversation
Carry the deferred Jetson GPU policy, bootstrap, lifecycle, and validation work in a stacked draft. The OpenShell execution boundary tracked by #7610 remains unresolved. Co-authored-by: San Dang <sdang@nvidia.com> Signed-off-by: Charan Jagwani <cjagwani@nvidia.com> Signed-off-by: San Dang <sdang@nvidia.com>
|
Auto-sync is disabled for draft pull requests in this repository. Workflows must be run manually. Contributors can view more details about this message here. |
|
Important Draft PR not reviewedDraft PRs are not automatically reviewed by default.
To automatically review draft PRs, update your CodeRabbit configuration: reviews:
auto_review:
drafts: trueComment |
|
🌿 Preview your docs: https://nvidia-preview-pr-8910.docs.buildwithfern.com/nemoclaw |
PR Review Advisor — Blocking findings reportedAdvisor assessment: Blockers require maintainer review E2E guidanceAdvisory only. A maintainer can dispatch the default E2E suite for the commit under review. Recommended E2E: Manual-only E2E: Blockers
|
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
# Conflicts: # src/lib/onboard/managed-bootstrap/docker.ts
prekshivyas
left a comment
There was a problem hiding this comment.
Reviewed exact draft head fff5a76.
The proposed implementation is appropriately fail-closed for its draft purpose: it derives supplementary groups only from existing non-symlink Jetson character devices, validates numeric group IDs, keeps the helper root-owned, limits the root action to group setup plus the OpenShell supervisor handoff, and adds focused policy/recreation/bootstrap tests. The documentation correctly avoids claiming CUDA success.
This cannot be approved or leave draft state. The repository product-scope gate is still unmet, #7610 remains open, and the only reproduced IGX Orin result is that non-root cuInit(0) fails even with the existing groups. The PR therefore has no evidence that these broader preserved groups establish the supported sandbox-user CUDA contract. GitHub also reports the branch CONFLICTING/DIRTY against current main, and the documentation review is explicitly blocked. Resolve the product decision first, reconcile with current main, then obtain exact-head Jetson hardware evidence through the supported OpenShell path proving cuInit(0)=0, lifecycle/recreation behavior, and the least-privilege device/group set; rerun docs and sensitive-path review afterward.
Security review:
- Input validation: PASS — device paths, symlink state, character-device type, and numeric group IDs are bounded and validated.
- Authentication and authorization: WARNING — supplementary group membership expands device authority and still lacks accepted least-privilege hardware proof.
- Secrets and sensitive data: PASS — no credentials or sensitive payloads are introduced.
- Injection risks: PASS — group identifiers are numeric and the root helper does not evaluate caller-supplied shell fragments.
- Data exposure and privacy: PASS — no new data egress or logging surface.
- Cryptography: PASS — no cryptographic behavior changes.
- Dependencies and supply chain: PASS — no dependency or artifact-source changes.
- System security: FAIL for approval — the core non-root CUDA security/compatibility postcondition remains unproven and product ownership is undefined.
- Testing and verification: FAIL for approval — #7610 is unresolved, exact-head Jetson hardware evidence is absent, docs review is blocked, and the branch conflicts with current main.
Files reviewed: all 40 changed Jetson device/group policy, clone/recreate/create, startup/bootstrap, managed-runtime, Dockerfile/build-context, workflow, documentation, and test files; linked issue #7610 and automated review evidence.
prekshivyas
left a comment
There was a problem hiding this comment.
Reviewed commit fff5a76e22c1c3c57731a82c09d9a2bd7155a0eb as a security-critical Jetson policy and root-helper change.
I did not find an additional correctness or security defect in the current diff. The helper validates the complete bounded GID set before mutation, requires root, accepts only the fixed OpenShell supervisor handoff, verifies the resulting membership, and fails closed. The policy path is anchored on a real non-symlink /dev/nvmap character device and grants only the enumerated device paths.
Security review: secrets PASS; input validation PASS; authentication/authorization PASS; dependencies PASS; error handling PASS; cryptography N/A; configuration/environment PASS; security tests PASS for the implemented boundary; system security BLOCKED for merge.
This is not an approval. The PR is correctly still draft and currently conflicts with the base branch. Its stated merge gates remain material: maintainer product-scope acceptance, resolution of #7610, real supported-path Jetson evidence showing cuInit(0), and completion of the sensitive-path/broad verification gates.
Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com>
|
Refreshed the draft through current The only overlap was The branch is conflict-free again. Draft exit conditions remain unchanged: maintainer product-scope acceptance, #7610 resolution, and supported-path physical IGX Orin |
prekshivyas
left a comment
There was a problem hiding this comment.
Reviewed exact draft head 15330cddd313eda2d9d18aa9feba9b245d96c085.
I found no additional code-level blocker in this revision. The bootstrap boundary is fixed to the OpenShell supervisor, device/group inputs are bounded and validated, Tegra discovery rejects symlinks and non-character devices, failures are fail-closed, and the exact-head required checks are green.
This is not an approval. The PR's own draft-exit conditions remain unmet: #7610 is still open, the expected non-root cuInit(0) = 0 result has not been demonstrated on supported physical Jetson/IGX hardware, and maintainer acceptance of the product scope is not recorded. Please keep this draft until those conditions are satisfied.
Security review:
- Secrets/credentials — PASS: no credential material or secret-handling path is introduced.
- Input validation — PASS: GIDs, device paths, argument shape, helper path, and supervisor target are constrained.
- Authentication/authorization — BLOCKED FOR APPROVAL: supplemental device-group membership expands sandbox device authority and still needs the required least-privilege hardware validation.
- Dependencies — PASS: no new third-party dependency or supply-chain source is added.
- Error handling/logging — PASS: invalid or incomplete device/group state fails closed with bounded diagnostics.
- Cryptography/data protection — N/A: no cryptographic or protected-data path changes.
- Configuration/security headers — PASS: the managed bootstrap and fixed supervisor boundary are explicit; no web security-header surface changes.
- Security testing — PASS for the simulated implementation tests; BLOCKED FOR ACCEPTANCE on the required physical Jetson/IGX test.
- System security — BLOCKED FOR APPROVAL pending the real-hardware
cuInit(0)proof and product-scope acceptance.
I also completed the cross-issue sweep for findings from this review and found no separate, actionable issue candidate beyond the tracked #7610 prerequisite.
jyaunches
left a comment
There was a problem hiding this comment.
LOC Reduction / Codebase Simplicity Review
Why this blocks
preserveJetsonDeviceGroupMembershipappears 28 times across 14 production files.- It is derived only from agent identity, then threaded through generic create, GPU, patch, and managed-bootstrap interfaces.
- Direct and managed paths independently wrap argv, and managed bootstrap imports its bootstrap string from the clone implementation.
Refactor direction
- Give
docker-gpu-jetson-groups.tsone normalized resolver and renderer that returns eithernullor a bootstrap plan with detected GIDs and wrapped argv. - Derive eligibility at the leaf from existing agent identity.
- Have both recreation paths consume the same wrapper helper.
Expected result
- Remove the optional flag from generic interfaces and calls.
- Centralize bootstrap and argv ownership so direct and managed implementations cannot drift.
|
Draft status refresh at commit
Before moving out of draft, update from current |
Signed-off-by: Carlos Villela <cvillela@nvidia.com>
cv
left a comment
There was a problem hiding this comment.
Blocking issues remain at exact head 94e6e89c74f588e9b16a722d3d12a8722ffb93b4:
-
Product and hardware acceptance needs a maintainer decision, not a mechanical repair. The PR description correctly says that #7610 remains open, maintainers have not accepted the Jetson GPU product scope, and the supported OpenShell path has not demonstrated non-root
cuInit(0)=0. The issue evidence still reports direct Docker success but OpenShell execution returning 801. Because this change expands sandbox device policy and supplementary-group authority, deterministic command tests cannot establish the least-privilege or compatibility contract. Please record the product ownership/lifecycle/security decision and provide exact-commit physical IGX Orin evidence through the supported OpenShell path before approval. -
The requested design simplification is still outstanding.
preserveJetsonDeviceGroupMembershipremains threaded through generic startup, sandbox-create, GPU-flow, patch, recreation, and managed-bootstrap contracts (49 source/test occurrences). Eligibility is derived from agent identity, while direct and managed paths separately wrap the startup command. Resolve the existing review by centralizing Jetson group detection and argv rendering at the leaf, and remove the optional flag from generic interfaces so the paths cannot drift. -
Current CI is red.
cli-test-shards (11)fails the growth guard becausesrc/lib/onboard/sandbox-gpu-create-flow.test.tsis 1,514 lines against its 1,500-line budget.static-checks,cli-tests, and the aggregatechecksjob consequently fail. Split or relocate the added cases rather than weakening the budget.
The earlier PR Review Advisor security and documentation findings are addressed in this head: /dev/nvmap now anchors group discovery, and the helper preflights the complete group database before mutation. The latest advisor run did not produce a new assessment because its specialist sessions were unavailable, so it does not replace the older applicable findings or this review.
Security rubric: secrets PASS; input validation PASS; injection PASS; dependencies PASS; data exposure PASS; cryptography N/A; error handling PASS; authentication/authorization and system security BLOCKED pending least-privilege hardware evidence and product-scope acceptance; verification FAIL while required CI is red and the supported-path acceptance result is missing.
Summary
This draft preserves Jetson GPU policy, device-group, container-lifecycle, and validation changes after #8875 merged the CPU-only E2E path. Issue #7610 still blocks the non-root OpenShell CUDA acceptance test and the product-scope decision. Maintainers must keep this PR as a draft until those conditions are resolved.
Related Issue
Related to #7610. This PR does not resolve or close that issue.
Changes
Draft Exit Conditions
Maintainers must keep this PR as a draft until all of these conditions are true:
cuInit(0)through the supported OpenShell sandbox path.Type of Change
Quality Gates
Documentation Writer Review
blockeddocs/reference/troubleshooting.mdx,test/e2e/README.md, andtest/e2e/docs/README.md. The changed documentation passes writing, terminology, claim-accuracy, and agent-variant review. The managed-bootstrap conflict resolution preserves the bounded supervisor reconnect timeout and the exact Jetson helper command boundary. Maintainer product-scope acceptance and IGX Orin OpenShellcuInit(0)=0evidence remain required.DGX Station Hardware Evidence
Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run validate:prpassed after refreshingorigin/mainwhen hooks were skipped or unavailablenpm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — deferred while issue [Jetson][Sandbox] Sandbox GPU passthrough proof fails for the non-root sandbox user on JetPack 6.2 IGX Orin — onboarding aborts #7610 blocks the acceptance contract.npm run docsbuilds without warnings (doc changes only) — build passed with 0 errors and 2 existing Fern warnings.Signed-off-by: Charan Jagwani cjagwani@nvidia.com
Signed-off-by: San Dang sdang@nvidia.com