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

Commit d046c7d

Browse files
committed
create policies folder and write extracted policy content to files, use xml link type
1 parent 745a6df commit d046c7d

File tree

5 files changed

+68
-7
lines changed

5 files changed

+68
-7
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Extract.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,22 @@ public ExtractCommand()
6363
FileNames fileNames = fileNameGenerator.GenerateFileNames(sourceApim);
6464

6565
// initialize entity extractor classes
66-
APIExtractor apiExtractor = new APIExtractor();
66+
APIExtractor apiExtractor = new APIExtractor(fileWriter);
6767
APIVersionSetExtractor apiVersionSetExtractor = new APIVersionSetExtractor();
6868
AuthorizationServerExtractor authorizationServerExtractor = new AuthorizationServerExtractor();
6969
BackendExtractor backendExtractor = new BackendExtractor();
7070
LoggerExtractor loggerExtractor = new LoggerExtractor();
7171
PropertyExtractor propertyExtractor = new PropertyExtractor();
72-
ProductExtractor productExtractor = new ProductExtractor();
72+
ProductExtractor productExtractor = new ProductExtractor(fileWriter);
7373
MasterTemplateExtractor masterTemplateExtractor = new MasterTemplateExtractor();
7474

7575
// extract templates from apim service
76-
Template apiTemplate = await apiExtractor.GenerateAPIsARMTemplate(sourceApim, resourceGroup, fileFolder, singleApiName, policyXMLBaseUrl);
76+
Template apiTemplate = await apiExtractor.GenerateAPIsARMTemplate(sourceApim, resourceGroup, singleApiName, policyXMLBaseUrl, fileFolder);
7777
List<TemplateResource> apiTemplateResources = apiTemplate.resources.ToList();
7878
Template apiVersionSetTemplate = await apiVersionSetExtractor.GenerateAPIVersionSetsARMTemplate(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl);
7979
Template authorizationServerTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplate(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl);
8080
Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplate(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl);
81-
Template productTemplate = await productExtractor.GenerateProductsARMTemplate(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl);
81+
Template productTemplate = await productExtractor.GenerateProductsARMTemplate(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl, fileFolder);
8282
Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplate(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl);
8383
List<TemplateResource> namedValueResources = namedValueTemplate.resources.ToList();
8484
Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplate(sourceApim, resourceGroup, singleApiName, apiTemplateResources, namedValueResources, policyXMLBaseUrl);

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,17 @@ public void WriteJSONToFile(object template, string location)
1717
});
1818
File.WriteAllText(location, jsonString);
1919
}
20+
21+
public void WriteXMLToFile(string xmlContent, string location)
22+
{
23+
// writes xml content to provided location
24+
File.WriteAllText(location, xmlContent);
25+
}
26+
27+
public void CreateFolderIfNotExists(string folderLocation)
28+
{
29+
// creates directory if it does not already exist
30+
System.IO.Directory.CreateDirectory(folderLocation);
31+
}
2032
}
2133
}

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

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
1010
{
1111
public class APIExtractor : EntityExtractor
1212
{
13+
private FileWriter fileWriter;
14+
15+
public APIExtractor(FileWriter fileWriter)
16+
{
17+
this.fileWriter = fileWriter;
18+
}
19+
1320
public async Task<string> GetAPIOperations(string ApiManagementName, string ResourceGroupName, string ApiName)
1421
{
1522
(string azToken, string azSubId) = await auth.GetAccessToken();
@@ -110,7 +117,7 @@ public async Task<string> GetAPISchemaDetails(string ApiManagementName, string R
110117
return await CallApiManagement(azToken, requestUrl);
111118
}
112119

113-
public async Task<Template> GenerateAPIsARMTemplate(string apimname, string resourceGroup, string fileFolder, string singleApiName, string policyXMLBaseUrl)
120+
public async Task<Template> GenerateAPIsARMTemplate(string apimname, string resourceGroup, string singleApiName, string policyXMLBaseUrl, string fileFolder)
114121
{
115122
// pull all apis from service
116123
string apis = await GetAPIs(apimname, resourceGroup);
@@ -228,6 +235,18 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
228235
operationPolicyResource.scale = null;
229236
operationPolicyResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('ApimServiceName'), '{oApiName}', '{operationResourceName}')]" };
230237

238+
// write policy xml content to file and point to it if policyXMLBaseUrl is provided
239+
if (policyXMLBaseUrl != null)
240+
{
241+
string policyXMLContent = operationPolicyResource.properties.value;
242+
string policyFolder = String.Concat(fileFolder, $@"/policies");
243+
string operationPolicyFileName = $@"/{operationName}-operationPolicy.xml";
244+
this.fileWriter.CreateFolderIfNotExists(policyFolder);
245+
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, operationPolicyFileName));
246+
operationPolicyResource.properties.format = "rawxml-link";
247+
operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}')]";
248+
}
249+
231250
templateResources.Add(operationPolicyResource);
232251
}
233252
catch (Exception) { }
@@ -246,6 +265,17 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
246265
apiPoliciesResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{apiPoliciesResource.name}')]";
247266
apiPoliciesResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" };
248267

