@@ -444,58 +444,68 @@ impl Configurator {
444444 } ;
445445 end_datetime = chrono:: Local :: now ( ) ;
446446 } 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- }
451447 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) {
469471 progress. set_failure ( get_failure_from_error ( & e) ) ;
470472 progress. write_increment ( 1 ) ;
471473 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 ( _) => {
478504 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+ }
499509 } else {
500510 return Err ( DscError :: NotImplemented ( t ! ( "configure.mod.deleteNotSupported" , resource = resource. resource_type) . to_string ( ) ) ) ;
501511 }
0 commit comments