Skip to content

Commit bc98145

Browse files
author
Steve Lee (POWERSHELL HE/HIM) (from Dev Box)
committed
cleanup traces and add adapter to list of found resources when enumerating adapted resources
1 parent d947a8c commit bc98145

File tree

4 files changed

+44
-73
lines changed

4 files changed

+44
-73
lines changed

dsc/src/resource_command.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ pub fn get(dsc: &DscManager, resource_type: &str, mut input: String, format: &Op
2727
if let Some(pr) = get_resource(dsc, requires) {
2828
resource = pr;
2929
} else {
30-
error!("Adapter {} not found", requires);
30+
error!("Adapter '{}' not found", requires);
3131
return;
3232
};
3333
}
@@ -112,7 +112,7 @@ pub fn set(dsc: &DscManager, resource_type: &str, mut input: String, format: &Op
112112
if let Some(pr) = get_resource(dsc, requires) {
113113
resource = pr;
114114
} else {
115-
error!("Adapter {} not found", requires);
115+
error!("Adapter '{}' not found", requires);
116116
return;
117117
};
118118
}
@@ -149,7 +149,7 @@ pub fn test(dsc: &DscManager, resource_type: &str, mut input: String, format: &O
149149
if let Some(pr) = get_resource(dsc, requires) {
150150
resource = pr;
151151
} else {
152-
error!("Adapter {} not found", requires);
152+
error!("Adapter '{}' not found", requires);
153153
return;
154154
};
155155
}
@@ -186,7 +186,7 @@ pub fn delete(dsc: &DscManager, resource_type: &str, mut input: String) {
186186
if let Some(pr) = get_resource(dsc, requires) {
187187
resource = pr;
188188
} else {
189-
error!("Adapter {} not found", requires);
189+
error!("Adapter '{}' not found", requires);
190190
return;
191191
};
192192
}

