Skip to content

Commit 8560100

Browse files
Fix bug with .bicepparam parsing (#22885)
* Fix bug with .bicepparam parsing * Update tests * Update changelog
1 parent a9a127a commit 8560100

18 files changed

+5450
-6856
lines changed

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

Lines changed: 67 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
using Microsoft.Azure.Commands.Common.Authentication.Abstractions;
1717
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Components;
1818
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.Utilities;
19+
using Microsoft.Azure.Commands.ResourceManager.Cmdlets.SdkModels;
1920
using Microsoft.Azure.Management.Resources;
2021
using Microsoft.Azure.Management.Resources.Models;
2122
using Microsoft.WindowsAzure.Commands.Utilities.Common;
@@ -72,6 +73,8 @@ public abstract class DeploymentCmdletBase : ResourceManagerCmdletBase
7273

7374
protected string protectedTemplateUri;
7475

76+
protected IReadOnlyDictionary<string, TemplateFileParameterV1> bicepparamFileParameters;
77+
7578
private ITemplateSpecsClient templateSpecsClient;
7679

7780
protected DeploymentCmdletBase()
@@ -229,6 +232,7 @@ protected override void OnBeginProcessing()
229232
{
230233
// Resolve the static parameter names for this cmdlet:
231234
string[] staticParameterNames = this.GetStaticParameterNames();
235+
var combinedParameterObject = GetCombinedTemplateParameterObject();
232236

233237
if (TemplateObject != null && TemplateObject != templateObject)
234238
{
@@ -237,15 +241,15 @@ protected override void OnBeginProcessing()
237241
{
238242
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
239243
TemplateObject,
240-
TemplateParameterObject,
244+
combinedParameterObject,
241245
this.ResolvePath(TemplateParameterFile),
242246
staticParameterNames);
243247
}
244248
else
245249
{
246250
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
247251
TemplateObject,
248-
TemplateParameterObject,
252+
combinedParameterObject,
249253
TemplateParameterUri,
250254
staticParameterNames);
251255
}
@@ -258,15 +262,15 @@ protected override void OnBeginProcessing()
258262
{
259263
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
260264
this.ResolvePath(TemplateFile),
261-
TemplateParameterObject,
265+
combinedParameterObject,
262266
this.ResolvePath(TemplateParameterFile),
263267
staticParameterNames);
264268
}
265269
else
266270
{
267271
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
268272
this.ResolvePath(TemplateFile),
269-
TemplateParameterObject,
273+
combinedParameterObject,
270274
TemplateParameterUri,
271275
staticParameterNames);
272276
}
@@ -286,15 +290,15 @@ protected override void OnBeginProcessing()
286290
{
287291
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
288292
templateUri,
289-
TemplateParameterObject,
293+
combinedParameterObject,
290294
this.ResolvePath(TemplateParameterFile),
291295
staticParameterNames);
292296
}
293297
else
294298
{
295299
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
296300
templateUri,
297-
TemplateParameterObject,
301+
combinedParameterObject,
298302
TemplateParameterUri,
299303
staticParameterNames);
300304
}
@@ -346,15 +350,15 @@ protected override void OnBeginProcessing()
346350
{
347351
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
348352
templateObj,
349-
TemplateParameterObject,
353+
combinedParameterObject,
350354
this.ResolvePath(TemplateParameterFile),
351355
staticParameterNames);
352356
}
353357
else
354358
{
355359
dynamicParameters = TemplateUtility.GetTemplateParametersFromFile(
356360
templateObj,
357-
TemplateParameterObject,
361+
combinedParameterObject,
358362
TemplateParameterUri,
359363
staticParameterNames);
360364
}
@@ -366,23 +370,44 @@ protected override void OnBeginProcessing()
366370
return dynamicParameters;
367371
}
368372

