Skip to content

feat: route machine lifecycle power through component backends#2959

Draft
osu wants to merge 2 commits into
NVIDIA:mainfrom
osu:feat/2053-machine-component-backends
Draft

feat: route machine lifecycle power through component backends#2959
osu wants to merge 2 commits into
NVIDIA:mainfrom
osu:feat/2053-machine-component-backends

Conversation

@osu

@osu osu commented Jun 28, 2026

Copy link
Copy Markdown
Member

Route compute-machine lifecycle power operations through the Component Manager abstraction.

  • add a Core compute-tray adapter that preserves the existing Redfish/IPMI behavior for non-rack machines
  • dispatch rack machines configured for RMS through exact compute-tray power actions, including BMC authentication, vendor, and custom-port data
  • route RMS rack requests through a durable rack-maintenance state machine unless the caller explicitly bypasses state control
  • make rack dispatch crash-safe and at-most-once, with scoped desired-power bookkeeping, compare-and-swap updates, result reconciliation, and cleanup
  • move automated machine lifecycle host-power actions onto the same backend interface while preserving Core fallback behavior
  • scope rack-maintenance access tokens per request so secret-store I/O stays outside row-lock transactions without concurrent requests deleting each other's credentials
  • reject ambiguous direct targets and reconcile malformed backend responses to one final outcome per requested machine

Related issues

Closes #2053

Addresses #2421
Addresses #2679

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

Validated with:

  • cargo test -p component-manager --lib -- --test-threads=1 (81 passed)
  • cargo test --locked -p carbide-machine-controller -p carbide-rack-controller -p carbide-rack -p carbide-secrets --no-default-features --lib -- --test-threads=1 (39, 35, 14, and 42 passed)
  • focused carbide-api-core database-backed integration tests for standalone Core routing, rack queue/bypass dispatch, duplicate BMC rejection, Core-only initial reset, AC-power-cycle fallback bookkeeping, concurrent maintenance-token ownership, firmware-token cleanup, and force-delete cleanup
  • table-driven direct-backend reconciliation coverage for duplicate, missing, and unexpected results
  • focused lifecycle regressions for unavailable/outdated DPUs, DPU reset, and instance creation
  • focused carbide-api-model rack scope serialization and state-SLA tests
  • cargo check --locked for the affected Component Manager, controller, rack, secrets, API-core, and API-model crates
  • cargo clippy --locked with warnings denied for the affected targets
  • cargo +nightly fmt --all -- --check
  • Linux cargo test --locked --no-run for all four originally affected crates

Additional Notes

The durable rack dispatch marker intentionally fails a recovered in-flight request closed instead of replaying non-idempotent restart or AC-cycle actions.

The follow-up removes comment-only protobuf, generated Go, and Flow documentation edits so the PR does not pull unrelated generated-file drift into its CI scope.

Signed-off-by: Hasan Khan <hasank@nvidia.com>
@osu osu requested a review from a team as a code owner June 28, 2026 20:12
@coderabbitai

coderabbitai Bot commented Jun 28, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Important

Review skipped

No new commits to review since the last review.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: bffc408e-ef7a-4c57-8363-9f21e892cfa3

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

Walkthrough

Implements per-machine compute-tray power routing through Core Redfish (direct), RMS-configured (direct), or rack state-controller (queued) paths. Introduces ComputeTrayAuthentication, bmc_port, request-scoped rack maintenance access tokens, a durable power_control_dispatch_started_at replay-prevention marker, a new RackMaintenanceState::PowerControl sub-state-machine, optimistic concurrency on power options, and InitialResetPhase waiting sub-states.

Changes

Compute Power Routing via Component Manager Backends