dsc_lib/src/discovery/command_discovery.rs

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use crate::discovery::convert_wildcard_to_regex;
66
use crate::dscresources::dscresource::{Capability, DscResource, ImplementedAs};
77
use crate::dscresources::resource_manifest::{import_manifest, validate_semver, Kind, ResourceManifest};
88
use crate::dscresources::command_resource::invoke_command;
9-
use crate::dscresources::command_resource::log_resource_traces;
109
use crate::dscerror::DscError;
1110
use indicatif::ProgressStyle;
1211
use regex::RegexBuilder;
@@ -49,7 +48,7 @@ impl CommandDiscovery {
4948
trace!("DSC_RESOURCE_PATH not set, trying PATH");
5049
match env::var_os("PATH") {
5150
Some(value) => {
52-
debug!("Using PATH: {:?}", value.to_string_lossy());
51+
trace!("Using PATH: {:?}", value.to_string_lossy());
5352
value
5453
},
5554
None => {
@@ -85,10 +84,6 @@ impl Default for CommandDiscovery {
8584
impl ResourceDiscovery for CommandDiscovery {
8685

8786
fn discover_resources(&mut self, filter: &str) -> Result<(), DscError> {
88-
if !self.resources.is_empty() || !self.adapters.is_empty() {
89-
return Ok(());
90-
}
91-
9287
info!("Discovering resources using filter: {filter}");
9388

9489
let regex_str = convert_wildcard_to_regex(filter);
@@ -232,11 +227,10 @@ impl ResourceDiscovery for CommandDiscovery {
232227
Ok((exit_code, stdout, stderr)) => (exit_code, stdout, stderr),
233228
Err(e) => {
234229
// In case of error, log and continue
235-
warn!("Could not start {}: {}", list_command.executable, e);
230+
warn!("{e}");
236231
continue;
237232
},
238233
};
239-
log_resource_traces(&stderr);
240234

241235
if exit_code != 0 {
242236
// in case of failure, log and continue
@@ -331,32 +325,34 @@ impl ResourceDiscovery for CommandDiscovery {
331325

332326
if remaining_required_resource_types.contains(&adapter_name.to_lowercase())
333327
{
334-
// if an adapter is required, we need to find the resources it adapts
335-
self.discover_adapted_resources("*", &adapter_name)?;
336-
337328
// remove the adapter from the list of required resources
338329
remaining_required_resource_types.retain(|x| *x != adapter_name.to_lowercase());
339330
found_resources.insert(adapter_name.to_lowercase(), adapter.clone());
340331
if remaining_required_resource_types.is_empty()
341332
{
342333
return Ok(found_resources);
343334
}
335+
}
344336

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-
};
337+
self.discover_adapted_resources("*", &adapter_name)?;
351338

352-
if remaining_required_resource_types.contains(&adapted_name.to_lowercase())
339+
// now go through the adapter resources and add them to the list of resources
340+
for (adapted_name, adapted_resource) in &self.adapted_resources {
341+
let Some(adapted_resource) = adapted_resource.first() else {
342+
// skip if no resources
343+
continue;
344+
};
345+
346+
if remaining_required_resource_types.contains(&adapted_name.to_lowercase())
347+
{
348+
remaining_required_resource_types.retain(|x| *x != adapted_name.to_lowercase());
349+
found_resources.insert(adapted_name.to_lowercase(), adapted_resource.clone());
350+
351+
// also insert the adapter
352+
found_resources.insert(adapter_name.to_lowercase(), adapter.clone());
353+
if remaining_required_resource_types.is_empty()
353354
{
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-
}
355+
return Ok(found_resources);
360356
}
361357
}
362358
}

dsc_lib/src/dscerror.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ pub enum DscError {
1717
#[error("Command: Resource '{0}' [Exit code {1}] {2}")]
1818
Command(String, i32, String),
1919

20+
#[error("Command: Executable '{0}' [Exit code {1}] {2}")]
21+
CommandExit(String, i32, String),
22+
2023
#[error("CommandOperation: {0} for executable '{1}'")]
2124
CommandOperation(String, String),
2225

dsc_lib/src/dscresources/command_resource.rs

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,22 @@ use tracing::{error, warn, info, debug, trace};
1212
pub const EXIT_PROCESS_TERMINATED: i32 = 0x102;
1313

1414

15-
pub fn log_resource_traces(stderr: &str)
15+
pub fn log_resource_traces(process_name: &str, stderr: &str)
1616
{
1717
if !stderr.is_empty()
1818
{
1919
for trace_line in stderr.lines() {
2020
if let Result::Ok(json_obj) = serde_json::from_str::<Value>(trace_line) {
2121
if let Some(msg) = json_obj.get("Error") {
22-
error!("{}", msg.as_str().unwrap_or_default());
22+
error!("Process {process_name}: {}", msg.as_str().unwrap_or_default());
2323
} else if let Some(msg) = json_obj.get("Warning") {
24-
warn!("{}", msg.as_str().unwrap_or_default());
24+
warn!("Process {process_name}: {}", msg.as_str().unwrap_or_default());
2525
} else if let Some(msg) = json_obj.get("Info") {
26-
info!("{}", msg.as_str().unwrap_or_default());
26+
info!("Process {process_name}: {}", msg.as_str().unwrap_or_default());
2727
} else if let Some(msg) = json_obj.get("Debug") {
28-
debug!("{}", msg.as_str().unwrap_or_default());
28+
debug!("Process {process_name}: {}", msg.as_str().unwrap_or_default());
2929
} else if let Some(msg) = json_obj.get("Trace") {
30-
trace!("{}", msg.as_str().unwrap_or_default());
30+
trace!("Process {process_name}: {}", msg.as_str().unwrap_or_default());
3131
};
3232
};
3333
}
@@ -54,12 +54,7 @@ pub fn invoke_get(resource: &ResourceManifest, cwd: &str, filter: &str) -> Resul
5454
}
5555

5656
info!("Invoking get '{}' using '{}'", &resource.resource_type, &resource.get.executable);
57-
let (exit_code, stdout, stderr) = invoke_command(&resource.get.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
58-
log_resource_traces(&stderr);
59-
if exit_code != 0 {
60-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
61-
}
62-
57+
let (_exit_code, stdout, stderr) = invoke_command(&resource.get.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
6358
if resource.kind == Some(Kind::Resource) {
6459
debug!("Verifying output of get '{}' using '{}'", &resource.resource_type, &resource.get.executable);
6560
verify_json(resource, cwd, &stdout)?;
@@ -131,10 +126,6 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
131126

132127
info!("Getting current state for set by invoking get {} using {}", &resource.resource_type, &resource.get.executable);
133128
let (exit_code, stdout, stderr) = invoke_command(&resource.get.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
134-
log_resource_traces(&stderr);
135-
if exit_code != 0 {
136-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
137-
}
138129

139130
if resource.kind == Some(Kind::Resource) {
140131
debug!("Verifying output of get '{}' using '{}'", &resource.resource_type, &resource.get.executable);
@@ -165,10 +156,6 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
165156

166157
info!("Invoking set '{}' using '{}'", &resource.resource_type, &set.executable);
167158
let (exit_code, stdout, stderr) = invoke_command(&set.executable, args, input_desired, Some(cwd), env)?;
168-
log_resource_traces(&stderr);
169-
if exit_code != 0 {
170-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
171-
}
172159

173160
match set.returns {
174161
Some(ReturnKind::State) => {
@@ -260,10 +247,6 @@ pub fn invoke_test(resource: &ResourceManifest, cwd: &str, expected: &str) -> Re
260247

261248
info!("Invoking test '{}' using '{}'", &resource.resource_type, &test.executable);
262249
let (exit_code, stdout, stderr) = invoke_command(&test.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
263-
log_resource_traces(&stderr);
264-
if exit_code != 0 {
265-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
266-
}
267250

268251
if resource.kind == Some(Kind::Resource) {
269252
debug!("Verifying output of test '{}' using '{}'", &resource.resource_type, &test.executable);
@@ -377,11 +360,7 @@ pub fn invoke_delete(resource: &ResourceManifest, cwd: &str, filter: &str) -> Re
377360
let command_input = get_command_input(&delete.input, filter)?;
378361

379362
info!("Invoking delete '{}' using '{}'", &resource.resource_type, &delete.executable);
380-
let (exit_code, _stdout, stderr) = invoke_command(&delete.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
381-
log_resource_traces(&stderr);
382-
if exit_code != 0 {
383-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
384-
}
363+
let (_exit_code, _stdout, _stderr) = invoke_command(&delete.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
385364

386365
Ok(())
387366
}
@@ -412,12 +391,7 @@ pub fn invoke_validate(resource: &ResourceManifest, cwd: &str, config: &str) ->
412391
let command_input = get_command_input(&validate.input, config)?;
413392

414393
info!("Invoking validate '{}' using '{}'", &resource.resource_type, &validate.executable);
415-
let (exit_code, stdout, stderr) = invoke_command(&validate.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
416-
log_resource_traces(&stderr);
417-
if exit_code != 0 {
418-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
419-
}
420-
394+
let (_exit_code, stdout, _stderr) = invoke_command(&validate.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
421395
let result: ValidateResult = serde_json::from_str(&stdout)?;
422396
Ok(result)
423397
}
@@ -438,11 +412,7 @@ pub fn get_schema(resource: &ResourceManifest, cwd: &str) -> Result<String, DscE
438412

439413
match schema_kind {
440414
SchemaKind::Command(ref command) => {
441-
let (exit_code, stdout, stderr) = invoke_command(&command.executable, command.args.clone(), None, Some(cwd), None)?;
442-
log_resource_traces(&stderr);
443-
if exit_code != 0 {
444-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
445-
}
415+
let (_exit_code, stdout, _stderr) = invoke_command(&command.executable, command.args.clone(), None, Some(cwd), None)?;
446416
Ok(stdout)
447417
},
448418
SchemaKind::Embedded(ref schema) => {
@@ -499,11 +469,7 @@ pub fn invoke_export(resource: &ResourceManifest, cwd: &str, input: Option<&str>
499469
args = process_args(&export.args, "");
500470
}
501471

502-
let (exit_code, stdout, stderr) = invoke_command(&export.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
503-
log_resource_traces(&stderr);
504-
if exit_code != 0 {
505-
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
506-
}
472+
let (_exit_code, stdout, stderr) = invoke_command(&export.executable, args, command_input.stdin.as_deref(), Some(cwd), command_input.env)?;
507473
let mut instances: Vec<Value> = Vec::new();
508474
for line in stdout.lines()
509475
{
@@ -594,7 +560,13 @@ pub fn invoke_command(executable: &str, args: Option<Vec<String>>, input: Option
594560
}
595561
if !stderr.is_empty() {
596562
trace!("STDERR returned: {}", &stderr);
563+
log_resource_traces(executable, &stderr);
597564
}
565+
566+
if exit_code != 0 {
567+
return Err(DscError::Command(executable.to_string(), exit_code, stderr));
568+
}
569+
598570
Ok((exit_code, stdout, stderr))
599571
}
600572

0 commit comments

Comments
 (0)