369-
protected Hashtable GetTemplateParameterObject(Hashtable templateParameterObject)
373+
private static void AddToParametersHashtable(IReadOnlyDictionary<string, TemplateFileParameterV1> parameters, Hashtable parameterObject)
374+
{
375+
parameters.ForEach(dp =>
376+
{
377+
var parameter = new Hashtable();
378+
if (dp.Value.Value != null)
379+
{
380+
parameter.Add("value", dp.Value.Value);
381+
}
382+
if (dp.Value.Reference != null)
383+
{
384+
parameter.Add("reference", dp.Value.Reference);
385+
}
386+
387+
parameterObject[dp.Key] = parameter;
388+
});
389+
}
390+
391+
protected Hashtable GetTemplateParameterObject()
370392
{
371-
// NOTE(jogao): create a new Hashtable so that user can re-use the templateParameterObject.
372393
var parameterObject = new Hashtable();
373-
if (templateParameterObject != null)
394+
if (bicepparamFileParameters != null)
374395
{
375-
foreach (var parameterKey in templateParameterObject.Keys)
396+
AddToParametersHashtable(bicepparamFileParameters, parameterObject);
397+
}
398+
else if (TemplateParameterObject != null)
399+
{
400+
foreach (var parameterKey in TemplateParameterObject.Keys)
376401
{
377402
// Let default behavior of a value parameter if not a KeyVault reference Hashtable
378-
var hashtableParameter = templateParameterObject[parameterKey] as Hashtable;
403+
var hashtableParameter = TemplateParameterObject[parameterKey] as Hashtable;
379404
if (hashtableParameter != null && hashtableParameter.ContainsKey("reference"))
380405
{
381-
parameterObject[parameterKey] = templateParameterObject[parameterKey];
406+
parameterObject[parameterKey] = TemplateParameterObject[parameterKey];
382407
}
383408
else
384409
{
385-
parameterObject[parameterKey] = new Hashtable { { "value", templateParameterObject[parameterKey] } };
410+
parameterObject[parameterKey] = new Hashtable { { "value", TemplateParameterObject[parameterKey] } };
386411
}
387412
}
388413
}
@@ -395,21 +420,7 @@ protected Hashtable GetTemplateParameterObject(Hashtable templateParameterObject
395420
if (FileUtilities.DataStore.FileExists(templateParameterFilePath))
396421
{
397422
var parametersFromFile = TemplateUtility.ParseTemplateParameterFileContents(templateParameterFilePath);
398-
parametersFromFile.ForEach(dp =>
399-
{
400-
var parameter = new Hashtable();
401-
if (dp.Value.Value != null)
402-
{
403-
parameter.Add("value", dp.Value.Value);
404-
}
405-
if (dp.Value.Reference != null)
406-
{
407-
parameter.Add("reference", dp.Value.Reference);
408-
}
409-
410-
parameterObject[dp.Key] = parameter;
411-
});
412-
423+
AddToParametersHashtable(parametersFromFile, parameterObject);
413424
}
414425
else
415426
{
@@ -497,7 +508,8 @@ protected void BuildAndUseBicepParameters()
497508
var output = BicepUtility.BuildParams(this.ResolvePath(TemplateParameterFile), this.WriteVerbose, this.WriteWarning);
498509

499510
TemplateParameterFile = null;
500-
TemplateParameterObject = GetParametersFromJson(output.parametersJson);
511+
TemplateParameterObject = null;
512+
bicepparamFileParameters = GetParametersFromJson(output.parametersJson);
501513

502514
if (TemplateObject == null &&
503515
string.IsNullOrEmpty(TemplateFile) &&
@@ -523,34 +535,40 @@ protected void BuildAndUseBicepParameters()
523535
}
524536
}
525537

526-
private Hashtable GetParametersFromJsonStream(Stream parametersJson)
538+
private Hashtable GetCombinedTemplateParameterObject()
527539
{
528-
var parameters = new Hashtable();
529-
var parametersFromJson = TemplateUtility.ParseTemplateParameterJson(parametersJson);
530-
531-
parametersFromJson.ForEach(dp =>
540+
if (bicepparamFileParameters != null)
532541
{
533-
var parameter = new Hashtable();
534-
if (dp.Value.Value != null)
535-
{
536-
parameter.Add("value", dp.Value.Value);
537-
}
538-
if (dp.Value.Reference != null)
542+
// The TemplateParameterObject property expects parameters to be in a different format to the parameters file JSON.
543+
// Here we convert from { "foo": { "value": "blah" } } to { "foo": "blah" }
544+
// with the exception of KV secret references which are left as { "foo": { "reference": ... } }
545+
var parameters = new Hashtable();
546+
foreach (var paramName in bicepparamFileParameters.Keys)
539547
{
540-
parameter.Add("reference", dp.Value.Reference);
548+
var param = bicepparamFileParameters[paramName];
549+
if (param.Value != null)
550+
{
551+
parameters[paramName] = param.Value;
552+
}
553+
if (param.Reference != null)
554+
{
555+
var parameter = new Hashtable();
556+
parameter.Add("reference", param.Reference);
557+
parameters[paramName] = parameter;
558+
}
541559
}
542560

543-
parameters[dp.Key] = parameter;
544-
});
561+
return parameters;
562+
}
545563

546-
return parameters;
564+
return TemplateParameterObject;
547565
}
548566

549-
private Hashtable GetParametersFromJson(string parametersJson)
567+
private IReadOnlyDictionary<string, TemplateFileParameterV1> GetParametersFromJson(string parametersJson)
550568
{
551-
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(parametersJson)))
569+
using (var reader = new StringReader(parametersJson))
552570
{
553-
return GetParametersFromJsonStream(stream);
571+
return TemplateUtility.ParseTemplateParameterJson(reader);
554572
}
555573
}
556574
}

