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

Commit 3970e94

Browse files
authored
[Extractor]Parameterize Named value (#335)
1 parent 6a7005d commit 3970e94

File tree

6 files changed

+123
-8
lines changed

6 files changed

+123
-8
lines changed

src/APIM_ARMTemplate/README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,8 @@ You have two choices when specifying your settings:
321321
| policyXMLSasToken | No | Specify sasToken for fetching policy files |
322322
| linkedTemplatesSasToken | No | Specify sasToken for fetching linkedTemplate files |
323323
| serviceUrlParameters | No | Parameterize service url in advance (you can replace serviceUrl afterwards as well, you can refer example for more information). |
324-
| paramServiceUrl | No | Set to "true" will parameterize all serviceUrl for each api and generate serviceUrl parameter in apiTemplate/parameter/masterTemplate files |
324+
| paramServiceUrl | No | Set to "true" will parameterize all serviceUrl for each api and generate serviceUrl parameter to api template/parameter template/master template files |
325+
| paramNamedValue | No | Set to "true" will parameterize all named values and add named values parameter to property template/parameter template/mastert emplate files |
325326

326327

327328
#### Note
@@ -450,6 +451,18 @@ Extract **all APIs within parameterServiceUrl**, use the following parameters:
450451
"paramServiceUrl": "true"
451452
}
452453
```
454+
Extract **all APIs within parameterServiceUrl**, use the following parameters:
455+
```
456+
{
457+
"sourceApimName": "<source-apim-name>",
458+
"destinationApimName": "<destination-apim-name>",
459+
"resourceGroup": "<resource-group>",
460+
"fileFolder": "<destination-file-folder>",
461+
"linkedTemplatesBaseUrl": "<linked_templates_remote_location>",
462+
"policyXMLBaseUrl": "<policies_remote_location>",
463+
"paramNamedValue": "true"
464+
}
465+
```
453466

454467
#### Run the extractor
455468
```

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,37 @@ public Template GenerateEmptyTemplate()
4545
return armTemplate;
4646
}
4747

48+
public Template GenerateEmptyPropertyTemplateWithParameters(Extractor exc)
49+
{
50+
Template armTemplate = GenerateEmptyTemplate();
51+
armTemplate.parameters = new Dictionary<string, TemplateParameterProperties> { { "ApimServiceName", new TemplateParameterProperties() { type = "string" } } };
52+
if (exc.policyXMLBaseUrl != null && exc.policyXMLSasToken != null)
53+
{
54+
TemplateParameterProperties policyTemplateSasTokenParameterProperties = new TemplateParameterProperties()
55+
{
56+
type = "string"
57+
};
58+
armTemplate.parameters.Add("PolicyXMLSasToken", policyTemplateSasTokenParameterProperties);
59+
}
60+
if (exc.policyXMLBaseUrl != null)
61+
{
62+
TemplateParameterProperties policyTemplateBaseUrlParameterProperties = new TemplateParameterProperties()
63+
{
64+
type = "string"
65+
};
66+
armTemplate.parameters.Add("PolicyXMLBaseUrl", policyTemplateBaseUrlParameterProperties);
67+
}
68+
if (exc.paramNamedValue)
69+
{
70+
TemplateParameterProperties namedValueParameterProperties = new TemplateParameterProperties()
71+
{
72+
type = "object"
73+
};
74+
armTemplate.parameters.Add("NamedValues", namedValueParameterProperties);
75+
}
76+
return armTemplate;
77+
}
78+
4879
public Template GenerateEmptyTemplateWithParameters(string policyXMLBaseUrl, string policyXMLSasToken)
4980
{
5081
Template armTemplate = GenerateEmptyTemplate();

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

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common;
33
using System.Linq;
44
using System;
5+
using Newtonsoft.Json;
56
using Newtonsoft.Json.Linq;
67
using System.Threading.Tasks;
78

@@ -44,7 +45,7 @@ public Template GenerateLinkedMasterTemplate(Template apiTemplate,
4445
dependsOnNamedValues = new string[] { $"[resourceId('Microsoft.Resources/deployments', '{namedValueDeploymentResourceName}')]" };
4546
apiDependsOn.Add($"[resourceId('Microsoft.Resources/deployments', '{namedValueDeploymentResourceName}')]");
4647
string namedValuesUri = GenerateLinkedTemplateUri(exc.linkedTemplatesUrlQueryString, exc.linkedTemplatesSasToken, fileNames.namedValues);
47-
resources.Add(this.CreateLinkedMasterTemplateResourceWithPolicyToken(namedValueDeploymentResourceName, namedValuesUri, new string[] { }, exc));
48+
resources.Add(this.CreateLinkedMasterTemplateResourceForPropertyTemplate(namedValueDeploymentResourceName, namedValuesUri, new string[] { }, exc));
4849
}
4950

5051
// globalServicePolicy
@@ -127,6 +128,20 @@ public MasterTemplateResource CreateLinkedMasterTemplateResourceForApiTemplate(s
127128
return masterResourceTemplate;
128129
}
129130

131+
public MasterTemplateResource CreateLinkedMasterTemplateResourceForPropertyTemplate(string name, string uriLink, string[] dependsOn, Extractor exc)
132+
{
133+
MasterTemplateResource masterResourceTemplate = this.CreateLinkedMasterTemplateResource(name, uriLink, dependsOn);
134+
if (exc.policyXMLSasToken != null)
135+
{
136+
masterResourceTemplate.properties.parameters.Add("PolicyXMLSasToken", new TemplateParameterProperties() { value = "[parameters('PolicyXMLSasToken')]" });
137+
}
138+
if (exc.paramNamedValue)
139+
{
140+
masterResourceTemplate.properties.parameters.Add("NamedValues", new TemplateParameterProperties() { value = "[parameters('NamedValues')]" });
141+
}
142+
return masterResourceTemplate;
143+
}
144+
130145
public MasterTemplateResource CreateLinkedMasterTemplateResourceWithPolicyToken(string name, string uriLink, string[] dependsOn, Extractor exc)
131146
{
132147
if (exc.policyXMLSasToken == null)
@@ -256,6 +271,18 @@ public Dictionary<string, TemplateParameterProperties> CreateMasterTemplateParam
256271
};
257272
parameters.Add("serviceUrl", paramServiceUrlProperties);
258273
}
274+
if (exc.paramNamedValue)
275+
{
276+
TemplateParameterProperties namedValueProperties = new TemplateParameterProperties()
277+
{
278+
metadata = new TemplateParameterMetadata()
279+
{
280+
description = "Named values"
281+
},
282+
type = "object"
283+
};
284+
parameters.Add("NamedValues", namedValueProperties);
285+
}
259286
return parameters;
260287
}
261288

