Skip to content

Commit aa02f29

Browse files
authored
Merge pull request #995 from SteveL-MSFT/resource-props
Update `Resource` schema to match ARM
2 parents eb5c1c0 + eb3fb51 commit aa02f29

File tree

4 files changed

+125
-2
lines changed

4 files changed

+125
-2
lines changed

dsc/src/args.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@ pub enum SchemaType {
280280
TestResult,
281281
ResolveResult,
282282
DscResource,
283+
Resource,
283284
ResourceManifest,
284285
Include,
285286
Configuration,

dsc/src/util.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use dsc_lib::{
1010
configure::{
1111
config_doc::{
1212
Configuration,
13+
Resource,
1314
RestartRequired,
1415
},
1516
config_result::{
@@ -164,6 +165,9 @@ pub fn get_schema(schema: SchemaType) -> Schema {
164165
SchemaType::DscResource => {
165166
schema_for!(DscResource)
166167
},
168+
SchemaType::Resource => {
169+
schema_for!(Resource)
170+
},
167171
SchemaType::ResourceManifest => {
168172
schema_for!(ResourceManifest)
169173
},
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Copyright (c) Microsoft Corporation.
2+
# Licensed under the MIT License.
3+
4+
Describe 'tests for the Resource schema within a configuration' {
5+
It 'Unknown properties are an error' {
6+
$yaml = @'
7+
$schema: https://aka.ms/dsc/schemas/v3/bundled/config/document.json
8+
resources:
9+
- name: test
10+
type: Microsft.Dsc.Debug/Echo
11+
unknownProperty: true
12+
properties:
13+
output: "Hello World"
14+
'@
15+
dsc config get -i $yaml 2>$TestDrive/error.log
16+
$LASTEXITCODE | Should -Be 2
17+
(Get-Content $TestDrive/error.log -Raw) | Should -Match 'Error: JSON: unknown field `unknownProperty`'
18+
19+
}
20+
21+
It 'dsc schema returns a valid schema' {
22+
$schema = dsc schema -t resource
23+
$LASTEXITCODE | Should -Be 0
24+
$schema | Should -Not -BeNullOrEmpty
25+
$schema = $schema | ConvertFrom-Json
26+
$schema.'$schema' | Should -BeExactly 'https://json-schema.org/draft/2020-12/schema'
27+
$schema.title | Should -BeExactly 'Resource'
28+
$schema.additionalProperties | Should -Be $false
29+
}
30+
}

dsc_lib/src/configure/config_doc.rs

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,23 +163,101 @@ pub enum DataType {
163163
}
164164

165165
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
166+
pub enum CopyMode {
167+
#[serde(rename = "serial")]
168+
Serial,
169+
#[serde(rename = "parallel")]
170+
Parallel,
171+
}
172+
173+
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
174+
#[serde(deny_unknown_fields)]
175+
pub struct Copy {
176+
pub name: String,
177+
pub count: i32,
178+
#[serde(skip_serializing_if = "Option::is_none")]
179+
pub mode: Option<CopyMode>,
180+
#[serde(skip_serializing_if = "Option::is_none", rename = "batchSize")]
181+
pub batch_size: Option<i32>,
182+
}
183+
184+
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
185+
#[serde(deny_unknown_fields)]
186+
pub struct Plan {
187+
pub name: String,
188+
#[serde(skip_serializing_if = "Option::is_none", rename = "promotionCode")]
189+
pub promotion_code: Option<String>,
190+
#[serde(skip_serializing_if = "Option::is_none")]
191+
pub publisher: Option<String>,
192+
#[serde(skip_serializing_if = "Option::is_none")]
193+
pub product: Option<String>,
194+
#[serde(skip_serializing_if = "Option::is_none")]
195+
pub version: Option<String>,
196+
}
197+
198+
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
199+
#[serde(deny_unknown_fields)]
200+
pub struct Identity {
201+
#[serde(skip_serializing_if = "Option::is_none")]
202+
pub r#type: Option<String>,
203+
#[serde(skip_serializing_if = "Option::is_none", rename = "userAssignedIdentities")]
204+
pub user_assigned_identities: Option<Map<String, Value>>,
205+
}
206+
207+
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
208+
#[serde(deny_unknown_fields)]
209+
pub struct Sku {
210+
#[serde(skip_serializing_if = "Option::is_none")]
211+
pub name: Option<String>,
212+
#[serde(skip_serializing_if = "Option::is_none")]
213+
pub tier: Option<String>,
214+
#[serde(skip_serializing_if = "Option::is_none")]
215+
pub size: Option<String>,
216+
#[serde(skip_serializing_if = "Option::is_none")]
217+
pub family: Option<String>,
218+
#[serde(skip_serializing_if = "Option::is_none")]
219+
pub capacity: Option<i32>,
220+
}
221+
222+
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, JsonSchema)]
223+
#[serde(deny_unknown_fields)]
166224
pub struct Resource {
225+
#[serde(skip_serializing_if = "Option::is_none")]
226+
pub condition: Option<String>,
167227
/// The fully qualified name of the resource type
168228
#[serde(rename = "type")]
169229
pub resource_type: String,
230+
#[serde(skip_serializing_if = "Option::is_none", rename = "apiVersion")]
231+
pub api_version: Option<String>,
170232
/// A friendly name for the resource instance
171233
pub name: String, // friendly unique instance name
234+
#[serde(skip_serializing_if = "Option::is_none")]
235+
pub comments: Option<String>,
236+
#[serde(skip_serializing_if = "Option::is_none")]
237+
pub location: Option<String>,
172238
#[serde(rename = "dependsOn", skip_serializing_if = "Option::is_none")]
173239
#[schemars(regex(pattern = r"^\[resourceId\(\s*'[a-zA-Z0-9\.]+/[a-zA-Z0-9]+'\s*,\s*'[a-zA-Z0-9 ]+'\s*\)]$"))]
174240
pub depends_on: Option<Vec<String>>,
175241
#[serde(skip_serializing_if = "Option::is_none")]
242+
pub tags: Option<Map<String, Value>>,
243+
#[serde(skip_serializing_if = "Option::is_none")]
244+
pub identity: Option<Identity>,
245+
#[serde(skip_serializing_if = "Option::is_none")]
246+
pub sku: Option<Sku>,
247+
#[serde(skip_serializing_if = "Option::is_none")]
176248
pub kind: Option<String>,
177249
#[serde(skip_serializing_if = "Option::is_none")]
250+
pub scope: Option<String>,
251+
#[serde(skip_serializing_if = "Option::is_none")]
252+
pub copy: Option<Copy>,
253+
#[serde(skip_serializing_if = "Option::is_none")]
254+
pub plan: Option<Plan>,
255+
#[serde(skip_serializing_if = "Option::is_none")]
178256
pub properties: Option<Map<String, Value>>,
179257
#[serde(skip_serializing_if = "Option::is_none")]
180-
pub metadata: Option<Metadata>,
258+
pub resources: Option<Vec<Resource>>,
181259
#[serde(skip_serializing_if = "Option::is_none")]
182-
pub condition: Option<String>,
260+
pub metadata: Option<Metadata>,
183261
}
184262

185263
impl Default for Configuration {
@@ -237,6 +315,16 @@ impl Resource {
237315
properties: None,
238316
metadata: None,
239317
condition: None,
318+
identity: None,
319+
sku: None,
320+
scope: None,
321+
copy: None,
322+
plan: None,
323+
resources: None,
324+
comments: None,
325+
location: None,
326+
tags: None,
327+
api_version: None,
240328
}
241329
}
242330
}

0 commit comments

Comments
 (0)