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

Commit 9bbf6f6

Browse files
committed
enable extraction of global policies
1 parent 97e5e29 commit 9bbf6f6

File tree

4 files changed

+84
-5
lines changed

4 files changed

+84
-5
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Extract.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,13 @@ public ExtractCommand()
7171
AuthorizationServerExtractor authorizationServerExtractor = new AuthorizationServerExtractor();
7272
BackendExtractor backendExtractor = new BackendExtractor();
7373
LoggerExtractor loggerExtractor = new LoggerExtractor();
74+
PolicyExtractor policyExtractor = new PolicyExtractor(fileWriter);
7475
PropertyExtractor propertyExtractor = new PropertyExtractor();
7576
ProductExtractor productExtractor = new ProductExtractor(fileWriter);
7677
MasterTemplateExtractor masterTemplateExtractor = new MasterTemplateExtractor();
7778

7879
// extract templates from apim service
80+
Template globalServicePolicyTemplate = await policyExtractor.GenerateGlobalServicePolicyTemplateAsync(sourceApim, resourceGroup, policyXMLBaseUrl, fileFolder);
7981
Template apiTemplate = await apiExtractor.GenerateAPIsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, policyXMLBaseUrl, fileFolder);
8082
List<TemplateResource> apiTemplateResources = apiTemplate.resources.ToList();
8183
Template apiVersionSetTemplate = await apiVersionSetExtractor.GenerateAPIVersionSetsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl);
@@ -98,11 +100,12 @@ public ExtractCommand()
98100
fileWriter.WriteJSONToFile(loggerTemplate, String.Concat(@fileFolder, fileNames.loggers));
99101
fileWriter.WriteJSONToFile(namedValueTemplate, String.Concat(@fileFolder, fileNames.namedValues));
100102
fileWriter.WriteJSONToFile(productTemplate, String.Concat(@fileFolder, fileNames.products));
103+
fileWriter.WriteJSONToFile(globalServicePolicyTemplate, String.Concat(@fileFolder, fileNames.globalServicePolicy));
101104

102105
if (linkedBaseUrl != null)
103106
{
104107
// create a master template that links to all other templates
105-
Template masterTemplate = masterTemplateExtractor.GenerateLinkedMasterTemplate(apiTemplate, apiVersionSetTemplate, productTemplate, loggerTemplate, backendTemplate, authorizationServerTemplate, namedValueTemplate, fileNames, apiFileName, linkedUrlQueryString, policyXMLBaseUrl);
108+
Template masterTemplate = masterTemplateExtractor.GenerateLinkedMasterTemplate(apiTemplate, globalServicePolicyTemplate, apiVersionSetTemplate, productTemplate, loggerTemplate, backendTemplate, authorizationServerTemplate, namedValueTemplate, fileNames, apiFileName, linkedUrlQueryString, policyXMLBaseUrl);
106109
fileWriter.WriteJSONToFile(masterTemplate, String.Concat(@fileFolder, fileNames.linkedMaster));
107110
}
108111

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
using System.Collections.Generic;
22
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common;
3-
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create;
4-
using System.Threading.Tasks;
53
using System.Linq;
64

