@@ -485,58 +485,68 @@ impl Configurator {
485
485
} ;
486
486
end_datetime = chrono:: Local :: now ( ) ;
487
487
} else if dsc_resource. capabilities . contains ( & Capability :: Delete ) {
488
- if self . context . execution_type == ExecutionKind :: WhatIf {
489
- // TODO: add delete what-if support
490
- return Err ( DscError :: NotSupported ( t ! ( "configure.mod.whatIfNotSupportedForDelete" ) . to_string ( ) ) ) ;
491
- }
492
488
debug ! ( "{}" , t!( "configure.mod.implementsDelete" ) ) ;
493
- let before_result = match dsc_resource. get ( & desired) {
494
- Ok ( result) => result,
495
- Err ( e) => {
496
- progress. set_failure ( get_failure_from_error ( & e) ) ;
497
- progress. write_increment ( 1 ) ;
498
- return Err ( e) ;
499
- } ,
500
- } ;
501
- start_datetime = chrono:: Local :: now ( ) ;
502
- if let Err ( e) = dsc_resource. delete ( & desired) {
503
- progress. set_failure ( get_failure_from_error ( & e) ) ;
504
- progress. write_increment ( 1 ) ;
505
- return Err ( e) ;
506
- }
507
- let after_result = match dsc_resource. get ( & desired) {
508
- Ok ( result) => result,
509
- Err ( e) => {
489
+ if self . context . execution_type == ExecutionKind :: WhatIf {
490
+ // Let the resource handle WhatIf via set (-w), which may route to delete
491
+ start_datetime = chrono:: Local :: now ( ) ;
492
+ set_result = match dsc_resource. set ( & desired, skip_test, & self . context . execution_type ) {
493
+ Ok ( result) => result,
494
+ Err ( e) => {
495
+ progress. set_failure ( get_failure_from_error ( & e) ) ;
496
+ progress. write_increment ( 1 ) ;
497
+ return Err ( e) ;
498
+ } ,
499
+ } ;
500
+ end_datetime = chrono:: Local :: now ( ) ;
501
+ } else {
502
+ let before_result = match dsc_resource. get ( & desired) {
503
+ Ok ( result) => result,
504
+ Err ( e) => {
505
+ progress. set_failure ( get_failure_from_error ( & e) ) ;
506
+ progress. write_increment ( 1 ) ;
507
+ return Err ( e) ;
508
+ } ,
509
+ } ;
510
+ start_datetime = chrono:: Local :: now ( ) ;
511
+ if let Err ( e) = dsc_resource. delete ( & desired) {
510
512
progress. set_failure ( get_failure_from_error ( & e) ) ;
511
513
progress. write_increment ( 1 ) ;
512
514
return Err ( e) ;
513
- } ,
514
- } ;
515
- // convert get result to set result
516
- set_result = match before_result {
517
- GetResult :: Resource ( before_response) => {
518
- let GetResult :: Resource ( after_result) = after_result else {
515
+ }
516
+ let after_result = match dsc_resource. get ( & desired) {
517
+ Ok ( result) => result,
518
+ Err ( e) => {
519
+ progress. set_failure ( get_failure_from_error ( & e) ) ;
520
+ progress. write_increment ( 1 ) ;
521
+ return Err ( e) ;
522
+ } ,
523
+ } ;
524
+ // convert get result to set result
525
+ set_result = match before_result {
526
+ GetResult :: Resource ( before_response) => {
527
+ let GetResult :: Resource ( after_result) = after_result else {
528
+ return Err ( DscError :: NotSupported ( t ! ( "configure.mod.groupNotSupportedForDelete" ) . to_string ( ) ) )
529
+ } ;
530
+ let diff = get_diff ( & before_response. actual_state , & after_result. actual_state ) ;
531
+ let mut before: Map < String , Value > = serde_json:: from_value ( before_response. actual_state ) ?;
532
+ // a `get` will return a `result` property, but an actual `set` will have that as `resources`
533
+ if before. contains_key ( "result" ) && !before. contains_key ( "resources" ) {
534
+ before. insert ( "resources" . to_string ( ) , before[ "result" ] . clone ( ) ) ;
535
+ before. remove ( "result" ) ;
536
+ }
537
+ let before_value = serde_json:: to_value ( & before) ?;
538
+ SetResult :: Resource ( ResourceSetResponse {
539
+ before_state : before_value. clone ( ) ,
540
+ after_state : after_result. actual_state ,
541
+ changed_properties : Some ( diff) ,
542
+ } )
543
+ } ,
544
+ GetResult :: Group ( _) => {
519
545
return Err ( DscError :: NotSupported ( t ! ( "configure.mod.groupNotSupportedForDelete" ) . to_string ( ) ) )
520
- } ;
521
- let diff = get_diff ( & before_response. actual_state , & after_result. actual_state ) ;
522
- let mut before: Map < String , Value > = serde_json:: from_value ( before_response. actual_state ) ?;
523
- // a `get` will return a `result` property, but an actual `set` will have that as `resources`
524
- if before. contains_key ( "result" ) && !before. contains_key ( "resources" ) {
525
- before. insert ( "resources" . to_string ( ) , before[ "result" ] . clone ( ) ) ;
526
- before. remove ( "result" ) ;
527
- }
528
- let before_value = serde_json:: to_value ( & before) ?;
529
- SetResult :: Resource ( ResourceSetResponse {
530
- before_state : before_value. clone ( ) ,
531
- after_state : after_result. actual_state ,
532
- changed_properties : Some ( diff) ,
533
- } )
534
- } ,
535
- GetResult :: Group ( _) => {
536
- return Err ( DscError :: NotSupported ( t ! ( "configure.mod.groupNotSupportedForDelete" ) . to_string ( ) ) )
537
- } ,
538
- } ;
539
- end_datetime = chrono:: Local :: now ( ) ;
546
+ } ,
547
+ } ;
548
+ end_datetime = chrono:: Local :: now ( ) ;
549
+ }
540
550
} else {
541
551
return Err ( DscError :: NotImplemented ( t ! ( "configure.mod.deleteNotSupported" , resource = resource. resource_type) . to_string ( ) ) ) ;
542
552
}
0 commit comments