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

Commit dad08dc

Browse files
fortunkamMatthew FortunkaRupengLiu
authored
Added support for parameterising backend properties (#537)
* Added support for parameterising backend properties (currently limited to resourceId, url and protocol, so no service fabric at the moment) Reworked parameters passed to linked templates to remove unused fields * fix issue with all api logger ids not being added to the parameters folder Co-authored-by: Matthew Fortunka <mafortun@microsoft.com> Co-authored-by: RupengLiu <rliu1211@terpmail.umd.edu>
1 parent 7051c7b commit dad08dc

18 files changed

+292
-196
lines changed

src/APIM_ARMTemplate/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ You have two choices when specifying your settings:
397397
| serviceBaseUrl | No | Specify the base url where you want to run your extractor |
398398
| notIncludeNamedValue | No | Set to "true" will not generate Named Value Templates|
399399
| paramNamedValuesKeyVaultSecrets | No | Set to true will parameterize all named values where the value is from a key vault secret |
400+
| paramBackend | No | Set to true will parameterize sepcific backend values (limited to resourceId, url and protocol) |
400401

401402
#### Note
402403
* Can not use "splitAPIs" and "apiName" at the same time, since using "apiName" only extract one API

src/APIM_ARMTemplate/apimtemplate/Common/Constants/GlobalConstants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public static class ParameterNames
3535
public const string ApimServiceName = "ApimServiceName";
3636
public const string LinkedTemplatesBaseUrl = "LinkedTemplatesBaseUrl";
3737
public const string NamedValueKeyVaultSecrets = "NamedValueKeyVaultSecrets";
38+
public const string BackendSettings = "BackendSettings";
3839
}
3940

4041
public static class ParameterPrefix
@@ -43,5 +44,6 @@ public static class ParameterPrefix
4344
public const string Diagnostic = "Diagnostic";
4445
public const string Property = "Property";
4546
public const string LogResourceId = "LogResourceId";
47+
public const string Backend = "Backend";
4648
}
4749
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
5+
namespace apimtemplate.Common.TemplateModels
6+
{
7+
/// <summary>
8+
/// Backend Parameters for a single API
9+
/// </summary>
10+
public class BackendApiParameters
11+
{
12+
public string resourceId { get; set; }
13+
public string url { get; set; }
14+
public string protocol { get; set; }
15+
}
16+
17+
}

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,5 +827,44 @@ private async Task<IEnumerable<TemplateResource>> GetServiceDiagnosticsTemplateR
827827

828828
return templateResources.ToArray();
829829
}
830+
831+
public Template GenerateEmptyApiTemplateWithParameters(Extractor exc)
832+
{
833+
Template armTemplate = GenerateEmptyTemplate();
834+
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { ParameterNames.ApimServiceName, new TemplateParameterProperties() { type = "string" } } };
835+
if (exc.policyXMLBaseUrl != null && exc.policyXMLSasToken != null)
836+
{
837+
TemplateParameterProperties policyTemplateSasTokenParameterProperties = new TemplateParameterProperties()
838+
{
839+
type = "string"
840+
};
841+
armTemplate.parameters.Add(ParameterNames.PolicyXMLSasToken, policyTemplateSasTokenParameterProperties);
842+
}
843+
if (exc.policyXMLBaseUrl != null)
844+
{
845+
TemplateParameterProperties policyTemplateBaseUrlParameterProperties = new TemplateParameterProperties()
846+
{
847+
type = "string"
848+
};
849+
armTemplate.parameters.Add(ParameterNames.PolicyXMLBaseUrl, policyTemplateBaseUrlParameterProperties);
850+
}
851+
if (exc.paramServiceUrl || (exc.serviceUrlParameters != null && exc.serviceUrlParameters.Length > 0))
852+
{
853+
TemplateParameterProperties serviceUrlParamProperty = new TemplateParameterProperties()
854+
{
855+
type = "object"
856+
};
857+
armTemplate.parameters.Add(ParameterNames.ServiceUrl, serviceUrlParamProperty);
858+
}
859+
if (exc.paramApiLoggerId)
860+
{
861+
TemplateParameterProperties apiLoggerProperty = new TemplateParameterProperties()
862+
{
863+
type = "object"
864+
};
865+
armTemplate.parameters.Add(ParameterNames.ApiLoggerId, apiLoggerProperty);
866+
}
867+
return armTemplate;
868+
}
830869
}
831870
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public async Task<string> GetAPIVersionSetDetailsAsync(string ApiManagementName,
3030
return await CallApiManagementAsync(azToken, requestUrl);
3131
}
3232

