in src/Analyzer.TemplateProcessor/PlaceholderInputGenerator.cs [25:126]
internal static string GeneratePlaceholderParameters(string armTemplate, string definedParameters = null)
{
JObject jsonParameters = new JObject();
if (definedParameters != null)
{
JObject definedParameterJson = JObject.Parse(definedParameters);
if (definedParameterJson.InsensitiveToken("parameters") is JObject paramsObject)
{
jsonParameters = paramsObject;
}
else
{
throw new Exception("Parameters property is not specified in the ARM Template parameters provided. Please ensure ARM Template parameters follows the following JSON schema https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#");
}
}
// parse only parameter data from the template to avoid additional overhead
JToken parameters = null;
var reader = new JsonTextReader(new StringReader(armTemplate));
while (reader.Read())
{
if (reader.Depth == 1 && reader.TokenType == JsonToken.PropertyName)
{
if (string.Equals((string)reader.Value, "parameters", StringComparison.OrdinalIgnoreCase))
{
reader.Read(); // read StartObjectToken
parameters = JToken.ReadFrom(reader);
break;
}
}
}
if (parameters != null)
{
int count = 0;
foreach (JProperty parameter in parameters.Children<JProperty>())
{
JToken parameterValue = parameter.Value;
if (!jsonParameters.ContainsKey(parameter.Name) && parameterValue.InsensitiveToken("defaultValue") == null)
{
JToken allowedValues = parameterValue.InsensitiveToken("allowedValues");
if (allowedValues != null)
{
JToken firstAllowedValue = allowedValues.First;
if (firstAllowedValue != null)
{
jsonParameters[parameter.Name] = new JObject(new JProperty("value", firstAllowedValue));
continue;
}
}
string parameterTypeString = parameterValue.InsensitiveToken("type")?.Value<string>();
if (Enum.TryParse<TemplateParameterType>(parameterTypeString, ignoreCase: true, out var parameterType))
{
switch (parameterType)
{
case TemplateParameterType.String:
case TemplateParameterType.SecureString:
string stringValue = "defaultString";
int countLength = count.ToString().Length;
int? minLength = parameterValue.InsensitiveToken("minLength")?.Value<int>();
int? maxLength = parameterValue.InsensitiveToken("maxLength")?.Value<int>();
if (minLength.HasValue && stringValue.Length + countLength < minLength)
{
stringValue += new string('a', minLength.Value - stringValue.Length - countLength);
}
else if (maxLength.HasValue && stringValue.Length + countLength > maxLength)
{
stringValue = stringValue[0..(maxLength.Value - countLength)];
}
stringValue += count.ToString();
jsonParameters[parameter.Name] = new JObject(new JProperty("value", stringValue));
break;
case TemplateParameterType.Int:
jsonParameters[parameter.Name] = new JObject(new JProperty("value", 1));
break;
case TemplateParameterType.Bool:
jsonParameters[parameter.Name] = new JObject(new JProperty("value", true));
break;
case TemplateParameterType.Array:
jsonParameters[parameter.Name] = JObject.FromObject(new { value = new[] { "item1", "item2" } });
break;
case TemplateParameterType.Object:
case TemplateParameterType.SecureObject:
jsonParameters[parameter.Name] = JObject.FromObject(new { value = new { property1 = "value1" } });
break;
default:
break;
}
}
}
count++;
}
}
return JObject.FromObject(new { parameters = jsonParameters }).ToString();
}