Skip to content
This repository was archived by the owner on Feb 23, 2024. It is now read-only.

Commit bc02f9d

Browse files
committed
create master template and parameters files for extractor, default deployment dependencies
1 parent e98f5ab commit bc02f9d

File tree

5 files changed

+215
-6
lines changed

5 files changed

+215
-6
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Create.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public CreateCommand()
9090
}
9191

9292
// create parameters file
93-
Template masterTemplateParameters = masterTemplateCreator.CreateMasterTemplateParameterValues(creatorConfig);
93+
Template templateParameters = masterTemplateCreator.CreateMasterTemplateParameterValues(creatorConfig);
9494

9595
// write templates to outputLocation
9696
if (creatorConfig.linked == true)
@@ -129,7 +129,7 @@ public CreateCommand()
129129
}
130130

131131
// write parameters to outputLocation
132-
fileWriter.WriteJSONToFile(masterTemplateParameters, String.Concat(creatorConfig.outputLocation, fileNames.parameters));
132+
fileWriter.WriteJSONToFile(templateParameters, String.Concat(creatorConfig.outputLocation, fileNames.parameters));
133133
Console.WriteLine("Templates written to output location");
134134
Console.WriteLine("Press any key to exit process:");
135135
#if DEBUG

src/APIM_ARMTemplate/apimtemplate/Commands/Extract.cs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public ExtractCommand()
1818
var resourceGroupName = this.Option("--resourceGroup <resourceGroup>", "Resource Group name", CommandOptionType.SingleValue);
1919
var fileFolderName = this.Option("--fileFolder <filefolder>", "ARM Template files folder", CommandOptionType.SingleValue);
2020
var apiName = this.Option("--apiName <apiName>", "API name", CommandOptionType.SingleValue);
21+
var linkedBaseUrlName = this.Option("--linkedBaseUrl <apiName>", "Creates a master template with links", CommandOptionType.SingleValue);
2122

2223
this.HelpOption();
2324

@@ -31,6 +32,7 @@ public ExtractCommand()
3132
string resourceGroup = resourceGroupName.Values[0].ToString();
3233
string apimname = apiManagementName.Values[0].ToString();
3334
string fileFolder = fileFolderName.Values[0].ToString();
35+
string linkedBaseUrl = linkedBaseUrlName.Values[0].ToString();
3436
string singleApiName = null;
3537

3638
if (apiName.Values.Count > 0)
@@ -63,28 +65,41 @@ public ExtractCommand()
6365
LoggerExtractor loggerExtractor = new LoggerExtractor();
6466
PropertyExtractor propertyExtractor = new PropertyExtractor();
6567
ProductExtractor productExtractor = new ProductExtractor();
68+
MasterTemplateExtractor masterTemplateExtractor = new MasterTemplateExtractor();
6669

6770
// extract templates from apim service
6871
Template apiTemplate = await apiExtractor.GenerateAPIsARMTemplate(apimname, resourceGroup, fileFolder, singleApiName);
6972
List<TemplateResource> apiTemplateResources = apiTemplate.resources.ToList();
7073
Template apiVersionSetTemplate = await apiVersionSetExtractor.GenerateAPIVersionSetsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
71-
Template authorizationTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
74+
Template authorizationServerTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
7275
Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
7376
Template productTemplate = await productExtractor.GenerateProductsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
7477
Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
7578
List<TemplateResource> namedValueResources = namedValueTemplate.resources.ToList();
7679
Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources, namedValueResources);
7780

81+
// create parameters file
82+
Template templateParameters = masterTemplateExtractor.CreateMasterTemplateParameterValues(apimname, linkedBaseUrl);
83+
7884
// write templates to output file location
7985
string apiFileName = fileNameGenerator.GenerateExtractorAPIFileName(singleApiName, apimname);
8086
fileWriter.WriteJSONToFile(apiTemplate, String.Concat(@fileFolder, apiFileName));
8187
fileWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(@fileFolder, fileNames.apiVersionSets));
82-
fileWriter.WriteJSONToFile(authorizationTemplate, String.Concat(@fileFolder, fileNames.authorizationServers));
88+
fileWriter.WriteJSONToFile(authorizationServerTemplate, String.Concat(@fileFolder, fileNames.authorizationServers));
8389
fileWriter.WriteJSONToFile(backendTemplate, String.Concat(@fileFolder, fileNames.backends));
8490
fileWriter.WriteJSONToFile(loggerTemplate, String.Concat(@fileFolder, fileNames.loggers));
8591
fileWriter.WriteJSONToFile(namedValueTemplate, String.Concat(@fileFolder, fileNames.namedValues));
8692
fileWriter.WriteJSONToFile(productTemplate, String.Concat(@fileFolder, fileNames.products));
8793