Layer / File(s) Summary
ComputeTrayEndpoint authentication abstraction and rack power-control model types
crates/component-manager/src/compute_tray_manager.rs, crates/api-model/src/machine/mod.rs, crates/api-model/src/rack.rs
ComputeTrayEndpoint replaces the flat bmc_credentials field with a ComputeTrayAuthentication enum (inline Credentials or deferred CredentialKey) and gains an optional bmc_port. RackMaintenanceState::PowerControl gains a serde-defaulted power_control_state field; new types RackPowerControlState, RackPowerControlResult, RackPowerControlPreparedTarget, and RackPowerControlTargetResult are added. RackConfig gains power_control_dispatch_started_at. InitialResetPhase gains WaitingForHostOff and WaitingForHostOn. MaintenanceScope::should_run now requires explicit PowerControl opt-in and gains maintenance_request_id.
Request-scoped rack maintenance access token
crates/secrets/src/credentials.rs, crates/rack/src/firmware_object.rs, crates/secrets/src/test_support/credentials.rs
CredentialKey::RackMaintenanceAccessToken gains an optional maintenance_request_id; to_key_str branches on its presence to produce a scoped or legacy Vault path. rack_maintenance_access_token_key is updated to accept the optional id. TestCredentialManager gains count_credentials_with_prefix.
Core and RMS backend adaptors
crates/component-manager/src/core_compute_manager.rs, crates/component-manager/src/rms.rs, crates/component-manager/src/config.rs, crates/component-manager/src/component_manager.rs
CoreComputeTrayManager::power_control derives auth from ComputeTrayAuthentication and passes bmc_port. build_compute_tray_node_info returns Result and rejects credential-key auth. to_rms_compute_power_operation preserves Redfish reset semantics for compute trays. LenovoAmi is handled explicitly in vendor mapping. Per-endpoint failures are emitted in both RMS power and firmware update flows.
Power options optimistic concurrency
crates/api-db/src/power_options.rs
update_desired_state adds current desired_power_state_version to the WHERE clause and maps RowNotFound to ConcurrentModificationError.
Machine controller compute-tray routing and power unification
crates/machine-controller/src/context.rs, crates/machine-controller/src/handler.rs, crates/machine-controller/src/redfish.rs, crates/machine-controller/Cargo.toml
MachineStateHandlerServices gains compute_tray_manager_for, compute_tray_endpoint, power_control, and power_control_with_manager. handler_host_power_control_with_location is rewritten to route non-core backends through component-manager dispatch and adds idempotency checks for the Core path. BOSS, restart-verification, DPU, HGX/BMC, and platform-config reboot call sites are unified through handler_host_power_control. pre_update_resets gains WaitingForHostOff/WaitingForHostOn timeout-aware phases.
Rack maintenance PowerControl sub-state-machine
crates/rack-controller/src/maintenance.rs, crates/rack-controller/src/context.rs, crates/rack-controller/src/io.rs, crates/rack-controller/src/ready.rs, crates/rack-controller/Cargo.toml
Implements the full Preparing → Prepared → Finalizing → Completed/Error compute-tray power-control flow: endpoint resolution with BMC-credential lookup, dispatch-marker claiming via row lock, health-report override preparation, per-target desired-power-state writes with rollback, backend dispatch and result reconciliation, and finalization restoring prior state on failure. Access-token load/delete now uses the scope-keyed credential. RackStateHandlerServices gains component_manager.
API component_manager handler: per-machine routing pipeline
crates/api-core/src/handlers/component_manager.rs
Replaces the monolithic Target::MachineIds dispatch with classify_compute_power_targets (CoreDirect / ConfiguredDirect / RackStateController), dispatch_compute_power_direct with health-override and reconcile_direct_compute_power_results, and queue_compute_power_control_via_rack_state_controller. Adds deduplicate_compute_machine_ids and duplicate-BMC-IP detection in resolve_compute_tray_endpoints.
Rack handler: request-scoped token and row-locked maintenance scheduling
crates/api-core/src/handlers/rack.rs
on_demand_rack_maintenance stores the access token under a request-scoped key, row-locks the rack inside a transaction before state validation, and resets power_control_dispatch_started_at. Token cleanup is skipped on commit failures. admin_force_delete_rack uses SELECT ... FOR UPDATE and deletes the scoped token.
Service wiring and test fixture infrastructure
crates/api-core/src/setup.rs, crates/api-core/src/tests/common/api_fixtures/mod.rs, crates/api-core/src/tests/mod.rs
Wires core_compute_tray_manager, component_manager, and credential_reader into MachineStateHandlerServices and RackStateHandlerServices. Adds component_manager_config to TestEnvOverrides, stores test_credential_reader on TestEnv, and registers the component_manager_compute_power test module.
Tests
crates/api-core/src/tests/component_manager_compute_power.rs, crates/api-core/src/tests/machine_states.rs, crates/api-core/src/tests/machine_power.rs, crates/api-core/src/tests/rack_find.rs, crates/api-core/src/tests/rack_state_controller/handler.rs, crates/rack-controller/src/maintenance.rs, crates/component-manager/src/core_compute_manager.rs, crates/component-manager/src/rms.rs, crates/machine-controller/src/context.rs, crates/machine-controller/src/handler.rs
Adds compute-power routing, duplicate-BMC rejection, rack-queue and bypass dispatch, dispatch-marker idempotency, backend-failure state restoration, concurrent maintenance token cleanup, RMS-vs-Core preflight bypass, InitialResetPhase polling, stale-version concurrency rejection, force-delete credential cleanup, vendor mapping, and port-handling tests.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant ComponentManagerHandler
  participant classify as classify_compute_power_targets
  participant dispatch as dispatch_compute_power_direct
  participant CoreComputeTrayManager
  participant RMSComputeTrayManager
  participant RackHandler as queue_compute_power_control_via_rack_state_controller
  participant DB

  Client->>ComponentManagerHandler: component_power_control(MachineIds, action)
  ComponentManagerHandler->>classify: deduplicate + classify machines
  classify-->>ComponentManagerHandler: CoreDirect / ConfiguredDirect / RackStateController buckets

  ComponentManagerHandler->>dispatch: dispatch CoreDirect bucket
  dispatch->>DB: update power_options (optimistic version check)
  dispatch->>CoreComputeTrayManager: power_control(endpoints, action)
  CoreComputeTrayManager-->>dispatch: results
  dispatch-->>ComponentManagerHandler: per-machine ComponentResults

  ComponentManagerHandler->>dispatch: dispatch ConfiguredDirect bucket
  dispatch->>RMSComputeTrayManager: power_control(endpoints, action)
  RMSComputeTrayManager-->>dispatch: results
  dispatch-->>ComponentManagerHandler: per-machine ComponentResults

  ComponentManagerHandler->>RackHandler: queue RackStateController bucket
  RackHandler->>DB: SELECT rack FOR UPDATE
  RackHandler->>DB: set maintenance_requested (MaintenanceScope + PowerControl)
  RackHandler-->>ComponentManagerHandler: queued success

  ComponentManagerHandler-->>Client: per-machine results
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • NVIDIA/infra-controller#2157: Modifies the same component_power_control dispatcher in handlers/component_manager.rs to add switch power-control queuing via the rack state controller — the same dispatch infrastructure this PR refactors for compute trays.

