Skip to content

feat(librms)!: use descriptors for node identity - #3812

Merged
jayzhudev merged 3 commits into
NVIDIA:mainfrom
jayzhudev:rms/node-descriptor
Jul 22, 2026
Merged

feat(librms)!: use descriptors for node identity#3812
jayzhudev merged 3 commits into
NVIDIA:mainfrom
jayzhudev:rms/node-descriptor

Conversation

@jayzhudev

@jayzhudev jayzhudev commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

NICo currently converts rack-profile vendor and product-family strings into a closed RMS NodeType enum before making RMS requests. That requires NICo code changes for each new hardware family and can reject unknown rack profiles during startup.

This change migrates NICo's RMS requests to NodeDescriptor. NICo now sends the existing rack-profile role, vendor, and product family directly to RMS and lets RMS resolve them for dispatch. Rack product families are represented as arbitrary strings, so adding a hardware family no longer requires a NICo release solely to extend an enum mapping.

For now, NodeType and NodeDescriptor coexist and NodeDescriptor serves in the fallback path. NodeType will be deprecated in the future in favor of NodeDescriptor.

Related issues

Closes #3593

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

This PR doesn't contain breaking API or config surface changes, but it involves a security cleanup -- removal of hardcoded dangerously_accept_invalid_certs: true in NICo code. This change was introduced between librms-v0.9.0-mts4 and librms-v0.10.0, which can cause breakage when a newer NICo version (after this PR) calls an older version of RMS using librms before NVIDIA/nv-rms-client@cb1a677, as early versions of RMS relied on caller specified dangerously_accept_invalid_certs for BMC and switch host HTTP (BMC uses HTTPs without server cert validation).

Testing

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

Test Logs

RPC Coverage

RMS methods that call a NodeDescriptor normalization path were exercised:

RPC Profile and role Expected internal NodeType Resolver calls
BatchSetPowerState gb200_nvidia_liteon compute compute_gb200_nvidia 1
BatchGetPowerState gb300_lenovo_delta compute compute_gb300_lenovo 1
CreateNodes gb200_nvidia_liteon power_shelf powershelf_gb200_liteon 1
ListNodeDeviceInfoByNodeType vrnvl72_nvidia compute compute_vrnvl72_nvidia 1
BatchGetNodeDeviceInfo gb200_nvidia_liteon compute compute_gb200_nvidia 1
BatchUpdateFirmwareByNodeType gb300_lenovo_delta switch switch_gb300_nvidia 1
BatchUpdateFirmware gb300_lenovo_delta power_shelf powershelf_gb300_delta 2
UpdateSwitchSystemImage gb200_nvidia_liteon switch switch_gb200_nvidia 1
UpdateSwitchSystemPassword vrnvl72_nvidia switch switch_vrnvl72_nvidia 1
ApplyStoredFirmwareObject gb200_nvidia_liteon compute compute_gb200_nvidia 2
ApplyFirmwareObject gb300_lenovo_delta compute compute_gb300_lenovo 2
ApplyStoredSwitchSystemImage gb300_lenovo_delta switch switch_gb300_nvidia 1
ApplySwitchSystemImage vrnvl72_nvidia switch switch_vrnvl72_nvidia 1
ConfigureScaleUpFabricManager gb200_nvidia_liteon switch switch_gb200_nvidia 1
BatchResetSwitchSdnFactoryDefault gb300_lenovo_delta switch switch_gb300_nvidia 1
BatchSetScaleUpFabricState vrnvl72_nvidia switch switch_vrnvl72_nvidia 1
GetScaleUpFabricState gb200_nvidia_liteon switch switch_gb200_nvidia 1
BatchGetScaleUpFabricServiceStatus gb300_lenovo_delta switch switch_gb300_nvidia 1
SetScaleUpFabricTelemetryInterfaceState vrnvl72_nvidia switch switch_vrnvl72_nvidia 1
ConfigureSwitchCertificate gb200_nvidia_liteon switch switch_gb200_nvidia 1

BatchUpdateFirmware, ApplyStoredFirmwareObject, and ApplyFirmwareObject each resolve both node and descriptor-keyed selector map entries. Total: 20 RPC methods and 23 successful resolutions.

NICo

