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

Commit 057d815

Browse files
f-alizadaFarhad Alizada
andauthored
Handle extraction of policyfragments given policies saved to xml files (#799)
Co-authored-by: Farhad Alizada <falizada@microsoft.com>
1 parent d134de4 commit 057d815

File tree

6 files changed

+102
-9
lines changed

6 files changed

+102
-9
lines changed

src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -968,7 +968,7 @@ public async Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTem
968968
{
969969
this.logger.LogInformation("Started generation of policy fragments template...");
970970

971-
var policyFragmentTemplate = await this.policyFragmentsExtractor.GeneratePolicyFragmentsTemplateAsync(apiPolicies, this.extractorParameters);
971+
var policyFragmentTemplate = await this.policyFragmentsExtractor.GeneratePolicyFragmentsTemplateAsync(apiPolicies, this.extractorParameters, baseFilesGenerationDirectory);
972972

973973
if (policyFragmentTemplate?.HasResources() == true)
974974
{

src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IPolicyFragmentsExtractor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Entity
1414
{
1515
public interface IPolicyFragmentsExtractor
1616
{
17-
Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTemplateAsync(List<PolicyTemplateResource> apiTemplatePolicies, ExtractorParameters extractorParameters);
17+
Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTemplateAsync(List<PolicyTemplateResource> apiTemplatePolicies, ExtractorParameters extractorParameters, string baseFilesGenerationDirectory);
1818
}
1919
}

src/ArmTemplates/Extractor/EntityExtractors/PolicyFragmentsExtractor.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,18 +24,21 @@ public class PolicyFragmentsExtractor : IPolicyFragmentsExtractor
2424
readonly ILogger<PolicyFragmentsExtractor> logger;
2525
readonly IPolicyFragmentsClient policyFragmentsClient;
2626
readonly ITemplateBuilder templateBuilder;
27+
readonly IPolicyExtractor policyExtractor;
2728

2829
public PolicyFragmentsExtractor(
2930
ILogger<PolicyFragmentsExtractor> logger,
3031
ITemplateBuilder templateBuilder,
31-
IPolicyFragmentsClient policyFragmentsClient)
32+
IPolicyFragmentsClient policyFragmentsClient,
33+
IPolicyExtractor policyExtractor)
3234
{
3335
this.logger = logger;
3436
this.templateBuilder = templateBuilder;
3537
this.policyFragmentsClient = policyFragmentsClient;
38+
this.policyExtractor = policyExtractor;
3639
}
3740

38-
public async Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTemplateAsync(List<PolicyTemplateResource> apiTemplatePolicies, ExtractorParameters extractorParameters)
41+
public async Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTemplateAsync(List<PolicyTemplateResource> apiTemplatePolicies, ExtractorParameters extractorParameters, string baseFilesGenerationDirectory)
3942
{
4043
var policyFragmentsTemplate = this.templateBuilder
4144
.GenerateTemplateWithApimServiceNameProperty()
@@ -61,8 +64,9 @@ public async Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTem
6164
else
6265
{
6366
var policyFragmentReferenceString = $"fragment-id=\"{policyFragment.OriginalName}\"";
64-
var isReferencedInPolicy = apiTemplatePolicies?.Any(x => x.Properties.PolicyContent.Contains(policyFragmentReferenceString));
65-
if (isReferencedInPolicy == true)
67+
var isReferencedInPolicy = this.DoesPolicyReferencePolicyFragment(apiTemplatePolicies, policyFragmentReferenceString, baseFilesGenerationDirectory);
68+
69+
if (isReferencedInPolicy)
6670
{
6771
policyFragmentsTemplate.TypedResources.PolicyFragments.Add(policyFragment);
6872
}
@@ -71,5 +75,27 @@ public async Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTem
7175

7276
return policyFragmentsTemplate;
7377
}
78+
79+
bool DoesPolicyReferencePolicyFragment(
80+
List<PolicyTemplateResource> apiPolicies,
81+
string policyFragmentReferenceString,
82+
string baseFilesGenerationDirectory)
83+
{
84+
if (apiPolicies.IsNullOrEmpty())
85+
{
86+
return false;
87+
}
88+
89+
foreach (var policyTemplateResource in apiPolicies)
90+
{
91+
var policyContent = this.policyExtractor.GetCachedPolicyContent(policyTemplateResource, baseFilesGenerationDirectory);
92+
93+
if (policyContent.Contains(policyFragmentReferenceString))
94+
{
95+
return true;
96+
}
97+
}
98+
return false;
99+
}
74100
}
75101
}

tests/ArmTemplates.Tests/Extractor/Scenarios/PolicyFragmentsExtractorTests.cs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public async Task GeneratePolicyFragmentTemplates_ProperlyParsesResponse()
3838
var extractorParameters = new ExtractorParameters(extractorConfig);
3939
var fileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListPolicyFragments_success_response.json");
4040
var mockedClient = await MockPolicyFragmentClient.GetMockedHttpPolicyFragmentClient(fileLocation);
41-
var policyFragmentExtractor = new PolicyFragmentsExtractor(this.GetTestLogger<PolicyFragmentsExtractor>(), new TemplateBuilder(), mockedClient);
41+
var policyFragmentExtractor = new PolicyFragmentsExtractor(this.GetTestLogger<PolicyFragmentsExtractor>(), new TemplateBuilder(), mockedClient, null);
4242

4343
var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
4444
this.GetTestLogger<ExtractorExecutor>(),
@@ -75,11 +75,14 @@ public async Task GeneratePolicyFragmentTemplates_GeneratesPolicyFragmentTemplat
7575
var extractorParameters = new ExtractorParameters(extractorConfig);
7676
var fileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListPolicyFragments_success_response.json");
7777
var mockedClient = await MockPolicyFragmentClient.GetMockedHttpPolicyFragmentClient(fileLocation);
78-
var policyFragmentExtractor = new PolicyFragmentsExtractor(this.GetTestLogger<PolicyFragmentsExtractor>(), new TemplateBuilder(), mockedClient);
78+
79+
var policExtractor = new PolicyExtractor(this.GetTestLogger<PolicyExtractor>(), null, new TemplateBuilder());
80+
var policyFragmentExtractor = new PolicyFragmentsExtractor(this.GetTestLogger<PolicyFragmentsExtractor>(), new TemplateBuilder(), mockedClient, policExtractor);
7981

8082
var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
8183
this.GetTestLogger<ExtractorExecutor>(),
82-
policyFragmentsExtractor: policyFragmentExtractor);
84+
policyFragmentsExtractor: policyFragmentExtractor,
85+
policyExtractor: policExtractor);
8386
extractorExecutor.SetExtractorParameters(extractorParameters);
8487