Suggested labels

rack lifecycle

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 57.94% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: routing machine lifecycle power through component backends.
Description check ✅ Passed The description is directly aligned with the compute-machine power-routing and maintenance changes in the PR.
Linked Issues check ✅ Passed The code implements #2053 by routing rack machines through RMS and non-rack machines through Core-backed compute logic.
Out of Scope Changes check ✅ Passed No clear unrelated or off-scope code changes are evident; the supporting model, controller, and test updates all match the feature.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@osu osu self-assigned this Jun 28, 2026
@github-actions

Copy link
Copy Markdown

🔐 TruffleHog Secret Scan

No secrets or credentials found!

Your code has been scanned for 700+ types of secrets and credentials. All clear! 🎉

🔗 View scan details

🕐 Last updated: 2026-06-28 20:15:02 UTC | Commit: 3e4bbc4

@osu osu marked this pull request as draft June 28, 2026 20:16
@copy-pr-bot

copy-pr-bot Bot commented Jun 28, 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 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: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
crates/api-core/src/tests/common/api_fixtures/mod.rs (1)

1366-1382: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Pass the Redfish simulator into build_component_manager for Core compute overrides.

TestEnvOverrides::component_manager_config now exposes the backend choice, but this fixture always calls build_component_manager(..., None) for the Redfish pool. Any test that sets compute_tray_backend: Core will fail during env construction even though redfish_sim is already available in this scope.

Proposed fix
     let test_component_manager = component_manager::component_manager::build_component_manager(
         &component_manager_config,
         component_manager_rack_profiles,
         rms_sim.as_rms_client(),
         None,
         Some(db_pool.clone()),
-        None,
+        Some(redfish_sim.clone()),
     )
🤖 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 `@crates/api-core/src/tests/common/api_fixtures/mod.rs` around lines 1366 -
1382, The `build_component_manager` call in the test fixture is still hardcoding
the Redfish pool argument to `None`, which breaks env construction when
`TestEnvOverrides::component_manager_config` selects `compute_tray_backend:
Core`. Update the fixture so the existing `redfish_sim` in scope is passed
through to `component_manager::component_manager::build_component_manager` when
building `test_component_manager`, while preserving the current
`rms_sim.as_rms_client()` and `db_pool` wiring. Use the
`build_component_manager` and `TestEnvOverrides::component_manager_config`
symbols to locate the change.
crates/api-core/src/handlers/component_manager.rs (1)

