2
2
// Licensed under the MIT License.
3
3
4
4
use crate :: { configure:: { config_doc:: { Configuration , ExecutionKind , Resource } , Configurator } , dscresources:: resource_manifest:: Kind } ;
5
+ use crate :: dscresources:: invoke_result:: ResourceGetResponse ;
5
6
use dscerror:: DscError ;
6
7
use rust_i18n:: t;
7
8
use schemars:: JsonSchema ;
@@ -93,19 +94,16 @@ impl DscResource {
93
94
}
94
95
}
95
96
96
- fn create_config_for_adapter ( self , adapter : & str ) -> Result < Configurator , DscError > {
97
+ fn create_config_for_adapter ( self , adapter : & str , input : & str ) -> Result < Configurator , DscError > {
97
98
// create new configuration with adapter and use this as the resource
98
99
let mut configuration = Configuration :: new ( ) ;
99
100
let mut property_map = Map :: new ( ) ;
100
101
property_map. insert ( "name" . to_string ( ) , Value :: String ( self . type_name . clone ( ) ) ) ;
101
102
property_map. insert ( "type" . to_string ( ) , Value :: String ( self . type_name . clone ( ) ) ) ;
102
- let mut resource_properties = Map :: new ( ) ;
103
- for property in & self . properties {
104
- resource_properties. insert ( property. clone ( ) , Value :: Null ) ;
105
- }
103
+ let resource_properties: Value = serde_json:: from_str ( input) ?;
106
104
let mut resources_map = Map :: new ( ) ;
107
- property_map. insert ( "properties" . to_string ( ) , Value :: Object ( resource_properties) ) ;
108
- resources_map. insert ( "resources" . to_string ( ) , Value :: Object ( property_map) ) ;
105
+ property_map. insert ( "properties" . to_string ( ) , resource_properties) ;
106
+ resources_map. insert ( "resources" . to_string ( ) , Value :: Array ( vec ! [ Value :: Object ( property_map) ] ) ) ;
109
107
let adapter_resource = Resource {
110
108
name : self . type_name . clone ( ) ,
111
109
resource_type : adapter. to_string ( ) ,
@@ -218,9 +216,21 @@ impl Invoke for DscResource {
218
216
fn get ( & self , filter : & str ) -> Result < GetResult , DscError > {
219
217
debug ! ( "{}" , t!( "dscresources.dscresource.invokeGet" , resource = self . type_name) ) ;
220
218
if let Some ( adapter) = & self . require_adapter {
221
- let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter) ?;
219
+ let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter, filter ) ?;
222
220
let result = configurator. invoke_get ( ) ?;
223
- return Ok ( result. results [ 0 ] . result . clone ( ) ) ;
221
+ let GetResult :: Resource ( ref resource_result) = result. results [ 0 ] . result else {
222
+ return Err ( DscError :: Operation ( t ! ( "dscresources.dscresource.invokeGetReturnedNoResult" , resource = self . type_name) . to_string ( ) ) ) ;
223
+ } ;
224
+ let properties = resource_result. actual_state
225
+ . as_object ( ) . ok_or ( DscError :: Operation ( t ! ( "dscresources.dscresource.propertyIncorrectType" , property = "actual_state" , r#type = "object" ) . to_string ( ) ) ) ?
226
+ . get ( "result" ) . ok_or ( DscError :: Operation ( t ! ( "dscresources.dscresource.propertyNotFound" , property = "result" ) . to_string ( ) ) ) ?
227
+ . as_array ( ) . ok_or ( DscError :: Operation ( t ! ( "dscresources.dscresource.propertyIncorrectType" , property = "result" , r#type = "array" ) . to_string ( ) ) ) ?[ 0 ]
228
+ . as_object ( ) . ok_or ( DscError :: Operation ( t ! ( "dscresources.dscresource.propertyIncorrectType" , property = "result" , r#type = "object" ) . to_string ( ) ) ) ?
229
+ . get ( "properties" ) . ok_or ( DscError :: Operation ( t ! ( "dscresources.dscresource.propertyNotFound" , property = "properties" ) . to_string ( ) ) ) ?. clone ( ) ;
230
+ let get_result = GetResult :: Resource ( ResourceGetResponse {
231
+ actual_state : properties. clone ( ) ,
232
+ } ) ;
233
+ return Ok ( get_result) ;
224
234
}
225
235
226
236
match & self . implemented_as {
@@ -240,7 +250,7 @@ impl Invoke for DscResource {
240
250
fn set ( & self , desired : & str , skip_test : bool , execution_type : & ExecutionKind ) -> Result < SetResult , DscError > {
241
251
debug ! ( "{}" , t!( "dscresources.dscresource.invokeSet" , resource = self . type_name) ) ;
242
252
if let Some ( adapter) = & self . require_adapter {
243
- let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter) ?;
253
+ let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter, desired ) ?;
244
254
let result = configurator. invoke_set ( false ) ?;
245
255
return Ok ( result. results [ 0 ] . result . clone ( ) ) ;
246
256
}
@@ -262,7 +272,7 @@ impl Invoke for DscResource {
262
272
fn test ( & self , expected : & str ) -> Result < TestResult , DscError > {
263
273
debug ! ( "{}" , t!( "dscresources.dscresource.invokeTest" , resource = self . type_name) ) ;
264
274
if let Some ( adapter) = & self . require_adapter {
265
- let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter) ?;
275
+ let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter, expected ) ?;
266
276
let result = configurator. invoke_test ( ) ?;
267
277
return Ok ( result. results [ 0 ] . result . clone ( ) ) ;
268
278
}
@@ -312,7 +322,7 @@ impl Invoke for DscResource {
312
322
fn delete ( & self , filter : & str ) -> Result < ( ) , DscError > {
313
323
debug ! ( "{}" , t!( "dscresources.dscresource.invokeDelete" , resource = self . type_name) ) ;
314
324
if let Some ( adapter) = & self . require_adapter {
315
- let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter) ?;
325
+ let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter, filter ) ?;
316
326
configurator. invoke_set ( false ) ?;
317
327
return Ok ( ( ) ) ;
318
328
}
@@ -374,7 +384,7 @@ impl Invoke for DscResource {
374
384
fn export ( & self , input : & str ) -> Result < ExportResult , DscError > {
375
385
debug ! ( "{}" , t!( "dscresources.dscresource.invokeExport" , resource = self . type_name) ) ;
376
386
if let Some ( adapter) = & self . require_adapter {
377
- let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter) ?;
387
+ let mut configurator = self . clone ( ) . create_config_for_adapter ( adapter, input ) ?;
378
388
let result = configurator. invoke_export ( ) ?;
379
389
let Some ( configuration) = result. result else {
380
390
return Err ( DscError :: Operation ( t ! ( "dscresources.dscresource.invokeExportReturnedNoResult" , resource = self . type_name) . to_string ( ) ) ) ;
0 commit comments