|
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