Skip to content

Commit 769a421

Browse files
committed
change to a failure object that contains exitCode and message
1 parent 6d033fd commit 769a421

File tree

3 files changed

+45
-18
lines changed

3 files changed

+45
-18
lines changed

dsc/tests/dsc_config_get.tests.ps1

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ Describe 'dsc config get tests' {
110110
- name: ErrorTest
111111
type: Test/ExitCode
112112
properties:
113-
exitCode: 1
113+
exitCode: 8
114114
'@
115115
dsc --progress-format json --trace-format json config get -i $config_yaml 2> $TestDrive/ErrorStream.txt
116116
$LASTEXITCODE | Should -Be 2
@@ -134,10 +134,12 @@ Describe 'dsc config get tests' {
134134
$jp.failed | Should -BeNullOrEmpty
135135
}
136136
}
137-
elseif ($null -ne $jp.failed -and $jp.resourceType -eq 'Test/ExitCode') {
137+
elseif ($null -ne $jp.failure -and $jp.resourceType -eq 'Test/ExitCode') {
138138
if ($jp.resourceName -eq 'ErrorTest') {
139139
$InstanceTwoFound = $true
140140
$jp.result | Should -BeNullOrEmpty
141+
$jp.failure.exitCode | Should -Be 8
142+
$jp.failure.message | Should -Not -BeNullOrEmpty
141143
}
142144
}
143145
}

dsc_lib/src/configure/mod.rs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::dscresources::{
1313
use crate::DscResource;
1414
use crate::discovery::Discovery;
1515
use crate::parser::Statement;
16-
use crate::progress::{ProgressBar, ProgressFormat};
16+
use crate::progress::{Failure, ProgressBar, ProgressFormat};
1717
use self::context::Context;
1818
use self::config_doc::{Configuration, DataType, MicrosoftDscMetadata, Operation, SecurityContextKind};
1919
use self::depends_on::get_resource_invocation_order;
@@ -245,7 +245,7 @@ impl Configurator {
245245
let get_result = match dsc_resource.get(&filter) {
246246
Ok(result) => result,
247247
Err(e) => {
248-
progress.set_failed();
248+
progress.set_failure(get_failure_from_error(&e));
249249
progress.write_increment(1);
250250
return Err(e);
251251
},
@@ -342,7 +342,7 @@ impl Configurator {
342342
set_result = match dsc_resource.set(&desired, skip_test, &self.context.execution_type) {
343343
Ok(result) => result,
344344
Err(e) => {
345-
progress.set_failed();
345+
progress.set_failure(get_failure_from_error(&e));
346346
progress.write_increment(1);
347347
return Err(e);
348348
},
@@ -357,21 +357,21 @@ impl Configurator {
357357
let before_result = match dsc_resource.get(&desired) {
358358
Ok(result) => result,
359359
Err(e) => {
360-
progress.set_failed();
360+
progress.set_failure(get_failure_from_error(&e));
361361
progress.write_increment(1);
362362
return Err(e);
363363
},
364364
};
365365
start_datetime = chrono::Local::now();
366-
if let Err(err) = dsc_resource.delete(&desired) {
367-
progress.set_failed();
366+
if let Err(e) = dsc_resource.delete(&desired) {
367+
progress.set_failure(get_failure_from_error(&e));
368368
progress.write_increment(1);
369-
return Err(err);
369+
return Err(e);
370370
}
371371
let after_result = match dsc_resource.get(&desired) {
372372
Ok(result) => result,
373373
Err(e) => {
374-
progress.set_failed();
374+
progress.set_failure(get_failure_from_error(&e));
375375
progress.write_increment(1);
376376
return Err(e);
377377
},
@@ -464,7 +464,7 @@ impl Configurator {
464464
let test_result = match dsc_resource.test(&expected) {
465465
Ok(result) => result,
466466
Err(e) => {
467-
progress.set_failed();
467+
progress.set_failure(get_failure_from_error(&e));
468468
progress.write_increment(1);
469469
return Err(e);
470470
},
@@ -535,7 +535,7 @@ impl Configurator {
535535
let export_result = match add_resource_export_results_to_configuration(dsc_resource, Some(dsc_resource), &mut conf, input.as_str()) {
536536
Ok(result) => result,
537537
Err(e) => {
538-
progress.set_failed();
538+
progress.set_failure(get_failure_from_error(&e));
539539
progress.write_increment(1);
540540
return Err(e);
541541
},
@@ -792,3 +792,21 @@ impl Configurator {
792792
Ok(Some(result))
793793
}
794794
}
795+
796+
fn get_failure_from_error(err: &DscError) -> Option<Failure> {
797+
match err {
798+
DscError::CommandExit(_resource, exit_code, reason) => {
799+
Some(Failure {
800+
message: reason.to_string(),
801+
exit_code: exit_code.clone(),
802+
})
803+
},
804+
DscError::CommandExitFromManifest(_resource, exit_code, reason) => {
805+
Some(Failure {
806+
message: reason.to_string(),
807+
exit_code: exit_code.clone(),
808+
})
809+
},
810+
_ => None,
811+
}
812+
}

dsc_lib/src/progress.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ pub enum ProgressFormat {
2323
Json,
2424
}
2525

26+
#[derive(Default, Debug, Clone, Serialize)]
27+
#[serde(rename_all = "camelCase")]
28+
pub struct Failure {
29+
pub message: String,
30+
pub exit_code: i32,
31+
}
32+
2633
#[derive(Default, Debug, Clone, Serialize)]
2734
#[serde(rename_all = "camelCase")]
2835
pub struct Progress {
@@ -49,9 +56,9 @@ pub struct Progress {
4956
/// The result of the operation.
5057
#[serde(skip_serializing_if = "Option::is_none")]
5158
pub result: Option<Value>,
52-
/// Indicates if the operation failed.
59+
/// Failure information.
5360
#[serde(skip_serializing_if = "Option::is_none")]
54-
pub failed: Option<bool>,
61+
pub failure: Option<Failure>,
5562
}
5663

5764
impl Progress {
@@ -136,7 +143,7 @@ impl ProgressBar {
136143
self.progress_value.resource_name = Some(name.to_string());
137144
self.progress_value.resource_type = Some(resource_type.to_string());
138145
self.progress_value.result = None;
139-
self.progress_value.failed = None;
146+
self.progress_value.failure = None;
140147
}
141148

142149
/// Set the result of the operation. This will clear any error.
@@ -146,15 +153,15 @@ impl ProgressBar {
146153
/// * `result` - The result of the operation
147154
///
148155
pub fn set_result(&mut self, result: &Value) {
149-
self.progress_value.failed = None;
156+
self.progress_value.failure = None;
150157
self.progress_value.result = Some(result.clone());
151158
}
152159

153160
/// Indicate that the operation failed. This will clear any result.
154161
///
155-
pub fn set_failed(&mut self) {
162+
pub fn set_failure(&mut self, failure: Option<Failure>) {
156163
self.progress_value.result = None;
157-
self.progress_value.failed = Some(true);
164+
self.progress_value.failure = failure;
158165
}
159166

160167
/// Set the status of the operation and write the progress

0 commit comments

Comments
 (0)