94+
if (linkedBaseUrl != null)
95+
{
96+
// create a master template that links to all other templates
97+
Template masterTemplate = masterTemplateExtractor.GenerateLinkedMasterTemplate(apiTemplate, apiVersionSetTemplate, productTemplate, loggerTemplate, backendTemplate, authorizationServerTemplate, namedValueTemplate, fileNames);
98+
fileWriter.WriteJSONToFile(masterTemplate, String.Concat(@fileFolder, fileNames.linkedMaster));
99+
}
100+
101+
// write parameters to outputLocation
102+
fileWriter.WriteJSONToFile(templateParameters, String.Concat(fileFolder, fileNames.parameters));
88103
Console.WriteLine("Templates written to output location");
89104
Console.WriteLine("Press any key to exit process:");
90105
#if DEBUG

src/APIM_ARMTemplate/apimtemplate/Common/FileHandlers/FileNameGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public string GenerateCreatorAPIFileName(string apiName, bool isSplitAPI, bool i
3535

3636
public string GenerateExtractorAPIFileName(string singleAPIName, string apimServiceName)
3737
{
38-
return singleAPIName == null ? $@"{apimServiceName}-apis.template.json" : $@"{apimServiceName}-{singleAPIName}-api.template.json";
38+
return singleAPIName == null ? $@"/{apimServiceName}-apis.template.json" : $@"/{apimServiceName}-{singleAPIName}-api.template.json";
3939
}
4040
}
4141

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/EntityExtractor.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,16 @@ public static async Task<string> CallApiManagement(string azToken, string reques
2828
}
2929
}
3030

