Invoke the test operation on a resource. # Returns `ConfigurationTestResult` - The result of the test operation. # Errors This function will return an error if the underlying resource fails.
(&mut self)
| 799 | /// |
| 800 | /// This function will return an error if the underlying resource fails. |
| 801 | pub fn invoke_test(&mut self) -> Result<ConfigurationTestResult, DscError> { |
| 802 | let mut result = ConfigurationTestResult::new(); |
| 803 | self.context.operation = Some(Operation::Test); |
| 804 | let resources = get_resource_invocation_order(&self.config, &mut self.statement_parser, &mut self.context)?; |
| 805 | let mut progress = ProgressBar::new(resources.len() as u64, self.progress_format)?; |
| 806 | let discovery = &mut self.discovery.clone(); |
| 807 | for resource in resources { |
| 808 | let evaluated_name = self.evaluate_resource_name(&resource.name)?; |
| 809 | |
| 810 | progress.set_resource(&evaluated_name, &resource.resource_type); |
| 811 | progress.write_activity(format!("Test '{evaluated_name}'").as_str()); |
| 812 | if self.skip_resource(&resource)? { |
| 813 | progress.write_increment(1); |
| 814 | continue; |
| 815 | } |
| 816 | let directive_security_context = resource.directives.as_ref().and_then(|d| d.security_context.as_ref()); |
| 817 | check_security_context(resource.metadata.as_ref(), directive_security_context)?; |
| 818 | let adapter = get_require_adapter_from_directive(&resource.directives); |
| 819 | find_resource_or_error!(dsc_resource, discovery, resource, adapter); |
| 820 | let properties = self.get_properties(&resource, &dsc_resource.kind)?; |
| 821 | debug!("resource_type {}", &resource.resource_type); |
| 822 | let expected = add_metadata(dsc_resource, properties, resource.metadata.clone())?; |
| 823 | trace!("{}", t!("configure.mod.expectedState", state = expected)); |
| 824 | let start_datetime = chrono::Local::now(); |
| 825 | let mut test_result = match dsc_resource.test(&expected) { |
| 826 | Ok(result) => result, |
| 827 | Err(e) => { |
| 828 | progress.set_failure(get_failure_from_error(&e)); |
| 829 | progress.write_increment(1); |
| 830 | return Err(e); |
| 831 | }, |
| 832 | }; |
| 833 | let end_datetime = chrono::Local::now(); |
| 834 | let mut execution_information = ExecutionInformation::new_with_duration(&start_datetime, &end_datetime); |
| 835 | let mut metadata = Metadata { |
| 836 | microsoft: Some( |
| 837 | MicrosoftDscMetadata::new_with_duration(&start_datetime, &end_datetime) |
| 838 | ), |
| 839 | other: Map::new(), |
| 840 | }; |
| 841 | match &mut test_result { |
| 842 | TestResult::Resource(resource_test_result) => { |
| 843 | self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), serde_json::to_value(&resource_test_result.actual_state)?); |
| 844 | get_metadata_from_result(Some(&mut self.context), &mut resource_test_result.actual_state, &mut metadata, &mut execution_information)?; |
| 845 | }, |
| 846 | TestResult::Group(group) => { |
| 847 | let mut results = Vec::<Value>::new(); |
| 848 | for result in group { |
| 849 | results.push(serde_json::to_value(&result.result)?); |
| 850 | } |
| 851 | self.context.references.insert(resource_id(&resource.resource_type, &evaluated_name), Value::Array(results.clone())); |
| 852 | }, |
| 853 | } |
| 854 | let resource_result = config_result::ResourceTestResult { |
| 855 | execution_information: Some(execution_information), |
| 856 | metadata: Some(metadata), |
| 857 | name: evaluated_name, |
| 858 | resource_type: resource.resource_type.clone(), |
no test coverage detected