1374-1571: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

Reject duplicate BMC IPs before direct dispatch.

ip_to_machine_id keeps only one machine per BMC IP, while dispatch_endpoints can still contain multiple endpoints with that same IP. In that case, direct dispatch can issue duplicate power operations and then attribute backend results to the wrong machine. Mirror the rack-controller guard by detecting duplicate BMC IPs during endpoint resolution and returning per-machine errors instead of dispatching them.

🤖 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 `@crates/api-core/src/handlers/component_manager.rs` around lines 1374 - 1571,
Duplicate BMC IPs are still allowed into the direct-dispatch path, which can
make `dispatch_compute_power_direct` send repeated power actions and
misattribute results because `ip_to_machine_id` only retains one machine per IP.
Add a duplicate-IP check while building endpoints in
`resolve_compute_tray_endpoints` (or immediately before dispatch) so repeated
BMC IPs are rejected with per-machine `error_result` entries instead of being
added to `ResolvedComputeTrayEndpoints` and `dispatch_endpoints`. Use the
existing `resolve_compute_tray_endpoints`, `dispatch_compute_power_direct`, and
`ip_to_machine_id` flow as the place to mirror the rack-controller guard.
🤖 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 `@crates/api-core/src/handlers/rack.rs`:
- Around line 831-845: The maintenance scheduling flow in rack.rs is holding the
rack transaction open while awaiting credential_manager.set_credentials, which
can block DB locks on an external dependency. Move credential storage out of the
transaction scope in the maintenance scheduling path (around the rack token
handling in the maintenance_access_token block), or switch to a
request-scoped/two-phase key so the DB transaction only covers rack state
changes. Keep the transaction limited to the DB update logic and perform the
credential backend write after the transaction has been committed.

In `@crates/api-core/src/tests/common/api_fixtures/mod.rs`:
- Around line 337-343: The controller-path test fixture is using only the base
credential manager, so it misses credentials available through the composite
snapshot-based reader. Update the relevant constructors in the test fixture to
inject the composite credential reader built from
test_static_credential_snapshot() plus credential_manager, matching the API path
behavior; use the existing CompositeCredentialManager and credential_reader
symbols to locate the affected setup.

In `@crates/machine-controller/src/handler.rs`:
- Around line 8683-8699: The InitialReset flow in the host state handler is
mixing backends by calling services.power_control before immediately polling
with create_redfish_client_from_machine/get_power_state, which can route rack
machines through RMS and then fail on direct BMC reads. Update the InitialReset
path in handler::StateHandlerOutcome/state transition logic so it stays on
Core/direct Redfish end-to-end, or switch to a backend-owned reset/status path
before any RMS-driven power action; make the same fix in the other matching
InitialReset block referenced by the review.
- Around line 10302-10319: In dispatch_core_host_power_control, the current
action can be downgraded from ACPowercycle to ForceOff, but the later DPU
bookkeeping still sees the original value. Return the effective power action
from dispatch_core_host_power_control, capture that result at the call site, and
use it before the DPU reboot timestamp loop so the recorded action matches the
one actually executed; keep the existing ACPowercycle fallback and the
dispatch_component_manager_power_control path in sync.

---

Outside diff comments:
In `@crates/api-core/src/handlers/component_manager.rs`:
- Around line 1374-1571: Duplicate BMC IPs are still allowed into the
direct-dispatch path, which can make `dispatch_compute_power_direct` send
repeated power actions and misattribute results because `ip_to_machine_id` only
retains one machine per IP. Add a duplicate-IP check while building endpoints in
`resolve_compute_tray_endpoints` (or immediately before dispatch) so repeated
BMC IPs are rejected with per-machine `error_result` entries instead of being
added to `ResolvedComputeTrayEndpoints` and `dispatch_endpoints`. Use the
existing `resolve_compute_tray_endpoints`, `dispatch_compute_power_direct`, and
`ip_to_machine_id` flow as the place to mirror the rack-controller guard.

In `@crates/api-core/src/tests/common/api_fixtures/mod.rs`:
- Around line 1366-1382: The `build_component_manager` call in the test fixture
is still hardcoding the Redfish pool argument to `None`, which breaks env
construction when `TestEnvOverrides::component_manager_config` selects
`compute_tray_backend: Core`. Update the fixture so the existing `redfish_sim`
in scope is passed through to
`component_manager::component_manager::build_component_manager` when building
`test_component_manager`, while preserving the current `rms_sim.as_rms_client()`
and `db_pool` wiring. Use the `build_component_manager` and
`TestEnvOverrides::component_manager_config` symbols to locate the change.
🪄 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: 3d98a856-b97a-4c69-aa11-1a5dde0f6a21

