@@ -7,7 +7,7 @@ use crate::discovery::discovery_trait::DiscoveryFilter;
7
7
use crate :: dscerror:: DscError ;
8
8
use crate :: dscresources:: invoke_result:: ExportResult ;
9
9
use crate :: dscresources:: {
10
- { dscresource:: { Capability , Invoke , get_diff} ,
10
+ { dscresource:: { Capability , Invoke , get_diff, validate_properties } ,
11
11
invoke_result:: { GetResult , SetResult , TestResult , ResourceSetResponse } } ,
12
12
resource_manifest:: Kind ,
13
13
} ;
@@ -171,10 +171,15 @@ fn escape_property_values(properties: &Map<String, Value>) -> Result<Option<Map<
171
171
Ok ( Some ( result) )
172
172
}
173
173
174
- fn add_metadata ( kind : & Kind , mut properties : Option < Map < String , Value > > ) -> Result < String , DscError > {
175
- if * kind == Kind :: Adapter {
174
+ fn add_metadata ( dsc_resource : & DscResource , mut properties : Option < Map < String , Value > > , resource_metadata : Option < Metadata > ) -> Result < String , DscError > {
175
+ if dsc_resource . kind == Kind :: Adapter {
176
176
// add metadata to the properties so the adapter knows this is a config
177
- let mut metadata = Map :: new ( ) ;
177
+ let mut metadata: Map < String , Value > = Map :: new ( ) ;
178
+ if let Some ( resource_metadata) = resource_metadata {
179
+ if !resource_metadata. other . is_empty ( ) {
180
+ metadata. extend ( resource_metadata. other ) ;
181
+ }
182
+ }
178
183
let mut dsc_value = Map :: new ( ) ;
179
184
dsc_value. insert ( "context" . to_string ( ) , Value :: String ( "configuration" . to_string ( ) ) ) ;
180
185
metadata. insert ( "Microsoft.DSC" . to_string ( ) , Value :: Object ( dsc_value) ) ;
@@ -186,6 +191,22 @@ fn add_metadata(kind: &Kind, mut properties: Option<Map<String, Value>> ) -> Res
186
191
return Ok ( serde_json:: to_string ( & properties) ?) ;
187
192
}
188
193
194
+ if let Some ( resource_metadata) = resource_metadata {
195
+ let other_metadata = resource_metadata. other ;
196
+ let mut props = if let Some ( props) = properties {
197
+ props
198
+ } else {
199
+ Map :: new ( )
200
+ } ;
201
+ props. insert ( "_metadata" . to_string ( ) , Value :: Object ( other_metadata) ) ;
202
+ let modified_props = Value :: from ( props. clone ( ) ) ;
203
+ if let Ok ( ( ) ) = validate_properties ( dsc_resource, & modified_props) { } else {
204
+ warn ! ( "{}" , t!( "configure.mod.schemaExcludesMetadata" ) ) ;
205
+ props. remove ( "_metadata" ) ;
206
+ }
207
+ return Ok ( serde_json:: to_string ( & props) ?) ;
208
+ }
209
+
189
210
match properties {
190
211
Some ( properties) => {
191
212
Ok ( serde_json:: to_string ( & properties) ?)
@@ -330,7 +351,7 @@ impl Configurator {
330
351
return Err ( DscError :: ResourceNotFound ( resource. resource_type , resource. api_version . as_deref ( ) . unwrap_or ( "" ) . to_string ( ) ) ) ;
331
352
} ;
332
353
let properties = self . get_properties ( & resource, & dsc_resource. kind ) ?;
333
- let filter = add_metadata ( & dsc_resource. kind , properties) ?;
354
+ let filter = add_metadata ( dsc_resource, properties, resource . metadata . clone ( ) ) ?;
334
355
let start_datetime = chrono:: Local :: now ( ) ;
335
356
let mut get_result = match dsc_resource. get ( & filter) {
336
357
Ok ( result) => result,
@@ -424,7 +445,7 @@ impl Configurator {
424
445
}
425
446
} ;
426
447
427
- let desired = add_metadata ( & dsc_resource. kind , properties) ?;
448
+ let desired = add_metadata ( dsc_resource, properties, resource . metadata . clone ( ) ) ?;
428
449
trace ! ( "{}" , t!( "configure.mod.desired" , state = desired) ) ;
429
450
430
451
let start_datetime;
@@ -561,7 +582,7 @@ impl Configurator {
561
582
} ;
562
583
let properties = self . get_properties ( & resource, & dsc_resource. kind ) ?;
563
584
debug ! ( "resource_type {}" , & resource. resource_type) ;
564
- let expected = add_metadata ( & dsc_resource. kind , properties) ?;
585
+ let expected = add_metadata ( dsc_resource, properties, resource . metadata . clone ( ) ) ?;
565
586
trace ! ( "{}" , t!( "configure.mod.expectedState" , state = expected) ) ;
566
587
let start_datetime = chrono:: Local :: now ( ) ;
567
588
let mut test_result = match dsc_resource. test ( & expected) {
@@ -637,7 +658,7 @@ impl Configurator {
637
658
return Err ( DscError :: ResourceNotFound ( resource. resource_type . clone ( ) , resource. api_version . as_deref ( ) . unwrap_or ( "" ) . to_string ( ) ) ) ;
638
659
} ;
639
660
let properties = self . get_properties ( resource, & dsc_resource. kind ) ?;
640
- let input = add_metadata ( & dsc_resource. kind , properties) ?;
661
+ let input = add_metadata ( dsc_resource, properties, resource . metadata . clone ( ) ) ?;
641
662
trace ! ( "{}" , t!( "configure.mod.exportInput" , input = input) ) ;
642
663
let export_result = match add_resource_export_results_to_configuration ( dsc_resource, & mut conf, input. as_str ( ) ) {
643
664
Ok ( result) => result,
0 commit comments