|
2 | 2 | // Licensed under the MIT License. |
3 | 3 |
|
4 | 4 | use crate::configure::config_doc::{ExecutionKind, Metadata, Resource}; |
5 | | -use crate::configure::parameters::Input; |
| 5 | +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::{ |
@@ -87,17 +87,17 @@ pub fn add_resource_export_results_to_configuration(resource: &DscResource, conf |
87 | 87 | other: Map::new(), |
88 | 88 | }; |
89 | 89 | if let Some(security_context) = props.remove("_securityContext") { |
90 | | - let context: SecurityContextKind = serde_json::from_value(security_context)?; |
| 90 | + let security_context: SecurityContextKind = serde_json::from_value(security_context)?; |
91 | 91 | metadata.microsoft = Some( |
92 | 92 | MicrosoftDscMetadata { |
93 | | - security_context: Some(context), |
| 93 | + security_context: Some(security_context), |
94 | 94 | ..Default::default() |
95 | 95 | } |
96 | 96 | ); |
97 | 97 | } |
98 | 98 | r.properties = escape_property_values(&props)?; |
99 | 99 | let mut properties = serde_json::to_value(&r.properties)?; |
100 | | - get_metadata_from_result(&mut properties, &mut metadata)?; |
| 100 | + get_metadata_from_result(None, &mut properties, &mut metadata)?; |
101 | 101 | r.properties = Some(properties.as_object().cloned().unwrap_or_default()); |
102 | 102 | r.metadata = if metadata.microsoft.is_some() || !metadata.other.is_empty() { |
103 | 103 | Some(metadata) |
@@ -225,14 +225,24 @@ fn check_security_context(metadata: Option<&Metadata>) -> Result<(), DscError> { |
225 | 225 | Ok(()) |
226 | 226 | } |
227 | 227 |
|
228 | | -fn get_metadata_from_result(result: &mut Value, metadata: &mut Metadata) -> Result<(), DscError> { |
| 228 | +fn get_metadata_from_result(mut context: Option<&mut Context>, result: &mut Value, metadata: &mut Metadata) -> Result<(), DscError> { |
229 | 229 | if let Some(metadata_value) = result.get("_metadata") { |
230 | 230 | if let Some(metadata_map) = metadata_value.as_object() { |
231 | 231 | for (key, value) in metadata_map { |
232 | 232 | if key.starts_with("Microsoft.DSC") { |
233 | 233 | warn!("{}", t!("configure.mod.metadataMicrosoftDscIgnored", key = key)); |
234 | 234 | continue; |
235 | 235 | } |
| 236 | + if let Some(ref mut context) = context { |
| 237 | + if key == "_restartRequired" { |
| 238 | + if let Ok(restart_required) = serde_json::from_value::<Vec<RestartRequired>>(value.clone()) { |
| 239 | + context.restart_required.get_or_insert_with(Vec::new).extend(restart_required); |
| 240 | + } else { |
| 241 | + warn!("{}", t!("configure.mod.metadataRestartRequiredInvalid", value = value)); |
| 242 | + continue; |
| 243 | + } |
| 244 | + } |
| 245 | + } |
236 | 246 | metadata.other.insert(key.clone(), value.clone()); |
237 | 247 | } |
238 | 248 | } else { |
@@ -342,7 +352,7 @@ impl Configurator { |
342 | 352 | match &mut get_result { |
343 | 353 | GetResult::Resource(ref mut resource_result) => { |
344 | 354 | self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_result.actual_state)?); |
345 | | - get_metadata_from_result(&mut resource_result.actual_state, &mut metadata)?; |
| 355 | + get_metadata_from_result(Some(&mut self.context), &mut resource_result.actual_state, &mut metadata)?; |
346 | 356 | }, |
347 | 357 | GetResult::Group(group) => { |
348 | 358 | let mut results = Vec::<Value>::new(); |
@@ -499,7 +509,7 @@ impl Configurator { |
499 | 509 | match &mut set_result { |
500 | 510 | SetResult::Resource(resource_result) => { |
501 | 511 | self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_result.after_state)?); |
502 | | - get_metadata_from_result(&mut resource_result.after_state, &mut metadata)?; |
| 512 | + get_metadata_from_result(Some(&mut self.context), &mut resource_result.after_state, &mut metadata)?; |
503 | 513 | }, |
504 | 514 | SetResult::Group(group) => { |
505 | 515 | let mut results = Vec::<Value>::new(); |
@@ -573,7 +583,7 @@ impl Configurator { |
573 | 583 | match &mut test_result { |
574 | 584 | TestResult::Resource(resource_test_result) => { |
575 | 585 | self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_test_result.actual_state)?); |
576 | | - get_metadata_from_result(&mut resource_test_result.actual_state, &mut metadata)?; |
| 586 | + get_metadata_from_result(Some(&mut self.context), &mut resource_test_result.actual_state, &mut metadata)?; |
577 | 587 | }, |
578 | 588 | TestResult::Group(group) => { |
579 | 589 | let mut results = Vec::<Value>::new(); |
@@ -796,6 +806,7 @@ impl Configurator { |
796 | 806 | end_datetime: Some(end_datetime.to_rfc3339()), |
797 | 807 | duration: Some(end_datetime.signed_duration_since(self.context.start_datetime).to_string()), |
798 | 808 | security_context: Some(self.context.security_context.clone()), |
| 809 | + restart_required: self.context.restart_required.clone(), |
799 | 810 | } |
800 | 811 | ), |
801 | 812 | other: Map::new(), |
|
0 commit comments