268+
// write policy xml content to file and point to it if policyXMLBaseUrl is provided
269+
if (policyXMLBaseUrl != null)
270+
{
271+
string policyXMLContent = apiPoliciesResource.properties.value;
272+
string policyFolder = String.Concat(fileFolder, $@"/policies");
273+
string apiPolicyFileName = $@"/{apiName}-apiPolicy.xml";
274+
this.fileWriter.CreateFolderIfNotExists(policyFolder);
275+
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, apiPolicyFileName));
276+
apiPoliciesResource.properties.format = "rawxml-link";
277+
apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}')]";
278+
}
249279
templateResources.Add(apiPoliciesResource);
250280
}
251281
catch (Exception) { }

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

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
1010
{
1111
public class ProductExtractor : EntityExtractor
1212
{
13+
private FileWriter fileWriter;
14+
15+
public ProductExtractor(FileWriter fileWriter)
16+
{
17+
this.fileWriter = fileWriter;
18+
}
19+
1320
public async Task<string> GetProducts(string ApiManagementName, string ResourceGroupName)
1421
{
1522
(string azToken, string azSubId) = await auth.GetAccessToken();
@@ -40,7 +47,7 @@ public async Task<string> GetProductPolicy(string ApiManagementName, string Reso
4047
return await CallApiManagement(azToken, requestUrl);
4148
}
4249

43-
public async Task<Template> GenerateProductsARMTemplate(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl)
50+
public async Task<Template> GenerateProductsARMTemplate(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string fileFolder)
4451
{
4552
Console.WriteLine("------------------------------------------");
4653
Console.WriteLine("Extracting products from service");
@@ -87,6 +94,18 @@ public async Task<Template> GenerateProductsARMTemplate(string apimname, string
8794
productPolicyResource.scale = null;
8895
productPolicyResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('ApimServiceName'), '{productName}')]" };
8996

97+
// write policy xml content to file and point to it if policyXMLBaseUrl is provided
98+
if (policyXMLBaseUrl != null)
99+
{
100+
string policyXMLContent = productPolicyResource.properties.value;
101+
string policyFolder = String.Concat(fileFolder, $@"/policies");
102+
string productPolicyFileName = $@"/{productName}-productPolicy.xml";
103+
this.fileWriter.CreateFolderIfNotExists(policyFolder);
104+
this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, productPolicyFileName));
105+
productPolicyResource.properties.format = "rawxml-link";
106+
productPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{productPolicyFileName}')]";
107+
}
108+
90109
templateResources.Add(productPolicyResource);
91110
}
92111
catch (Exception) { }

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": "extract --sourceApimName LucasBlankLinked --destinationApimName LucasBlankUnlinked --resourceGroup LucasHuetHudsonInternal --fileFolder C:\\Users\\lucashh\\Desktop\\Projects\\APIM-ARM\\GeneratedTemplates\\Extractor\\Full --linkedBaseUrl https://lucasarmtemplates.blob.core.windows.net/linked-templates "
5+
"commandLineArgs": "extract --sourceApimName LucasBlankLinked --destinationApimName LucasBlankUnlinked --resourceGroup LucasHuetHudsonInternal --fileFolder C:\\Users\\lucashh\\Desktop\\Projects\\APIM-ARM\\GeneratedTemplates\\Extractor\\Full --policyXMLBaseUrl https://lucasarmtemplates.blob.core.windows.net/linked-templates "
66
}
77
}
88
}

0 commit comments

Comments
 (0)