Skip to content

Commit d875e1b

Browse files
authored
Add dynamic parameter support to deployment stack New/Set cmdlets. (#24263)
Added dynamic parameters to load template parameters from provided user template. This feature is already available in deployments cmdlets and a similar pattern was used. Also involved some refactoring.
1 parent b820f37 commit d875e1b

15 files changed

+10616
-4058
lines changed

src/Resources/ResourceManager/Implementation/CmdletBase/DeploymentStacksCmdletBase.cs

Lines changed: 0 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -55,86 +55,5 @@ public DeploymentStacksSdkClient DeploymentStacksSdkClient
5555
this.deploymentStacksSdkClient = value;
5656
}
5757
}
58-
59-
protected BicepBuildParamsStdout ResolveBicepParameterFile(string TemplateParameterFile)
60-
{
61-
if (BicepUtility.IsBicepparamFile(TemplateParameterFile))
62-
{
63-
return BicepUtility.Create().BuildBicepParamFile(this.ResolvePath(TemplateParameterFile), new Dictionary<string, object>(), this.WriteVerbose, this.WriteWarning);
64-
}
65-
66-
return null;
67-
}
68-
69-
protected string ResolveBicepFile(string filePath)
70-
{
71-
if (BicepUtility.IsBicepFile(filePath))
72-
{
73-
return BicepUtility.Create().BuildBicepFile(this.ResolvePath(filePath), this.WriteVerbose, this.WriteWarning);
74-
}
75-
76-
return null;
77-
}
78-
79-
private Hashtable GetParametersFromJsonStream(Stream parametersJson)
80-
{
81-
var parameters = new Hashtable();
82-
var parametersFromJson = TemplateUtility.ParseTemplateParameterJson(parametersJson);
83-
84-
parametersFromJson.ForEach(dp =>
85-
{
86-
var parameter = new Hashtable();
87-
if (dp.Value.Value != null)
88-
{
89-
parameter.Add("value", dp.Value.Value);
90-
}
91-
if (dp.Value.Reference != null)
92-
{
93-
parameter.Add("reference", dp.Value.Reference);
94-
}
95-
96-
parameters[dp.Key] = parameter;
97-
});
98-
99-
return parameters;
100-
}
101-
102-
protected Hashtable GetParametersFromJson(string parametersJson)
103-
{
104-
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(parametersJson)))
105-
{
106-
return GetParametersFromJsonStream(stream);
107-
}
108-
}
109-
110-
protected Hashtable GetParameterObject(string parameterFile)
111-
{
112-
string templateParameterFilePath = this.ResolvePath(parameterFile);
113-
if (parameterFile != null && FileUtilities.DataStore.FileExists(templateParameterFilePath))
114-
{
115-
return GetParametersFromJsonStream(FileUtilities.DataStore.ReadFileAsStream(templateParameterFilePath));
116-
}
117-
return new Hashtable();
118-
}
119-
120-
protected Hashtable GetTemplateParameterObject(Hashtable templateParameterObject)
121-
{
122-
//create a new Hashtable so that user can re-use the templateParameterObject.
123-
var parameterObject = new Hashtable();
124-
foreach (var parameterKey in templateParameterObject.Keys)
125-
{
126-
// Let default behavior of a value parameter if not a KeyVault reference Hashtable
127-
var hashtableParameter = templateParameterObject[parameterKey] as Hashtable;
128-
if (hashtableParameter != null && hashtableParameter.ContainsKey("reference"))
129-
{
130-
parameterObject[parameterKey] = templateParameterObject[parameterKey];
131-
}
132-
else
133-
{
134-
parameterObject[parameterKey] = new Hashtable { { "value", templateParameterObject[parameterKey] } };
135-
}
136-
}
137-
return parameterObject;
138-
}
13958
}
14059
}

src/Resources/ResourceManager/Implementation/CmdletBase/DeploymentStacksCreateCmdletBase.cs

Lines changed: 232 additions & 34 deletions
Large diffs are not rendered by default.

src/Resources/ResourceManager/Implementation/DeploymentStacks/NewAzManagementGroupDeploymentStack.cs

