Repository navigation
feat(onboard): support external images with Podman - #12538
Conversation
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.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. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (1)
Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 10 remain after this review. 📝 WalkthroughWalkthroughRootless Podman now supports digest-pinned OpenClaw and Hermes images through provider-owned preparation. Onboarding, rebuild, and runtime checks use provider-specific image operations. The changes also update admin approval to select the exact captured request. ChangesExternal-image onboarding across runtimes
Exact-request admin approval
Priority: ➖ Normal Estimated code review effort: 4 (Complex) | ~45 minutes Change: Feature · Severity of issue fixed: Medium Sequence Diagram(s)sequenceDiagram
participant Onboarding
participant ExternalImagePreparation
participant SelectedRuntime
Onboarding->>ExternalImagePreparation: inspectLocal image
ExternalImagePreparation->>SelectedRuntime: inspect local image
SelectedRuntime-->>ExternalImagePreparation: inspection result
opt Local image is absent
Onboarding->>ExternalImagePreparation: pull image
ExternalImagePreparation->>SelectedRuntime: pull with runtime credentials
Onboarding->>ExternalImagePreparation: inspectPulled image
ExternalImagePreparation->>SelectedRuntime: inspect pulled image
SelectedRuntime-->>Onboarding: image metadata
end
Suggested reviewers: Merge Risk: ⚪ Minimal · up to The documentation accurately describes Podman’s credential behavior; no merge-blocking issue remains in this change. 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
Full details: Out of Scope Changes checkExplanation The changes to Full details: Docstring CoverageExplanation Docstring coverage is 9.09% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 55 functions across 28 files. (1 skipped: 1 unsupported.)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
🌿 Preview your docs: https://nvidia-preview-pr-12538.docs.buildwithfern.com/nemoclaw |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall line coverage in commit f027143 in the Show a line coverage summary of the most impacted files.
TypeScript / code-coverage/cliThe overall line coverage in commit f027143 in the Show a line coverage summary of the most impacted files.
Updated |
CI status at
|
deepujain
left a comment
There was a problem hiding this comment.
Reviewed 500932d1. No new code defect found in the provider-owned image preparation, exact-digest receipt handling, rebuild preflight, or shared-image cleanup changes. Local focused validation passed: 255 tests across 8 files, after building the plugin and compiling the catalog.
I took the upstream failures into account: the image-build log shows the Debian libssl package mismatch, and this PR changes neither the image build definitions nor the audited dependency manifests/lockfiles. I am not requesting unrelated dependency or base-image fixes in this PR.
Approval is pending validation of the new path. Accepted issue #12241 explicitly requires rootless Podman E2E evidence for published OpenClaw and Hermes digests. The Podman activation job was skipped, so the passing CPU lifecycle check does not establish that evidence. Once the upstream prerequisite is available, please run the activation coverage on the resulting PR commit and link its result, including external-image onboarding/readiness, identity checks, rebuild without a build, and image retention during cleanup.
The Advisor run also skipped its specialists; I could not verify completed Advisor findings for this commit. Please obtain that review evidence as well, or have the accountable maintainer explicitly disposition its deferral. This is a validation request, not a request for another code change.
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
|
Advisor product-scope classification for Issue #12241 already records the required accepted product decision under |
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Advisor E2E recommendation disposition for exact head e1bb72d: covered by the existing exact managed-image activation, so a second selector is not warranted. Exact-head evidence:
This directly exercises the external-image boundary identified by the customer-value and operability specialists. Adding another selector would duplicate the same behavior logic and conflict with the repository guidance to keep behavior in the typed target and shared workflow planner. The Advisor recommendations should be resolved against the successful exact-head jobs above. |
|
@coderabbitai review |
|
|
Advisor product-scope disposition for exact head Accepted issue #12241 records Accept plus the required reason, placement, accountable maintainer ( No source removal is warranted. Re-evaluate the product-scope finding against the accepted issue record and exact-head evidence. |
Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
|
@coderabbitai review |
✅ Action performedReview finished.
|
|
Advisor E2E disposition for exact head f893745: false positive. The supported selector is the exact managed-image activation lane in .github/workflows/managed-images.yaml, which sets NEMOCLAW_GATEWAY_RUNTIME=podman and executes test/e2e/live/managed-image-activation-e2e.test.ts with public immutable OpenClaw and Hermes digests. The exact-head rootless Podman job passed: https://github.com/NVIDIA/NemoClaw/actions/runs/37556050403/job/112586113058. This live lane covers onboarding, readiness, agent turns, identity-drift rejection, rebuild/recreate behavior, destroy and cleanup, and external-image retention. No duplicate general E2E selector is warranted. |
|
Advisor exact-head disposition for
No source removal or additional selector is warranted. Please re-evaluate the Advisor gate against this accepted product decision and terminal exact-head activation evidence. |
|
@coderabbitai resume |
✅ Action performedReviews resumed and review finished. |
|
PR Review Advisor finished for commit Request review only when Require no Advisor blockers is green. |
|
Advisor disposition for latest PR commit Product-scope findingAdvisor finding Issue #12241 contains an explicit Accept decision. It records the reason, placement, accountable maintainer ( E2E recommendationThe same specialist says no supplied selector covers public digest onboarding with rootless Podman. Advisor's trusted selector inventory contains only selectors from That specialized test ran on this commit and passed:
The rootless Podman artifact verifies public digest-pinned OpenClaw and Hermes onboarding, readiness, runtime identity, identity-drift rejection, buildless rebuild with zero build commands, image retention, and cleanup. DispositionThe Advisor finding and E2E recommendation are non-actionable review input. The PR already contains and ran the owning specialized E2E coverage. Do not add a duplicate general E2E selector or rerun unchanged jobs. The other eight Advisor specialists reported no findings. |
kaofelix
left a comment
There was a problem hiding this comment.
The validation gap from the earlier review is now closed for f027143. I verified both activation artifacts: OpenClaw and Hermes onboard, rebuild, and retain their external images without local builds.
The Advisor scope finding requires no source change. Its gate remains red and needs resolution before merge.
Independent review found no new actionable defects. All 230 focused CLI tests passed.
## Outcome Managed-image admin approval now reaches its prepared shell when portable OpenClaw has the expected pending scope upgrade. The fixture uses the trusted OpenShell shell transport directly, so NemoClaw readiness cannot reject the intentionally unsettled request before approval. ## Reason PR #12538 added exact-request filtering but still opened the approval shell through `nemoclaw connect`. Portable readiness correctly rejects an unsettled admin request, so the rootless main workflow failed before the prepared approval ran. ### Related issues Refs #12538. ## Changes - Let the shared approval-script builder accept a shell-quoted connect command and a prepared-shell prelude. The managed-image fixture needs both to approve the pending request before product readiness. The default `nemoclaw connect` path remains unchanged for other consumers. - Run exact-request approval through OpenShell's interactive sandbox shell. This is the existing credential-prepared boundary, while `nemoclaw connect` cannot be its entry point during an intentionally pending approval. - Keep the exact-request filter inside the one-line prepared payload. Integration and E2E-support tests protect exact selection, stale-request exclusion, cleanup, redaction, and the single-line terminal boundary. The live contract remains in `test/e2e/live/managed-image-activation-e2e.test.ts`. Its real boundary is the OpenShell interactive shell with portable pairing pending. It proves that the captured admin request is approved and the downstream OpenClaw operation succeeds. Deterministic payload and selector behavior stays in `test/security/admin-approval-helper.test.ts` and `test/e2e/support/managed-image-activation-diagnostics.test.ts`. ## Verification - `npx vitest run --project integration test/security/admin-approval-helper.test.ts` — 31 tests passed. - `npx vitest run --project e2e-support test/e2e/support/managed-image-activation-diagnostics.test.ts` — 28 tests passed. - `npm run typecheck:cli` — passed. - `npm run validate:pr` — passed. - Normal commit and pre-push hooks — passed, including publication validation and CLI TypeScript checks. - Diff inspection confirmed that no secrets, API keys, or credentials are present. --- Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com> --------- Signed-off-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com> Co-authored-by: Rebecca Sliter <571084+rsliter@users.noreply.github.com>
Outcome
Rootless Podman can now onboard, resume, rebuild, and clean up exact-digest external OpenClaw and Hermes images through
--from-image. Podman uses its ambient registry credentials, validates the immutable local image identity, and retains publisher-owned shared images; Docker behavior remains compatible.Reason
External-image preparation previously encoded Docker-specific inspection, absence detection, pull, and image-ID behavior in the generic workflow. That prevented the qualified Podman provider from honestly advertising or executing the accepted external-image capability.
Related issues
Fixes #12241.
Changes
REGISTRY_AUTH_FILEforwarding, fail-closed status handling, and a non-retrying digest pull. Podman adapter and provider tests protect credential boundaries, status 125 handling, bare-ID normalization, and cleanup retention.--from-imageand rebuild.Verification
npx vitest run --project cli src/lib/onboard/workload/external-image.test.ts src/lib/actions/sandbox/lifecycle/rebuild-external-image-preflight.test.ts src/lib/onboard/runtime-provider/runtime-provider-contract.test.ts src/lib/onboard/runtime-provider/activation.test.ts src/lib/onboard/runtime-provider/podman-runtime-surfaces.test.ts src/lib/onboard/runtime-provider/podman.test.ts src/lib/adapters/podman/index.test.ts- 229 tests passed.node --max-old-space-size=8192 node_modules/typescript/bin/tsc -p tsconfig.cli.json- passed.npm run checks:repository- 18 selected repository checks passed.npm run test:e2e-phases:check- 101 tests across 78 files passed.npm run docs- strict documentation build passed with no errors.npm run test:changed- non-success aggregate run: 10,131 tests passed and 58 failed. The failures were outside the modified paths and classified as/private/tmptrusted-ancestry rejection, missing host Pythonyaml, host Docker-context variance, or whole-suite resource timeouts. The affected-path tests above pass.Review notes
Sensitive paths:
src/lib/onboard/**under the canonical contributor policy. Pre-publication context is an implementation self-review ofNVIDIA/NemoClawcommit500932d1be7f323c69c85f3005ed70b2eae0c3daacross all 24 changed paths, including exact-digest validation, ambient credential handling, ambiguous failure states, rebuild ordering, and cleanup retention. No unresolved candidate-owned finding was found. This is not independent approval; the sensitive paths await independent review.Signed-off-by: Rebecca Sliter 571084+rsliter@users.noreply.github.com
Summary by CodeRabbit
--from-image, alongside Docker.REGISTRY_AUTH_FILE. NemoClaw does not request or store registry tokens.