@@ -6,7 +6,7 @@ use crate::configure::{config_doc::RestartRequired, parameters::Input};
66use crate :: dscerror:: DscError ;
77use crate :: dscresources:: invoke_result:: ExportResult ;
88use crate :: dscresources:: {
9- { dscresource:: { Capability , Invoke , get_diff} ,
9+ { dscresource:: { Capability , Invoke , get_diff, validate_properties } ,
1010 invoke_result:: { GetResult , SetResult , TestResult , ResourceSetResponse } } ,
1111 resource_manifest:: Kind ,
1212} ;
@@ -170,8 +170,8 @@ fn escape_property_values(properties: &Map<String, Value>) -> Result<Option<Map<
170170 Ok ( Some ( result) )
171171}
172172
173- fn add_metadata ( kind : & Kind , mut properties : Option < Map < String , Value > > , resource_metadata : Option < Metadata > ) -> Result < String , DscError > {
174- if * kind == Kind :: Adapter {
173+ fn add_metadata ( dsc_resource : & DscResource , mut properties : Option < Map < String , Value > > , resource_metadata : Option < Metadata > ) -> Result < String , DscError > {
174+ if dsc_resource . kind == Kind :: Adapter {
175175 // add metadata to the properties so the adapter knows this is a config
176176 let mut metadata: Map < String , Value > = Map :: new ( ) ;
177177 if let Some ( resource_metadata) = resource_metadata {
@@ -191,15 +191,19 @@ fn add_metadata(kind: &Kind, mut properties: Option<Map<String, Value>>, resourc
191191 }
192192
193193 if let Some ( resource_metadata) = resource_metadata {
194- let other_metadata = resource_metadata. other . clone ( ) ;
195- if let Some ( mut properties ) = properties {
196- properties . insert ( "_metadata" . to_string ( ) , Value :: Object ( other_metadata ) ) ;
197- return Ok ( serde_json :: to_string ( & properties ) ? ) ;
198- }
199- let mut props = Map :: new ( ) ;
194+ let other_metadata = resource_metadata. other ;
195+ let mut props = if let Some ( props ) = properties {
196+ props
197+ } else {
198+ Map :: new ( )
199+ } ;
200200 props. insert ( "_metadata" . to_string ( ) , Value :: Object ( other_metadata) ) ;
201- properties = Some ( props) ;
202- return Ok ( serde_json:: to_string ( & properties) ?) ;
201+ let modified_props = Value :: from ( props. clone ( ) ) ;
202+ if let Ok ( ( ) ) = validate_properties ( dsc_resource, & modified_props) { } else {
203+ warn ! ( "{}" , t!( "configure.mod.schemaExcludesMetadata" ) ) ;
204+ props. remove ( "_metadata" ) ;
205+ }
206+ return Ok ( serde_json:: to_string ( & props) ?) ;
203207 }
204208
205209 match properties {
@@ -347,7 +351,7 @@ impl Configurator {
347351 } ;
348352 let properties = self . get_properties ( & resource, & dsc_resource. kind ) ?;
349353 debug ! ( "resource_type {}" , & resource. resource_type) ;
350- let filter = add_metadata ( & dsc_resource. kind , properties, resource. metadata . clone ( ) ) ?;
354+ let filter = add_metadata ( dsc_resource, properties, resource. metadata . clone ( ) ) ?;
351355 trace ! ( "filter: {filter}" ) ;
352356 let start_datetime = chrono:: Local :: now ( ) ;
353357 let mut get_result = match dsc_resource. get ( & filter) {
@@ -442,7 +446,7 @@ impl Configurator {
442446 }
443447 } ;
444448
445- let desired = add_metadata ( & dsc_resource. kind , properties, resource. metadata . clone ( ) ) ?;
449+ let desired = add_metadata ( dsc_resource, properties, resource. metadata . clone ( ) ) ?;
446450 trace ! ( "{}" , t!( "configure.mod.desired" , state = desired) ) ;
447451
448452 let start_datetime;
@@ -579,7 +583,7 @@ impl Configurator {
579583 } ;
580584 let properties = self . get_properties ( & resource, & dsc_resource. kind ) ?;
581585 debug ! ( "resource_type {}" , & resource. resource_type) ;
582- let expected = add_metadata ( & dsc_resource. kind , properties, resource. metadata . clone ( ) ) ?;
586+ let expected = add_metadata ( dsc_resource, properties, resource. metadata . clone ( ) ) ?;
583587 trace ! ( "{}" , t!( "configure.mod.expectedState" , state = expected) ) ;
584588 let start_datetime = chrono:: Local :: now ( ) ;
585589 let mut test_result = match dsc_resource. test ( & expected) {
@@ -655,7 +659,7 @@ impl Configurator {
655659 return Err ( DscError :: ResourceNotFound ( resource. resource_type . clone ( ) ) ) ;
656660 } ;
657661 let properties = self . get_properties ( resource, & dsc_resource. kind ) ?;
658- let input = add_metadata ( & dsc_resource. kind , properties, resource. metadata . clone ( ) ) ?;
662+ let input = add_metadata ( dsc_resource, properties, resource. metadata . clone ( ) ) ?;
659663 trace ! ( "{}" , t!( "configure.mod.exportInput" , input = input) ) ;
660664 let export_result = match add_resource_export_results_to_configuration ( dsc_resource, & mut conf, input. as_str ( ) ) {
661665 Ok ( result) => result,
0 commit comments