Skip to content

Commit d947a8c

Browse files
author
Steve Lee (POWERSHELL HE/HIM) (from Dev Box)
committed
add comments, fix formatting
1 parent f8a4eb1 commit d947a8c

File tree

2 files changed

+58
-20
lines changed

2 files changed

+58
-20
lines changed

dsc_lib/src/discovery/command_discovery.rs

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,10 @@ impl ResourceDiscovery for CommandDiscovery {
148148
let manifest = import_manifest(manifest.clone())?;
149149
if manifest.kind == Some(Kind::Adapter) {
150150
trace!("Resource adapter {} found", resource.type_name);
151-
insert_resource(&mut adapters, &resource);
151+
insert_resource(&mut adapters, &resource, true);
152152
} else {
153153
trace!("Resource {} found", resource.type_name);
154-
insert_resource(&mut resources, &resource);
154+
insert_resource(&mut resources, &resource, true);
155155
}
156156
}
157157
}
@@ -253,7 +253,9 @@ impl ResourceDiscovery for CommandDiscovery {
253253
}
254254

255255
if name_regex.is_match(&resource.type_name) {
256-
insert_resource(&mut adapted_resources, &resource);
256+
// we allow duplicate versions since it can come from different adapters
257+
// like PowerShell vs WindowsPowerShell
258+
insert_resource(&mut adapted_resources, &resource, false);
257259
adapter_resources_count += 1;
258260
}
259261
},
@@ -300,6 +302,7 @@ impl ResourceDiscovery for CommandDiscovery {
300302
let mut remaining_required_resource_types = required_resource_types.to_owned();
301303

302304
for (resource_name, resources) in &self.resources {
305+
// TODO: handle version requirements
303306
let Some(resource ) = resources.first() else {
304307
// skip if no resources
305308
continue;
@@ -318,29 +321,52 @@ impl ResourceDiscovery for CommandDiscovery {
318321
}
319322
debug!("Found {} matching non-adapter-based resources", found_resources.len());
320323

321-
// now go through the adapter resources and add them to the list of resources
322-
for (adapted_name, adapted_resource) in &self.adapted_resources {
323-
let Some(adapted_resource) = adapted_resource.first() else {
324-
// skip if no resources
324+
// now go through the adapters
325+
for (adapter_name, adapters) in self.adapters.clone() {
326+
// TODO: handle version requirements
327+
let Some(adapter) = adapters.first() else {
328+
// skip if no adapters
325329
continue;
326330
};
327331

328-
if remaining_required_resource_types.contains(&adapted_name.to_lowercase())
332+
if remaining_required_resource_types.contains(&adapter_name.to_lowercase())
329333
{
330-
remaining_required_resource_types.retain(|x| *x != adapted_name.to_lowercase());
331-
found_resources.insert(adapted_name.to_lowercase(), adapted_resource.clone());
334+
// if an adapter is required, we need to find the resources it adapts
335+
self.discover_adapted_resources("*", &adapter_name)?;
336+
337+
// remove the adapter from the list of required resources
338+
remaining_required_resource_types.retain(|x| *x != adapter_name.to_lowercase());
339+
found_resources.insert(adapter_name.to_lowercase(), adapter.clone());
332340
if remaining_required_resource_types.is_empty()
333341
{
334342
return Ok(found_resources);
335343
}
344+
345+
// now go through the adapter resources and add them to the list of resources
346+
for (adapted_name, adapted_resource) in &self.adapted_resources {
347+
let Some(adapted_resource) = adapted_resource.first() else {
348+
// skip if no resources
349+
continue;
350+
};
351+
352+
if remaining_required_resource_types.contains(&adapted_name.to_lowercase())
353+
{
354+
remaining_required_resource_types.retain(|x| *x != adapted_name.to_lowercase());
355+
found_resources.insert(adapted_name.to_lowercase(), adapted_resource.clone());
356+
if remaining_required_resource_types.is_empty()
357+
{
358+
return Ok(found_resources);
359+
}
360+
}
361+
}
336362
}
337363
}
338364
Ok(found_resources)
339365
}
340366
}
341367

342368
// helper to insert a resource into a vector of resources in order of newest to oldest
343-
fn insert_resource(resources: &mut BTreeMap<String, Vec<DscResource>>, resource: &DscResource) {
369+
fn insert_resource(resources: &mut BTreeMap<String, Vec<DscResource>>, resource: &DscResource, skip_duplicate_version: bool) {
344370
if resources.contains_key(&resource.type_name) {
345371
let Some(resource_versions) = resources.get_mut(&resource.type_name) else {
346372
resources.insert(resource.type_name.clone(), vec![resource.clone()]);
@@ -365,8 +391,8 @@ fn insert_resource(resources: &mut BTreeMap<String, Vec<DscResource>>, resource:
365391
continue;
366392
},
367393
};
368-
// if the version already exists, we skip
369-
if resource_instance_version == resource_version {
394+
// if the version already exists, we might skip it
395+
if !skip_duplicate_version && resource_instance_version == resource_version {
370396
return;
371397
}
372398

dsc_lib/src/discovery/mod.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,16 @@ impl Discovery {
2626
})
2727
}
2828

29-
/// List operation.
29+
/// List operation for getting available resources based on the filters.
30+
///
31+
/// # Arguments
32+
///
33+
/// * `type_name_filter` - The filter for the resource type name.
34+
/// * `adapter_name_filter` - The filter for the adapter name.
35+
///
36+
/// # Returns
37+
///
38+
/// A vector of `DscResource` instances.
3039
pub fn list_available_resources(&mut self, type_name_filter: &str, adapter_name_filter: &str) -> Vec<DscResource> {
3140
let discovery_types: Vec<Box<dyn ResourceDiscovery>> = vec![
3241
Box::new(command_discovery::CommandDiscovery::new()),
@@ -59,22 +68,25 @@ impl Discovery {
5968
self.resources.get(type_name)
6069
}
6170

71+
/// Find resources based on the required resource types.
72+
///
73+
/// # Arguments
74+
///
75+
/// * `required_resource_types` - The required resource types.
6276
pub fn find_resources(&mut self, required_resource_types: &[String]) {
63-
6477
let discovery_types: Vec<Box<dyn ResourceDiscovery>> = vec![
6578
Box::new(command_discovery::CommandDiscovery::new()),
6679
];
67-
6880
let mut remaining_required_resource_types = required_resource_types.to_owned();
6981
for mut discovery_type in discovery_types {
7082

7183
let discovered_resources = match discovery_type.find_resources(&remaining_required_resource_types) {
7284
Ok(value) => value,
7385
Err(err) => {
74-
error!("{err}");
75-
continue;
76-
}
77-
};
86+
error!("{err}");
87+
continue;
88+
}
89+
};
7890

7991
for resource in discovered_resources {
8092
self.resources.insert(resource.0.clone(), resource.1);

0 commit comments

Comments
 (0)