@@ -444,58 +444,68 @@ impl Configurator {
444
444
} ;
445
445
end_datetime = chrono:: Local :: now ( ) ;
446
446
} else if dsc_resource. capabilities . contains ( & Capability :: Delete ) {
447
- if self . context . execution_type == ExecutionKind :: WhatIf {
448
- // TODO: add delete what-if support
449
- return Err ( DscError :: NotSupported ( t ! ( "configure.mod.whatIfNotSupportedForDelete" ) . to_string ( ) ) ) ;
450
- }
451
447
debug ! ( "{}" , t!( "configure.mod.implementsDelete" ) ) ;
452
- let before_result = match dsc_resource. get ( & desired) {
453
- Ok ( result) => result,
454
- Err ( e) => {
455
- progress. set_failure ( get_failure_from_error ( & e) ) ;
456
- progress. write_increment ( 1 ) ;
457
- return Err ( e) ;
458
- } ,
459
- } ;
460
- start_datetime = chrono:: Local :: now ( ) ;
461
- if let Err ( e) = dsc_resource. delete ( & desired) {
462
- progress. set_failure ( get_failure_from_error ( & e) ) ;
463
- progress. write_increment ( 1 ) ;
464
- return Err ( e) ;
465
- }
466
- let after_result = match dsc_resource. get ( & desired) {
467
- Ok ( result) => result,
468
- Err ( e) => {
448
+ if self . context . execution_type == ExecutionKind :: WhatIf {
449
+ // Let the resource handle WhatIf via set (-w), which may route to delete
450
+ start_datetime = chrono:: Local :: now ( ) ;
451
+ set_result = match dsc_resource. set ( & desired, skip_test, & self . context . execution_type ) {
452
+ Ok ( result) => result,
453
+ Err ( e) => {
454
+ progress. set_failure ( get_failure_from_error ( & e) ) ;
455
+ progress. write_increment ( 1 ) ;
456
+ return Err ( e) ;
457
+ } ,
458
+ } ;
459
+ end_datetime = chrono:: Local :: now ( ) ;
460
+ } else {
461
+ let before_result = match dsc_resource. get ( & desired) {
462
+ Ok ( result) => result,
463
+ Err ( e) => {
464
+ progress. set_failure ( get_failure_from_error ( & e) ) ;
465
+ progress. write_increment ( 1 ) ;
466
+ return Err ( e) ;
467
+ } ,
468
+ } ;
469
+ start_datetime = chrono:: Local :: now ( ) ;
470
+ if let Err ( e) = dsc_resource. delete ( & desired) {
469
471
progress. set_failure ( get_failure_from_error ( & e) ) ;
470
472
progress. write_increment ( 1 ) ;
471
473
return Err ( e) ;
472
- } ,
473
- } ;
474
- // convert get result to set result
475
- set_result = match before_result {
476
- GetResult :: Resource ( before_response) => {
477
- let GetResult :: Resource ( after_result) = after_result else {
474
+ }
475
+ let after_result = match dsc_resource. get ( & desired) {
476
+ Ok ( result) => result,
477
+ Err ( e) => {
478
+ progress. set_failure ( get_failure_from_error ( & e) ) ;
479
+ progress. write_increment ( 1 ) ;
480
+ return Err ( e) ;
481
+ } ,
482
+ } ;
483
+ // convert get result to set result
484
+ set_result = match before_result {
485
+ GetResult :: Resource ( before_response) => {
486
+ let GetResult :: Resource ( after_result) = after_result else {
487
+ return Err ( DscError :: NotSupported ( t ! ( "configure.mod.groupNotSupportedForDelete" ) . to_string ( ) ) )
488
+ } ;
489
+ let diff = get_diff ( & before_response. actual_state , & after_result. actual_state ) ;
490
+ let mut before: Map < String , Value > = serde_json:: from_value ( before_response. actual_state ) ?;
491
+ // a `get` will return a `result` property, but an actual `set` will have that as `resources`
492
+ if before. contains_key ( "result" ) && !before. contains_key ( "resources" ) {
493
+ before. insert ( "resources" . to_string ( ) , before[ "result" ] . clone ( ) ) ;
494
+ before. remove ( "result" ) ;
495
+ }
496
+ let before_value = serde_json:: to_value ( & before) ?;
497
+ SetResult :: Resource ( ResourceSetResponse {
498
+ before_state : before_value. clone ( ) ,
499
+ after_state : after_result. actual_state ,
500
+ changed_properties : Some ( diff) ,
501
+ } )
502
+ } ,
503
+ GetResult :: Group ( _) => {
478
504
return Err ( DscError :: NotSupported ( t ! ( "configure.mod.groupNotSupportedForDelete" ) . to_string ( ) ) )
479
- } ;
480
- let diff = get_diff ( & before_response. actual_state , & after_result. actual_state ) ;
481
- let mut before: Map < String , Value > = serde_json:: from_value ( before_response. actual_state ) ?;
482
- // a `get` will return a `result` property, but an actual `set` will have that as `resources`
483
- if before. contains_key ( "result" ) && !before. contains_key ( "resources" ) {
484
- before. insert ( "resources" . to_string ( ) , before[ "result" ] . clone ( ) ) ;
485
- before. remove ( "result" ) ;
486
- }
487
- let before_value = serde_json:: to_value ( & before) ?;
488
- SetResult :: Resource ( ResourceSetResponse {
489
- before_state : before_value. clone ( ) ,
490
- after_state : after_result. actual_state ,
491
- changed_properties : Some ( diff) ,
492
- } )
493
- } ,
494
- GetResult :: Group ( _) => {
495
- return Err ( DscError :: NotSupported ( t ! ( "configure.mod.groupNotSupportedForDelete" ) . to_string ( ) ) )
496
- } ,
497
- } ;
498
- end_datetime = chrono:: Local :: now ( ) ;
505
+ } ,
506
+ } ;
507
+ end_datetime = chrono:: Local :: now ( ) ;
508
+ }
499
509
} else {
500
510
return Err ( DscError :: NotImplemented ( t ! ( "configure.mod.deleteNotSupported" , resource = resource. resource_type) . to_string ( ) ) ) ;
501
511
}
0 commit comments