75
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
86
{
97
public class MasterTemplateExtractor : EntityExtractor
108
{
119
public Template GenerateLinkedMasterTemplate(Template apiTemplate,
10+
Template globalServicePolicyTemplate,
1211
Template apiVersionSetTemplate,
1312
Template productsTemplate,
1413
Template loggersTemplate,
@@ -39,6 +38,13 @@ public Template GenerateLinkedMasterTemplate(Template apiTemplate,
3938
resources.Add(this.CreateLinkedMasterTemplateResource(namedValueDeploymentResourceName, namedValuesUri, new string[] { }));
4039
}
4140

41+
// globalServicePolicy
42+
if (globalServicePolicyTemplate != null)
43+
{
44+
string globalServicePolicyUri = GenerateLinkedTemplateUri(linkedTemplatesUrlQueryString, fileNames.globalServicePolicy);
45+
resources.Add(this.CreateLinkedMasterTemplateResource("globalServicePolicyTemplate", globalServicePolicyUri, dependsOnNamedValues));
46+
}
47+
4248
// apiVersionSet
4349
if (apiVersionSetTemplate != null)
4450
{
@@ -78,14 +84,15 @@ public Template GenerateLinkedMasterTemplate(Template apiTemplate,
7884
if (apiTemplate != null)
7985
{
8086
string apisUri = GenerateLinkedTemplateUri(linkedTemplatesUrlQueryString, apiFileName);
81-
resources.Add(this.CreateLinkedMasterTemplateResource("apisTemplate", apisUri, GenerateAPIResourceDependencies(apiTemplate, apiVersionSetTemplate, productsTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, namedValueDeploymentResourceName)));
87+
resources.Add(this.CreateLinkedMasterTemplateResource("apisTemplate", apisUri, GenerateAPIResourceDependencies(apiTemplate, globalServicePolicyTemplate, apiVersionSetTemplate, productsTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, namedValueDeploymentResourceName)));
8288
}
8389

8490
masterTemplate.resources = resources.ToArray();
8591
return masterTemplate;
8692
}
8793

8894
public string[] GenerateAPIResourceDependencies(Template apiTemplate,
95+
Template globalServicePolicyTemplate,
8996
Template apiVersionSetTemplate,
9097
Template productsTemplate,
9198
Template loggersTemplate,
@@ -98,6 +105,7 @@ public string[] GenerateAPIResourceDependencies(Template apiTemplate,
98105

99106
// add dependency on all other template files by default for now
100107
apiDependsOn.Add($"[resourceId('Microsoft.Resources/deployments', '{namedValueDeploymentResourceName}')]");
108+
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'globalServicePolicyTemplate')]");
101109
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'versionSetTemplate')]");
102110
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'productsTemplate')]");
103111
apiDependsOn.Add("[resourceId('Microsoft.Resources/deployments', 'loggersTemplate')]");
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
using System;
2+
using System.Threading.Tasks;
3+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common;
4+
using System.Collections.Generic;
5+
using Newtonsoft.Json;
6+
7+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
8+
{
9+
public class PolicyExtractor: EntityExtractor
10+
{
11+
private FileWriter fileWriter;
12+
13+
public PolicyExtractor(FileWriter fileWriter)
14+
{
15+
this.fileWriter = fileWriter;
16+
}
17+
18+
public async Task<string> GetGlobalServicePolicyAsync(string ApiManagementName, string ResourceGroupName)
19+
{
20+
(string azToken, string azSubId) = await auth.GetAccessToken();
21+
22+
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/policies/policy?api-version={4}",
23+
baseUrl, azSubId, ResourceGroupName, ApiManagementName, GlobalConstants.APIVersion);
24+
25+
return await CallApiManagementAsync(azToken, requestUrl);
26+
}
27+
28+
public async Task<Template> GenerateGlobalServicePolicyTemplateAsync(string apimname, string resourceGroup, string policyXMLBaseUrl, string fileFolder)
29+
{
30+
// extract global service policy in both full and single api extraction cases
31+
Console.WriteLine("------------------------------------------");
32+
Console.WriteLine("Extracting global service policy from service");
33+
Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl);
34+
35+
List<TemplateResource> templateResources = new List<TemplateResource>();
36+
37+
// add global service policy resource to template
38+
try
39+
{
40+
string globalServicePolicy = await GetGlobalServicePolicyAsync(apimname, resourceGroup);
41+
Console.WriteLine($" - Global policy found for {apimname} API Management service");
42+
PolicyTemplateResource globalServicePolicyResource = JsonConvert.DeserializeObject<PolicyTemplateResource>(globalServicePolicy);
43+
// REST API will return format property as rawxml and value property as the xml by default
44+
globalServicePolicyResource.name = $"[concat(parameters('ApimServiceName'), '/policy')]";
45+
globalServicePolicyResource.apiVersion = GlobalConstants.APIVersion;
46+
globalServicePolicyResource.scale = null;
47+
48+
// write policy xml content to file and point to it if policyXMLBaseUrl is provided
49+
if (policyXMLBaseUrl != null)
50+
{
51+
string policyXMLContent = globalServicePolicyResource.properties.value;
52+
string policyFolder = String.Concat(fileFolder, $@"/policies");
53+
string globalServicePolicyFileName = $@"/globalServicePolicy.xml";
54+
this.fileWriter.CreateFolderIfNotExists(policyFolder);
55+
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, globalServicePolicyFileName));
56+
globalServicePolicyResource.properties.format = "rawxml-link";
57+
globalServicePolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{globalServicePolicyFileName}')]";
58+
}
59+
60+
templateResources.Add(globalServicePolicyResource);
61+
}
62+
catch (Exception) { }
63+
64+
armTemplate.resources = templateResources.ToArray();
65+
return armTemplate;
66+
}
67+
}
68+
}

src/APIM_ARMTemplate/apimtemplate/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"profiles": {
33
"apimtemplate": {
44
"commandName": "Project",
5-
"commandLineArgs": "create --configFile C:\\Users\\lucashh\\Desktop\\Projects\\APIM-ARM\\azure-api-management-devops-example\\src\\APIM_ARMTemplate\\apimtemplate\\Creator\\ExampleFiles\\YAMLConfigs\\validTesting.yml"
5+
"commandLineArgs": "extract --sourceApimName lucas-create-push --destinationApimName lucas-extract-push --resourceGroup LucasHuetHudsonInternal --fileFolder C:\\\\Users\\\\lucashh\\\\Desktop\\\\Projects\\\\APIM-ARM\\\\GeneratedTemplates\\\\Extractor\\\\Full --linkedTemplatesBaseUrl https://lucasapimstorage.blob.core.windows.net/linked-templates --linkedTemplatesUrlQueryString ?sv=2018-03-28&ss=bfqt&srt=sco&sp=rwdlacup&se=2019-12-24T23:12:53Z&st=2019-09-09T14:12:53Z&spr=https&sig=uFGlpJEYPH81OQVzKb7q9nLq0Xt%2Bu35UTqpATIZo6uc%3D --policyXMLBaseUrl https://lucasapimstorage.blob.core.windows.net/policies"
66
}
77
}
88
}

0 commit comments

Comments
 (0)