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

Commit 2e1ab83

Browse files
committed
extract backend in single api case if referenced directly in policy or by named value that applies to said backend
1 parent 8dc3519 commit 2e1ab83

File tree

3 files changed

+55
-37
lines changed

3 files changed

+55
-37
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Extract.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
using System;
22
using McMaster.Extensions.CommandLineUtils;
3-
using Newtonsoft.Json;
43
using System.Collections.Generic;
5-
using Newtonsoft.Json.Linq;
64
using System.IO;
75
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common;
8-
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create;
96
using System.Linq;
107

118
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
@@ -59,9 +56,10 @@ public ExtractCommand()
5956
Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
6057
Template productTemplate = await productExtractor.GenerateProductsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
6158
Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
62-
Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
59+
List<TemplateResource> namedValueResources = namedValueTemplate.resources.ToList();
60+
Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources, namedValueResources);
6361

64-
string apiFileName = singleApiName == null ? @fileFolder + Path.DirectorySeparatorChar + apimname + "-apis-template.json" : @fileFolder + Path.DirectorySeparatorChar + apimname + "-" + singleApiName + "-template.json";
62+
string apiFileName = singleApiName == null ? @fileFolder + Path.DirectorySeparatorChar + apimname + "-apis-template.json" : @fileFolder + Path.DirectorySeparatorChar + apimname + "-" + singleApiName + "-api-template.json";
6563
fileWriter.WriteJSONToFile(apiTemplate, apiFileName);
6664
fileWriter.WriteJSONToFile(authorizationTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-authorizationServers.json");
6765
fileWriter.WriteJSONToFile(backendTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-backends.json");

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

Lines changed: 51 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public async Task<string> GetBackend(string ApiManagementName, string ResourceGr
3030
return await CallApiManagement(azToken, requestUrl);
3131
}
3232

33-
public async Task<Template> GenerateBackendsARMTemplate(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources)
33+
public async Task<Template> GenerateBackendsARMTemplate(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, List<TemplateResource> propertyResources)
3434
{
3535
Console.WriteLine("------------------------------------------");
3636
Console.WriteLine("Getting backends from service");
@@ -40,6 +40,7 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
4040

4141
// isolate api and operation policy resources in the case of a single api extraction, as they may reference backends
4242
var policyResources = apiTemplateResources.Where(resource => (resource.type == ResourceTypeConstants.APIPolicy || resource.type == ResourceTypeConstants.APIOperationPolicy));
43+
var namedValueResources = propertyResources.Where(resource => (resource.type == ResourceTypeConstants.Property));
4344

4445
string backends = await GetBackends(apimname, resourceGroup);
4546
JObject oBackends = JObject.Parse(backends);
@@ -53,40 +54,59 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
5354
backendTemplateResource.name = $"[concat(parameters('ApimServiceName'), '/{backendName}')]";
5455
backendTemplateResource.apiVersion = "2018-06-01-preview";
5556

56-
// extract all the backends in both cases for the time being
57-
Console.WriteLine("'{0}' Backend found", backendName);
58-
templateResources.Add(backendTemplateResource);
59-
60-
// 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
61-
//if (singleApiName == null)
62-
//{
63-
// // if the user is extracting all apis, extract all the backends
64-
// Console.WriteLine("'{0}' Backend found", backendName);
65-
// templateResources.Add(backendTemplateResource);
66-
//}
67-
//else
68-
//{
69-
// bool isReferencedInPolicy = false;
70-
// foreach (PolicyTemplateResource policyTemplateResource in policyResources)
71-
// {
72-
// // the backend is used in a policy if the xml contains a set-backend-service policy, which will reference the backend's url or id
73-
// string policyContent = policyTemplateResource.properties.policyContent;
74-
// if (policyContent.Contains(backendName) || policyContent.Contains(backendTemplateResource.properties.url) || policyContent.Contains(backendTemplateResource.properties.resourceId))
75-
// {
76-
// isReferencedInPolicy = true;
77-
// }
78-
// }
79-
// if (isReferencedInPolicy == true)
80-
// {
81-
// // backend was used in policy, extract it
82-
// Console.WriteLine("'{0}' Backend found", backendName);
83-
// templateResources.Add(backendTemplateResource);
84-
// }
85-
//}
57+
//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
58+
if (singleApiName == null)
59+
{
60+
// if the user is extracting all apis, extract all the backends
61+
Console.WriteLine("'{0}' Backend found", backendName);
62+
templateResources.Add(backendTemplateResource);
63+
}
64+
else
65+
{
66+
bool isReferencedInPolicy = false;
67+
foreach (PolicyTemplateResource policyTemplateResource in policyResources)
68+
{
69+
// the backend is used in a policy if the xml contains a set-backend-service policy, which will reference the backend's url or id
70+
string policyContent = policyTemplateResource.properties.policyContent;
71+
isReferencedInPolicy = DoesPolicyReferenceBackend(policyContent, namedValueResources, backendName, backendTemplateResource);
72+
}
73+
if (isReferencedInPolicy == true)
74+
{
75+
// backend was used in policy, extract it
76+
Console.WriteLine("'{0}' Backend found", backendName);
77+
templateResources.Add(backendTemplateResource);
78+
}
79+
}
8680
}
8781

8882
armTemplate.resources = templateResources.ToArray();
8983
return armTemplate;
9084
}
85+
86+
public bool DoesPolicyReferenceBackend(string policyContent, IEnumerable<TemplateResource> namedValueResources, string backendName, BackendTemplateResource backendTemplateResource)
87+
{
88+
var namedValueResourcesUsedByBackend = namedValueResources.Where(resource => DoesBackendReferenceNamedValue(resource, backendTemplateResource));
89+
if (policyContent.Contains(backendName) || policyContent.Contains(backendTemplateResource.properties.url) || policyContent.Contains(backendTemplateResource.properties.resourceId))
90+
{
91+
return true;
92+
}
93+
foreach(PropertyTemplateResource namedValueResource in namedValueResourcesUsedByBackend)
94+
{
95+
if (policyContent.Contains(namedValueResource.properties.displayName) || policyContent.Contains(namedValueResource.properties.value))
96+
{
97+
return true;
98+
}
99+
100+
}
101+
return false;
102+
}
103+
104+
public bool DoesBackendReferenceNamedValue(TemplateResource namedValueResource, BackendTemplateResource backendTemplateResource)
105+
{
106+
string namedValue = (namedValueResource as PropertyTemplateResource).properties.value;
107+
return (namedValue == backendTemplateResource.properties.url
108+
|| namedValue == backendTemplateResource.properties.description
109+
|| namedValue == backendTemplateResource.properties.title);
110+
}
91111
}
92112
}

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 --name apiphany --resourceGroup vlvinogr-apim --fileFolder C:\\\\\\\\Users\\\\\\\\lucashh\\\\\\\\Desktop\\\\\\\\Projects\\\\\\\\APIM-ARM\\\\\\\\ExtractedTemplates\\\\Full"
5+
"commandLineArgs": "extract --name apiphany --resourceGroup vlvinogr-apim --fileFolder C:\\\\\\\\Users\\\\\\\\lucashh\\\\\\\\Desktop\\\\\\\\Projects\\\\\\\\APIM-ARM\\\\\\\\ExtractedTemplates\\\\SingleAPI --apiName event-broker"
66
}
77
}
88
}

0 commit comments

Comments
 (0)