Skip to content

feat(nico-api): define rack profile, component manager and RMS ts globally - #4211

Open
kunzhao-nv wants to merge 1 commit into
NVIDIA:mainfrom
kunzhao-nv:feat/global-component-manager-rack-profile-defaults
Open

feat(nico-api): define rack profile, component manager and RMS ts globally#4211
kunzhao-nv wants to merge 1 commit into
NVIDIA:mainfrom
kunzhao-nv:feat/global-component-manager-rack-profile-defaults

Conversation

@kunzhao-nv

@kunzhao-nv kunzhao-nv commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

The rack profile, component manager and RMS sections only existed in per-site config, so every site running rack management had to restate all of them. Move a deployment-wide baseline into the global config so sites only override what actually differs.

rack_profiles carries the standard NVL72 bills of materials for GB200 and GB300. The component manager backends are rms, which is both the recommended backend for rack trays and what nico-api already defaults to. The state controller flags are on because state-controlled dispatch is the recommended mode; the field default of false is the legacy direct-dispatch path, which a site can still select.

The rack profile and component manager sections are coupled: an rms backend requires a non-empty rack_profiles and configuration loading fails without one.

Setting [rms].api_url here enables the component manager fleet-wide rather than only supplying a default. Its client is constructed lazily and never verifies connectivity, so a site that does not run RMS builds one too, and its rack operations fail against an unreachable endpoint instead of reporting that no component manager is configured. Sites can still point elsewhere through their own [rms].api_url.

Related issues

#3299

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.)

Additional Notes

…ts globally

The rack profile, component manager and RMS sections only existed in
per-site config, so every site running rack management had to restate
all of them. Move a deployment-wide baseline into the global config so
sites only override what actually differs.

rack_profiles carries the standard NVL72 bills of materials for GB200
and GB300. The component manager backends are rms, which is both the
recommended backend for rack trays and what nico-api already defaults
to. The state controller flags are on because state-controlled dispatch
is the recommended mode; the field default of false is the legacy
direct-dispatch path, which a site can still select.

The rack profile and component manager sections are coupled: an rms
backend requires a non-empty rack_profiles and configuration loading
fails without one.

Setting [rms].api_url here enables the component manager fleet-wide
rather than only supplying a default. Its client is constructed lazily
and never verifies connectivity, so a site that does not run RMS builds
one too, and its rack operations fail against an unreachable endpoint
instead of reporting that no component manager is configured. Sites can
still point elsewhere through their own [rms].api_url.

Signed-off-by: Kun Zhao <kunzhao@nvidia.com>
@kunzhao-nv
kunzhao-nv requested a review from a team as a code owner July 27, 2026 18:47
@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Adds NVL72 rack profile expectations and configures the component manager to use RMS backends and state controllers for compute trays, NV switches, and power shelves, with TLS enforced for the RMS endpoint.

Changes

Rack profile and component-manager configuration

Layer / File(s) Summary
Rack profiles and RMS wiring
helm/charts/nico-api/files/carbide-api-config.toml
Defines NVL72 and NVL72_GB300 product, topology, and vendor capability expectations, then configures RMS selectors, state controllers, and a TLS-enforced RMS API endpoint.

Estimated code review effort: 2 (Simple) | ~10 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title summarizes the main change: moving rack profile, component manager, and RMS config to global defaults.
Description check ✅ Passed The description matches the changes and explains the global rack profile, component manager, and RMS configuration move.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@coderabbitai coderabbitai Bot 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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@helm/charts/nico-api/files/carbide-api-config.toml`:
- Around line 146-154: Update the [component_manager] defaults so RMS is not
applied fleet-wide without availability protection: preserve a per-site non-RMS
backend override or add a preflight/rollout gate before enabling the RMS
backends and state controllers. Verify the rendered Helm configuration and
upgrade behavior, and require testing in non-critical environments before
production rollout.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 07c7d11a-7c4b-4569-8c7d-6712afa53ee0

📥 Commits

Reviewing files that changed from the base of the PR and between 504df13 and 75aaaed.

📒 Files selected for processing (1)
  • helm/charts/nico-api/files/carbide-api-config.toml

Comment on lines +146 to +154
# Defining this section is what enables the component manager.
[component_manager]
compute_tray_backend = "rms"
nv_switch_backend = "rms"
power_shelf_backend = "rms"

nv_switch_use_state_controller = true
power_shelf_use_state_controller = true
compute_tray_use_state_controller = true

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.

🩺 Stability & Availability | 🟠 Major | 🏗️ Heavy lift

Do not make RMS the fleet-wide backend without an availability gate.

These settings route compute trays, NV switches, and power shelves through RMS for every rendered deployment. Sites without a working RMS service will start with configured backends but fail operations against the endpoint. Preserve a per-site non-RMS override or add a preflight/rollout gate before applying this global default.

As per coding guidelines, treat NICo as experimental software and test deployments in non-critical environments before production use. As per path instructions, verify the rendered Helm configuration and upgrade behavior before rollout.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@helm/charts/nico-api/files/carbide-api-config.toml` around lines 146 - 154,
Update the [component_manager] defaults so RMS is not applied fleet-wide without
availability protection: preserve a per-site non-RMS backend override or add a
preflight/rollout gate before enabling the RMS backends and state controllers.
Verify the rendered Helm configuration and upgrade behavior, and require testing
in non-critical environments before production rollout.

