Skip to content

Commit aa3d968

Browse files
author
Andrew
authored
Merge pull request #287 from anmenaga/resource_debug_msgs
Support for resource tracing info
2 parents e63c3bb + 6c2a622 commit aa3d968

File tree

4 files changed

+54
-5
lines changed

4 files changed

+54
-5
lines changed

dsc/tests/dsc_args.tests.ps1

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,13 @@ resources:
180180
$LASTEXITCODE | Should -Be 0
181181
}
182182

183+
It 'resource tracing shows up' {
184+
# Assumption here is that DSC/PowerShellGroup provider is visible
185+
dsc -l trace resource list 2> $TestDrive/tracing.txt
186+
"$TestDrive/tracing.txt" | Should -FileContentMatchExactly 'PSModulePath'
187+
$LASTEXITCODE | Should -Be 0
188+
}
189+
183190
It 'stdin cannot be empty if neither input or path is provided' {
184191
'' | dsc resource set -r Microsoft/OSInfo 2> $TestDrive/error.txt
185192
$err = Get-Content $testdrive/error.txt -Raw

dsc_lib/src/discovery/command_discovery.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use crate::discovery::discovery_trait::ResourceDiscovery;
55
use crate::dscresources::dscresource::{Capability, DscResource, ImplementedAs};
66
use crate::dscresources::resource_manifest::{import_manifest, Kind, ResourceManifest};
77
use crate::dscresources::command_resource::invoke_command;
8+
use crate::dscresources::command_resource::log_resource_traces;
89
use crate::dscerror::DscError;
910
use indicatif::ProgressStyle;
1011
use std::collections::BTreeMap;
@@ -165,6 +166,7 @@ impl CommandDiscovery {
165166
continue;
166167
},
167168
};
169+
log_resource_traces(&stderr);
168170

