in SQL-Hybrid-Cloud-Toolkit/Components/ADP/ADPControl/AzureResourceManagerActivity.cs [184:242]
private static JObject UpdateArmTemplateForImport(JObject originalTemplate, ImportRequest request)
{
string serverNameParameterName = null;
// Go through every parameter to find the property name is like 'server_%_name'
using (JsonTextReader reader = new JsonTextReader(new StringReader(originalTemplate["parameters"].ToString())))
{
while (reader.Read())
{
if (reader.TokenType.ToString().Equals("PropertyName")
&& reader.ValueType.ToString().Equals("System.String")
&& reader.Value.ToString().StartsWith("servers_")
&& reader.Value.ToString().EndsWith("_name"))
{
serverNameParameterName = reader.Value.ToString();
break;
}
}
}
// 1. Replacing the default value to the target server name, appending to the new template
originalTemplate["parameters"][serverNameParameterName]["defaultValue"] = request.TargetSqlServerName;
JObject serverNameParameterValue = (JObject)originalTemplate["parameters"][serverNameParameterName];
// 2. Cleanup all the parameters except the updated server name
((JObject)originalTemplate["parameters"]).RemoveAll();
((JObject)originalTemplate["parameters"]).Add(serverNameParameterName, serverNameParameterValue);
// 3. Adjust the servers resource by adding password after the login
JObject server = (JObject)originalTemplate["resources"]
.SelectToken("$.[?(@.type == 'Microsoft.Sql/servers')]");
server.Remove("identity");
JObject serverProperties = (JObject)server["properties"];
serverProperties.Property("administratorLogin")
.AddAfterSelf(new JProperty("administratorLoginPassword", request.SqlAdminPassword));
JArray newResources = new JArray();
// 4. Getting the whitelisted resources and adding them to the new template later.
foreach (string resourceType in AllowedImportSubServerResourceTypes)
{
List<JToken> resources = originalTemplate["resources"]
.SelectTokens(string.Format("$.[?(@.type == '{0}')]", resourceType)).ToList();
newResources.Add(resources);
}
// 5. Clean up all the resources excepted the new server and whitelisted resource type.
((JArray)originalTemplate["resources"]).Clear();
((JArray)originalTemplate["resources"]).Add(server);
foreach (var resource in newResources)
{
((JArray)originalTemplate["resources"]).Add(resource);
}
return originalTemplate;
}