Skip to content

Commit dd10ff9

Browse files
authored
Merge pull request Azure#10565 from shenglol/shenglol/fix-deployment-dynamic-param-conflict-issue
[Az.Resources] Fix template parameter name conflict issue for deployment cmdlets
2 parents 5bc44e4 + d422bc2 commit dd10ff9

File tree

3 files changed

+20
-63
lines changed

3 files changed

+20
-63
lines changed

src/Resources/ResourceManager/Utilities/TemplateUtility.cs

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -144,51 +144,41 @@ private static RuntimeDefinedParameterDictionary ParseTemplateAndExtractParamete
144144
}
145145
if (templateParameterObject != null)
146146
{
147-
UpdateParametersWithObject(dynamicParameters, templateParameterObject);
147+
UpdateParametersWithObject(staticParameters, dynamicParameters, templateParameterObject);
148148
}
149149
if (templateParameterFilePath != null && FileUtilities.DataStore.FileExists(templateParameterFilePath))
150150
{
151151
var parametersFromFile = ParseTemplateParameterFileContents(templateParameterFilePath);
152-
UpdateParametersWithObject(dynamicParameters, new Hashtable(parametersFromFile));
152+
UpdateParametersWithObject(staticParameters, dynamicParameters, new Hashtable(parametersFromFile));
153153
}
154154
if (templateParameterFilePath != null && Uri.IsWellFormedUriString(templateParameterFilePath, UriKind.Absolute))
155155
{
156156
var parametersFromUri = ParseTemplateParameterContent(GeneralUtilities.DownloadFile(templateParameterFilePath));
157-
UpdateParametersWithObject(dynamicParameters, new Hashtable(parametersFromUri));
157+
UpdateParametersWithObject(staticParameters, dynamicParameters, new Hashtable(parametersFromUri));
158158
}
159159
return dynamicParameters;
160160
}
161161

