@@ -7,7 +7,7 @@ use crate::discovery::discovery_trait::DiscoveryFilter;
77use crate :: dscerror:: DscError ;
88use crate :: dscresources:: invoke_result:: ExportResult ;
99use crate :: dscresources:: {
10- { dscresource:: { Capability , Invoke , get_diff} ,
10+ { dscresource:: { Capability , Invoke , get_diff, validate_properties } ,
1111 invoke_result:: { GetResult , SetResult , TestResult , ResourceSetResponse } } ,
1212 resource_manifest:: Kind ,
1313} ;
@@ -171,10 +171,15 @@ fn escape_property_values(properties: &Map<String, Value>) -> Result<Option<Map<
171171 Ok ( Some ( result) )
172172}
173173
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 {
176176 // 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+ }
178183 let mut dsc_value = Map :: new ( ) ;
179184 dsc_value. insert ( "context" . to_string ( ) , Value :: String ( "configuration" . to_string ( ) ) ) ;
180185 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
186191 return Ok ( serde_json:: to_string ( & properties) ?) ;
187192 }
188193
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+
189210 match properties {
190211 Some ( properties) => {
191212 Ok ( serde_json:: to_string ( & properties) ?)
@@ -330,7 +351,7 @@ impl Configurator {
330351 return Err ( DscError :: ResourceNotFound ( resource. resource_type , resource. api_version . as_deref ( ) . unwrap_or ( "" ) . to_string ( ) ) ) ;
331352 } ;
332353 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 ( ) ) ?;
334355 let start_datetime = chrono:: Local :: now ( ) ;
335356 let mut get_result = match dsc_resource. get ( & filter) {
336357 Ok ( result) => result,
@@ -424,7 +445,7 @@ impl Configurator {
424445 }
425446 } ;
426447
427- let desired = add_metadata ( & dsc_resource. kind , properties) ?;
448+ let desired = add_metadata ( dsc_resource, properties, resource . metadata . clone ( ) ) ?;
428449 trace ! ( "{}" , t!( "configure.mod.desired" , state = desired) ) ;
429450
430451 let start_datetime;
@@ -561,7 +582,7 @@ impl Configurator {
561582 } ;
562583 let properties = self . get_properties ( & resource, & dsc_resource. kind ) ?;
563584 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 ( ) ) ?;
565586 trace ! ( "{}" , t!( "configure.mod.expectedState" , state = expected) ) ;
566587 let start_datetime = chrono:: Local :: now ( ) ;
567588 let mut test_result = match dsc_resource. test ( & expected) {
@@ -637,7 +658,7 @@ impl Configurator {
637658 return Err ( DscError :: ResourceNotFound ( resource. resource_type . clone ( ) , resource. api_version . as_deref ( ) . unwrap_or ( "" ) . to_string ( ) ) ) ;
638659 } ;
639660 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 ( ) ) ?;
641662 trace ! ( "{}" , t!( "configure.mod.exportInput" , input = input) ) ;
642663 let export_result = match add_resource_export_results_to_configuration ( dsc_resource, & mut conf, input. as_str ( ) ) {
643664 Ok ( result) => result,
0 commit comments