Skip to content

Commit 0066264

Browse files
committed
Change references() to use the raw output of a resource
1 parent 92a40d9 commit 0066264

File tree

5 files changed

+57
-16
lines changed

5 files changed

+57
-16
lines changed

dsc/examples/reference.dsc.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ resources:
77
- name: Echo
88
type: Microsoft.DSC.Debug/Echo
99
properties:
10-
output: "[concat('The OS is ', reference(resourceId('Microsoft/OSInfo','os')).actualState.family)]"
10+
output: "[concat('The OS is ', reference(resourceId('Microsoft/OSInfo','os')).family)]"
1111
dependsOn:
1212
- "[resourceId('Microsoft/OSInfo','os')]"

dsc/tests/dsc_reference.tests.ps1

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22
# Licensed under the MIT License.
33

44
Describe 'Tests for config using reference function' {
5-
It 'Reference works' {
6-
$out = dsc config get -f $PSScriptRoot/../examples/reference.dsc.yaml | ConvertFrom-Json
5+
It 'Reference works for <operation>' -TestCases @(
6+
@{ operation = 'get' },
7+
@{ operation = 'test' }
8+
) {
9+
param($operation)
10+
11+
$out = dsc config $operation -f $PSScriptRoot/../examples/reference.dsc.yaml | ConvertFrom-Json
712
$LASTEXITCODE | Should -Be 0
813
$os = if ($IsWindows) {
914
'Windows'

dsc_lib/src/configure/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use super::config_doc::{DataType, SecurityContextKind};
1111

1212
pub struct Context {
1313
pub execution_type: ExecutionKind,
14-
pub outputs: HashMap<String, Value>, // this is used by the `reference()` function to retrieve output
14+
pub references: HashMap<String, Value>,
1515
pub system_root: PathBuf,
1616
pub parameters: HashMap<String, (Value, DataType)>,
1717
pub security_context: SecurityContextKind,
@@ -24,7 +24,7 @@ impl Context {
2424
pub fn new() -> Self {
2525
Self {
2626
execution_type: ExecutionKind::Actual,
27-
outputs: HashMap::new(),
27+
references: HashMap::new(),
2828
system_root: get_default_os_system_root(),
2929
parameters: HashMap::new(),
3030
security_context: match get_security_context() {

dsc_lib/src/configure/mod.rs

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
use crate::configure::config_doc::{ExecutionKind, Metadata};
55
use crate::configure::parameters::Input;
66
use crate::dscerror::DscError;
7+
use crate::dscresources::invoke_result::ExportResult;
78
use crate::dscresources::{
8-
{dscresource::{Capability, Invoke, get_diff}, invoke_result::{SetResult, ResourceSetResponse}},
9-
invoke_result::GetResult,
9+
{dscresource::{Capability, Invoke, get_diff},
10+
invoke_result::{GetResult, SetResult, TestResult, ResourceSetResponse}},
1011
resource_manifest::Kind,
1112
};
1213
use crate::DscResource;
@@ -56,7 +57,7 @@ pub struct Configurator {
5657
/// # Errors
5758
///
5859
/// This function will return an error if the underlying resource fails.
59-
pub fn add_resource_export_results_to_configuration(resource: &DscResource, adapter_resource: Option<&DscResource>, conf: &mut Configuration, input: &str) -> Result<(), DscError> {
60+
pub fn add_resource_export_results_to_configuration(resource: &DscResource, adapter_resource: Option<&DscResource>, conf: &mut Configuration, input: &str) -> Result<ExportResult, DscError> {
6061

6162
let export_result = match adapter_resource {
6263
Some(_) => adapter_resource.unwrap().export(input)?,
@@ -73,7 +74,7 @@ pub fn add_resource_export_results_to_configuration(resource: &DscResource, adap
7374
conf.resources.push(r);
7475
}
7576

76-
Ok(())
77+
Ok(export_result)
7778
}
7879

7980
// for values returned by resources, they may look like expressions, so we make sure to escape them in case
@@ -261,7 +262,18 @@ impl Configurator {
261262
let start_datetime = chrono::Local::now();
262263
let get_result = dsc_resource.get(&filter)?;
263264
let end_datetime = chrono::Local::now();
264-
self.context.outputs.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&get_result)?);
265+
match &get_result {
266+
GetResult::Resource(resource_result) => {
267+
self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_result.actual_state)?);
268+
},
269+
GetResult::Group(group) => {
270+
let mut results = Vec::<Value>::new();
271+
for result in group {
272+
results.push(serde_json::to_value(&result.result)?);
273+
}
274+
self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), Value::Array(results));
275+
},
276+
}
265277
let resource_result = config_result::ResourceGetResult {
266278
metadata: Some(
267279
Metadata {
@@ -372,7 +384,19 @@ impl Configurator {
372384
return Err(DscError::NotImplemented(t!("configure.mod.deleteNotSupported", resource = resource.resource_type).to_string()));
373385
}
374386

375-
self.context.outputs.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&set_result)?);
387+
match &set_result {
388+
SetResult::Resource(resource_result) => {
389+
self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_result.after_state)?);
390+
},
391+
SetResult::Group(group) => {
392+
let mut results = Vec::<Value>::new();
393+
for result in group {
394+
results.push(serde_json::to_value(&result.result)?);
395+
}
396+
self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), Value::Array(results));
397+
},
398+
}
399+
376400
let resource_result = config_result::ResourceSetResult {
377401
metadata: Some(
378402
Metadata {
@@ -425,7 +449,18 @@ impl Configurator {
425449
let start_datetime = chrono::Local::now();
426450
let test_result = dsc_resource.test(&expected)?;
427451
let end_datetime = chrono::Local::now();
428-
self.context.outputs.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&test_result)?);
452+
match &test_result {
453+
TestResult::Resource(resource_test_result) => {
454+
self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&resource_test_result.actual_state)?);
455+
},
456+
TestResult::Group(group) => {
457+
let mut results = Vec::<Value>::new();
458+
for result in group {
459+
results.push(serde_json::to_value(&result.result)?);
460+
}
461+
self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), Value::Array(results));
462+
},
463+
}
429464
let resource_result = config_result::ResourceTestResult {
430465
metadata: Some(
431466
Metadata {
@@ -476,7 +511,8 @@ impl Configurator {
476511
};
477512
let input = add_metadata(&dsc_resource.kind, properties)?;
478513
trace!("{}", t!("configure.mod.exportInput", input = input));
479-
add_resource_export_results_to_configuration(dsc_resource, Some(dsc_resource), &mut conf, input.as_str())?;
514+
let export_result = add_resource_export_results_to_configuration(dsc_resource, Some(dsc_resource), &mut conf, input.as_str())?;
515+
self.context.references.insert(format!("{}:{}", resource.resource_type, resource.name), serde_json::to_value(&export_result.actual_state)?);
480516
}
481517

482518
conf.metadata = Some(self.get_result_metadata(Operation::Export));

dsc_lib/src/functions/reference.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ impl Function for Reference {
2727
fn invoke(&self, args: &[Value], context: &Context) -> Result<Value, DscError> {
2828
debug!("{}", t!("functions.reference.invoked"));
2929
if let Some(key) = args[0].as_str() {
30-
if context.outputs.contains_key(key) {
31-
Ok(context.outputs[key].clone())
30+
if context.references.contains_key(key) {
31+
Ok(context.references[key].clone())
3232
} else {
3333
Err(DscError::Parser(t!("functions.reference.keyNotFound", key = key).to_string()))
3434
}
@@ -47,7 +47,7 @@ mod tests {
4747
fn valid_resourceid() {
4848
let mut parser = Statement::new().unwrap();
4949
let mut context = Context::new();
50-
context.outputs.insert("foo:bar".to_string(), "baz".into());
50+
context.references.insert("foo:bar".to_string(), "baz".into());
5151
let result = parser.parse_and_execute("[reference('foo:bar')]", &context).unwrap();
5252
assert_eq!(result, "baz");
5353
}

0 commit comments

Comments
 (0)