src/Resources/ResourceManager/Implementation/Deployments/GetAzureManagementGroupDeploymentWhatIfResultCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public class GetAzureManagementGroupDeploymentWhatIfResultCmdlet : DeploymentWha
6262
templateUri: this.TemplateUri ?? this.TryResolvePath(this.TemplateFile),
6363
templateObject: this.TemplateObject,
6464
templateParametersUri: this.TemplateParameterUri,
65-
templateParametersObject: GetTemplateParameterObject(this.TemplateParameterObject),
65+
templateParametersObject: GetTemplateParameterObject(),
6666
resultFormat: this.ResultFormat,
6767
excludeChangeTypes: this.ExcludeChangeType);
6868
}

src/Resources/ResourceManager/Implementation/Deployments/GetAzureSubscriptionDeploymentWhatIfResultCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public class GetAzureSubscriptionDeploymentWhatIfResultCmdlet : DeploymentWhatIf
5959
templateObject: this.TemplateObject,
6060
templateSpecId: TemplateSpecId,
6161
templateParametersUri: this.TemplateParameterUri,
62-
templateParametersObject: GetTemplateParameterObject(this.TemplateParameterObject),
62+
templateParametersObject: GetTemplateParameterObject(),
6363
resultFormat: this.ResultFormat,
6464
excludeChangeTypes: this.ExcludeChangeType);
6565
}

src/Resources/ResourceManager/Implementation/Deployments/GetAzureTenantDeploymentWhatIfResultCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public class GetAzureTenantDeploymentWhatIfResultCmdlet : DeploymentWhatIfCmdlet
5757
templateUri: this.TemplateUri ?? this.TryResolvePath(this.TemplateFile),
5858
templateObject: this.TemplateObject,
5959
templateParametersUri: this.TemplateParameterUri,
60-
templateParametersObject: GetTemplateParameterObject(this.TemplateParameterObject),
60+
templateParametersObject: GetTemplateParameterObject(),
6161
resultFormat: this.ResultFormat,
6262
excludeChangeTypes: this.ExcludeChangeType);
6363
}

src/Resources/ResourceManager/Implementation/Deployments/NewAzureManagementGroupDeploymentCmdlet.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public class NewAzureManagementGroupDeploymentCmdlet : DeploymentCreateCmdlet
8686
TemplateFile = this.TemplateUri ?? this.TryResolvePath(this.TemplateFile),
8787
TemplateObject = this.TemplateObject,
8888
TemplateSpecId = TemplateSpecId,
89-
TemplateParameterObject = this.GetTemplateParameterObject(this.TemplateParameterObject),
89+
TemplateParameterObject = this.GetTemplateParameterObject(),
9090
ParameterUri = this.TemplateParameterUri,
9191
DeploymentDebugLogLevel = this.GetDeploymentDebugLogLevel(this.DeploymentDebugLogLevel),
9292
Tags = TagsHelper.ConvertToTagsDictionary(this.Tag)
@@ -103,7 +103,7 @@ public class NewAzureManagementGroupDeploymentCmdlet : DeploymentCreateCmdlet
103103
templateUri: this.TemplateUri ?? this.TryResolvePath(this.TemplateFile),
104104
templateObject: this.TemplateObject,
105105
templateParametersUri: this.TemplateParameterUri,
106-
templateParametersObject: GetTemplateParameterObject(this.TemplateParameterObject),
106+
templateParametersObject: GetTemplateParameterObject(),
107107
resultFormat: this.WhatIfResultFormat,
108108
excludeChangeTypes: this.WhatIfExcludeChangeType);
109109