Sources: Coding guidelines, Path instructions

count = 6

# Defining this section is what enables the component manager.
[component_manager]

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.

Major: unconditional enablement is a one-way door for non-RMS sites. The PR description itself notes that a site not running RMS builds a client anyway and its rack operations "fail against an unreachable endpoint instead of reporting that no component manager is configured." Site TOML can override values but cannot un-define this section once the global config declares it — the only opt-out is the undocumented [rms] api_url = "" escape hatch (setup.rs treats an empty URL as unset), which still leaves component-manager enabled with rms backends and no client. Suggest gating these sections behind chart values instead of shipping them unconditionally — #4218 adds exactly that shape for [rms] (same file, so we need to reconcile the two before either merges; happy to combine them).


[rms]
api_url = "https://rms-api-server.rack-manager.svc.cluster.local:8801"
enforce_tls = true

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.

Major: this default doesn't match the rack-manager chart as deployed. The RMS chart ships tls.enabled: false / allowInsecure: true (plain HTTP on 8801), and the config validated on RMS-consuming sites was http://rms-api-server.rack-manager:8801 with enforce_tls = false. A site following both charts' defaults gets a TLS handshake failure on every rack operation. Preferring TLS is the right instinct, but either match the RMS chart as it ships today, or document the RMS-side TLS prerequisite in this comment block.

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.

Correction after reading the Launchpad RMS runbook: the current validated deployment IS mTLS (apiServer.tls.enabled + caEnabled: true), so https + enforce_tls = true is the right direction — my forged plain-HTTP reference was the older pattern. However this block is still incomplete against that deployment: caEnabled RMS requires a client certificate, and without root_ca_path/client_cert/client_key the handshake fails. The validated trio is nico-api's own SPIFFE mount (already present in every pod, no new mounts): root_ca_path = "/var/run/secrets/spiffe.io/ca.crt", client_cert = ".../tls.crt", client_key = ".../tls.key". #4218 now ships exactly that as its values defaults — happy to converge the two PRs.

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.

Second correction, now fully resolved: I claimed the missing cert paths would fail the handshake — wrong. nv-rms-client's RmsClientConfig auto-discovers nico-api's SPIFFE mount (/var/run/secrets/spiffe.io/{tls.crt,tls.key,ca.crt}) whenever the [rms] paths are unset, so this PR's bare api_url + enforce_tls = true block is sufficient against the standard mTLS RMS deployment. Apologies for the noise. One behavior worth knowing: if the SPIFFE files were ever absent, the client logs a warning and silently disables TLS enforcement rather than failing — there's no hard-fail mode. My TLS concern on this PR is withdrawn; the remaining discussion is only the unconditional-enablement question above.

rack_hardware_topology = "gb300_nvl72r1_c2g4_topology"

[rack_profiles.NVL72_GB300.rack_capabilities.compute]
vendor = "Lenovo"

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.

Medium: OEM-specific vendors as deployment-wide defaults. vendor = "Lenovo" (and LiteOn for power shelves) are per-OEM facts, not properties of the GB300 NVL72 platform. Startup validation checks vendor fields for RMS-enabled roles, so a non-Lenovo GB300 site inherits a default that validates cleanly and then mismatches at component discovery/linking — harder to debug than a missing profile. Since Figment merges site over global per-key, sites can override, but that expectation should be stated here — or name the profile for what it is (e.g. NVL72_GB300_Lenovo) so a site with different hardware knows it must define its own.

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.

4 participants