31-
public Template GenerateEmptyTemplateWithParameters()
31+
public Template GenerateEmptyTemplate()
3232
{
3333
TemplateCreator templateCreator = new TemplateCreator();
3434
Template armTemplate = templateCreator.CreateEmptyTemplate();
35+
return armTemplate;
36+
}
37+
38+
public Template GenerateEmptyTemplateWithParameters()
39+
{
40+
Template armTemplate = GenerateEmptyTemplate();
3541
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { "ApimServiceName", new TemplateParameterProperties() { type = "string" } } };
3642
return armTemplate;
3743
}
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
using System.Collections.Generic;
2+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common;
3+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create;
4+
using System.Threading.Tasks;
5+
using System.Linq;
6+
7+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
8+
{
9+
public class MasterTemplateExtractor : EntityExtractor
10+
{
11+
public Template GenerateLinkedMasterTemplate(Template apiTemplate,
12+
Template apiVersionSetTemplate,
13+
Template productsTemplate,
14+
Template loggersTemplate,
15+
Template backendsTemplate,
16+
Template authorizationServersTemplate,
17+
Template namedValuesTemplate,
18+
FileNames fileNames)
19+
{
20+
// create empty template
21+
Template masterTemplate = GenerateEmptyTemplate();
22+
23+
// add parameters
24+
masterTemplate.parameters = this.CreateMasterTemplateParameters(true);
25+
26+
// add deployment resources that links to all resource files
27+
List<TemplateResource> resources = new List<TemplateResource>();
28+
29+
// namedValue
30+
string namedValueDeploymentResourceName = "namedValuesTemplate";
31+
// all other deployment resources will depend on named values
32+
string[] dependsOnNamedValues = new string[] { $"[resourceId('Microsoft.Resources/deployments', '{namedValueDeploymentResourceName}')]" };
33+
if (namedValuesTemplate != null)
34+
{
35+
string namedValuesUri = $"[concat(parameters('LinkedTemplatesBaseUrl'), '{fileNames.namedValues}')]";
36+
resources.Add(this.CreateLinkedMasterTemplateResource(namedValueDeploymentResourceName, namedValuesUri, new string[] { }));
37+
}
38+
39+
// apiVersionSet
40+
if (apiVersionSetTemplate != null)
41+
{
42+
string apiVersionSetUri = $"[concat(parameters('LinkedTemplatesBaseUrl'), '{fileNames.apiVersionSets}')]";
43+
resources.Add(this.CreateLinkedMasterTemplateResource("versionSetTemplate", apiVersionSetUri, dependsOnNamedValues));
44+
}
45+
46+
// product
47+
if (productsTemplate != null)
48+
{
49+
string productsUri = $"[concat(parameters('LinkedTemplatesBaseUrl'), '{fileNames.products}')]";
50+
resources.Add(this.CreateLinkedMasterTemplateResource("productsTemplate", productsUri, dependsOnNamedValues));
51+
}
52+
53+
// logger
54+
if (loggersTemplate != null)
55+
{
56+
string loggersUri = $"[concat(parameters('LinkedTemplatesBaseUrl'), '{fileNames.loggers}')]";
57+
resources.Add(this.CreateLinkedMasterTemplateResource("loggersTemplate", loggersUri, dependsOnNamedValues));
58+
}
59+
60+
// backend
61+
if (backendsTemplate != null)
62+
{
63+
string backendsUri = $"[concat(parameters('LinkedTemplatesBaseUrl'), '{fileNames.backends}')]";
64+
resources.Add(this.CreateLinkedMasterTemplateResource("backendsTemplate", backendsUri, dependsOnNamedValues));
65+
}
66+
67+
// authorizationServer
68+
if (authorizationServersTemplate != null)
69+
{
70+
string authorizationServersUri = $"[concat(parameters('LinkedTemplatesBaseUrl'), '{fileNames.authorizationServers}')]";
71+
resources.Add(this.CreateLinkedMasterTemplateResource("authorizationServersTemplate", authorizationServersUri, dependsOnNamedValues));
72+
}
73+
74+
// api
75+
if (apiTemplate != null)
76+
{
77+
string authorizationServersUri = $"[concat(parameters('LinkedTemplatesBaseUrl'), '{fileNames.authorizationServers}')]";
78+
resources.Add(this.CreateLinkedMasterTemplateResource("authorizationServersTemplate", authorizationServersUri, GenerateAPIResourceDependencies(apiTemplate, apiVersionSetTemplate, productsTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, namedValueDeploymentResourceName)));
79+
}
80+
81+
masterTemplate.resources = resources.ToArray();
82+
return masterTemplate;
83+
}
84+
85+
public string[] GenerateAPIResourceDependencies(Template apiTemplate,
86+
Template apiVersionSetTemplate,
87+
Template productsTemplate,
88+
Template loggersTemplate,
89+
Template backendsTemplate,
90+
Template authorizationServersTemplate,
91+
string namedValueDeploymentResourceName)
92+
{
93+
List<string> apiDependsOn = new List<string>();
94+
var apiResources = apiTemplate.resources.Where(resource => resource.type == ResourceTypeConstants.API);
95+
96+
// add dependency on all other template files by default for now
97+
apiDependsOn.Add($"[resourceId('Microsoft.Resources/deployments', '{namedValueDeploymentResourceName}')]");
98+
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'versionSetTemplate')]");
99+
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'productsTemplate')]");
100+
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'loggersTemplate')]");
101+
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'backendsTemplate')]");
102+
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'authorizationServersTemplate')]");
103+
104+
return apiDependsOn.ToArray();
105+
}
106+
107+
public MasterTemplateResource CreateLinkedMasterTemplateResource(string name, string uriLink, string[] dependsOn)
108+
{
109+
// create deployment resource with provided arguments
110+
MasterTemplateResource masterTemplateResource = new MasterTemplateResource()
111+
{
112+
name = name,
113+
type = "Microsoft.Resources/deployments",
114+
apiVersion = GlobalConstants.LinkedAPIVersion,
115+
properties = new MasterTemplateProperties()
116+
{
117+
mode = "Incremental",
118+
templateLink = new MasterTemplateLink()
119+
{
120+
uri = uriLink,
121+
contentVersion = "1.0.0.0"
122+
},
123+
parameters = new Dictionary<string, TemplateParameterProperties>
124+
{
125+
{ "ApimServiceName", new TemplateParameterProperties(){ value = "[parameters('ApimServiceName')]" } }
126+
}
127+
},
128+
dependsOn = dependsOn
129+
};
130+
return masterTemplateResource;
131+
}
132+
133+
public Dictionary<string, TemplateParameterProperties> CreateMasterTemplateParameters(bool linked)
134+
{
135+
// used to create the parameter metatadata, etc (not value) for use in file with resources
136+
// add parameters with metatdata properties
137+
Dictionary<string, TemplateParameterProperties> parameters = new Dictionary<string, TemplateParameterProperties>();
138+
TemplateParameterProperties apimServiceNameProperties = new TemplateParameterProperties()
139+
{
140+
metadata = new TemplateParameterMetadata()
141+
{
142+
description = "Name of the API Management"
143+
},
144+
type = "string"
145+
};
146+
parameters.Add("ApimServiceName", apimServiceNameProperties);
147+
// add remote location of template files for linked option
148+
if (linked == true)
149+
{
150+
TemplateParameterProperties linkedTemplatesBaseUrlProperties = new TemplateParameterProperties()
151+
{
152+
metadata = new TemplateParameterMetadata()
153+
{
154+
description = "Base URL of the repository"
155+
},
156+
type = "string"
157+
};
158+
parameters.Add("LinkedTemplatesBaseUrl", linkedTemplatesBaseUrlProperties);
159+
}
160+
return parameters;
161+
}
162+
163+
public Template CreateMasterTemplateParameterValues(string apimServiceName, string linkedTemplatesBaseUrl)
164+
{
165+
// used to create the parameter values for use in parameters file
166+
// create empty template
167+
Template masterTemplate = GenerateEmptyTemplate();
168+
169+
// add parameters with value property
170+
Dictionary<string, TemplateParameterProperties> parameters = new Dictionary<string, TemplateParameterProperties>();
171+
TemplateParameterProperties apimServiceNameProperties = new TemplateParameterProperties()
172+
{
173+
value = apimServiceName
174+
};
175+
parameters.Add("ApimServiceName", apimServiceNameProperties);
176+
if (linkedTemplatesBaseUrl != null)
177+
{
178+
TemplateParameterProperties linkedTemplatesBaseUrlProperties = new TemplateParameterProperties()
179+
{
180+
value = linkedTemplatesBaseUrl
181+
};
182+
parameters.Add("LinkedTemplatesBaseUrl", linkedTemplatesBaseUrlProperties);
183+
}
184+
masterTemplate.parameters = parameters;
185+
return masterTemplate;
186+
}
187+
}
188+
}

0 commit comments

Comments
 (0)