@@ -404,6 +431,28 @@ public async Task<Template> CreateMasterTemplateParameterValues(string singleApi
404431
};
405432
parameters.Add("serviceUrl", serviceUrlProperties);
406433
}
434+
if (exc.paramNamedValue)
435+
{
436+
Dictionary<string, string> namedValues = new Dictionary<string, string>();
437+
PropertyExtractor pExc = new PropertyExtractor();
438+
string properties = await pExc.GetPropertiesAsync(exc.sourceApimName, exc.resourceGroup);
439+
JObject oProperties = JObject.Parse(properties);
440+
441+
foreach (var extractedProperty in oProperties["value"])
442+
{
443+
string propertyName = ((JValue)extractedProperty["name"]).Value.ToString();
444+
string fullPropertyResource = await pExc.GetPropertyDetailsAsync(exc.sourceApimName, exc.resourceGroup, propertyName);
445+
PropertyTemplateResource propertyTemplateResource = JsonConvert.DeserializeObject<PropertyTemplateResource>(fullPropertyResource);
446+
string propertyValue = propertyTemplateResource.properties.value;
447+
string validPName = ExtractorUtils.GenValidPropertyParamName(propertyName);
448+
namedValues.Add(validPName, propertyValue);
449+
}
450+
TemplateServiceUrlProperties namedValueProperties = new TemplateServiceUrlProperties()
451+
{
452+
value = namedValues
453+
};
454+
parameters.Add("NamedValues", namedValueProperties);
455+
}
407456
masterTemplate.parameters = parameters;
408457
return masterTemplate;
409458
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
99
{
10-
public class PropertyExtractor: EntityExtractor
10+
public class PropertyExtractor : EntityExtractor
1111
{
1212
public async Task<string> GetPropertiesAsync(string ApiManagementName, string ResourceGroupName)
1313
{
@@ -29,22 +29,22 @@ public async Task<string> GetPropertyDetailsAsync(string ApiManagementName, stri
2929
return await CallApiManagementAsync(azToken, requestUrl);
3030
}
3131

32-
public async Task<Template> GenerateNamedValuesTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string policyXMLSasToken)
32+
public async Task<Template> GenerateNamedValuesTemplateAsync(string singleApiName, List<TemplateResource> apiTemplateResources, Extractor exc)
3333
{
3434
Console.WriteLine("------------------------------------------");
3535
Console.WriteLine("Extracting named values from service");
36-
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl, policyXMLSasToken);
36+
Template armTemplate = GenerateEmptyPropertyTemplateWithParameters(exc);
3737

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

4040
// pull all named values (properties) for service
41-
string properties = await GetPropertiesAsync(apimname, resourceGroup);
41+
string properties = await GetPropertiesAsync(exc.sourceApimName, exc.resourceGroup);
4242
JObject oProperties = JObject.Parse(properties);
4343

4444
foreach (var extractedProperty in oProperties["value"])
4545
{
4646
string propertyName = ((JValue)extractedProperty["name"]).Value.ToString();
47-
string fullPropertyResource = await GetPropertyDetailsAsync(apimname, resourceGroup, propertyName);
47+
string fullPropertyResource = await GetPropertyDetailsAsync(exc.sourceApimName, exc.resourceGroup, propertyName);
4848

4949
// convert returned named value to template resource class
5050
PropertyTemplateResource propertyTemplateResource = JsonConvert.DeserializeObject<PropertyTemplateResource>(fullPropertyResource);
@@ -53,6 +53,11 @@ public async Task<Template> GenerateNamedValuesTemplateAsync(string apimname, st
5353
propertyTemplateResource.apiVersion = GlobalConstants.APIVersion;
5454
propertyTemplateResource.scale = null;
5555

56+
if (exc.paramNamedValue)
57+
{
58+
propertyTemplateResource.properties.value = $"[parameters('NamedValues').{ExtractorUtils.GenValidPropertyParamName(propertyName)}]";
59+
}
60+
5661
if (singleApiName == null)
5762
{
5863
// if the user is executing a full extraction, extract all the loggers

src/APIM_ARMTemplate/apimtemplate/Extractor/Models/ExtractorConfiguration.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public class ExtractorConfig
3838
public serviceUrlProperty[] serviceUrlParameters { get; set; }
3939
[Description("Parameterize serviceUrl")]
4040
public string paramServiceUrl { get; set; }
41+
[Description("Parameterize named values")]
42+
public string paramNamedValue { get; set; }
4143
public void Validate()
4244
{
4345
if (string.IsNullOrEmpty(sourceApimName)) throw new ArgumentException("Missing parameter <sourceApimName>.");
@@ -93,6 +95,7 @@ public class Extractor
9395
public bool includeAllRevisions { get; private set; }
9496
public serviceUrlProperty[] serviceUrlParameters { get; set; }
9597
public bool paramServiceUrl { get; private set; }
98+
public bool paramNamedValue { get; private set; }
9699

97100
public Extractor(ExtractorConfig exc, string dirName)
98101
{
@@ -109,6 +112,7 @@ public Extractor(ExtractorConfig exc, string dirName)
109112
this.includeAllRevisions = exc.includeAllRevisions != null && exc.includeAllRevisions.Equals("true");
110113
this.serviceUrlParameters = exc.serviceUrlParameters;
111114
this.paramServiceUrl = (exc.paramServiceUrl != null && exc.paramServiceUrl.Equals("true")) || exc.serviceUrlParameters != null;
115+
this.paramNamedValue = exc.paramNamedValue != null && exc.paramNamedValue.Equals("true");
112116
}
113117

114118
public Extractor(ExtractorConfig exc) : this(exc, exc.fileFolder)

src/APIM_ARMTemplate/apimtemplate/Extractor/Utilities/ExtractorUtils.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public static async Task GenerateTemplates(
7777
Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl, policyXMLSasToken);
7878
Template productTemplate = await productExtractor.GenerateProductsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl, policyXMLSasToken, dirName);
7979
List<TemplateResource> productTemplateResources = productTemplate.resources.ToList();
80-
Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl, policyXMLSasToken);
80+
Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplateAsync(singleApiName, apiTemplateResources, exc);
8181
Template tagTemplate = await tagExtractor.GenerateTagsTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, productTemplateResources, policyXMLBaseUrl, policyXMLSasToken);
8282
List<TemplateResource> namedValueResources = namedValueTemplate.resources.ToList();
8383
Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, namedValueResources, policyXMLBaseUrl, policyXMLSasToken);
@@ -255,6 +255,19 @@ public static string GenValidApiParamName(string apiName)
255255
}
256256
}
257257

258+
public static string GenValidPropertyParamName(string propertyName)
259+
{
260+
string validApiName = Regex.Replace(propertyName, "[^a-zA-Z0-9]", "");
261+
if (Char.IsDigit(validApiName.First()))
262+
{
263+
return "Property" + validApiName;
264+
}
265+
else
266+
{
267+
return validApiName;
268+
}
269+
}
270+
258271
public static async Task GenerateSingleAPIWithRevisionsTemplates(ExtractorConfig exc, string apiName, FileNameGenerator fileNameGenerator, FileWriter fileWriter, FileNames fileNames)
259272
{
260273
Console.WriteLine("Extracting singleAPI {0} with revisions", apiName);

0 commit comments

Comments
 (0)