@@ -7,10 +7,33 @@ use std::{collections::HashMap, env, process::Command, io::{Write, Read}, proces
77use crate :: { dscerror:: DscError , dscresources:: invoke_result:: { ResourceGetResponse , ResourceSetResponse , ResourceTestResponse } } ;
88use crate :: configure:: config_result:: ResourceGetResult ;
99use 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
1212pub 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 }
0 commit comments