📥 Commits

Reviewing files that changed from the base of the PR and between 0082abd and 3e4bbc4.

⛔ Files ignored due to path filters (4)
  • Cargo.lock is excluded by !**/*.lock
  • rest-api/flow/internal/nicoapi/gen/nico.pb.go is excluded by !**/*.pb.go, !**/gen/**, !rest-api/**/*.pb.go
  • rest-api/workflow-schema/schema/site-agent/workflows/v1/nico_nico.pb.go is excluded by !**/*.pb.go, !rest-api/**/*.pb.go
  • rest-api/workflow-schema/site-agent/workflows/v1/nico_nico.proto is excluded by !rest-api/workflow-schema/site-agent/workflows/v1/*_nico.proto
📒 Files selected for processing (30)
  • crates/api-core/src/handlers/component_manager.rs
  • crates/api-core/src/handlers/rack.rs
  • crates/api-core/src/setup.rs
  • crates/api-core/src/tests/common/api_fixtures/mod.rs
  • crates/api-core/src/tests/component_manager_compute_power.rs
  • crates/api-core/src/tests/machine_power.rs
  • crates/api-core/src/tests/machine_states.rs
  • crates/api-core/src/tests/mod.rs
  • crates/api-core/src/tests/rack_state_controller/handler.rs
  • crates/api-db/src/power_options.rs
  • crates/api-model/src/machine/mod.rs
  • crates/api-model/src/rack.rs
  • crates/component-manager/src/component_manager.rs
  • crates/component-manager/src/compute_tray_manager.rs
  • crates/component-manager/src/config.rs
  • crates/component-manager/src/core_compute_manager.rs
  • crates/component-manager/src/rms.rs
  • crates/machine-controller/Cargo.toml
  • crates/machine-controller/src/context.rs
  • crates/machine-controller/src/handler.rs
  • crates/machine-controller/src/redfish.rs
  • crates/rack-controller/Cargo.toml
  • crates/rack-controller/src/context.rs
  • crates/rack-controller/src/io.rs
  • crates/rack-controller/src/maintenance.rs
  • crates/rack-controller/src/ready.rs
  • crates/rpc/proto/forge.proto
  • rest-api/flow/docs/component-manager-config.md
  • rest-api/flow/internal/nicoapi/nicoproto/nico.proto
  • rest-api/flow/internal/task/componentmanager/compute/nico/nico.go

Comment thread crates/api-core/src/handlers/rack.rs Outdated
Comment thread crates/api-core/src/tests/common/api_fixtures/mod.rs Outdated
Comment thread crates/machine-controller/src/handler.rs
Comment thread crates/machine-controller/src/handler.rs Outdated
@github-actions

github-actions Bot commented Jun 28, 2026

Copy link
Copy Markdown

🔍 Container Scan Summary

Service Total Critical High Medium Low Other
boot-artifacts-aarch64 3 0 0 3 0 0
boot-artifacts-x86_64 3 0 0 3 0 0
forge-admin-cli-x86_64 285 6 25 103 7 144
machine-validation-runner 748 30 189 272 36 221
machine_validation 748 30 189 272 36 221
machine_validation-aarch64 748 30 189 272 36 221
nvmetal-carbide 748 30 189 272 36 221
TOTAL 3283 126 781 1197 151 1028

Per-CVE detail lives in the per-service grype-* artifacts (JSON + SARIF). Severity counts only — no CVE IDs published here.

@osu osu marked this pull request as ready for review June 29, 2026 05:52
Signed-off-by: Hasan Khan <hasank@nvidia.com>
@osu

osu commented Jun 29, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 29, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@osu osu marked this pull request as draft June 29, 2026 17:19
@osu

osu commented Jun 30, 2026

Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@osu

osu commented Jun 30, 2026

Copy link
Copy Markdown
Member Author

/ok to test 89f4e30

@zhaozhongn

Copy link
Copy Markdown
Contributor

Is this ready for review?

@osu

osu commented Jul 1, 2026

Copy link
Copy Markdown
Member Author

@zhaozhongn no

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.

Conduct Machine Lifecycle Operations via Component Manager Backends

2 participants