src/Resources/ResourceManager/Implementation/Deployments/NewAzureSubscriptionDeploymentCmdlet.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public class NewAzureSubscriptionDeploymentCmdlet : DeploymentCreateCmdlet
8282
TemplateObject = this.TemplateObject,
8383
TemplateSpecId = TemplateSpecId,
8484
QueryString = QueryString,
85-
TemplateParameterObject = this.GetTemplateParameterObject(this.TemplateParameterObject),
85+
TemplateParameterObject = this.GetTemplateParameterObject(),
8686
ParameterUri = this.TemplateParameterUri,
8787
DeploymentDebugLogLevel = this.GetDeploymentDebugLogLevel(this.DeploymentDebugLogLevel),
8888
Tags = TagsHelper.ConvertToTagsDictionary(this.Tag)
@@ -98,7 +98,7 @@ public class NewAzureSubscriptionDeploymentCmdlet : DeploymentCreateCmdlet
9898
templateSpecId: TemplateSpecId,
9999
queryString: QueryString,
100100
templateParametersUri: this.TemplateParameterUri,
101-
templateParametersObject: GetTemplateParameterObject(this.TemplateParameterObject),
101+
templateParametersObject: GetTemplateParameterObject(),
102102
resultFormat: this.WhatIfResultFormat,
103103
excludeChangeTypes: this.WhatIfExcludeChangeType);
104104

src/Resources/ResourceManager/Implementation/Deployments/NewAzureTenantDeploymentCmdlet.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public class NewAzureTenantDeploymentCmdlet: DeploymentCreateCmdlet
8181
TemplateFile = this.TemplateUri ?? this.TryResolvePath(this.TemplateFile),
8282
TemplateObject = this.TemplateObject,
8383
TemplateSpecId = this.TemplateSpecId,
84-
TemplateParameterObject = this.GetTemplateParameterObject(this.TemplateParameterObject),
84+
TemplateParameterObject = this.GetTemplateParameterObject(),
8585
ParameterUri = this.TemplateParameterUri,
8686
DeploymentDebugLogLevel = GetDeploymentDebugLogLevel(this.DeploymentDebugLogLevel),
8787
Tags = TagsHelper.ConvertToTagsDictionary(this.Tag)
@@ -97,7 +97,7 @@ public class NewAzureTenantDeploymentCmdlet: DeploymentCreateCmdlet
9797
templateObject : this.TemplateObject,
9898
templateSpecId: TemplateSpecId,
9999
templateParametersUri : this.TemplateParameterUri,
100-
templateParametersObject : GetTemplateParameterObject(this.TemplateParameterObject),
100+
templateParametersObject : GetTemplateParameterObject(),
101101
resultFormat : this.WhatIfResultFormat,
102102
excludeChangeTypes: this.WhatIfExcludeChangeType
103103
);

src/Resources/ResourceManager/Implementation/Deployments/TestAzureManagementGroupDeploymentCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ protected override void OnProcessRecord()
5454
QueryString = QueryString,
5555
TemplateFile = this.TemplateUri ?? this.TryResolvePath(this.TemplateFile),
5656
TemplateObject = this.TemplateObject,
57-
TemplateParameterObject = this.GetTemplateParameterObject(this.TemplateParameterObject),
57+
TemplateParameterObject = this.GetTemplateParameterObject(),
5858
ParameterUri = this.TemplateParameterUri
5959
};
6060

src/Resources/ResourceManager/Implementation/Deployments/TestAzureSubscriptionDeploymentCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected override void OnProcessRecord()
5050
TemplateFile = TemplateUri ?? this.TryResolvePath(TemplateFile),
5151
TemplateObject = TemplateObject,
5252
QueryString = QueryString,
53-
TemplateParameterObject = GetTemplateParameterObject(TemplateParameterObject),
53+
TemplateParameterObject = GetTemplateParameterObject(),
5454
ParameterUri = TemplateParameterUri
5555
};
5656

src/Resources/ResourceManager/Implementation/Deployments/TestAzureTenantDeploymentCmdlet.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ protected override void OnProcessRecord()
5050
TemplateFile = this.TemplateUri ?? this.TryResolvePath(this.TemplateFile),
5151
TemplateObject = this.TemplateObject,
5252
QueryString = QueryString,
53-
TemplateParameterObject = this.GetTemplateParameterObject(this.TemplateParameterObject),
53+
TemplateParameterObject = this.GetTemplateParameterObject(),
5454
ParameterUri = this.TemplateParameterUri
5555
};
5656

0 commit comments

Comments
 (0)