@@ -485,58 +485,68 @@ impl Configurator {
485485 } ;
486486 end_datetime = chrono:: Local :: now ( ) ;
487487 } 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- }
492488 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) {
510512 progress. set_failure ( get_failure_from_error ( & e) ) ;
511513 progress. write_increment ( 1 ) ;
512514 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 ( _) => {
519545 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+ }
540550 } else {
541551 return Err ( DscError :: NotImplemented ( t ! ( "configure.mod.deleteNotSupported" , resource = resource. resource_type) . to_string ( ) ) ) ;
542552 }
0 commit comments