@@ -499,87 +499,106 @@ fn parse_add_without_dpu_mode() {
499499 }
500500}
501501
502- // parse_add_with_dpu_mode_nic ensures `--dpu-mode nic-mode`
503- // parses to the NicMode variant.
502+ // `--dpu-mode <value>` parses to the matching DpuMode variant on both `add`
503+ // (alongside the required credential/chassis args) and `patch` (where flipping
504+ // dpu_mode on a single host is the whole point). The closure pulls dpu_mode off
505+ // whichever variant parsed; each row pins the parsed `Some(variant)`.
504506#[ test]
505- fn parse_add_with_dpu_mode_nic ( ) {
506- let cmd = Cmd :: try_parse_from ( [
507- "expected-machine" ,
508- "add" ,
509- "--bmc-mac-address" ,
510- "1a:2b:3c:4d:5e:6f" ,
511- "--bmc-username" ,
512- "admin" ,
513- "--bmc-password" ,
514- "secret" ,
515- "--chassis-serial-number" ,
516- "SN12345" ,
517- "--dpu-mode" ,
518- "nic-mode" ,
519- ] )
520- . expect ( "should parse nic-mode" ) ;
507+ fn parse_dpu_mode_to_its_variant ( ) {
508+ scenarios ! (
509+ run = |argv| {
510+ Cmd :: try_parse_from( argv. iter( ) . copied( ) )
511+ . map( |cmd| match cmd {
512+ Cmd :: Add ( args) => args. dpu_mode,
513+ Cmd :: Patch ( args) => args. dpu_mode,
514+ _ => panic!( "expected Add or Patch variant" ) ,
515+ } )
516+ . map_err( drop)
517+ } ;
518+ "add --dpu-mode nic-mode" {
519+ & [
520+ "expected-machine" ,
521+ "add" ,
522+ "--bmc-mac-address" ,
523+ "1a:2b:3c:4d:5e:6f" ,
524+ "--bmc-username" ,
525+ "admin" ,
526+ "--bmc-password" ,
527+ "secret" ,
528+ "--chassis-serial-number" ,
529+ "SN12345" ,
530+ "--dpu-mode" ,
531+ "nic-mode" ,
532+ ] [ ..] => Yields ( Some ( rpc:: forge:: DpuMode :: NicMode ) ) ,
533+ }
521534
522- match cmd {
523- Cmd :: Add ( args) => {
524- assert ! ( matches!( args. dpu_mode, Some ( rpc:: forge:: DpuMode :: NicMode ) ) ) ;
535+ "add --dpu-mode no-dpu" {
536+ & [
537+ "expected-machine" ,
538+ "add" ,
539+ "--bmc-mac-address" ,
540+ "1a:2b:3c:4d:5e:6f" ,
541+ "--bmc-username" ,
542+ "admin" ,
543+ "--bmc-password" ,
544+ "secret" ,
545+ "--chassis-serial-number" ,
546+ "SN12345" ,
547+ "--dpu-mode" ,
548+ "no-dpu" ,
549+ ] [ ..] => Yields ( Some ( rpc:: forge:: DpuMode :: NoDpu ) ) ,
525550 }
526- _ => panic ! ( "expected Add variant" ) ,
527- }
528- }
529551
530- // parse_add_with_dpu_mode_no_dpu ensures `--dpu-mode no-dpu` parses
531- // correctly (host with zero DPU hardware at all).
532- #[ test]
533- fn parse_add_with_dpu_mode_no_dpu ( ) {
534- let cmd = Cmd :: try_parse_from ( [
535- "expected-machine" ,
536- "add" ,
537- "--bmc-mac-address" ,
538- "1a:2b:3c:4d:5e:6f" ,
539- "--bmc-username" ,
540- "admin" ,
541- "--bmc-password" ,
542- "secret" ,
543- "--chassis-serial-number" ,
544- "SN12345" ,
545- "--dpu-mode" ,
546- "no-dpu" ,
547- ] )
548- . expect ( "should parse no-dpu" ) ;
552+ "add --dpu-mode dpu-mode" {
553+ & [
554+ "expected-machine" ,
555+ "add" ,
556+ "--bmc-mac-address" ,
557+ "1a:2b:3c:4d:5e:6f" ,
558+ "--bmc-username" ,
559+ "admin" ,
560+ "--bmc-password" ,
561+ "secret" ,
562+ "--chassis-serial-number" ,
563+ "SN12345" ,
564+ "--dpu-mode" ,
565+ "dpu-mode" ,
566+ ] [ ..] => Yields ( Some ( rpc:: forge:: DpuMode :: DpuMode ) ) ,
567+ }
549568
550- match cmd {
551- Cmd :: Add ( args) => {
552- assert ! ( matches!( args. dpu_mode, Some ( rpc:: forge:: DpuMode :: NoDpu ) ) ) ;
569+ "patch --dpu-mode nic-mode" {
570+ & [
571+ "expected-machine" ,
572+ "patch" ,
573+ "--bmc-mac-address" ,
574+ "1a:2b:3c:4d:5e:6f" ,
575+ "--dpu-mode" ,
576+ "nic-mode" ,
577+ ] [ ..] => Yields ( Some ( rpc:: forge:: DpuMode :: NicMode ) ) ,
553578 }
554- _ => panic ! ( "expected Add variant" ) ,
555- }
556- }
557579
558- // parse_add_with_dpu_mode_dpu ensures `--dpu-mode dpu-mode` parses.
559- #[ test]
560- fn parse_add_with_dpu_mode_dpu ( ) {
561- let cmd = Cmd :: try_parse_from ( [
562- "expected-machine" ,
563- "add" ,
564- "--bmc-mac-address" ,
565- "1a:2b:3c:4d:5e:6f" ,
566- "--bmc-username" ,
567- "admin" ,
568- "--bmc-password" ,
569- "secret" ,
570- "--chassis-serial-number" ,
571- "SN12345" ,
572- "--dpu-mode" ,
573- "dpu-mode" ,
574- ] )
575- . expect ( "should parse dpu-mode" ) ;
580+ "patch --dpu-mode no-dpu" {
581+ & [
582+ "expected-machine" ,
583+ "patch" ,
584+ "--bmc-mac-address" ,
585+ "1a:2b:3c:4d:5e:6f" ,
586+ "--dpu-mode" ,
587+ "no-dpu" ,
588+ ] [ ..] => Yields ( Some ( rpc:: forge:: DpuMode :: NoDpu ) ) ,
589+ }
576590
577- match cmd {
578- Cmd :: Add ( args) => {
579- assert ! ( matches!( args. dpu_mode, Some ( rpc:: forge:: DpuMode :: DpuMode ) ) ) ;
591+ "patch --dpu-mode dpu-mode" {
592+ & [
593+ "expected-machine" ,
594+ "patch" ,
595+ "--bmc-mac-address" ,
596+ "1a:2b:3c:4d:5e:6f" ,
597+ "--dpu-mode" ,
598+ "dpu-mode" ,
599+ ] [ ..] => Yields ( Some ( rpc:: forge:: DpuMode :: DpuMode ) ) ,
580600 }
581- _ => panic ! ( "expected Add variant" ) ,
582- }
601+ ) ;
583602}
584603
585604// parse_add_rejects_invalid_dpu_mode ensures clap rejects values that
@@ -606,74 +625,6 @@ fn parse_add_rejects_invalid_dpu_mode() {
606625 ) ;
607626}
608627
609- // parse_patch_with_dpu_mode_nic ensures `patch ... --dpu-mode nic-mode`
610- // parses to NicMode. Patch users flip dpu_mode on a single host without
611- // rewriting the entire ExpectedMachine.
612- #[ test]
613- fn parse_patch_with_dpu_mode_nic ( ) {
614- let cmd = Cmd :: try_parse_from ( [
615- "expected-machine" ,
616- "patch" ,
617- "--bmc-mac-address" ,
618- "1a:2b:3c:4d:5e:6f" ,
619- "--dpu-mode" ,
620- "nic-mode" ,
621- ] )
622- . expect ( "should parse patch --dpu-mode nic-mode" ) ;
623-
624- match cmd {
625- Cmd :: Patch ( args) => {
626- assert ! ( matches!( args. dpu_mode, Some ( rpc:: forge:: DpuMode :: NicMode ) ) ) ;
627- }
628- _ => panic ! ( "expected Patch variant" ) ,
629- }
630- }
631-
632- // parse_patch_with_dpu_mode_no_dpu ensures `patch ... --dpu-mode no-dpu`
633- // parses (host with no DPU hardware at all).
634- #[ test]
635- fn parse_patch_with_dpu_mode_no_dpu ( ) {
636- let cmd = Cmd :: try_parse_from ( [
637- "expected-machine" ,
638- "patch" ,
639- "--bmc-mac-address" ,
640- "1a:2b:3c:4d:5e:6f" ,
641- "--dpu-mode" ,
642- "no-dpu" ,
643- ] )
644- . expect ( "should parse patch --dpu-mode no-dpu" ) ;
645-
646- match cmd {
647- Cmd :: Patch ( args) => {
648- assert ! ( matches!( args. dpu_mode, Some ( rpc:: forge:: DpuMode :: NoDpu ) ) ) ;
649- }
650- _ => panic ! ( "expected Patch variant" ) ,
651- }
652- }
653-
654- // parse_patch_with_dpu_mode_dpu ensures `patch ... --dpu-mode dpu-mode`
655- // parses; this is how operators revert a host back to the default after
656- // previously setting NicMode/NoDpu.
657- #[ test]
658- fn parse_patch_with_dpu_mode_dpu ( ) {
659- let cmd = Cmd :: try_parse_from ( [
660- "expected-machine" ,
661- "patch" ,
662- "--bmc-mac-address" ,
663- "1a:2b:3c:4d:5e:6f" ,
664- "--dpu-mode" ,
665- "dpu-mode" ,
666- ] )
667- . expect ( "should parse patch --dpu-mode dpu-mode" ) ;
668-
669- match cmd {
670- Cmd :: Patch ( args) => {
671- assert ! ( matches!( args. dpu_mode, Some ( rpc:: forge:: DpuMode :: DpuMode ) ) ) ;
672- }
673- _ => panic ! ( "expected Patch variant" ) ,
674- }
675- }
676-
677628// validate_patch_with_dpu_mode_only ensures `patch --dpu-mode nic-mode`
678629// alone (no other patchable fields) satisfies clap's ArgGroup and the
679630// `Args::validate()` "at least one field" check. The whole point of this
0 commit comments