Skip to content

fix(dpf): start without the site-wide BMC root credential#4167

Draft
wminckler wants to merge 2 commits into
NVIDIA:mainfrom
wminckler:fix/dpf-init-without-bmc-root-cred
Draft

fix(dpf): start without the site-wide BMC root credential#4167
wminckler wants to merge 2 commits into
NVIDIA:mainfrom
wminckler:fix/dpf-init-without-bmc-root-cred

Conversation

@wminckler

Copy link
Copy Markdown
Contributor

Operators set the site-wide BMC root credential through the API, so on a fresh
site it does not exist when nico-api first boots. DPF SDK initialization read
that credential unconditionally and propagated the failure out of setup,
aborting the boot before the listener started — which left no way to set the
credential that would have let the next boot succeed. A fresh site with DPF
enabled could not be brought up at all.

This makes the initial read best-effort when a BMC password refresh interval is
configured: initialization continues without the Secret, and the existing 60s
refresh task writes it as soon as the credential appears, so no restart is
needed. With no refresh task configured nothing would ever retry, so there the
failure stays fatal.

The refresh task could not have recovered as written: create_secret returned
early when the Secret already existed, so a rotated password was never
propagated to the cluster. It is renamed to apply_secret and implemented as a
server-side apply, matching apply_configmap.

The second commit adds optional DPF operator installation to the devspace
environment, mirroring the cluster-side steps of the dpf recipe in the forged
repo (namespace, hbn-user-password and dpf-pull-secret Secrets labelled for
DPF mirroring, the dpf-operator chart, and cluster-wide access for the
nico-api ServiceAccount). It is off by default because it needs an NGC API
key and pulls the operator images. It stops short of DPFOperatorConfig,
DPUCluster, and the keepalived VIP LoadBalancer, which describe DPU-bearing
hosts and a routable management network with nothing to bind to locally. What
is installed exercises nico-api's DPF initialization path against a real
operator; no DPU is provisioned. LOCAL_DEV_SEED_BMC_ROOT=0 skips seeding the
site-wide BMC root credential into Vault, which reproduces the fresh-site
startup path this PR fixes.

Enabling DPF also requires [dpf].enabled = true in the site config, which
lived inline in values.base.yaml. Helm values are strings, so a second values
file could only replace that config, not extend it — the TOML moves to
site-config.toml and is rendered into values.generated.yaml, appending
site-config.dpf.toml when DPF is on.

Related issues

Fixes #4130

Type of Change

  • Add - New feature or capability
  • Change - Changes in existing functionality
  • Fix - Bug fixes
  • Remove - Removed features or deprecated functionality
  • Internal - Internal changes (refactoring, tests, docs, etc.)

Breaking Changes

  • This PR contains breaking changes

Testing

  • Unit tests added/updated
  • Integration tests added/updated
  • Manual testing performed
  • No testing required (docs, internal refactor, etc.)

Four new unit tests cover the refresh task writing the Secret once the password
appears, staying unwritten while it is unavailable, and build succeeding vs.
failing when the password is unset with and without a refresh interval
configured.

Additional Notes

Docs updates ride along: the credential is documented as a DPF setup step, the
Site Explorer precondition is noted on the two getting-started pages that
previously implied "after deploy" was the only option, and a commented-out
kvSeeds entry gives a fresh cluster an obvious place to seed it.

🤖 Generated with Claude Code

@copy-pr-bot

copy-pr-bot Bot commented Jul 25, 2026

Copy link
Copy Markdown

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.

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: cb5254b4-76be-423a-80d1-c688d6190a36

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Comment @coderabbitai help to get the list of available commands.

wminckler and others added 2 commits July 25, 2026 08:38
Operators set the site-wide BMC root credential through the API, so on a
fresh site it does not exist when nico-api first boots. DPF SDK init read
it unconditionally and propagated the failure out of setup, aborting the
boot before the listener started -- leaving no way to set the credential
that would let the next boot succeed.

Make the initial read best-effort when a BMC password refresh interval is
configured: initialization continues without the Secret and the existing
60s refresh task writes it as soon as the credential appears, so no
restart is needed. With no refresh task nothing would ever retry, so
there the failure stays fatal.

The refresh task could not have recovered as written: create_secret
returned early when the Secret already existed, so a rotated password was
never propagated to the cluster. Rename it to apply_secret and implement
it as a server-side apply, matching apply_configmap.

Document the credential as a DPF setup step, note the Site Explorer
precondition on the two getting-started pages that previously implied
"after deploy" was the only option, and add a commented-out kvSeeds entry
so a fresh cluster has an obvious place to seed it.

Fixes NVIDIA#4130

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mirrors the cluster-side steps of the `dpf` recipe in the forged repo:
namespace, hbn-user-password and dpf-pull-secret Secrets labelled for DPF
mirroring, the dpf-operator chart, and cluster-wide access for the
nico-api ServiceAccount. Off by default -- it needs an NGC API key and
pulls the operator images.

Stops short of DPFOperatorConfig, DPUCluster, and the keepalived VIP
LoadBalancer that the forged recipe applies. Those describe DPU-bearing
hosts and a routable management network with nothing to bind to locally.
What is installed exercises nico-api's DPF initialization path against a
real operator; no DPU is provisioned.

Enabling DPF also requires `[dpf].enabled = true` in the site config,
which lived inline in values.base.yaml. Helm values are strings, so a
second values file could only replace that config, not extend it. Move
the TOML to site-config.toml and render it into values.generated.yaml,
appending site-config.dpf.toml when DPF is on.

LOCAL_DEV_SEED_BMC_ROOT=0 skips seeding the site-wide BMC root credential
into Vault, which reproduces the fresh-site startup path from NVIDIA#4130.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@wminckler
wminckler force-pushed the fix/dpf-init-without-bmc-root-cred branch from a838452 to 708d0bd Compare July 25, 2026 12:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug: hard startup failure in the API server's DPF SDK initialization due to no site-wide BMC root credential

1 participant