|
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 Some(restart_required) = serde_json::from_value::<Vec<RestartRequired>>(value.clone()).ok() { |
| 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 {
|
@@ -335,7 +345,7 @@ impl Configurator {
|
335 | 345 | match &mut get_result {
|
336 | 346 | GetResult::Resource(ref mut resource_result) => {
|
337 | 347 | self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_result.actual_state)?);
|
338 |
| - get_metadata_from_result(&mut resource_result.actual_state, &mut metadata)?; |
| 348 | + get_metadata_from_result(Some(&mut self.context), &mut resource_result.actual_state, &mut metadata)?; |
339 | 349 | },
|
340 | 350 | GetResult::Group(group) => {
|
341 | 351 | let mut results = Vec::<Value>::new();
|
@@ -488,7 +498,7 @@ impl Configurator {
|
488 | 498 | match &mut set_result {
|
489 | 499 | SetResult::Resource(resource_result) => {
|
490 | 500 | self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_result.after_state)?);
|
491 |
| - get_metadata_from_result(&mut resource_result.after_state, &mut metadata)?; |
| 501 | + get_metadata_from_result(Some(&mut self.context), &mut resource_result.after_state, &mut metadata)?; |
492 | 502 | },
|
493 | 503 | SetResult::Group(group) => {
|
494 | 504 | let mut results = Vec::<Value>::new();
|
@@ -558,7 +568,7 @@ impl Configurator {
|
558 | 568 | match &mut test_result {
|
559 | 569 | TestResult::Resource(resource_test_result) => {
|
560 | 570 | self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_test_result.actual_state)?);
|
561 |
| - get_metadata_from_result(&mut resource_test_result.actual_state, &mut metadata)?; |
| 571 | + get_metadata_from_result(Some(&mut self.context), &mut resource_test_result.actual_state, &mut metadata)?; |
562 | 572 | },
|
563 | 573 | TestResult::Group(group) => {
|
564 | 574 | let mut results = Vec::<Value>::new();
|
@@ -765,6 +775,11 @@ impl Configurator {
|
765 | 775 | end_datetime: Some(end_datetime.to_rfc3339()),
|
766 | 776 | duration: Some(end_datetime.signed_duration_since(self.context.start_datetime).to_string()),
|
767 | 777 | security_context: Some(self.context.security_context.clone()),
|
| 778 | + restart_required: if let Some(restart_required) = self.context.restart_required.clone() { |
| 779 | + Some(restart_required) |
| 780 | + } else { |
| 781 | + None |
| 782 | + }, |
768 | 783 | }
|
769 | 784 | ),
|
770 | 785 | other: Map::new(),
|
|
0 commit comments