(&mut self)
| 1194 | } |
| 1195 | |
| 1196 | fn validate_config(&mut self) -> Result<(), DscError> { |
| 1197 | let config: Configuration = serde_json::from_str(self.json.as_str())?; |
| 1198 | let config_security_context = if let Some(directives) = &config.directives { |
| 1199 | directives.security_context.clone() |
| 1200 | } else { |
| 1201 | None |
| 1202 | }; |
| 1203 | check_security_context(config.metadata.as_ref(), config_security_context.as_ref())?; |
| 1204 | |
| 1205 | if let Some(directives) = &config.directives |
| 1206 | && let Some(version_req) = &directives.version { |
| 1207 | let dsc_version = SemanticVersion::parse(env!("CARGO_PKG_VERSION"))?; |
| 1208 | if !version_req.matches(&dsc_version) { |
| 1209 | return Err(DscError::Validation(t!("configure.mod.versionNotSatisfied", required_version = version_req, current_version = env!("CARGO_PKG_VERSION")).to_string())); |
| 1210 | } |
| 1211 | } |
| 1212 | |
| 1213 | let mut resource_discovery_mode = ResourceDiscoveryMode::PreDeployment; |
| 1214 | if let Some(directives) = &config.directives |
| 1215 | && let Some(resource_discovery_directive) = &directives.resource_discovery { |
| 1216 | resource_discovery_mode = resource_discovery_directive.clone(); |
| 1217 | } |
| 1218 | |
| 1219 | if resource_discovery_mode == ResourceDiscoveryMode::DuringDeployment { |
| 1220 | debug!("{}", t!("configure.mod.skippingResourceDiscovery")); |
| 1221 | self.discovery.refresh_cache = true; |
| 1222 | } else { |
| 1223 | // Perform discovery of resources used in config |
| 1224 | // create an array of DiscoveryFilter using the resource types and requireVersion from the config |
| 1225 | let mut discovery_filter: Vec<DiscoveryFilter> = Vec::new(); |
| 1226 | let config_copy = config.clone(); |
| 1227 | for resource in config_copy.resources { |
| 1228 | let adapter = get_require_adapter_from_directive(&resource.directives); |
| 1229 | let filter = DiscoveryFilter::new( |
| 1230 | &resource.resource_type, |
| 1231 | resource.require_version.clone(), |
| 1232 | adapter |
| 1233 | ); |
| 1234 | if !discovery_filter.contains(&filter) { |
| 1235 | discovery_filter.push(filter); |
| 1236 | } |
| 1237 | // defer actual unrolling until parameters are available |
| 1238 | if let Some(copy) = &resource.copy { |
| 1239 | debug!("{}", t!("configure.mod.validateCopy", name = ©.name, count = copy.count)); |
| 1240 | if copy.mode.is_some() { |
| 1241 | return Err(DscError::Validation(t!("configure.mod.copyModeNotSupported").to_string())); |
| 1242 | } |
| 1243 | if copy.batch_size.is_some() { |
| 1244 | return Err(DscError::Validation(t!("configure.mod.copyBatchSizeNotSupported").to_string())); |
| 1245 | } |
| 1246 | } |
| 1247 | } |
| 1248 | self.discovery.find_resources(&discovery_filter, self.progress_format)?; |
| 1249 | |
| 1250 | // now check that each resource in the config was found |
| 1251 | for resource in config.resources.iter() { |
| 1252 | let adapter = get_require_adapter_from_directive(&resource.directives); |
| 1253 | let Some(_dsc_resource) = self.discovery.find_resource(&DiscoveryFilter::new(&resource.resource_type, resource.require_version.clone(), adapter))? else { |
no test coverage detected