@@ -25,13 +25,17 @@ pub const EXIT_PROCESS_TERMINATED: i32 = 0x102;
25
25
/// # Errors
26
26
///
27
27
/// Error returned if the resource does not successfully get the current state
28
- pub fn invoke_get ( resource : & ResourceManifest , cwd : & str , filter : & str ) -> Result < GetResult , DscError > {
28
+ pub fn invoke_get ( resource : & ResourceManifest , cwd : & str , filter : & str , target_resource : Option < & str > ) -> Result < GetResult , DscError > {
29
29
debug ! ( "{}" , t!( "dscresources.commandResource.invokeGet" , resource = & resource. resource_type) ) ;
30
30
let mut command_input = CommandInput { env : None , stdin : None } ;
31
31
let Some ( get) = & resource. get else {
32
32
return Err ( DscError :: NotImplemented ( "get" . to_string ( ) ) ) ;
33
33
} ;
34
- let args = process_args ( get. args . as_ref ( ) , filter, & resource. resource_type ) ;
34
+ let resource_type = match target_resource {
35
+ Some ( r) => r,
36
+ None => & resource. resource_type ,
37
+ } ;
38
+ let args = process_args ( get. args . as_ref ( ) , filter, resource_type) ;
35
39
if !filter. is_empty ( ) {
36
40
verify_json ( resource, cwd, filter) ?;
37
41
command_input = get_command_input ( get. input . as_ref ( ) , filter) ?;
@@ -74,7 +78,7 @@ pub fn invoke_get(resource: &ResourceManifest, cwd: &str, filter: &str) -> Resul
74
78
///
75
79
/// Error returned if the resource does not successfully set the desired state
76
80
#[ allow( clippy:: too_many_lines) ]
77
- pub fn invoke_set ( resource : & ResourceManifest , cwd : & str , desired : & str , skip_test : bool , execution_type : & ExecutionKind ) -> Result < SetResult , DscError > {
81
+ pub fn invoke_set ( resource : & ResourceManifest , cwd : & str , desired : & str , skip_test : bool , execution_type : & ExecutionKind , target_resource : Option < & str > ) -> Result < SetResult , DscError > {
78
82
debug ! ( "{}" , t!( "dscresources.commandResource.invokeSet" , resource = & resource. resource_type) ) ;
79
83
let operation_type: String ;
80
84
let mut is_synthetic_what_if = false ;
@@ -101,7 +105,7 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
101
105
// if resource doesn't implement a pre-test, we execute test first to see if a set is needed
102
106
if !skip_test && set. pre_test != Some ( true ) {
103
107
info ! ( "{}" , t!( "dscresources.commandResource.noPretest" , resource = & resource. resource_type) ) ;
104
- let test_result = invoke_test ( resource, cwd, desired) ?;
108
+ let test_result = invoke_test ( resource, cwd, desired, target_resource ) ?;
105
109
if is_synthetic_what_if {
106
110
return Ok ( test_result. into ( ) ) ;
107
111
}
@@ -136,7 +140,11 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
136
140
let Some ( get) = & resource. get else {
137
141
return Err ( DscError :: NotImplemented ( "get" . to_string ( ) ) ) ;
138
142
} ;
139
- let args = process_args ( get. args . as_ref ( ) , desired, & resource. resource_type ) ;
143
+ let resource_type = match target_resource {
144
+ Some ( r) => r,
145
+ None => & resource. resource_type ,
146
+ } ;
147
+ let args = process_args ( get. args . as_ref ( ) , desired, resource_type) ;
140
148
let command_input = get_command_input ( get. input . as_ref ( ) , desired) ?;
141
149
142
150
info ! ( "{}" , t!( "dscresources.commandResource.setGetCurrent" , resource = & resource. resource_type, executable = & get. executable) ) ;
@@ -168,7 +176,7 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
168
176
169
177
let mut env: Option < HashMap < String , String > > = None ;
170
178
let mut input_desired: Option < & str > = None ;
171
- let args = process_args ( set. args . as_ref ( ) , desired, & resource . resource_type ) ;
179
+ let args = process_args ( set. args . as_ref ( ) , desired, resource_type) ;
172
180
match & set. input {
173
181
Some ( InputKind :: Env ) => {
174
182
env = Some ( json_to_hashmap ( desired) ?) ;
@@ -228,7 +236,7 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
228
236
} ,
229
237
None => {
230
238
// perform a get and compare the result to the expected state
231
- let get_result = invoke_get ( resource, cwd, desired) ?;
239
+ let get_result = invoke_get ( resource, cwd, desired, target_resource ) ?;
232
240
// for changed_properties, we compare post state to pre state
233
241
let actual_state = match get_result {
234
242
GetResult :: Group ( results) => {
@@ -263,16 +271,20 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
263
271
/// # Errors
264
272
///
265
273
/// Error is returned if the underlying command returns a non-zero exit code.
266
- pub fn invoke_test ( resource : & ResourceManifest , cwd : & str , expected : & str ) -> Result < TestResult , DscError > {
274
+ pub fn invoke_test ( resource : & ResourceManifest , cwd : & str , expected : & str , target_resource : Option < & str > ) -> Result < TestResult , DscError > {
267
275
debug ! ( "{}" , t!( "dscresources.commandResource.invokeTest" , resource = & resource. resource_type) ) ;
268
276
let Some ( test) = & resource. test else {
269
277
info ! ( "{}" , t!( "dscresources.commandResource.testSyntheticTest" , resource = & resource. resource_type) ) ;
270
- return invoke_synthetic_test ( resource, cwd, expected) ;
278
+ return invoke_synthetic_test ( resource, cwd, expected, target_resource ) ;
271
279
} ;
272
280
273
281
verify_json ( resource, cwd, expected) ?;
274
282
275
- let args = process_args ( test. args . as_ref ( ) , expected, & resource. resource_type ) ;
283
+ let resource_type = match target_resource {
284
+ Some ( r) => r,
285
+ None => & resource. resource_type ,
286
+ } ;
287
+ let args = process_args ( test. args . as_ref ( ) , expected, resource_type) ;
276
288
let command_input = get_command_input ( test. input . as_ref ( ) , expected) ?;
277
289
278
290
info ! ( "{}" , t!( "dscresources.commandResource.invokeTestUsing" , resource = & resource. resource_type, executable = & test. executable) ) ;
@@ -330,7 +342,7 @@ pub fn invoke_test(resource: &ResourceManifest, cwd: &str, expected: &str) -> Re
330
342
} ,
331
343
None => {
332
344
// perform a get and compare the result to the expected state
333
- let get_result = invoke_get ( resource, cwd, expected) ?;
345
+ let get_result = invoke_get ( resource, cwd, expected, target_resource ) ?;
334
346
let actual_state = match get_result {
335
347
GetResult :: Group ( results) => {
336
348
let mut result_array: Vec < Value > = Vec :: new ( ) ;
@@ -368,8 +380,8 @@ fn get_desired_state(actual: &Value) -> Result<Option<bool>, DscError> {
368
380
Ok ( in_desired_state)
369
381
}
370
382
371
- fn invoke_synthetic_test ( resource : & ResourceManifest , cwd : & str , expected : & str ) -> Result < TestResult , DscError > {
372
- let get_result = invoke_get ( resource, cwd, expected) ?;
383
+ fn invoke_synthetic_test ( resource : & ResourceManifest , cwd : & str , expected : & str , target_resource : Option < & str > ) -> Result < TestResult , DscError > {
384
+ let get_result = invoke_get ( resource, cwd, expected, target_resource ) ?;
373
385
let actual_state = match get_result {
374
386
GetResult :: Group ( results) => {
375
387
let mut result_array: Vec < Value > = Vec :: new ( ) ;
@@ -403,17 +415,21 @@ fn invoke_synthetic_test(resource: &ResourceManifest, cwd: &str, expected: &str)
403
415
/// # Errors
404
416
///
405
417
/// Error is returned if the underlying command returns a non-zero exit code.
406
- pub fn invoke_delete ( resource : & ResourceManifest , cwd : & str , filter : & str ) -> Result < ( ) , DscError > {
418
+ pub fn invoke_delete ( resource : & ResourceManifest , cwd : & str , filter : & str , target_resource : Option < & str > ) -> Result < ( ) , DscError > {
407
419
let Some ( delete) = & resource. delete else {
408
420
return Err ( DscError :: NotImplemented ( "delete" . to_string ( ) ) ) ;
409
421
} ;
410
422
411
423
verify_json ( resource, cwd, filter) ?;
412
424
413
- let args = process_args ( delete. args . as_ref ( ) , filter, & resource. resource_type ) ;
425
+ let resource_type = match target_resource {
426
+ Some ( r) => r,
427
+ None => & resource. resource_type ,
428
+ } ;
429
+ let args = process_args ( delete. args . as_ref ( ) , filter, resource_type) ;
414
430
let command_input = get_command_input ( delete. input . as_ref ( ) , filter) ?;
415
431
416
- info ! ( "{}" , t!( "dscresources.commandResource.invokeDeleteUsing" , resource = & resource . resource_type, executable = & delete. executable) ) ;
432
+ info ! ( "{}" , t!( "dscresources.commandResource.invokeDeleteUsing" , resource = resource_type, executable = & delete. executable) ) ;
417
433
let ( _exit_code, _stdout, _stderr) = invoke_command ( & delete. executable , args, command_input. stdin . as_deref ( ) , Some ( cwd) , command_input. env , resource. exit_codes . as_ref ( ) ) ?;
418
434
419
435
Ok ( ( ) )
@@ -434,17 +450,21 @@ pub fn invoke_delete(resource: &ResourceManifest, cwd: &str, filter: &str) -> Re
434
450
/// # Errors
435
451
///
436
452
/// Error is returned if the underlying command returns a non-zero exit code.
437
- pub fn invoke_validate ( resource : & ResourceManifest , cwd : & str , config : & str ) -> Result < ValidateResult , DscError > {
453
+ pub fn invoke_validate ( resource : & ResourceManifest , cwd : & str , config : & str , target_resource : Option < & str > ) -> Result < ValidateResult , DscError > {
438
454
trace ! ( "{}" , t!( "dscresources.commandResource.invokeValidateConfig" , resource = & resource. resource_type, config = & config) ) ;
439
455
// TODO: use schema to validate config if validate is not implemented
440
456
let Some ( validate) = resource. validate . as_ref ( ) else {
441
457
return Err ( DscError :: NotImplemented ( "validate" . to_string ( ) ) ) ;
442
458
} ;
443
459
444
- let args = process_args ( validate. args . as_ref ( ) , config, & resource. resource_type ) ;
460
+ let resource_type = match target_resource {
461
+ Some ( r) => r,
462
+ None => & resource. resource_type ,
463
+ } ;
464
+ let args = process_args ( validate. args . as_ref ( ) , config, resource_type) ;
445
465
let command_input = get_command_input ( validate. input . as_ref ( ) , config) ?;
446
466
447
- info ! ( "{}" , t!( "dscresources.commandResource.invokeValidateUsing" , resource = & resource . resource_type, executable = & validate. executable) ) ;
467
+ info ! ( "{}" , t!( "dscresources.commandResource.invokeValidateUsing" , resource = resource_type, executable = & validate. executable) ) ;
448
468
let ( _exit_code, stdout, _stderr) = invoke_command ( & validate. executable , args, command_input. stdin . as_deref ( ) , Some ( cwd) , command_input. env , resource. exit_codes . as_ref ( ) ) ?;
449
469
let result: ValidateResult = serde_json:: from_str ( & stdout) ?;
450
470
Ok ( result)
@@ -491,12 +511,12 @@ pub fn get_schema(resource: &ResourceManifest, cwd: &str) -> Result<String, DscE
491
511
/// # Errors
492
512
///
493
513
/// Error returned if the resource does not successfully export the current state
494
- pub fn invoke_export ( resource : & ResourceManifest , cwd : & str , input : Option < & str > ) -> Result < ExportResult , DscError > {
514
+ pub fn invoke_export ( resource : & ResourceManifest , cwd : & str , input : Option < & str > , target_resource : Option < & str > ) -> Result < ExportResult , DscError > {
495
515
let Some ( export) = resource. export . as_ref ( ) else {
496
516
// see if get is supported and use that instead
497
517
if resource. get . is_some ( ) {
498
518
info ! ( "{}" , t!( "dscresources.commandResource.exportNotSupportedUsingGet" , resource = & resource. resource_type) ) ;
499
- let get_result = invoke_get ( resource, cwd, input. unwrap_or ( "" ) ) ?;
519
+ let get_result = invoke_get ( resource, cwd, input. unwrap_or ( "" ) , target_resource ) ?;
500
520
let mut instances: Vec < Value > = Vec :: new ( ) ;
501
521
match get_result {
502
522
GetResult :: Group ( group_response) => {
@@ -518,16 +538,20 @@ pub fn invoke_export(resource: &ResourceManifest, cwd: &str, input: Option<&str>
518
538
519
539
let mut command_input: CommandInput = CommandInput { env : None , stdin : None } ;
520
540
let args: Option < Vec < String > > ;
541
+ let resource_type = match target_resource {
542
+ Some ( r) => r,
543
+ None => & resource. resource_type ,
544
+ } ;
521
545
if let Some ( input) = input {
522
546
if !input. is_empty ( ) {
523
547
verify_json ( resource, cwd, input) ?;
524
548
525
549
command_input = get_command_input ( export. input . as_ref ( ) , input) ?;
526
550
}
527
551
528
- args = process_args ( export. args . as_ref ( ) , input, & resource . resource_type ) ;
552
+ args = process_args ( export. args . as_ref ( ) , input, resource_type) ;
529
553
} else {
530
- args = process_args ( export. args . as_ref ( ) , "" , & resource . resource_type ) ;
554
+ args = process_args ( export. args . as_ref ( ) , "" , resource_type) ;
531
555
}
532
556
533
557
let ( _exit_code, stdout, stderr) = invoke_command ( & export. executable , args, command_input. stdin . as_deref ( ) , Some ( cwd) , command_input. env , resource. exit_codes . as_ref ( ) ) ?;
@@ -815,7 +839,7 @@ fn verify_json(resource: &ResourceManifest, cwd: &str, json: &str) -> Result<(),
815
839
// see if resource implements validate
816
840
if resource. validate . is_some ( ) {
817
841
trace ! ( "{}" , t!( "dscresources.commandResource.validateJson" , json = json) ) ;
818
- let result = invoke_validate ( resource, cwd, json) ?;
842
+ let result = invoke_validate ( resource, cwd, json, None ) ?;
819
843
if result. valid {
820
844
return Ok ( ( ) ) ;
821
845
}
0 commit comments