Skip to content

Commit 1591e21

Browse files
authored
[reconfigurator] RoT planner support (#8421)
This commit implements support for RoT updates in the planner and support for reconfigurator-cli updates as well.
1 parent 6a93f8c commit 1591e21

File tree

20 files changed

+1797
-138
lines changed

20 files changed

+1797
-138
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dev-tools/reconfigurator-cli/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ iddqd.workspace = true
2323
indent_write.workspace = true
2424
internal-dns-types.workspace = true
2525
itertools.workspace = true
26+
gateway-types.workspace = true
2627
newtype-uuid.workspace = true
2728
nexus-inventory.workspace = true
2829
nexus-reconfigurator-blippy.workspace = true

dev-tools/reconfigurator-cli/src/lib.rs

Lines changed: 88 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ fn process_command(
235235
Commands::SledUpdateInstallDataset(args) => {
236236
cmd_sled_update_install_dataset(sim, args)
237237
}
238+
Commands::SledUpdateRot(args) => cmd_sled_update_rot(sim, args),
238239
Commands::SledUpdateSp(args) => cmd_sled_update_sp(sim, args),
239240
Commands::SledUpdateRotBootloader(args) => {
240241
cmd_sled_update_rot_bootlaoder(sim, args)
@@ -293,6 +294,8 @@ enum Commands {
293294
SledSet(SledSetArgs),
294295
/// update the install dataset on a sled, simulating a mupdate
295296
SledUpdateInstallDataset(SledUpdateInstallDatasetArgs),
297+
/// simulate updating the sled's RoT versions
298+
SledUpdateRot(SledUpdateRotArgs),
296299
/// simulate updating the sled's RoT Bootloader versions
297300
SledUpdateRotBootloader(SledUpdateRotBootloaderArgs),
298301
/// simulate updating the sled's SP versions
@@ -528,6 +531,20 @@ struct SledUpdateSpArgs {
528531
inactive: Option<ExpectedVersion>,
529532
}
530533

534+
#[derive(Debug, Args)]
535+
struct SledUpdateRotArgs {
536+
/// id of the sled
537+
sled_id: SledUuid,
538+
539+
/// sets the version reported for the RoT slot a
540+
#[clap(long, required_unless_present_any = &["slot_b"])]
541+
slot_a: Option<ExpectedVersion>,
542+
543+
/// sets the version reported for the RoT slot b
544+
#[clap(long, required_unless_present_any = &["slot_a"])]
545+
slot_b: Option<ExpectedVersion>,
546+
}
547+
531548
#[derive(Debug, Args)]
532549
struct SledSetMupdateOverrideArgs {
533550
#[clap(flatten)]
@@ -1380,6 +1397,15 @@ fn cmd_sled_show(
13801397
let stage0_next_version = description.sled_stage0_next_version(sled_id)?;
13811398
let sp_active_version = description.sled_sp_active_version(sled_id)?;
13821399
let sp_inactive_version = description.sled_sp_inactive_version(sled_id)?;
1400+
let rot_active_slot = description.sled_rot_active_slot(sled_id)?;
1401+
let rot_slot_a_version = description.sled_rot_slot_a_version(sled_id)?;
1402+
let rot_slot_b_version = description.sled_rot_slot_b_version(sled_id)?;
1403+
let rot_persistent_boot_preference =
1404+
description.sled_rot_persistent_boot_preference(sled_id)?;
1405+
let rot_pending_persistent_boot_preference =
1406+
description.sled_rot_pending_persistent_boot_preference(sled_id)?;
1407+
let rot_transient_boot_preference =
1408+
description.sled_rot_transient_boot_preference(sled_id)?;
13831409
let planning_input = description
13841410
.to_planning_input_builder()
13851411
.context("failed to generate planning_input builder")?
@@ -1390,14 +1416,32 @@ fn cmd_sled_show(
13901416
swriteln!(s, "sled {} ({}, {})", sled_id, sled.policy, sled.state);
13911417
swriteln!(s, "serial {}", sled.baseboard_id.serial_number);
13921418
swriteln!(s, "subnet {}", sled_resources.subnet.net());
1393-
swriteln!(s, "RoT bootloader stage 0 version: {:?}", stage0_version);
1419+
swriteln!(s, "SP active version: {:?}", sp_active_version);
1420+
swriteln!(s, "SP inactive version: {:?}", sp_inactive_version);
1421+
swriteln!(s, "RoT bootloader stage 0 version: {:?}", stage0_version);
13941422
swriteln!(
13951423
s,
13961424
"RoT bootloader stage 0 next version: {:?}",
13971425
stage0_next_version
13981426
);
1399-
swriteln!(s, "SP active version: {:?}", sp_active_version);
1400-
swriteln!(s, "SP inactive version: {:?}", sp_inactive_version);
1427+
swriteln!(s, "RoT active slot: {}", rot_active_slot);
1428+
swriteln!(s, "RoT slot A version: {:?}", rot_slot_a_version);
1429+
swriteln!(s, "RoT slot B version: {:?}", rot_slot_b_version);
1430+
swriteln!(
1431+
s,
1432+
"RoT persistent boot preference: {}",
1433+
rot_persistent_boot_preference
1434+
);
1435+
swriteln!(
1436+
s,
1437+
"RoT pending persistent boot preference: {:?}",
1438+
rot_pending_persistent_boot_preference
1439+
);
1440+
swriteln!(
1441+
s,
1442+
"RoT transient boot preference: {:?}",
1443+
rot_transient_boot_preference
1444+
);
14011445
swriteln!(s, "zpools ({}):", sled_resources.zpools.len());
14021446
for (zpool, disk) in &sled_resources.zpools {
14031447
swriteln!(s, " {:?}", zpool);
@@ -1604,6 +1648,47 @@ fn cmd_sled_update_sp(
16041648
Ok(Some(format!("set sled {} SP versions: {}", sled_id, labels.join(", "))))
16051649
}
16061650

1651+
fn cmd_sled_update_rot(
1652+
sim: &mut ReconfiguratorSim,
1653+
args: SledUpdateRotArgs,
1654+
) -> anyhow::Result<Option<String>> {
1655+
let mut labels = Vec::new();
1656+
1657+
if let Some(slot_a) = &args.slot_a {
1658+
labels.push(format!("slot a -> {}", slot_a));
1659+
}
1660+
if let Some(slot_b) = &args.slot_b {
1661+
labels.push(format!("slot b -> {}", slot_b));
1662+
}
1663+
1664+
assert!(
1665+
!labels.is_empty(),
1666+
"clap configuration requires that at least one argument is specified"
1667+
);
1668+
1669+
let mut state = sim.current_state().to_mut();
1670+
state.system_mut().description_mut().sled_update_rot_versions(
1671+
args.sled_id,
1672+
args.slot_a,
1673+
args.slot_b,
1674+
)?;
1675+
1676+
sim.commit_and_bump(
1677+
format!(
1678+
"reconfigurator-cli sled-update-rot: {}: {}",
1679+
args.sled_id,
1680+
labels.join(", "),
1681+
),
1682+
state,
1683+
);
1684+
1685+
Ok(Some(format!(
1686+
"set sled {} RoT settings: {}",
1687+
args.sled_id,
1688+
labels.join(", ")
1689+
)))
1690+
}
1691+
16071692
fn cmd_inventory_list(
16081693
sim: &mut ReconfiguratorSim,
16091694
) -> anyhow::Result<Option<String>> {

dev-tools/reconfigurator-cli/tests/input/cmds-target-release.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,4 @@ blueprint-diff 7f976e0d-d2a5-4eeb-9e82-c82bc2824aba 9034c710-3e57-45f3-99e5-4316
7474

7575
# We should continue walking through the update. We need to build out a
7676
# reconfigurator-cli subcommand to simulate updated zone image sources (just
77-
# like we have sled-update-sp for simulated SP updates).
77+
# like we have sled-update-sp for simulated SP updates).

dev-tools/reconfigurator-cli/tests/input/cmds.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@ sled-add 90c1102a-b9f5-4d88-92a2-60d54a2d98cc
1313
sled-add 04ef3330-c682-4a08-8def-fcc4bef31bcd --policy non-provisionable
1414
sled-list
1515

16+
sled-update-rot dde1c0e2-b10d-4621-b420-f179f7a7a00a
17+
sled-update-rot dde1c0e2-b10d-4621-b420-f179f7a7a00a --slot-a 1.0.0
18+
sled-show dde1c0e2-b10d-4621-b420-f179f7a7a00a
19+
sled-update-rot dde1c0e2-b10d-4621-b420-f179f7a7a00a --slot-b 2.0.0
20+
sled-show dde1c0e2-b10d-4621-b420-f179f7a7a00a
21+
sled-update-rot dde1c0e2-b10d-4621-b420-f179f7a7a00a --slot-a 3.0.0
22+
sled-show dde1c0e2-b10d-4621-b420-f179f7a7a00a
23+
sled-update-rot dde1c0e2-b10d-4621-b420-f179f7a7a00a --slot-a 4.0.0 --slot-b invalid
24+
sled-show dde1c0e2-b10d-4621-b420-f179f7a7a00a
25+
sled-update-rot dde1c0e2-b10d-4621-b420-f179f7a7a00a --slot-a 4.0.0 --slot-b 5.0.0
26+
sled-show dde1c0e2-b10d-4621-b420-f179f7a7a00a
27+
1628
sled-update-sp dde1c0e2-b10d-4621-b420-f179f7a7a00a
1729
sled-update-sp dde1c0e2-b10d-4621-b420-f179f7a7a00a --active 1.0.0
1830
sled-show dde1c0e2-b10d-4621-b420-f179f7a7a00a

dev-tools/reconfigurator-cli/tests/output/cmds-example-stdout

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,16 @@ T ENA ID PARENT
4242
sled 2eb69596-f081-4e2d-9425-9994926e0832 (in service, active)
4343
serial serial1
4444
subnet fd00:1122:3344:102::/64
45-
RoT bootloader stage 0 version: Some("0.0.1")
46-
RoT bootloader stage 0 next version: None
47-
SP active version: Some("0.0.1")
45+
SP active version: Some("0.0.1")
4846
SP inactive version: None
47+
RoT bootloader stage 0 version: Some("0.0.1")
48+
RoT bootloader stage 0 next version: None
49+
RoT active slot: A
50+
RoT slot A version: Some("0.0.2")
51+
RoT slot B version: None
52+
RoT persistent boot preference: A
53+
RoT pending persistent boot preference: None
54+
RoT transient boot preference: None
4955
zpools (10):
5056
055c4910-b641-46d9-b52d-313aae9d9cbf (zpool)
5157
SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-055c4910-b641-46d9-b52d-313aae9d9cbf" }, disk_id: 6a0cb52f-5cc2-48a5-9f44-ac8dea3ac45b (physical_disk), policy: InService, state: Active }
@@ -429,10 +435,16 @@ T ENA ID PARENT
429435
sled 89d02b1b-478c-401a-8e28-7a26f74fa41b (in service, active)
430436
serial serial0
431437
subnet fd00:1122:3344:101::/64
432-
RoT bootloader stage 0 version: Some("0.0.1")
433-
RoT bootloader stage 0 next version: None
434-
SP active version: Some("0.0.1")
438+
SP active version: Some("0.0.1")
435439
SP inactive version: None
440+
RoT bootloader stage 0 version: Some("0.0.1")
441+
RoT bootloader stage 0 next version: None
442+
RoT active slot: A
443+
RoT slot A version: Some("0.0.2")
444+
RoT slot B version: None
445+
RoT persistent boot preference: A
446+
RoT pending persistent boot preference: None
447+
RoT transient boot preference: None
436448
zpools (4):
437449
0477165a-a72e-4814-b8d6-74aa02cb2040 (zpool)
438450
SledDisk { disk_identity: DiskIdentity { vendor: "fake-vendor", model: "fake-model", serial: "serial-0477165a-a72e-4814-b8d6-74aa02cb2040" }, disk_id: 6a5a31ab-4edc-44e0-a7a1-4190bfe582f7 (physical_disk), policy: InService, state: Active }
@@ -1038,9 +1050,10 @@ Sled serial0
10381050
A 0101010101010101010101010101010101010101010101010101010101010101
10391051
B 0202020202020202020202020202020202020202020202020202020202020202
10401052
cabooses:
1041-
SLOT BOARD NAME VERSION GIT_COMMIT SIGN
1042-
SpSlot0 SimGimletSp SimGimletSp 0.0.1 unknown n/a
1043-
Stage0 SimRotStage0 SimRotStage0 0.0.1 unknown n/a
1053+
SLOT BOARD NAME VERSION GIT_COMMIT SIGN
1054+
SpSlot0 SimGimletSp SimGimletSp 0.0.1 unknown n/a
1055+
RotSlotA SimRot SimRot 0.0.2 unknown n/a
1056+
Stage0 SimRotStage0 SimRotStage0 0.0.1 unknown n/a
10441057
RoT pages:
10451058
SLOT DATA_BASE64
10461059
RoT: active slot: slot A
@@ -1062,9 +1075,10 @@ Sled serial1
10621075
A 0101010101010101010101010101010101010101010101010101010101010101
10631076
B 0202020202020202020202020202020202020202020202020202020202020202
10641077
cabooses:
1065-
SLOT BOARD NAME VERSION GIT_COMMIT SIGN
1066-
SpSlot0 SimGimletSp SimGimletSp 0.0.1 unknown n/a
1067-
Stage0 SimRotStage0 SimRotStage0 0.0.1 unknown n/a
1078+
SLOT BOARD NAME VERSION GIT_COMMIT SIGN
1079+
SpSlot0 SimGimletSp SimGimletSp 0.0.1 unknown n/a
1080+
RotSlotA SimRot SimRot 0.0.2 unknown n/a
1081+
Stage0 SimRotStage0 SimRotStage0 0.0.1 unknown n/a
10681082
RoT pages:
10691083
SLOT DATA_BASE64
10701084
RoT: active slot: slot A
@@ -1086,9 +1100,10 @@ Sled serial2
10861100
A 0101010101010101010101010101010101010101010101010101010101010101
10871101
B 0202020202020202020202020202020202020202020202020202020202020202
10881102
cabooses:
1089-
SLOT BOARD NAME VERSION GIT_COMMIT SIGN
1090-
SpSlot0 SimGimletSp SimGimletSp 0.0.1 unknown n/a
1091-
Stage0 SimRotStage0 SimRotStage0 0.0.1 unknown n/a
1103+
SLOT BOARD NAME VERSION GIT_COMMIT SIGN
1104+
SpSlot0 SimGimletSp SimGimletSp 0.0.1 unknown n/a
1105+
RotSlotA SimRot SimRot 0.0.2 unknown n/a
1106+
Stage0 SimRotStage0 SimRotStage0 0.0.1 unknown n/a
10921107
RoT pages:
10931108
SLOT DATA_BASE64
10941109
RoT: active slot: slot A

dev-tools/reconfigurator-cli/tests/output/cmds-mupdate-update-flow-stdout

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ INFO extracting uploaded archive to <EXTRACTING_UPLOADED_ARCHIVE_TO_REDACTED>
1919
INFO created directory to store extracted artifacts, path: <CREATED_DIRECTORY_TO_STORE_EXTRACTED_ARTIFACTS_PATH_REDACTED>
2020
INFO added artifact, name: installinator_document, kind: installinator_document, version: 1.0.0, hash: c6ae866031d1183094c92cde9d9d1fd5f18356abc81a842ce31471b473fd5582, length: 367
2121
INFO added artifact, name: SimGimletSp, kind: gimlet_sp, version: 1.0.0, hash: 7e6667e646ad001b54c8365a3d309c03f89c59102723d38d01697ee8079fe670, length: 747
22-
INFO added artifact, name: fake-gimlet-rot, kind: gimlet_rot_image_a, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
23-
INFO added artifact, name: fake-gimlet-rot, kind: gimlet_rot_image_b, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
22+
INFO added artifact, name: SimRot, kind: gimlet_rot_image_a, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
23+
INFO added artifact, name: SimRot, kind: gimlet_rot_image_b, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
2424
INFO added artifact, name: SimRotStage0, kind: gimlet_rot_bootloader, version: 1.0.0, hash: 005ea358f1cd316df42465b1e3a0334ea22cc0c0442cf9ddf9b42fbf49780236, length: 750
2525
INFO added artifact, name: fake-host, kind: host_phase_1, version: 1.0.0, hash: 2053f8594971bbf0a7326c833e2ffc12b065b9d823b9c0b967d275fa595e4e89, length: 524288
2626
INFO added artifact, name: fake-host, kind: host_phase_2, version: 1.0.0, hash: f3dd0c7a1bd4500ea0d8bcf67581f576d47752b2f1998a4cb0f0c3155c483008, length: 1048576
@@ -821,8 +821,8 @@ INFO extracting uploaded archive to <EXTRACTING_UPLOADED_ARCHIVE_TO_REDACTED>
821821
INFO created directory to store extracted artifacts, path: <CREATED_DIRECTORY_TO_STORE_EXTRACTED_ARTIFACTS_PATH_REDACTED>
822822
INFO added artifact, name: installinator_document, kind: installinator_document, version: 1.0.0, hash: c6ae866031d1183094c92cde9d9d1fd5f18356abc81a842ce31471b473fd5582, length: 367
823823
INFO added artifact, name: SimGimletSp, kind: gimlet_sp, version: 1.0.0, hash: 7e6667e646ad001b54c8365a3d309c03f89c59102723d38d01697ee8079fe670, length: 747
824-
INFO added artifact, name: fake-gimlet-rot, kind: gimlet_rot_image_a, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
825-
INFO added artifact, name: fake-gimlet-rot, kind: gimlet_rot_image_b, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
824+
INFO added artifact, name: SimRot, kind: gimlet_rot_image_a, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
825+
INFO added artifact, name: SimRot, kind: gimlet_rot_image_b, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
826826
INFO added artifact, name: SimRotStage0, kind: gimlet_rot_bootloader, version: 1.0.0, hash: 005ea358f1cd316df42465b1e3a0334ea22cc0c0442cf9ddf9b42fbf49780236, length: 750
827827
INFO added artifact, name: fake-host, kind: host_phase_1, version: 1.0.0, hash: 2053f8594971bbf0a7326c833e2ffc12b065b9d823b9c0b967d275fa595e4e89, length: 524288
828828
INFO added artifact, name: fake-host, kind: host_phase_2, version: 1.0.0, hash: f3dd0c7a1bd4500ea0d8bcf67581f576d47752b2f1998a4cb0f0c3155c483008, length: 1048576
@@ -2136,10 +2136,13 @@ INFO sufficient InternalDns zones exist in plan, desired_count: 3, current_count
21362136
INFO sufficient ExternalDns zones exist in plan, desired_count: 3, current_count: 3
21372137
INFO sufficient Nexus zones exist in plan, desired_count: 3, current_count: 3
21382138
INFO sufficient Oximeter zones exist in plan, desired_count: 0, current_count: 0
2139+
WARN cannot configure RoT update for board (missing sign in caboose from inventory), serial_number: serial0, part_number: model0
21392140
WARN cannot configure SP update for board (no matching artifact), serial_number: serial0, part_number: model0
21402141
INFO skipping board for MGS-driven update, serial_number: serial0, part_number: model0
2142+
WARN cannot configure RoT update for board (missing sign in caboose from inventory), serial_number: serial1, part_number: model1
21412143
WARN cannot configure SP update for board (no matching artifact), serial_number: serial1, part_number: model1
21422144
INFO skipping board for MGS-driven update, serial_number: serial1, part_number: model1
2145+
WARN cannot configure RoT update for board (missing sign in caboose from inventory), serial_number: serial2, part_number: model2
21432146
WARN cannot configure SP update for board (no matching artifact), serial_number: serial2, part_number: model2
21442147
INFO skipping board for MGS-driven update, serial_number: serial2, part_number: model2
21452148
INFO ran out of boards for MGS-driven update

dev-tools/reconfigurator-cli/tests/output/cmds-noop-image-source-stdout

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ INFO extracting uploaded archive to <EXTRACTING_UPLOADED_ARCHIVE_TO_REDACTED>
4141
INFO created directory to store extracted artifacts, path: <CREATED_DIRECTORY_TO_STORE_EXTRACTED_ARTIFACTS_PATH_REDACTED>
4242
INFO added artifact, name: installinator_document, kind: installinator_document, version: 1.0.0, hash: c6ae866031d1183094c92cde9d9d1fd5f18356abc81a842ce31471b473fd5582, length: 367
4343
INFO added artifact, name: SimGimletSp, kind: gimlet_sp, version: 1.0.0, hash: 7e6667e646ad001b54c8365a3d309c03f89c59102723d38d01697ee8079fe670, length: 747
44-
INFO added artifact, name: fake-gimlet-rot, kind: gimlet_rot_image_a, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
45-
INFO added artifact, name: fake-gimlet-rot, kind: gimlet_rot_image_b, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
44+
INFO added artifact, name: SimRot, kind: gimlet_rot_image_a, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
45+
INFO added artifact, name: SimRot, kind: gimlet_rot_image_b, version: 1.0.0, hash: 04e4a7fdb84acca92c8fd3235e26d64ea61bef8a5f98202589fd346989c5720a, length: 735
4646
INFO added artifact, name: SimRotStage0, kind: gimlet_rot_bootloader, version: 1.0.0, hash: 005ea358f1cd316df42465b1e3a0334ea22cc0c0442cf9ddf9b42fbf49780236, length: 750
4747
INFO added artifact, name: fake-host, kind: host_phase_1, version: 1.0.0, hash: 2053f8594971bbf0a7326c833e2ffc12b065b9d823b9c0b967d275fa595e4e89, length: 524288
4848
INFO added artifact, name: fake-host, kind: host_phase_2, version: 1.0.0, hash: f3dd0c7a1bd4500ea0d8bcf67581f576d47752b2f1998a4cb0f0c3155c483008, length: 1048576

dev-tools/reconfigurator-cli/tests/output/cmds-stderr

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
error: the following required arguments were not provided:
2+
--slot-a <SLOT_A>
3+
--slot-b <SLOT_B>
4+
5+
Usage: sled-update-rot --slot-a <SLOT_A> --slot-b <SLOT_B> <SLED_ID>
6+
7+
For more information, try '--help'.
18
error: the following required arguments were not provided:
29
--active <ACTIVE>
310
--inactive <INACTIVE>

0 commit comments

Comments
 (0)