Lines changed: 5 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,12 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
1717
{
1818
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.CmdletBase;
1919
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels;
20-
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Utilities;
2120
using Microsoft.Azure.Commands.ResourceManager.Common.Tags;
2221
using Microsoft.Azure.Management.Resources.Models;
2322
using Microsoft.WindowsAzure.Commands.Common.CustomAttributes;
24-
using Microsoft.WindowsAzure.Commands.Utilities.Common;
2523
using System;
2624
using System.Collections;
27-
using System.IO;
2825
using System.Management.Automation;
29-
using ProjectResources = Microsoft.Azure.Commands.ResourceManager.Cmdlets.Properties.Resources;
3026

3127
[Cmdlet("New", Common.AzureRMConstants.AzureRMPrefix + "ManagementGroupDeploymentStack",
3228
SupportsShouldProcess = true, DefaultParameterSetName = ParameterlessTemplateFileParameterSetName), OutputType(typeof(PSDeploymentStack))]
@@ -98,63 +94,6 @@ protected override void OnProcessRecord()
9894
{
9995
try
10096
{
101-
Hashtable parameters = new Hashtable();
102-
103-
switch (ParameterSetName)
104-
{
105-
case ParameterlessTemplateFileParameterSetName:
106-
case ParameterUriTemplateFileParameterSetName:
107-
ResolveTemplate();
108-
break;
109-
case ParameterFileTemplateSpecParameterSetName:
110-
case ParameterFileTemplateUriParameterSetName:
111-
parameters = ResolveParameters();
112-
113-
// contruct the protected template URI if a query string was provided
114-
if (!string.IsNullOrEmpty(QueryString))
115-
{
116-
if (QueryString.Substring(0, 1) == "?")
117-
protectedTemplateUri = TemplateUri + QueryString;
118-
else
119-
protectedTemplateUri = TemplateUri + "?" + QueryString;
120-
}
121-
break;
122-
case ParameterFileTemplateFileParameterSetName:
123-
parameters = ResolveParameters();
124-
ResolveTemplate();
125-
break;
126-
case ByParameterFileWithNoTemplateParameterSetName:
127-
parameters = ResolveParameters();
128-
break;
129-
case ParameterObjectTemplateFileParameterSetName:
130-
ResolveTemplate();
131-
parameters = GetTemplateParameterObject(TemplateParameterObject);
132-
break;
133-
case ParameterObjectTemplateSpecParameterSetName:
134-
case ParameterObjectTemplateUriParameterSetName:
135-
parameters = GetTemplateParameterObject(TemplateParameterObject);
136-
137-
// contruct the protected template URI if a query string was provided
138-
if (!string.IsNullOrEmpty(QueryString))
139-
{
140-
if (QueryString.Substring(0, 1) == "?")
141-
protectedTemplateUri = TemplateUri + QueryString;
142-
else
143-
protectedTemplateUri = TemplateUri + "?" + QueryString;
144-
}
145-
break;
146-
case ParameterlessTemplateUriParameterSetName:
147-
// contruct the protected template URI if a query string was provided
148-
if (!string.IsNullOrEmpty(QueryString))
149-
{
150-
if (QueryString.Substring(0, 1) == "?")
151-
protectedTemplateUri = TemplateUri + QueryString;
152-
else
153-
protectedTemplateUri = TemplateUri + "?" + QueryString;
154-
}
155-
break;
156-
}
157-
15897
var shouldDeleteResources = (DeleteAll.ToBool() || DeleteResources.ToBool()) ? true : false;
15998
var shouldDeleteResourceGroups = (DeleteAll.ToBool() || DeleteResourceGroups.ToBool()) ? true : false;
16099

@@ -169,18 +108,19 @@ protected override void OnProcessRecord()
169108
{
170109
Tag = TagsConversionHelper.CreateTagHashtable(currentStack.Tags);
171110
}
172-
111+
173112
Action createOrUpdateAction = () =>
174113
{
175114
var deploymentStack = DeploymentStacksSdkClient.ManagementGroupCreateOrUpdateDeploymentStack(
176115
deploymentStackName: Name,
177116
managementGroupId: ManagementGroupId,
178117
location: Location,
118+
templateFile: TemplateFile,
179119
templateUri: !string.IsNullOrEmpty(protectedTemplateUri) ? protectedTemplateUri : TemplateUri,
180120
templateSpec: TemplateSpecId,
181-
templateJson: TemplateJson,
121+
templateObject: TemplateObject,
182122
parameterUri: TemplateParameterUri,
183-
parameters: parameters,
123+
parameters: GetTemplateParameterObject(),
184124
description: Description,
185125
resourcesCleanupAction: shouldDeleteResources ? "delete" : "detach",
186126
resourceGroupsCleanupAction: shouldDeleteResourceGroups ? "delete" : "detach",
@@ -208,7 +148,7 @@ protected override void OnProcessRecord()
208148
(!shouldDeleteResources || !shouldDeleteResourceGroups ? "\nDetaching: " : "") +
209149
(!shouldDeleteResources ? "resources" : "") +
210150
(!shouldDeleteResources && !shouldDeleteResourceGroups ? ", " : "") +
211-
(!shouldDeleteResourceGroups ? "resourceGroups" : "");
151+
(!shouldDeleteResourceGroups ? "resourceGroups" : "");
212152
ConfirmAction(
213153
Force.IsPresent,
214154
confirmationMessage,

src/Resources/ResourceManager/Implementation/DeploymentStacks/NewAzResourceGroupDeploymentStack.cs

Lines changed: 3 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,13 @@ namespace Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation
1616
{
1717
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.CmdletBase;
1818
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels;
19-
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Utilities;
2019
using Microsoft.Azure.Commands.ResourceManager.Common.Tags;
2120
using Microsoft.Azure.Commands.ResourceManager.Common.ArgumentCompleters;
2221
using Microsoft.Azure.Management.Resources.Models;
2322
using Microsoft.WindowsAzure.Commands.Common.CustomAttributes;
24-
using Microsoft.WindowsAzure.Commands.Utilities.Common;
2523
using System;
2624
using System.Collections;
27-
using System.IO;
2825
using System.Management.Automation;
29-
using ProjectResources = Microsoft.Azure.Commands.ResourceManager.Cmdlets.Properties.Resources;
3026

3127
[Cmdlet("New", Common.AzureRMConstants.AzureRMPrefix + "ResourceGroupDeploymentStack",
3228
SupportsShouldProcess = true, DefaultParameterSetName = ParameterlessTemplateFileParameterSetName), OutputType(typeof(PSDeploymentStack))]
@@ -90,63 +86,6 @@ protected override void OnProcessRecord()
9086
{
9187
try
9288
{
93-
Hashtable parameters = new Hashtable();
94-
95-
switch (ParameterSetName)
96-
{
97-
case ParameterlessTemplateFileParameterSetName:
98-
case ParameterUriTemplateFileParameterSetName:
99-
ResolveTemplate();
100-
break;
101-
case ParameterFileTemplateSpecParameterSetName:
102-
case ParameterFileTemplateUriParameterSetName:
103-
parameters = ResolveParameters();
104-
105-
// contruct the protected template URI if a query string was provided
106-
if (!string.IsNullOrEmpty(QueryString))
107-
{
108-
if (QueryString.Substring(0, 1) == "?")
109-
protectedTemplateUri = TemplateUri + QueryString;
110-
else
111-
protectedTemplateUri = TemplateUri + "?" + QueryString;
112-
}
113-
break;
114-
case ParameterFileTemplateFileParameterSetName:
115-
parameters = ResolveParameters();
116-
ResolveTemplate();
117-
break;
118-
case ByParameterFileWithNoTemplateParameterSetName:
119-
parameters = ResolveParameters();
120-
break;
121-
case ParameterObjectTemplateFileParameterSetName:
122-
ResolveTemplate();
123-
parameters = GetTemplateParameterObject(TemplateParameterObject);
124-
break;
125-
case ParameterObjectTemplateSpecParameterSetName:
126-
case ParameterObjectTemplateUriParameterSetName:
127-
parameters = GetTemplateParameterObject(TemplateParameterObject);
128-
129-
// contruct the protected template URI if a query string was provided
130-
if (!string.IsNullOrEmpty(QueryString))
131-
{
132-
if (QueryString.Substring(0, 1) == "?")
133-
protectedTemplateUri = TemplateUri + QueryString;
134-
else
135-
protectedTemplateUri = TemplateUri + "?" + QueryString;
136-
}
137-
break;
138-
case ParameterlessTemplateUriParameterSetName:
139-
// contruct the protected template URI if a query string was provided
140-
if (!string.IsNullOrEmpty(QueryString))
141-
{
142-
if (QueryString.Substring(0, 1) == "?")
143-
protectedTemplateUri = TemplateUri + QueryString;
144-
else
145-
protectedTemplateUri = TemplateUri + "?" + QueryString;
146-
}
147-
break;
148-
}
149-
15089
var shouldDeleteResources = (DeleteAll.ToBool() || DeleteResources.ToBool()) ? true : false;
15190
var shouldDeleteResourceGroups = (DeleteAll.ToBool() || DeleteResourceGroups.ToBool()) ? true : false;
15291

@@ -161,11 +100,12 @@ protected override void OnProcessRecord()
161100
var deploymentStack = DeploymentStacksSdkClient.ResourceGroupCreateOrUpdateDeploymentStack(
162101
deploymentStackName: Name,
163102
resourceGroupName: ResourceGroupName,
103+
templateFile: TemplateFile,
164104
templateUri: !string.IsNullOrEmpty(protectedTemplateUri) ? protectedTemplateUri : TemplateUri,
165105
templateSpec: TemplateSpecId,
166-
templateJson: TemplateJson,
106+
templateObject: TemplateObject,
167107
parameterUri: TemplateParameterUri,
168-
parameters: parameters,
108+
parameters: GetTemplateParameterObject(),
169109
description: Description,
170110
resourcesCleanupAction: shouldDeleteResources ? "delete" : "detach",
171111
resourceGroupsCleanupAction: shouldDeleteResourceGroups ? "delete" : "detach",

0 commit comments

Comments
 (0)