PROFILE id=gb200_nvidia_liteon product_family=gb200 compute_vendor=Some("  NVIDIA  ") switch_vendor=Some(" NVIDIA ") power_shelf_vendor=Some(" Lite-On ")
PROFILE id=gb300_lenovo_delta product_family=gb300 compute_vendor=Some(" Lenovo ") switch_vendor=Some(" NVIDIA ") power_shelf_vendor=Some(" Delta ")
PROFILE id=vrnvl72_nvidia product_family=vr_nvl72 compute_vendor=Some(" NVIDIA ") switch_vendor=Some(" NVIDIA ") power_shelf_vendor=Some(" Delta ")
PROFILE id=future_open_profile product_family=future-family-x1 compute_vendor=Some(" FutureCompute ") switch_vendor=Some(" FutureSwitch ") power_shelf_vendor=Some(" FuturePower ")
BUILD rpc=BatchSetPowerState profile=gb200_nvidia_liteon role=compute vendor=NVIDIA product_family=gb200 production_node_type=Some(ComputeGb200Nvidia) forced_wire_node_type=None expected_internal=compute_gb200_nvidia
RESULT rpc=BatchSetPowerState transport=grpc_error code=InvalidArgument resolver=accepted message="invalid operation: 0"
BUILD rpc=BatchGetPowerState profile=gb300_lenovo_delta role=compute vendor=Lenovo product_family=gb300 production_node_type=Some(ComputeGb300Lenovo) forced_wire_node_type=None expected_internal=compute_gb300_lenovo
RESULT rpc=BatchGetPowerState transport=ok resolver=accepted
BUILD rpc=CreateNodes profile=gb200_nvidia_liteon role=power_shelf vendor=Lite-On product_family=gb200 production_node_type=Some(PowershelfGb200Liteon) forced_wire_node_type=None expected_internal=powershelf_gb200_liteon
RESULT rpc=CreateNodes transport=ok resolver=accepted
BUILD rpc=ListNodeDeviceInfoByNodeType profile=vrnvl72_nvidia role=compute vendor=NVIDIA product_family=vr_nvl72 production_node_type=Some(ComputeVrnvl72Nvidia) forced_wire_node_type=None expected_internal=compute_vrnvl72_nvidia
RESULT rpc=ListNodeDeviceInfoByNodeType transport=ok resolver=accepted
BUILD rpc=BatchGetNodeDeviceInfo profile=gb200_nvidia_liteon role=compute vendor=NVIDIA product_family=gb200 production_node_type=Some(ComputeGb200Nvidia) forced_wire_node_type=None expected_internal=compute_gb200_nvidia
RESULT rpc=BatchGetNodeDeviceInfo transport=ok resolver=accepted
BUILD rpc=BatchUpdateFirmwareByNodeType profile=gb300_lenovo_delta role=switch vendor=NVIDIA product_family=gb300 production_node_type=Some(SwitchGb300Nvidia) forced_wire_node_type=None expected_internal=switch_gb300_nvidia
RESULT rpc=BatchUpdateFirmwareByNodeType transport=ok resolver=accepted
BUILD rpc=BatchUpdateFirmware profile=gb300_lenovo_delta role=power_shelf vendor=Delta product_family=gb300 production_node_type=Some(PowershelfGb300Delta) forced_wire_node_type=None expected_internal=powershelf_gb300_delta
RESULT rpc=BatchUpdateFirmware transport=ok resolver=accepted
BUILD rpc=UpdateSwitchSystemImage profile=gb200_nvidia_liteon role=switch vendor=NVIDIA product_family=gb200 production_node_type=Some(SwitchGb200Nvidia) forced_wire_node_type=None expected_internal=switch_gb200_nvidia
RESULT rpc=UpdateSwitchSystemImage transport=ok resolver=accepted
BUILD rpc=UpdateSwitchSystemPassword profile=vrnvl72_nvidia role=switch vendor=NVIDIA product_family=vr_nvl72 production_node_type=Some(SwitchVrnvl72Nvidia) forced_wire_node_type=None expected_internal=switch_vrnvl72_nvidia
RESULT rpc=UpdateSwitchSystemPassword transport=grpc_error code=InvalidArgument resolver=accepted message="username may only contain ASCII letters and digits"
BUILD rpc=ApplyStoredFirmwareObject profile=gb200_nvidia_liteon role=compute vendor=NVIDIA product_family=gb200 production_node_type=Some(ComputeGb200Nvidia) forced_wire_node_type=None expected_internal=compute_gb200_nvidia
RESULT rpc=ApplyStoredFirmwareObject transport=grpc_error code=InvalidArgument resolver=accepted message="hardware_type is required when object_id is empty"
BUILD rpc=ApplyFirmwareObject profile=gb300_lenovo_delta role=compute vendor=Lenovo product_family=gb300 production_node_type=Some(ComputeGb300Lenovo) forced_wire_node_type=None expected_internal=compute_gb300_lenovo
RESULT rpc=ApplyFirmwareObject transport=grpc_error code=InvalidArgument resolver=accepted message="hardware_type is required"
BUILD rpc=ApplyStoredSwitchSystemImage profile=gb300_lenovo_delta role=switch vendor=NVIDIA product_family=gb300 production_node_type=Some(SwitchGb300Nvidia) forced_wire_node_type=None expected_internal=switch_gb300_nvidia
RESULT rpc=ApplyStoredSwitchSystemImage transport=grpc_error code=InvalidArgument resolver=accepted message="hardware_type is required when object_id is empty"
BUILD rpc=ApplySwitchSystemImage profile=vrnvl72_nvidia role=switch vendor=NVIDIA product_family=vr_nvl72 production_node_type=Some(SwitchVrnvl72Nvidia) forced_wire_node_type=None expected_internal=switch_vrnvl72_nvidia
RESULT rpc=ApplySwitchSystemImage transport=grpc_error code=InvalidArgument resolver=accepted message="hardware_type is required"
BUILD rpc=ConfigureScaleUpFabricManager profile=gb200_nvidia_liteon role=switch vendor=NVIDIA product_family=gb200 production_node_type=Some(SwitchGb200Nvidia) forced_wire_node_type=None expected_internal=switch_gb200_nvidia
RESULT rpc=ConfigureScaleUpFabricManager transport=ok resolver=accepted
BUILD rpc=BatchResetSwitchSdnFactoryDefault profile=gb300_lenovo_delta role=switch vendor=NVIDIA product_family=gb300 production_node_type=Some(SwitchGb300Nvidia) forced_wire_node_type=None expected_internal=switch_gb300_nvidia
RESULT rpc=BatchResetSwitchSdnFactoryDefault transport=ok resolver=accepted
BUILD rpc=BatchSetScaleUpFabricState profile=vrnvl72_nvidia role=switch vendor=NVIDIA product_family=vr_nvl72 production_node_type=Some(SwitchVrnvl72Nvidia) forced_wire_node_type=None expected_internal=switch_vrnvl72_nvidia
RESULT rpc=BatchSetScaleUpFabricState transport=ok resolver=accepted
BUILD rpc=GetScaleUpFabricState profile=gb200_nvidia_liteon role=switch vendor=NVIDIA product_family=gb200 production_node_type=Some(SwitchGb200Nvidia) forced_wire_node_type=None expected_internal=switch_gb200_nvidia
RESULT rpc=GetScaleUpFabricState transport=ok resolver=accepted
BUILD rpc=BatchGetScaleUpFabricServiceStatus profile=gb300_lenovo_delta role=switch vendor=NVIDIA product_family=gb300 production_node_type=Some(SwitchGb300Nvidia) forced_wire_node_type=None expected_internal=switch_gb300_nvidia
RESULT rpc=BatchGetScaleUpFabricServiceStatus transport=ok resolver=accepted
BUILD rpc=SetScaleUpFabricTelemetryInterfaceState profile=vrnvl72_nvidia role=switch vendor=NVIDIA product_family=vr_nvl72 production_node_type=Some(SwitchVrnvl72Nvidia) forced_wire_node_type=None expected_internal=switch_vrnvl72_nvidia
RESULT rpc=SetScaleUpFabricTelemetryInterfaceState transport=ok resolver=accepted
BUILD rpc=ConfigureSwitchCertificate profile=gb200_nvidia_liteon role=switch vendor=NVIDIA product_family=gb200 production_node_type=Some(SwitchGb200Nvidia) forced_wire_node_type=None expected_internal=switch_gb200_nvidia
RESULT rpc=ConfigureSwitchCertificate transport=grpc_error code=InvalidArgument resolver=accepted message="services must contain at least one SwitchService"
BUILD rpc=BatchGetPowerStateNegativeFutureProfile profile=future_open_profile role=compute vendor=FutureCompute product_family=future-family-x1 production_node_type=None forced_wire_node_type=None expected_internal=unsupported
NEGATIVE rpc=BatchGetPowerStateNegativeFutureProfile profile=future_open_profile nico_passthrough=accepted rms_code=InvalidArgument rms_message="unsupported node descriptor role=compute, vendor=futurecompute, product_family=futurefamilyx1"
RESULT pass profiles=4 positive_rpcs=20 positive_resolutions=23 negative_cases=1