33-
public async Task<Template> GenerateAPIVersionSetsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string policyXMLSasToken)
33+
public async Task<Template> GenerateAPIVersionSetsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources)
3434
{
3535
Console.WriteLine("------------------------------------------");
3636
Console.WriteLine("Extracting API version sets from service");
37-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
37+
Template armTemplate = GenerateEmptyPropertyTemplateWithParameters();
3838

3939
// isolate apis in the case of a single api extraction
4040
var apiResources = apiTemplateResources.Where(resource => resource.type == ResourceTypeConstants.API);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ public async Task<string> GetAuthorizationServerDetailsAsync(string ApiManagemen
3030
return await CallApiManagementAsync(azToken, requestUrl);
3131
}
3232

33-
public async Task<Template> GenerateAuthorizationServersARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string policyXMLSasToken)
33+
public async Task<Template> GenerateAuthorizationServersARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources)
3434
{
3535
Console.WriteLine("------------------------------------------");
3636
Console.WriteLine("Extracting authorization servers from service");
37-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
37+
Template armTemplate = GenerateEmptyPropertyTemplateWithParameters();
3838

3939
List<TemplateResource> templateResources = new List<TemplateResource>();
4040

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

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Linq;
66
using Newtonsoft.Json;
77
using System;
8+
using apimtemplate.Common.TemplateModels;
89

910
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
1011
{
@@ -30,11 +31,32 @@ public async Task<string> GetBackendDetailsAsync(string ApiManagementName, strin
3031
return await CallApiManagementAsync(azToken, requestUrl);
3132
}
3233

33-
public async Task<Template> GenerateBackendsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, List<TemplateResource> propertyResources, string policyXMLBaseUrl, string policyXMLSasToken)
34+
/// <summary>
35+
/// Generate the ARM assets for the backend resources
36+
/// </summary>
37+
/// <param name="apimname"></param>
38+
/// <param name="resourceGroup"></param>
39+
/// <param name="singleApiName"></param>
40+
/// <param name="apiTemplateResources"></param>
41+
/// <param name="propertyResources"></param>
42+
/// <param name="policyXMLBaseUrl"></param>
43+
/// <param name="policyXMLSasToken"></param>
44+
/// <param name="extractBackendParameters"></param>
45+
/// <returns>a combination of a Template and the value for the BackendSettings parameter</returns>
46+
public async Task<Tuple<Template,Dictionary<string,BackendApiParameters> > > GenerateBackendsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, List<TemplateResource> propertyResources, Extractor exc)
3447
{
3548
Console.WriteLine("------------------------------------------");
3649
Console.WriteLine("Extracting backends from service");
37-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
50+
Template armTemplate = GenerateEmptyPropertyTemplateWithParameters();
51+
52+
if (exc.paramBackend)
53+
{
54+
TemplateParameterProperties extractBackendParametersProperties = new TemplateParameterProperties()
55+
{
56+
type = "object"
57+
};
58+
armTemplate.parameters.Add(ParameterNames.BackendSettings, extractBackendParametersProperties);
59+
}
3860

3961
List<TemplateResource> templateResources = new List<TemplateResource>();
4062

@@ -44,6 +66,7 @@ public async Task<Template> GenerateBackendsARMTemplateAsync(string apimname, st
4466

4567
// pull all backends for service
4668
JObject oBackends = new JObject();
69+
var oBackendParameters = new Dictionary<string, BackendApiParameters>();
4770
int skipNumberOfBackends = 0;
4871

4972
do
@@ -61,6 +84,32 @@ public async Task<Template> GenerateBackendsARMTemplateAsync(string apimname, st
6184
backendTemplateResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{backendName}')]";
6285
backendTemplateResource.apiVersion = GlobalConstants.APIVersion;
6386

87+
if(exc.paramBackend)
88+
{
89+
var apiToken = new BackendApiParameters();
90+
string validApiParamName = ExtractorUtils.GenValidParamName(backendName, ParameterPrefix.Diagnostic).ToLower();
91+
92+
93+
if (!string.IsNullOrEmpty(backendTemplateResource.properties.resourceId))
94+
{
95+
apiToken.resourceId = backendTemplateResource.properties.resourceId;
96+
backendTemplateResource.properties.resourceId = $"[parameters('{ParameterNames.BackendSettings}').{validApiParamName}.resourceId]";
97+
}
98+
99+
if (!string.IsNullOrEmpty(backendTemplateResource.properties.url))
100+
{
101+
apiToken.url = backendTemplateResource.properties.url;
102+
backendTemplateResource.properties.url = $"[parameters('{ParameterNames.BackendSettings}').{validApiParamName}.url]";
103+
}
104+
105+
if (!string.IsNullOrEmpty(backendTemplateResource.properties.protocol))
106+
{
107+
apiToken.protocol = backendTemplateResource.properties.protocol;
108+
backendTemplateResource.properties.protocol = $"[parameters('{ParameterNames.BackendSettings}').{validApiParamName}.protocol]";
109+
}
110+
oBackendParameters.Add(validApiParamName, apiToken);
111+
}
112+
64113
////only extract the backend if this is a full extraction, or in the case of a single api, if it is referenced by one of the policies
65114
//if (singleApiName == null)
66115
//{
@@ -94,7 +143,7 @@ public async Task<Template> GenerateBackendsARMTemplateAsync(string apimname, st
94143
while (oBackends["nextLink"] != null);
95144

96145
armTemplate.resources = templateResources.ToArray();
97-
return armTemplate;
146+
return new Tuple<Template, Dictionary<string, BackendApiParameters>>(armTemplate, oBackendParameters);
98147
}
99148

100149
public bool DoesPolicyReferenceBackend(string policyContent, IEnumerable<TemplateResource> namedValueResources, string backendName, BackendTemplateResource backendTemplateResource)

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

Lines changed: 2 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -46,143 +46,15 @@ public Template GenerateEmptyTemplate()
4646
return armTemplate;
4747
}
4848

49-
public Template GenerateEmptyPropertyTemplateWithParameters(Extractor exc)
49+
public Template GenerateEmptyPropertyTemplateWithParameters()
5050
{
5151
Template armTemplate = GenerateEmptyTemplate();
5252
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { ParameterNames.ApimServiceName, new TemplateParameterProperties() { type = "string" } } };
53-
if (exc.policyXMLBaseUrl != null && exc.policyXMLSasToken != null)
54-
{
55-
TemplateParameterProperties policyTemplateSasTokenParameterProperties = new TemplateParameterProperties()
56-
{
57-
type = "string"
58-
};
59-
armTemplate.parameters.Add(ParameterNames.PolicyXMLSasToken, policyTemplateSasTokenParameterProperties);
60-
}
61-
if (exc.policyXMLBaseUrl != null)
62-
{
63-
TemplateParameterProperties policyTemplateBaseUrlParameterProperties = new TemplateParameterProperties()
64-
{
65-
type = "string"
66-
};
67-
armTemplate.parameters.Add(ParameterNames.PolicyXMLBaseUrl, policyTemplateBaseUrlParameterProperties);
68-
}
69-
if (exc.paramNamedValue)
70-
{
71-
TemplateParameterProperties namedValueParameterProperties = new TemplateParameterProperties()
72-
{
73-
type = "object"
74-
};
75-
armTemplate.parameters.Add(ParameterNames.NamedValues, namedValueParameterProperties);
76-
}
77-
if (exc.paramNamedValuesKeyVaultSecrets)
78-
{
79-
TemplateParameterProperties keyVaultNamedValueParameterProperties = new TemplateParameterProperties()
80-
{
81-
type = "object"
82-
};
83-
armTemplate.parameters.Add(ParameterNames.NamedValueKeyVaultSecrets, keyVaultNamedValueParameterProperties);
84-
}
8553
return armTemplate;
8654
}
8755

88-
public Template GenerateEmptyTemplateWithParameters(string policyXMLBaseUrl, string policyXMLSasToken)
89-
{
90-
Template armTemplate = GenerateEmptyTemplate();
91-
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { ParameterNames.ApimServiceName, new TemplateParameterProperties() { type = "string" } } };
92-
if (policyXMLBaseUrl != null && policyXMLSasToken != null)
93-
{
94-
TemplateParameterProperties policyTemplateSasTokenParameterProperties = new TemplateParameterProperties()
95-
{
96-
type = "string"
97-
};
98-
armTemplate.parameters.Add(ParameterNames.PolicyXMLSasToken, policyTemplateSasTokenParameterProperties);
99-
}
100-
if (policyXMLBaseUrl != null)
101-
{
102-
TemplateParameterProperties policyTemplateBaseUrlParameterProperties = new TemplateParameterProperties()
103-
{
104-
type = "string"
105-
};
106-
armTemplate.parameters.Add(ParameterNames.PolicyXMLBaseUrl, policyTemplateBaseUrlParameterProperties);
107-
}
108-
return armTemplate;
109-
}
11056