162-
private static void UpdateParametersWithObject(RuntimeDefinedParameterDictionary dynamicParameters, Hashtable templateParameterObject)
162+
private static void UpdateParametersWithObject(string[] staticParameters, RuntimeDefinedParameterDictionary dynamicParameters, Hashtable templateParameterObject)
163163
{
164+
const string duplicatedParameterSuffix = "FromTemplate";
165+
164166
if (templateParameterObject != null)
165167
{
166-
foreach (KeyValuePair<string, RuntimeDefinedParameter> dynamicParameter in dynamicParameters)
168+
foreach (string paramName in templateParameterObject.Keys)
167169
{
168-
try
169-
{
170-
foreach (string key in templateParameterObject.Keys)
171-
{
172-
if (key.Equals(dynamicParameter.Key, StringComparison.InvariantCultureIgnoreCase))
173-
{
174-
if (templateParameterObject[key] is TemplateFileParameterV1)
175-
{
176-
dynamicParameter.Value.Value = (templateParameterObject[key] as TemplateFileParameterV1).Value;
177-
}
178-
else
179-
{
180-
dynamicParameter.Value.Value = templateParameterObject[key];
181-
}
182-
dynamicParameter.Value.IsSet = true;
183-
((ParameterAttribute)dynamicParameter.Value.Attributes[0]).Mandatory = false;
184-
}
185-
}
186-
}
187-
catch
170+
string dynamicParamName = staticParameters.Contains(paramName, StringComparer.OrdinalIgnoreCase)
171+
? paramName + duplicatedParameterSuffix
172+
: paramName;
173+
174+
if (dynamicParameters.TryGetValue(dynamicParamName, out RuntimeDefinedParameter dynamicParameter))
188175
{
189-
throw new ArgumentException(string.Format(ProjectResources.FailureParsingTemplateParameterObject,
190-
dynamicParameter.Key,
191-
templateParameterObject[dynamicParameter.Key]));
176+
dynamicParameter.Value = templateParameterObject[paramName] is TemplateFileParameterV1 templateFileParameterV1
177+
? templateFileParameterV1.Value
178+
: templateParameterObject[paramName];
179+
180+
dynamicParameter.IsSet = true;
181+
((ParameterAttribute)dynamicParameter.Attributes[0]).Mandatory = false;
192182
}
193183
}
194184
}
@@ -249,8 +239,7 @@ internal static RuntimeDefinedParameter ConstructDynamicParameter(string[] stati
249239
RuntimeDefinedParameter runtimeParameter = new RuntimeDefinedParameter()
250240
{
251241
// For duplicated template parameter names, add a suffix FromTemplate to distinguish them from the cmdlet parameter.
252-
Name = staticParameters.Any(n => n.StartsWith(name, StringComparison.OrdinalIgnoreCase))
253-
? name + duplicatedParameterSuffix : name,
242+
Name = staticParameters.Contains(name, StringComparer.OrdinalIgnoreCase) ? name + duplicatedParameterSuffix : name,
254243
ParameterType = GetParameterType(parameter.Value.Type),
255244
Value = defaultValue
256245
};

src/Resources/Resources.Test/Models.ResourceGroups/GalleryTemplatesClientTests.cs

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -123,39 +123,6 @@ public void ResolvesDuplicatedDynamicParameterName()
123123
Assert.Equal(int.Parse(value.MaxLength), validateLengthAttribute.MaxLength);
124124
}
125125

126-
[Fact]
127-
[Trait(Category.AcceptanceType, Category.CheckIn)]
128-
public void ResolvesDuplicatedDynamicParameterNameSubstring()
129-
{
130-
string[] parameters = { "Username", "Location", "Mode" };
131-
string[] parameterSetNames = { "__AllParameterSets" };
132-
string key = "user";
133-
TemplateFileParameterV1 value = new TemplateFileParameterV1()
134-
{
135-
AllowedValues = new List<object>() { "Mode1", "Mode2", "Mode3" },
136-
MaxLength = "5",
137-
MinLength = "1",
138-
Type = "bool"
139-
};
140-
KeyValuePair<string, TemplateFileParameterV1> parameter = new KeyValuePair<string, TemplateFileParameterV1>(key, value);
141-
142-
RuntimeDefinedParameter dynamicParameter = TemplateUtility.ConstructDynamicParameter(parameters, parameter);
143-
144-
Assert.Equal(key + "FromTemplate", dynamicParameter.Name);
145-
Assert.Equal(value.DefaultValue, dynamicParameter.Value);
146-
Assert.Equal(typeof(bool), dynamicParameter.ParameterType);
147-
Assert.Equal(2, dynamicParameter.Attributes.Count);
148-
149-
ParameterAttribute parameterAttribute = (ParameterAttribute)dynamicParameter.Attributes[0];
150-
Assert.True(parameterAttribute.Mandatory);
151-
Assert.True(parameterAttribute.ValueFromPipelineByPropertyName);
152-
Assert.Equal(parameterSetNames[0], parameterAttribute.ParameterSetName);
153-
154-
ValidateLengthAttribute validateLengthAttribute = (ValidateLengthAttribute)dynamicParameter.Attributes[1];
155-
Assert.Equal(int.Parse(value.MinLength), validateLengthAttribute.MinLength);
156-
Assert.Equal(int.Parse(value.MaxLength), validateLengthAttribute.MaxLength);
157-
}
158-
159126
[Fact]
160127
[Trait(Category.AcceptanceType, Category.CheckIn)]
161128
public void ResolvesDuplicatedDynamicParameterNameCaseInsensitive()

src/Resources/Resources/ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
- Additional information about change #1
1919
-->
2020
## Upcoming Release
21+
* Fix an issue where template deployment fails to read a template parameter if its name conflicts with some built-in parameter name.
2122

2223
## Version 1.8.0
2324
- Updated policy cmdlets to use new api version 2019-06-01 that has new EnforcementMode property in policy assignment.

0 commit comments

Comments
 (0)