169171
if exit_code != 0 {
170172
/* In case of "resource list" operation - print failure from adapter as warning

dsc_lib/src/dscresources/command_resource.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,33 @@ use std::{collections::HashMap, env, process::Command, io::{Write, Read}, proces
77
use crate::{dscerror::DscError, dscresources::invoke_result::{ResourceGetResponse, ResourceSetResponse, ResourceTestResponse}};
88
use crate::configure::config_result::ResourceGetResult;
99
use super::{dscresource::get_diff,resource_manifest::{ResourceManifest, InputKind, ReturnKind, SchemaKind}, invoke_result::{GetResult, SetResult, TestResult, ValidateResult, ExportResult}};
10-
use tracing::{debug, info, trace};
10+
use tracing::{error, warn, info, debug, trace};
1111

1212
pub const EXIT_PROCESS_TERMINATED: i32 = 0x102;
1313

14+
15+
pub fn log_resource_traces(stderr: &str)
16+
{
17+
if !stderr.is_empty()
18+
{
19+
for trace_line in stderr.lines() {
20+
if let Result::Ok(json_obj) = serde_json::from_str::<Value>(trace_line) {
21+
if let Some(msg) = json_obj.get("Error") {
22+
error!("{}", msg.as_str().unwrap_or_default());
23+
} else if let Some(msg) = json_obj.get("Warning") {
24+
warn!("{}", msg.as_str().unwrap_or_default());
25+
} else if let Some(msg) = json_obj.get("Info") {
26+
info!("{}", msg.as_str().unwrap_or_default());
27+
} else if let Some(msg) = json_obj.get("Debug") {
28+
debug!("{}", msg.as_str().unwrap_or_default());
29+
} else if let Some(msg) = json_obj.get("Trace") {
30+
trace!("{}", msg.as_str().unwrap_or_default());
31+
};
32+
};
33+
}
34+
}
35+
}
36+
1437
/// Invoke the get operation on a resource
1538
///
1639
/// # Arguments
@@ -50,6 +73,7 @@ pub fn invoke_get(resource: &ResourceManifest, cwd: &str, filter: &str) -> Resul
5073

5174
info!("Invoking get {} using {}", &resource.resource_type, &resource.get.executable);
5275
let (exit_code, stdout, stderr) = invoke_command(&resource.get.executable, get_args, input_filter, Some(cwd), env)?;
76+
log_resource_traces(&stderr);
5377
if exit_code != 0 {
5478
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
5579
}
@@ -150,6 +174,7 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
150174

151175
info!("Getting current state for set by invoking get {} using {}", &resource.resource_type, &resource.get.executable);
152176
let (exit_code, stdout, stderr) = invoke_command(&resource.get.executable, get_args, get_input, Some(cwd), get_env)?;
177+
log_resource_traces(&stderr);
153178
if exit_code != 0 {
154179
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
155180
}
@@ -163,6 +188,7 @@ pub fn invoke_set(resource: &ResourceManifest, cwd: &str, desired: &str, skip_te
163188

164189
info!("Invoking set {} using {}", &resource.resource_type, &set.executable);
165190
let (exit_code, stdout, stderr) = invoke_command(&set.executable, set.args.clone(), input_desired, Some(cwd), env)?;
191+
log_resource_traces(&stderr);
166192
if exit_code != 0 {
167193
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
168194
}
@@ -262,6 +288,7 @@ pub fn invoke_test(resource: &ResourceManifest, cwd: &str, expected: &str) -> Re
262288

263289
info!("Invoking test {} using {}", &resource.resource_type, &test.executable);
264290
let (exit_code, stdout, stderr) = invoke_command(&test.executable, args, input_expected, Some(cwd), env)?;
291+
log_resource_traces(&stderr);
265292
if exit_code != 0 {
266293
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
267294
}
@@ -350,6 +377,7 @@ pub fn invoke_validate(resource: &ResourceManifest, cwd: &str, config: &str) ->
350377
};
351378

352379
let (exit_code, stdout, stderr) = invoke_command(&validate.executable, validate.args.clone(), Some(config), Some(cwd), None)?;
380+
log_resource_traces(&stderr);
353381
if exit_code != 0 {
354382
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
355383
}
@@ -375,6 +403,7 @@ pub fn get_schema(resource: &ResourceManifest, cwd: &str) -> Result<String, DscE
375403
match schema_kind {
376404
SchemaKind::Command(ref command) => {
377405
let (exit_code, stdout, stderr) = invoke_command(&command.executable, command.args.clone(), None, Some(cwd), None)?;
406+
log_resource_traces(&stderr);
378407
if exit_code != 0 {
379408
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
380409
}
@@ -420,6 +449,7 @@ pub fn invoke_export(resource: &ResourceManifest, cwd: &str, input: Option<&str>
420449
};
421450

422451
let (exit_code, stdout, stderr) = invoke_command(&export.executable, export.args.clone(), input, Some(cwd), None)?;
452+
log_resource_traces(&stderr);
423453
if exit_code != 0 {
424454
return Err(DscError::Command(resource.resource_type.clone(), exit_code, stderr));
425455
}

powershell-adapter/powershell.resource.ps1

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,23 @@ if ($null -eq $DscModule)
7373

7474
Import-Module $DscModule -DisableNameChecking
7575

76+
# Adding some debug info to STDERR
77+
$m = gmo PSDesiredStateConfiguration
78+
$trace = @{"Debug"="PSVersion="+$PSVersionTable.PSVersion.ToString()} | ConvertTo-Json -Compress
79+
$host.ui.WriteErrorLine($trace)
80+
$trace = @{"Debug"="PSPath="+$PSHome} | ConvertTo-Json -Compress
81+
$host.ui.WriteErrorLine($trace)
82+
$trace = @{"Debug"="ModuleVersion="+$m.Version.ToString()} | ConvertTo-Json -Compress
83+
$host.ui.WriteErrorLine($trace)
84+
$trace = @{"Debug"="ModulePath="+$m.Path} | ConvertTo-Json -Compress
85+
$host.ui.WriteErrorLine($trace)
86+
$trace = @{"Debug"="PSModulePath="+$env:PSModulePath} | ConvertTo-Json -Compress
87+
$host.ui.WriteErrorLine($trace)
88+
7689
if ($Operation -eq 'List')
7790
{
7891
$DscResources= Get-DscResource
79-
#TODO: following should be added to debug stream of every operation
80-
#$m = gmo PSDesiredStateConfiguration
81-
#$r += @{"DebugInfo"=@{"ModuleVersion"=$m.Version.ToString();"ModulePath"=$m.Path;"PSVersion"=$PSVersionTable.PSVersion.ToString();"PSPath"=$PSHome}}
82-
#$r[0] | ConvertTo-Json -Compress -Depth 3
92+
8393
foreach ($r in $DscResources)
8494
{
8595
if ($r.ImplementedAs -eq "Binary")

0 commit comments

Comments
 (0)