(&mut self, skip_test: bool)
| 611 | /// This function will return an error if the underlying resource fails. |
| 612 | #[allow(clippy::too_many_lines)] |
| 613 | pub fn invoke_set(&mut self, skip_test: bool) -> Result<ConfigurationSetResult, DscError> { |
| 614 | let mut result = ConfigurationSetResult::new(); |
| 615 | self.context.operation = Some(Operation::Set); |
| 616 | let resources = get_resource_invocation_order(&self.config, &mut self.statement_parser, &mut self.context)?; |
| 617 | let mut progress = ProgressBar::new(resources.len() as u64, self.progress_format)?; |
| 618 | let discovery = &mut self.discovery.clone(); |
| 619 | for resource in resources { |
| 620 | let evaluated_name = self.evaluate_resource_name(&resource.name)?; |
| 621 | |
| 622 | progress.set_resource(&evaluated_name, &resource.resource_type); |
| 623 | progress.write_activity(format!("Set '{evaluated_name}'").as_str()); |
| 624 | if self.skip_resource(&resource)? { |
| 625 | progress.write_increment(1); |
| 626 | continue; |
| 627 | } |
| 628 | let directive_security_context = resource.directives.as_ref().and_then(|d| d.security_context.as_ref()); |
| 629 | check_security_context(resource.metadata.as_ref(), directive_security_context)?; |
| 630 | let adapter = get_require_adapter_from_directive(&resource.directives); |
| 631 | find_resource_or_error!(dsc_resource, discovery, resource, adapter); |
| 632 | let properties = self.get_properties(&resource, &dsc_resource.kind)?; |
| 633 | debug!("resource_type {}", &resource.resource_type); |
| 634 | // see if the properties contains `_exist` and is false |
| 635 | let exist = match &properties { |
| 636 | Some(property_map) => { |
| 637 | if let Some(exist) = property_map.get("_exist") { |
| 638 | !matches!(exist, Value::Bool(false)) |
| 639 | } else { |
| 640 | true |
| 641 | } |
| 642 | }, |
| 643 | _ => { |
| 644 | true |
| 645 | } |
| 646 | }; |
| 647 | |
| 648 | let desired = add_metadata(dsc_resource, properties, resource.metadata.clone())?; |
| 649 | trace!("{}", t!("configure.mod.desired", state = desired)); |
| 650 | |
| 651 | let start_datetime; |
| 652 | let end_datetime; |
| 653 | let mut set_result; |
| 654 | let mut delete_what_if_metadata: Option<DeleteResult> = None; |
| 655 | if exist || dsc_resource.capabilities.contains(&Capability::SetHandlesExist) { |
| 656 | debug!("{}", t!("configure.mod.handlesExist")); |
| 657 | start_datetime = chrono::Local::now(); |
| 658 | set_result = match dsc_resource.set(&desired, skip_test, &self.context.execution_type) { |
| 659 | Ok(result) => result, |
| 660 | Err(e) => { |
| 661 | progress.set_failure(get_failure_from_error(&e)); |
| 662 | progress.write_increment(1); |
| 663 | return Err(e); |
| 664 | }, |
| 665 | }; |
| 666 | end_datetime = chrono::Local::now(); |
| 667 | } else if dsc_resource.capabilities.contains(&Capability::Delete) { |
| 668 | debug!("{}", t!("configure.mod.implementsDelete")); |
| 669 | |
| 670 | let before_result = match dsc_resource.get(&desired) { |
no test coverage detected