111-
public Template GenerateEmptyLoggerTemplateWithParameters(Extractor exc)
112-
{
113-
Template armTemplate = GenerateEmptyTemplate();
114-
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { ParameterNames.ApimServiceName, new TemplateParameterProperties() { type = "string" } } };
115-
if (exc.policyXMLBaseUrl != null && exc.policyXMLSasToken != null)
116-
{
117-
TemplateParameterProperties policyTemplateSasTokenParameterProperties = new TemplateParameterProperties()
118-
{
119-
type = "string"
120-
};
121-
armTemplate.parameters.Add(ParameterNames.PolicyXMLSasToken, policyTemplateSasTokenParameterProperties);
122-
}
123-
if (exc.policyXMLBaseUrl != null)
124-
{
125-
TemplateParameterProperties policyTemplateBaseUrlParameterProperties = new TemplateParameterProperties()
126-
{
127-
type = "string"
128-
};
129-
armTemplate.parameters.Add(ParameterNames.PolicyXMLBaseUrl, policyTemplateBaseUrlParameterProperties);
130-
}
131-
if (exc.paramLogResourceId)
132-
{
133-
TemplateParameterProperties loggerResourceIdParameterProperties = new TemplateParameterProperties()
134-
{
135-
type = "object"
136-
};
137-
armTemplate.parameters.Add(ParameterNames.LoggerResourceId, loggerResourceIdParameterProperties);
138-
}
139-
return armTemplate;
140-
}
57+
14158