8588
var apiPolicies = new List<PolicyTemplateResource>()
@@ -105,5 +108,46 @@ public async Task GeneratePolicyFragmentTemplates_GeneratesPolicyFragmentTemplat
105108
policyFragment1.Should().NotBeNull();
106109
policyFragment1.Properties.Description.Should().Be("A policy fragment example 1");
107110
}
111+
112+
[Fact]
113+
public async Task GeneratePolicyFragmentTemplates_GeneratesPolicyFragmentTemplateForSingleApi_GivenPolicyXmlBaseUrlParameter()
114+
{
115+
// arrange
116+
var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GeneratePolicyFragmentTemplates_GeneratesPolicyFragmentTemplateForSingleApi_GivenPolicyXmlBaseUrlParameter));
117+
118+
var extractorConfig = this.GetDefaultExtractorConsoleAppConfiguration(
119+
policyXmlBaseUrl: "policyXmlBaseUrl",
120+
apiName: "api");
121+
var extractorParameters = new ExtractorParameters(extractorConfig);
122+
123+
var policyFragmentResponseFileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListPolicyFragments_success_response.json");
124+
var mockedPolicyFragmentClient = await MockPolicyFragmentClient.GetMockedHttpPolicyFragmentClient(policyFragmentResponseFileLocation);
125+
126+
var policyResponseFileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListApiPolicies_success_response.json");
127+
var mockedPolicyClient = await MockPolicyClient.GetMockedHttpPolicyFragmentClient(policyResponseFileLocation);
128+
129+
var policExtractor = new PolicyExtractor(this.GetTestLogger<PolicyExtractor>(), mockedPolicyClient, new TemplateBuilder());
130+
var policyFragmentExtractor = new PolicyFragmentsExtractor(this.GetTestLogger<PolicyFragmentsExtractor>(), new TemplateBuilder(), mockedPolicyFragmentClient, policExtractor);
131+
132+
var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
133+
this.GetTestLogger<ExtractorExecutor>(),
134+
policyFragmentsExtractor: policyFragmentExtractor,
135+
policyExtractor: policExtractor);
136+
extractorExecutor.SetExtractorParameters(extractorParameters);
137+
138+
// act
139+
var apiPolicies = await policExtractor.GenerateApiPolicyResourceAsync("api", currentTestDirectory, extractorParameters);
140+
var policyFragments = await extractorExecutor.GeneratePolicyFragmentsTemplateAsync(new List<PolicyTemplateResource> { apiPolicies }, currentTestDirectory);
141+
142+
// assert
143+
File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.PolicyFragments)).Should().BeTrue();
144+
145+
policyFragments.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);
146+
policyFragments.TypedResources.PolicyFragments.Count().Should().Be(1);
147+
148+
var policyFragment1 = policyFragments.TypedResources.PolicyFragments.First(x => x.OriginalName.Equals("policyFragment1"));
149+
policyFragment1.Should().NotBeNull();
150+
policyFragment1.Properties.Description.Should().Be("A policy fragment example 1");
151+
}
108152
}
109153
}

tests/ArmTemplates.Tests/Moqs/ApiClients/MockPolicyClient.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
// Licensed under the MIT License.
44
// --------------------------------------------------------------------------
55

6+
using System.Threading.Tasks;
67
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions;
8+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Policy;
79
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants;
810
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
911
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
@@ -74,5 +76,13 @@ public static IPolicyClient GetMockedApiClientWithDefaultValues()
7476

7577
return mockPolicyApiClient.Object;
7678
}
79+
80+
public static async Task<IPolicyClient> GetMockedHttpPolicyFragmentClient(string responseFileLocation)
81+
{
82+
var mockedClient = new Mock<PolicyClient>(MockBehavior.Strict, await MockClientUtils.GenerateMockedIHttpClientFactoryWithResponse(responseFileLocation));
83+
MockClientUtils.MockAuthOfApiClient(mockedClient);
84+
85+
return mockedClient.Object;
86+
}
7787
}
7888
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"value": [
3+
{
4+
"id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.ApiManagement/service/apimService1/apis/5600b59475ff190048040001/policies/policy",
5+
"type": "Microsoft.ApiManagement/service/apis/policies",
6+
"name": "policy",
7+
"properties": {
8+
"value": "<policies>\r\n <inbound>\r\n <base />\r\n <include-fragment fragment-id=\"policyFragment1\" />\r\n </inbound>\r\n <backend>\r\n <base />\r\n </backend>\r\n <outbound>\r\n <base />\r\n </outbound>\r\n <on-error>\r\n <base />\r\n </on-error>\r\n</policies>"
9+
}
10+
}
11+
],
12+
"count": 1
13+
}

0 commit comments

Comments
 (0)