Perform discovery of resources using the extension. # Returns A result containing a vector of discovered resources or an error. # Errors This function will return an error if the discovery fails.
(&self)
| 56 | /// |
| 57 | /// This function will return an error if the discovery fails. |
| 58 | pub fn discover(&self) -> Result<Vec<DscResource>, DscError> { |
| 59 | let mut resources: Vec<DscResource> = Vec::new(); |
| 60 | |
| 61 | if self.capabilities.contains(&Capability::Discover) { |
| 62 | let extension = match serde_json::from_value::<ExtensionManifest>(self.manifest.clone()) { |
| 63 | Ok(manifest) => manifest, |
| 64 | Err(err) => { |
| 65 | return Err(DscError::Manifest(self.type_name.to_string(), err)); |
| 66 | } |
| 67 | }; |
| 68 | let Some(discover) = extension.discover else { |
| 69 | return Err(DscError::UnsupportedCapability(self.type_name.to_string(), Capability::Discover.to_string())); |
| 70 | }; |
| 71 | let command_resource_info = CommandResourceInfo { |
| 72 | type_name: self.type_name.clone(), |
| 73 | path: None, |
| 74 | }; |
| 75 | let args = process_get_args(discover.args.as_ref(), "", &command_resource_info); |
| 76 | if let Some(deprecation_message) = extension.deprecation_message.as_ref() { |
| 77 | warn!("{}", t!("extensions.dscextension.deprecationMessage", extension = self.type_name, message = deprecation_message)); |
| 78 | } |
| 79 | let (_exit_code, stdout, _stderr) = invoke_command( |
| 80 | &discover.executable, |
| 81 | args, |
| 82 | None, |
| 83 | Some(&self.directory), |
| 84 | None, |
| 85 | extension.exit_codes.as_ref(), |
| 86 | )?; |
| 87 | if stdout.is_empty() { |
| 88 | info!("{}", t!("extensions.dscextension.discoverNoResults", extension = self.type_name)); |
| 89 | } else { |
| 90 | for line in stdout.lines() { |
| 91 | trace!("{}", t!("extensions.dscextension.extensionReturned", extension = self.type_name, line = line)); |
| 92 | let discover_result: DiscoverResult = match serde_json::from_str(line) { |
| 93 | Ok(result) => result, |
| 94 | Err(err) => { |
| 95 | return Err(DscError::Json(err)); |
| 96 | } |
| 97 | }; |
| 98 | if !discover_result.manifest_path.is_absolute() { |
| 99 | return Err(DscError::Extension(t!("extensions.dscextension.discoverNotAbsolutePath", extension = self.type_name.clone(), path = discover_result.manifest_path.display()).to_string())); |
| 100 | } |
| 101 | // Currently we don't support extensions discovering other extensions |
| 102 | let manifests = match load_manifest(&discover_result.manifest_path) { |
| 103 | Ok(manifests) => manifests, |
| 104 | Err(err) => { |
| 105 | info!("{}", t!("extensions.dscextension.failedLoadManifest", extension = self.type_name, err = err)); |
| 106 | continue; |
| 107 | } |
| 108 | }; |
| 109 | for imported_manifest in manifests { |
| 110 | if let ImportedManifest::Resource(resource) = imported_manifest { |
| 111 | resources.push(resource); |
| 112 | } |
| 113 | } |
| 114 | } |
| 115 | } |
nothing calls this directly
no test coverage detected