142-
public Template GenerateEmptyApiTemplateWithParameters(Extractor exc)
143-
{
144-
Template armTemplate = GenerateEmptyTemplate();
145-
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { ParameterNames.ApimServiceName, new TemplateParameterProperties() { type = "string" } } };
146-
if (exc.policyXMLBaseUrl != null && exc.policyXMLSasToken != null)
147-
{
148-
TemplateParameterProperties policyTemplateSasTokenParameterProperties = new TemplateParameterProperties()
149-
{
150-
type = "string"
151-
};
152-
armTemplate.parameters.Add(ParameterNames.PolicyXMLSasToken, policyTemplateSasTokenParameterProperties);
153-
}
154-
if (exc.policyXMLBaseUrl != null)
155-
{
156-
TemplateParameterProperties policyTemplateBaseUrlParameterProperties = new TemplateParameterProperties()
157-
{
158-
type = "string"
159-
};
160-
armTemplate.parameters.Add(ParameterNames.PolicyXMLBaseUrl, policyTemplateBaseUrlParameterProperties);
161-
}
162-
if (exc.paramServiceUrl || (exc.serviceUrlParameters != null && exc.serviceUrlParameters.Length > 0))
163-
{
164-
TemplateParameterProperties serviceUrlParamProperty = new TemplateParameterProperties()
165-
{
166-
type = "object"
167-
};
168-
armTemplate.parameters.Add(ParameterNames.ServiceUrl, serviceUrlParamProperty);
169-
}
170-
if (exc.paramApiLoggerId)
171-
{
172-
TemplateParameterProperties apiLoggerProperty = new TemplateParameterProperties()
173-
{
174-
type = "object"
175-
};
176-
armTemplate.parameters.Add(ParameterNames.ApiLoggerId, apiLoggerProperty);
177-
}
178-
return armTemplate;
179-
}
180-
181-
public Template GenerateEmptyProductApiTemplateWithParameters(Extractor exc)
182-
{
183-
Template armTemplate = GenerateEmptyTemplate();
184-
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { ParameterNames.ApimServiceName, new TemplateParameterProperties() { type = "string" } } };
185-
return armTemplate;
186-
}
18759
}
18860
}

0 commit comments

Comments
 (0)