@@ -6,7 +6,7 @@ use crate::configure::{config_doc::RestartRequired, parameters::Input};
6
6
use crate :: dscerror:: DscError ;
7
7
use crate :: dscresources:: invoke_result:: ExportResult ;
8
8
use crate :: dscresources:: {
9
- { dscresource:: { Capability , Invoke , get_diff} ,
9
+ { dscresource:: { Capability , Invoke , get_diff, validate_properties } ,
10
10
invoke_result:: { GetResult , SetResult , TestResult , ResourceSetResponse } } ,
11
11
resource_manifest:: Kind ,
12
12
} ;
@@ -170,8 +170,8 @@ fn escape_property_values(properties: &Map<String, Value>) -> Result<Option<Map<
170
170
Ok ( Some ( result) )
171
171
}
172
172
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 {
175
175
// add metadata to the properties so the adapter knows this is a config
176
176
let mut metadata: Map < String , Value > = Map :: new ( ) ;
177
177
if let Some ( resource_metadata) = resource_metadata {
@@ -191,15 +191,19 @@ fn add_metadata(kind: &Kind, mut properties: Option<Map<String, Value>>, resourc
191
191
}
192
192
193
193
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
+ } ;
200
200
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) ?) ;
203
207
}
204
208
205
209
match properties {
@@ -347,7 +351,7 @@ impl Configurator {
347
351
} ;
348
352
let properties = self . get_properties ( & resource, & dsc_resource. kind ) ?;
349
353
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 ( ) ) ?;
351
355
trace ! ( "filter: {filter}" ) ;
352
356
let start_datetime = chrono:: Local :: now ( ) ;
353
357
let mut get_result = match dsc_resource. get ( & filter) {
@@ -442,7 +446,7 @@ impl Configurator {
442
446
}
443
447
} ;
444
448
445
- let desired = add_metadata ( & dsc_resource. kind , properties, resource. metadata . clone ( ) ) ?;
449
+ let desired = add_metadata ( dsc_resource, properties, resource. metadata . clone ( ) ) ?;
446
450
trace ! ( "{}" , t!( "configure.mod.desired" , state = desired) ) ;
447
451
448
452
let start_datetime;
@@ -579,7 +583,7 @@ impl Configurator {
579
583
} ;
580
584
let properties = self . get_properties ( & resource, & dsc_resource. kind ) ?;
581
585
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 ( ) ) ?;
583
587
trace ! ( "{}" , t!( "configure.mod.expectedState" , state = expected) ) ;
584
588
let start_datetime = chrono:: Local :: now ( ) ;
585
589
let mut test_result = match dsc_resource. test ( & expected) {
@@ -655,7 +659,7 @@ impl Configurator {
655
659
return Err ( DscError :: ResourceNotFound ( resource. resource_type . clone ( ) ) ) ;
656
660
} ;
657
661
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 ( ) ) ?;
659
663
trace ! ( "{}" , t!( "configure.mod.exportInput" , input = input) ) ;
660
664
let export_result = match add_resource_export_results_to_configuration ( dsc_resource, & mut conf, input. as_str ( ) ) {
661
665
Ok ( result) => result,
0 commit comments