RMS

rms-1  | 2026-07-22T13:43:32.310803553Z level=WARN time=2026-07-22T13:43:32.296552Z msg="RUST_LOG is set but is no longer honored: RMS log filtering is controlled by the `log_level` configuration key. Ignoring RUST_LOG." location="<REDACTED>"
rms-1  | 2026-07-22T13:43:32.310855512Z level=INFO time=2026-07-22T13:43:32.310703Z msg="Current log level: debug" location="<REDACTED>"
rms-1  | 2026-07-22T13:43:32.385944595Z level=INFO time=2026-07-22T13:43:32.385736Z msg="build metadata" build_date=2026-07-22T13:40:29.503425177Z build_version=VERGEN_IDEMPOTENT_OUTPUT git_sha=VERGEN_IDEMPOTENT_OUTPUT rust_version="rustc 1.96.0" location="<REDACTED>"
rms-1  | 2026-07-22T13:43:32.386685470Z level=WARN time=2026-07-22T13:43:32.386609Z msg="insecure_switch disables switch client mTLS; NVUE uses unverified HTTPS and NMX-C uses plaintext HTTP" location="<REDACTED>"
rms-1  | 2026-07-22T13:43:32.387046720Z level=INFO time=2026-07-22T13:43:32.386905Z msg="gRPC server starting" mode=mTLS port=8801 location="<REDACTED>"
rms-1  | 2026-07-22T13:43:32.389081262Z level=INFO time=2026-07-22T13:43:32.388999Z msg="SFTP upload options configured" buffer_size_bytes=524288 step_timeout_secs=30 upload_timeout_secs=3600 location="<REDACTED>"
rms-1  | 2026-07-22T13:43:32.389821345Z level=INFO time=2026-07-22T13:43:32.389735Z msg="metrics server starting" mode=plaintext port=8802 location="<REDACTED>"
rms-1  | 2026-07-22T13:43:32.389871845Z level=INFO time=2026-07-22T13:43:32.389765Z msg="Rack Management Service running (send SIGINT/Ctrl+C or SIGTERM to stop)" grpc_port=8801 metrics_port=8802 metrics_tls=false location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.059482797Z level=SPAN span_id=0x1dcdbc58c975e6eb span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/GetVersion otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=GetVersion rpc_service=rack_manager.RackManager timing_busy_ns=1030999 timing_elapsed_us=1479 timing_idle_ns=448459 timing_start_time=2026-07-22T13:46:50.055378089Z
rms-1  | 2026-07-22T13:46:50.092336756Z level=SPAN span_id=0x921a6aa377bf06a2 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/GetVersion otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=GetVersion rpc_service=rack_manager.RackManager timing_busy_ns=23208 timing_elapsed_us=38 timing_idle_ns=15750 timing_start_time=2026-07-22T13:46:50.092144714Z
rms-1  | 2026-07-22T13:46:50.095882381Z level=DEBUG time=2026-07-22T13:46:50.095597Z span_id=0x1d5ed8b5115853e8 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=compute_gb200_nvidia role="Some(\"compute\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.096402089Z level=SPAN span_id=0x1d5ed8b5115853e8 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchSetPowerState otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: invalid operation: 0" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: invalid operation: 0" rpc_method=BatchSetPowerState rpc_service=rack_manager.RackManager timing_busy_ns=1204334 timing_elapsed_us=2390 timing_idle_ns=1186000 timing_start_time=2026-07-22T13:46:50.093451381Z
rms-1  | 2026-07-22T13:46:50.103715631Z level=DEBUG time=2026-07-22T13:46:50.103464Z span_id=0xf2b6a170bb842a80 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=compute_gb300_lenovo role="Some(\"compute\")" vendor="Some(\"Lenovo\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.103767547Z level=ERROR time=2026-07-22T13:46:50.103538Z span_id=0xf2b6a170bb842a80 msg="failed to construct unregistered node" error="Missing BMC credentials for node batchgetpowerstate-gb300_lenovo_delta" node=batchgetpowerstate-gb300_lenovo_delta rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.103887047Z level=SPAN span_id=0xf2b6a170bb842a80 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchGetPowerState otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=BatchGetPowerState rpc_service=rack_manager.RackManager timing_busy_ns=404541 timing_elapsed_us=4279 timing_idle_ns=3875251 timing_start_time=2026-07-22T13:46:50.099407339Z
rms-1  | 2026-07-22T13:46:50.112861506Z level=DEBUG time=2026-07-22T13:46:50.112659Z span_id=0x4fca2cd8d8729528 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=powershelf_gb200_liteon role="Some(\"power_shelf\")" vendor="Some(\"Lite-On\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.112917756Z level=ERROR time=2026-07-22T13:46:50.112804Z span_id=0x4fca2cd8d8729528 msg="failed to create node" error="create_powershelf: missing credentials for createnodes-gb200_nvidia_liteon (provide username/password)" node=createnodes-gb200_nvidia_liteon rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.113025547Z level=SPAN span_id=0x4fca2cd8d8729528 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/CreateNodes otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=CreateNodes rpc_service=rack_manager.RackManager timing_busy_ns=320418 timing_elapsed_us=4059 timing_idle_ns=3739207 timing_start_time=2026-07-22T13:46:50.108845297Z
rms-1  | 2026-07-22T13:46:50.121036672Z level=DEBUG time=2026-07-22T13:46:50.120912Z span_id=0x39801f12d5e5500 msg="TEST EVIDENCE resolved node selector" node_type=Some(0) product_family="Some(\"vr_nvl72\")" resolved_node_type=compute_vrnvl72_nvidia role="Some(\"compute\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.121191506Z level=ERROR time=2026-07-22T13:46:50.121112Z span_id=0x39801f12d5e5500 msg="rack not found" rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.121202089Z level=SPAN span_id=0x39801f12d5e5500 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/ListNodeDeviceInfoByNodeType otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=ListNodeDeviceInfoByNodeType rpc_service=rack_manager.RackManager timing_busy_ns=501710 timing_elapsed_us=2461 timing_idle_ns=1959874 timing_start_time=2026-07-22T13:46:50.118690922Z
rms-1  | 2026-07-22T13:46:50.130496756Z level=DEBUG time=2026-07-22T13:46:50.130210Z span_id=0xc1fc31abb93301cd msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=compute_gb200_nvidia role="Some(\"compute\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.130521047Z level=ERROR time=2026-07-22T13:46:50.130271Z span_id=0xc1fc31abb93301cd msg="BatchGetNodeDeviceInfo completed with errors" errors="node_id=batchgetnodedeviceinfo-gb200_nvidia_liteon: missing BMC credentials" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.130523589Z level=SPAN span_id=0xc1fc31abb93301cd span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchGetNodeDeviceInfo otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=BatchGetNodeDeviceInfo rpc_service=rack_manager.RackManager timing_busy_ns=143083 timing_elapsed_us=4174 timing_idle_ns=4031667 timing_start_time=2026-07-22T13:46:50.126128131Z
rms-1  | 2026-07-22T13:46:50.138462839Z level=DEBUG time=2026-07-22T13:46:50.138340Z span_id=0x8097c0fd2087603b msg="TEST EVIDENCE resolved node selector" node_type=Some(0) product_family="Some(\"gb300\")" resolved_node_type=switch_gb300_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.138482922Z level=ERROR time=2026-07-22T13:46:50.138385Z span_id=0x8097c0fd2087603b msg="rack not found" rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.138534631Z level=SPAN span_id=0x8097c0fd2087603b span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchUpdateFirmwareByNodeType otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=BatchUpdateFirmwareByNodeType rpc_service=rack_manager.RackManager timing_busy_ns=221500 timing_elapsed_us=2724 timing_idle_ns=2502792 timing_start_time=2026-07-22T13:46:50.135724589Z
rms-1  | 2026-07-22T13:46:50.144331922Z level=DEBUG time=2026-07-22T13:46:50.144119Z span_id=0xb7838213c8f2208e msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=powershelf_gb300_delta role="Some(\"power_shelf\")" vendor="Some(\"Delta\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.144379381Z level=DEBUG time=2026-07-22T13:46:50.144165Z span_id=0xb7838213c8f2208e msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=powershelf_gb300_delta role="Some(\"power_shelf\")" vendor="Some(\"Delta\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.144803714Z level=SPAN span_id=0xb7838213c8f2208e span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchUpdateFirmware otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=BatchUpdateFirmware rpc_service=rack_manager.RackManager timing_busy_ns=786416 timing_elapsed_us=2797 timing_idle_ns=2011251 timing_start_time=2026-07-22T13:46:50.141821797Z
rms-1  | 2026-07-22T13:46:50.149980006Z level=DEBUG time=2026-07-22T13:46:50.149832Z span_id=0x190e431aef789f31 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=switch_gb200_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.150007297Z level=WARN time=2026-07-22T13:46:50.149895Z span_id=0x190e431aef789f31 msg="image_filename is required" total_nodes=1 location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.150008964Z level=SPAN span_id=0x190e431aef789f31 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/UpdateSwitchSystemImage otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=UpdateSwitchSystemImage rpc_service=rack_manager.RackManager timing_busy_ns=128707 timing_elapsed_us=1777 timing_idle_ns=1648334 timing_start_time=2026-07-22T13:46:50.148145672Z
rms-1  | 2026-07-22T13:46:50.156502381Z level=DEBUG time=2026-07-22T13:46:50.156376Z span_id=0xda350404c05983bc msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"vr_nvl72\")" resolved_node_type=switch_vrnvl72_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.156529464Z level=SPAN span_id=0xda350404c05983bc span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/UpdateSwitchSystemPassword otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: username may only contain ASCII letters and digits" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: username may only contain ASCII letters and digits" rpc_method=UpdateSwitchSystemPassword rpc_service=rack_manager.RackManager timing_busy_ns=93582 timing_elapsed_us=1959 timing_idle_ns=1866084 timing_start_time=2026-07-22T13:46:50.154470047Z
rms-1  | 2026-07-22T13:46:50.162479256Z level=DEBUG time=2026-07-22T13:46:50.162349Z span_id=0x412f7590db1e2a1 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=compute_gb200_nvidia role="Some(\"compute\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.162502006Z level=DEBUG time=2026-07-22T13:46:50.162383Z span_id=0x412f7590db1e2a1 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=compute_gb200_nvidia role="Some(\"compute\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.162504547Z level=SPAN span_id=0x412f7590db1e2a1 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/ApplyStoredFirmwareObject otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: hardware_type is required when object_id is empty" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: hardware_type is required when object_id is empty" rpc_method=ApplyStoredFirmwareObject rpc_service=rack_manager.RackManager timing_busy_ns=155666 timing_elapsed_us=1959 timing_idle_ns=1804001 timing_start_time=2026-07-22T13:46:50.160472131Z
rms-1  | 2026-07-22T13:46:50.168444006Z level=DEBUG time=2026-07-22T13:46:50.168284Z span_id=0xbc7bbacfd868a6b2 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=compute_gb300_lenovo role="Some(\"compute\")" vendor="Some(\"Lenovo\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.168471797Z level=DEBUG time=2026-07-22T13:46:50.168327Z span_id=0xbc7bbacfd868a6b2 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=compute_gb300_lenovo role="Some(\"compute\")" vendor="Some(\"Lenovo\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.168528047Z level=SPAN span_id=0xbc7bbacfd868a6b2 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/ApplyFirmwareObject otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: hardware_type is required" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: hardware_type is required" rpc_method=ApplyFirmwareObject rpc_service=rack_manager.RackManager timing_busy_ns=250667 timing_elapsed_us=2259 timing_idle_ns=2008791 timing_start_time=2026-07-22T13:46:50.166183381Z
rms-1  | 2026-07-22T13:46:50.173665381Z level=DEBUG time=2026-07-22T13:46:50.173540Z span_id=0x7f5a73e6b668b9 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=switch_gb300_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.173683756Z level=SPAN span_id=0x7f5a73e6b668b9 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/ApplyStoredSwitchSystemImage otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: hardware_type is required when object_id is empty" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: hardware_type is required when object_id is empty" rpc_method=ApplyStoredSwitchSystemImage rpc_service=rack_manager.RackManager timing_busy_ns=89417 timing_elapsed_us=1739 timing_idle_ns=1650375 timing_start_time=2026-07-22T13:46:50.171855714Z
rms-1  | 2026-07-22T13:46:50.178806672Z level=DEBUG time=2026-07-22T13:46:50.178673Z span_id=0x1e33d46438546f4f msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"vr_nvl72\")" resolved_node_type=switch_vrnvl72_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.179061297Z level=SPAN span_id=0x1e33d46438546f4f span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/ApplySwitchSystemImage otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: hardware_type is required" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: hardware_type is required" rpc_method=ApplySwitchSystemImage rpc_service=rack_manager.RackManager timing_busy_ns=340251 timing_elapsed_us=2715 timing_idle_ns=2375333 timing_start_time=2026-07-22T13:46:50.176259006Z
rms-1  | 2026-07-22T13:46:50.184615339Z level=DEBUG time=2026-07-22T13:46:50.184467Z span_id=0xeac918672e03cd09 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=switch_gb200_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.186415672Z level=SPAN span_id=0xeac918672e03cd09 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/ConfigureScaleUpFabricManager otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=ConfigureScaleUpFabricManager rpc_service=rack_manager.RackManager timing_busy_ns=1965541 timing_elapsed_us=3824 timing_idle_ns=1858500 timing_start_time=2026-07-22T13:46:50.182455547Z
rms-1  | 2026-07-22T13:46:50.191447881Z level=DEBUG time=2026-07-22T13:46:50.191328Z span_id=0x649539995048f795 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=switch_gb300_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.191467047Z level=INFO time=2026-07-22T13:46:50.191397Z span_id=0x649539995048f795 msg="batch SDN factory-default reset request received" domain= total_nodes=1 location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.191622631Z level=INFO time=2026-07-22T13:46:50.191547Z span_id=0x649539995048f795 msg="processing SDN factory-default reset target" domain= node=batchresetswitchsdnfactorydefault-gb300_lenovo_delta node_type=6 rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.191792839Z level=WARN time=2026-07-22T13:46:50.191700Z span_id=0x649539995048f795 msg="failed to build switch for SDN factory-default reset" error="device batchresetswitchsdnfactorydefault-gb300_lenovo_delta missing host credentials" node=batchresetswitchsdnfactorydefault-gb300_lenovo_delta rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.191799381Z level=WARN time=2026-07-22T13:46:50.191719Z span_id=0x649539995048f795 msg="batch SDN factory-default reset created no jobs" domain= skipped=1 total_nodes=1 location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.191800631Z level=SPAN span_id=0x649539995048f795 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchResetSwitchSdnFactoryDefault otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=BatchResetSwitchSdnFactoryDefault rpc_service=rack_manager.RackManager timing_busy_ns=449958 timing_elapsed_us=2008 timing_idle_ns=1558750 timing_start_time=2026-07-22T13:46:50.189726839Z
rms-1  | 2026-07-22T13:46:50.197085881Z level=DEBUG time=2026-07-22T13:46:50.196986Z span_id=0x7ea0c0dbeac96cd3 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"vr_nvl72\")" resolved_node_type=switch_vrnvl72_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.197090089Z level=INFO time=2026-07-22T13:46:50.197029Z span_id=0x7ea0c0dbeac96cd3 msg="set scale-up fabric state request received" device_count=1 enabled=false location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.198771172Z level=INFO time=2026-07-22T13:46:50.198566Z span_id=0x7ea0c0dbeac96cd3 msg="setting scale-up fabric state" enabled=false node=batchsetscaleupfabricstate-vrnvl72_nvidia rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.198776922Z level=WARN time=2026-07-22T13:46:50.198712Z span_id=0x7ea0c0dbeac96cd3 msg="failed to build switch for scale-up fabric state update" error="device batchsetscaleupfabricstate-vrnvl72_nvidia missing host credentials" node=batchsetscaleupfabricstate-vrnvl72_nvidia rack=node-descriptor-rpc-matrix location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.200643922Z level=SPAN span_id=0x7ea0c0dbeac96cd3 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchSetScaleUpFabricState otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=BatchSetScaleUpFabricState rpc_service=rack_manager.RackManager timing_busy_ns=3579916 timing_elapsed_us=5245 timing_idle_ns=1665209 timing_start_time=2026-07-22T13:46:50.195266589Z
rms-1  | 2026-07-22T13:46:50.205536089Z level=DEBUG time=2026-07-22T13:46:50.205418Z span_id=0x5720e309a74ad5c7 msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=switch_gb200_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.205594922Z level=SPAN span_id=0x5720e309a74ad5c7 span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/GetScaleUpFabricState otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=GetScaleUpFabricState rpc_service=rack_manager.RackManager timing_busy_ns=127708 timing_elapsed_us=1608 timing_idle_ns=1480584 timing_start_time=2026-07-22T13:46:50.203907922Z
rms-1  | 2026-07-22T13:46:50.211582506Z level=DEBUG time=2026-07-22T13:46:50.211451Z span_id=0xcc4e07663a1d76fa msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb300\")" resolved_node_type=switch_gb300_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.211603172Z level=SPAN span_id=0xcc4e07663a1d76fa span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchGetScaleUpFabricServiceStatus otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=BatchGetScaleUpFabricServiceStatus rpc_service=rack_manager.RackManager timing_busy_ns=104416 timing_elapsed_us=1892 timing_idle_ns=1788334 timing_start_time=2026-07-22T13:46:50.209631964Z
rms-1  | 2026-07-22T13:46:50.217507547Z level=DEBUG time=2026-07-22T13:46:50.217392Z span_id=0x854b9a0ffe9fbdff msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"vr_nvl72\")" resolved_node_type=switch_vrnvl72_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.217518964Z level=SPAN span_id=0x854b9a0ffe9fbdff span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/SetScaleUpFabricTelemetryInterfaceState otel_status_code=ok peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=0 rpc_grpc_status_description="Code: The operation completed successfully, Message: " rpc_method=SetScaleUpFabricTelemetryInterfaceState rpc_service=rack_manager.RackManager timing_busy_ns=109292 timing_elapsed_us=1629 timing_idle_ns=1520041 timing_start_time=2026-07-22T13:46:50.215818381Z
rms-1  | 2026-07-22T13:46:50.222960631Z level=DEBUG time=2026-07-22T13:46:50.222863Z span_id=0xeb107b69da48aa7e msg="TEST EVIDENCE resolved node selector" node_type=None product_family="Some(\"gb200\")" resolved_node_type=switch_gb200_nvidia role="Some(\"switch\")" vendor="Some(\"NVIDIA\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.222965506Z level=INFO time=2026-07-22T13:46:50.222899Z span_id=0xeb107b69da48aa7e msg="ConfigureSwitchCertificate request received" domain=None node_count=1 service_count=0 test_hello=false location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.222966339Z level=WARN time=2026-07-22T13:46:50.222924Z span_id=0xeb107b69da48aa7e msg="ConfigureSwitchCertificate invalid services" domain=(insecure-switch) error="services must contain at least one SwitchService" service_count=0 location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.223014297Z level=SPAN span_id=0xeb107b69da48aa7e span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/ConfigureSwitchCertificate otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: services must contain at least one SwitchService" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: services must contain at least one SwitchService" rpc_method=ConfigureSwitchCertificate rpc_service=rack_manager.RackManager timing_busy_ns=108790 timing_elapsed_us=1850 timing_idle_ns=1741210 timing_start_time=2026-07-22T13:46:50.221094006Z
rms-1  | 2026-07-22T13:46:50.229150464Z level=DEBUG time=2026-07-22T13:46:50.228983Z span_id=0x1d1a499035528beb msg="TEST EVIDENCE failed to resolve node selector" error="unsupported node descriptor role=compute, vendor=futurecompute, product_family=futurefamilyx1" node_type=None product_family="Some(\"future-family-x1\")" role="Some(\"compute\")" vendor="Some(\"FutureCompute\")" location="<REDACTED>"
rms-1  | 2026-07-22T13:46:50.229232839Z level=SPAN span_id=0x1d1a499035528beb span_name=request http_response_status_code=200 http_url=https://127.0.0.1:19082/rack_manager.RackManager/BatchGetPowerState otel_status_code=error otel_status_message="gRPC Error: Client specified an invalid argument. Message: unsupported node descriptor role=compute, vendor=futurecompute, product_family=futurefamilyx1" peer_addr=<REDACTED_LOCAL_PEER> peer_identity="CN=nico-rms-client" rpc_grpc_status_code=3 rpc_grpc_status_description="Code: Client specified an invalid argument, Message: unsupported node descriptor role=compute, vendor=futurecompute, product_family=futurefamilyx1" rpc_method=BatchGetPowerState rpc_service=rack_manager.RackManager timing_busy_ns=252084 timing_elapsed_us=2337 timing_idle_ns=2085625 timing_start_time=2026-07-22T13:46:50.226786672Z

Signed-off-by: Jay Zhu <jayzhu@nvidia.com>
@jayzhudev jayzhudev self-assigned this Jul 21, 2026
@jayzhudev
jayzhudev requested review from a team and polarweasel as code owners July 21, 2026 22:56
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

The PR upgrades librms to v0.10.0 and replaces fixed RMS node-type resolution with descriptor-based identities. Rack profiles support arbitrary product families, while RMS requests retain optional legacy mappings and omit insecure certificate-acceptance fields.

Changes

RMS descriptor migration

Layer / File(s) Summary
Product-family and identity contracts
crates/api-model/..., crates/rpc/..., crates/rack/src/rms_node_type.rs, Cargo.toml
Product families support arbitrary non-empty strings, RPC conversion maps unknown values to UNSPECIFIED, and RmsNodeIdentity constructs descriptors with optional legacy mappings.
Component-manager descriptor wiring
crates/component-manager/..., crates/rack/src/firmware_update.rs, crates/site-explorer/src/machine_creator.rs
Component-manager, firmware, and site-explorer RMS requests apply role, vendor, and product-family descriptors and generate descriptor-based component filters.
Rack-controller propagation
crates/rack-controller/...
NMX, NVOS, firmware, and fabric-status flows resolve node identities and build descriptor-based RMS nodes.
Mock and test updates
crates/rack/src/rms_client.rs, crates/api-test-helper/..., crates/api-core/src/tests/..., crates/site-explorer/tests/...
Mocks retain node descriptors, obsolete switch-firmware RPC helpers are removed, and tests validate descriptors and endpoint presence.
Configuration documentation
book/src/configuration/..., docs/configuration/..., dev/mac-local-dev/README.md, docs/manuals/...
Documentation describes descriptor fields, trimming and non-empty validation, RMS-time support validation, compatibility behavior, and backend coverage.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant RackProfile
  participant ComponentManager
  participant RmsNodeIdentity
  participant NodeInfoBuilder
  participant RMS
  RackProfile->>ComponentManager: provide role, vendor, product_family
  ComponentManager->>RmsNodeIdentity: resolve descriptor identity
  RmsNodeIdentity->>NodeInfoBuilder: apply descriptor and optional legacy type
  NodeInfoBuilder->>RMS: send descriptor-based request and filters
  RMS-->>NodeInfoBuilder: return operation response
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 75.59% 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
Linked Issues check ✅ Passed The changes satisfy #3593 by upgrading librms, removing invalid-cert flags, adding VR product-family/vendor support, and updating NodeType mappings/docs.
Out of Scope Changes check ✅ Passed No clear out-of-scope changes are evident; the code, tests, and docs all support the descriptor-based RMS migration.
Title check ✅ Passed The title clearly summarizes the main change: switching node identity handling to descriptors.
Description check ✅ Passed The description accurately matches the descriptor-based RMS migration and related compatibility changes.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@github-actions

Copy link
Copy Markdown

@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

🧹 Nitpick comments (1)
crates/site-explorer/tests/integration/machine_creator.rs (1)

245-267: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Cover descriptor fallback for arbitrary product families.

This test only exercises Gb200, which also has a legacy NodeType mapping. Add a table-driven case for RackProductFamily::Other(...) that verifies the custom product_family is sent, while node.r#type remains None; this directly protects the PR’s descriptor-migration objective.

As per coding guidelines, input variants should be grouped using table-driven tests. Based on the PR objective, arbitrary product-family strings must be supported without closed NodeType mappings.

🤖 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/site-explorer/tests/integration/machine_creator.rs` around lines 245 -
267, Add a table-driven integration-test case alongside the existing descriptor
assertions for RackProductFamily::Other with an arbitrary product-family string.
Verify the custom product_family attribute is preserved and node.r#type is None,
while retaining the existing Gb200 coverage and assertions.

Source: Coding guidelines

🤖 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 `@docs/manuals/rack_level_admin.md`:
- Around line 41-46: Update the Dependencies section in rack_level_admin.md to
remove the unconditional NICo Flow, NSM, and PSM prerequisite. State that
NSM/PSM are required only when using those backends, and document RMS as the
alternative backend for deployments covering compute, switch, and power-shelf
roles.

---

Nitpick comments:
In `@crates/site-explorer/tests/integration/machine_creator.rs`:
- Around line 245-267: Add a table-driven integration-test case alongside the
existing descriptor assertions for RackProductFamily::Other with an arbitrary
product-family string. Verify the custom product_family attribute is preserved
and node.r#type is None, while retaining the existing Gb200 coverage and
assertions.
🪄 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: c644acc4-dae7-4225-9eca-44429d08a150

📥 Commits

Reviewing files that changed from the base of the PR and between e1eee96 and 548eedf.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (23)
  • Cargo.toml
  • book/src/configuration/configurability.md
  • crates/api-core/src/cfg/README.md
  • crates/api-core/src/setup.rs
  • crates/api-core/src/tests/rack_state_controller/handler.rs
  • crates/api-db/src/machine.rs
  • crates/api-db/src/power_shelf.rs
  • crates/api-db/src/switch.rs
  • crates/api-model/src/rack_type.rs
  • crates/api-test-helper/src/mock_rms.rs
  • crates/component-manager/src/component_manager.rs
  • crates/component-manager/src/rms.rs
  • crates/rack-controller/src/fabric_manager.rs
  • crates/rack-controller/src/maintenance.rs
  • crates/rack/src/firmware_update.rs
  • crates/rack/src/rms_client.rs
  • crates/rack/src/rms_node_type.rs
  • crates/rpc/src/model/rack_type.rs
  • crates/site-explorer/src/machine_creator.rs
  • crates/site-explorer/tests/integration/machine_creator.rs
  • dev/mac-local-dev/README.md
  • docs/configuration/component-manager-rms.md
  • docs/manuals/rack_level_admin.md

Comment thread docs/manuals/rack_level_admin.md Outdated
Signed-off-by: Jay Zhu <jayzhu@nvidia.com>
@jayzhudev jayzhudev added the rack lifecycle Issues that relate to managing the lifecycle of a full rack (compute, switches and powershelves) label Jul 22, 2026
Signed-off-by: Jay Zhu <jayzhu@nvidia.com>

@polarweasel polarweasel 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.

Check the one comment, but should be good to go

Comment thread dev/mac-local-dev/README.md
@jayzhudev
jayzhudev merged commit 7048da3 into NVIDIA:main Jul 22, 2026
64 checks passed
jayzhudev added a commit that referenced this pull request Jul 25, 2026
This is a follow-up doc fix for #3812

## Related issues

Supports #3593

## Type of Change

- [ ] **Add** - New feature or capability
- [ ] **Change** - Changes in existing functionality
- [ ] **Fix** - Bug fixes
- [ ] **Remove** - Removed features or deprecated functionality
- [x] **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
- [x] No testing required (docs, internal refactor, etc.)

Signed-off-by: Jay Zhu <jayzhu@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

rack lifecycle Issues that relate to managing the lifecycle of a full rack (compute, switches and powershelves)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: upgrade librms to v0.10.0

5 participants