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

Commit e8694f8

Browse files
f-alizadaFarhad Alizada
andauthored
Remove namedValue search from backend extractor (#852)
* Remove namedValue search from backend extractor Co-authored-by: Farhad Alizada <falizada@microsoft.com>
1 parent e8c8075 commit e8694f8

File tree

5 files changed

+77
-33
lines changed

5 files changed

+77
-33
lines changed

src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -663,15 +663,13 @@ await FileWriter.SaveAsJsonAsync(
663663
public async Task<Template<BackendTemplateResources>> GenerateBackendTemplateAsync(
664664
string singleApiName,
665665
List<PolicyTemplateResource> apiPolicies,
666-
List<NamedValueTemplateResource> namedValueResources,
667666
string baseFilesGenerationDirectory)
668667
{
669668
this.logger.LogInformation("Started generation of backend template...");
670669

671670
var backendTemplate = await this.backendExtractor.GenerateBackendsTemplateAsync(
672671
singleApiName,
673672
apiPolicies,
674-
namedValueResources,
675673
baseFilesGenerationDirectory,
676674
this.extractorParameters);
677675

@@ -1173,7 +1171,7 @@ async Task GenerateTemplates(
11731171
var apiTagTemplate = await this.GenerateTagApiTemplateAsync(singleApiName, multipleApiNames, baseFilesGenerationDirectory);
11741172
var loggerTemplate = await this.GenerateLoggerTemplateAsync(apisToExtract, apiTemplate.TypedResources.GetAllPolicies(), baseFilesGenerationDirectory);
11751173
var namedValueTemplate = await this.GenerateNamedValuesTemplateAsync(singleApiName, apiTemplate.TypedResources.GetAllPolicies(), loggerTemplate.TypedResources.Loggers, baseFilesGenerationDirectory);
1176-
var backendTemplate = await this.GenerateBackendTemplateAsync(singleApiName, apiTemplate.TypedResources.GetAllPolicies(), namedValueTemplate.TypedResources.NamedValues, baseFilesGenerationDirectory);
1174+
var backendTemplate = await this.GenerateBackendTemplateAsync(singleApiName, apiTemplate.TypedResources.GetAllPolicies(), baseFilesGenerationDirectory);
11771175
var groupTemplate = await this.GenerateGroupsTemplateAsync(baseFilesGenerationDirectory);
11781176
var identityProviderTemplate = await this.GenerateIdentityProviderTemplateAsync(baseFilesGenerationDirectory);
11791177
var openIdConnectProviderTemplate = await this.GenerateOpenIdConnectProviderTemplateAsync(baseFilesGenerationDirectory);

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ public interface IBackendExtractor
1818
Task<Template<BackendTemplateResources>> GenerateBackendsTemplateAsync(
1919
string singleApiName,
2020
List<PolicyTemplateResource> apiPolicies,
21-
List<NamedValueTemplateResource> namedValues,
2221
string baseFilesGenerationDirectory,
2322
ExtractorParameters extractorParameters);
2423

src/ArmTemplates/Extractor/EntityExtractors/BackendExtractor.cs

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,13 @@
55

66
using System.Threading.Tasks;
77
using System.Collections.Generic;
8-
using System.Linq;
9-
using System;
108
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
119
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions;
1210
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants;
1311
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors.Abstractions;
1412
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
1513
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
1614
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Builders.Abstractions;
17-
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.NamedValues;
1815
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Backend;
1916
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions;
2017
using Microsoft.Extensions.Logging;
@@ -48,7 +45,6 @@ public BackendExtractor(
4845
public async Task<Template<BackendTemplateResources>> GenerateBackendsTemplateAsync(
4946
string singleApiName,
5047
List<PolicyTemplateResource> apiPolicies,
51-
List<NamedValueTemplateResource> namedValues,
5248
string baseFilesGenerationDirectory,
5349
ExtractorParameters extractorParameters)
5450
{
@@ -87,7 +83,7 @@ public async Task<Template<BackendTemplateResources>> GenerateBackendsTemplateAs
8783
{
8884
var policyContent = this.policyExtractor.GetCachedPolicyContent(policyTemplateResource, baseFilesGenerationDirectory);
8985

90-
if (this.DoesPolicyReferenceBackend(policyContent, namedValues, backendResource.OriginalName, backendResource))
86+
if (this.DoesPolicyReferenceBackend(policyContent, backendResource.OriginalName, backendResource))
9187
{
9288
// backend was used in policy, extract it
9389
backendTemplate.TypedResources.Backends.Add(backendResource);
@@ -161,33 +157,18 @@ void SaveBackendApiParametersToCache()
161157

162158
bool DoesPolicyReferenceBackend(
163159
string policyContent,
164-
IEnumerable<NamedValueTemplateResource> namedValueResources,
165160
string backendName,
166161
BackendTemplateResource backendTemplateResource)
167162
{
168-
// a policy is referenced by a backend with the set-backend-service policy, which will reference use the backends name or url, or through referencing a named value that applies to the backend
169-
var namedValueResourcesUsedByBackend = namedValueResources.Where(resource => this.DoesBackendReferenceNamedValue(resource, backendTemplateResource));
170-
171-
if (backendName != null && policyContent.Contains(backendName) ||
172-
backendTemplateResource.Properties.Url != null && policyContent.Contains(backendTemplateResource.Properties.Url) ||
173-
backendTemplateResource.Properties.Title != null && policyContent.Contains(backendTemplateResource.Properties.Title) ||
174-
backendTemplateResource.Properties.ResourceId != null && policyContent.Contains(backendTemplateResource.Properties.ResourceId))
163+
if (!string.IsNullOrEmpty(backendName) && policyContent.Contains(backendName) ||
164+
!string.IsNullOrEmpty(backendTemplateResource.Properties.Url) && policyContent.Contains(backendTemplateResource.Properties.Url) ||
165+
!string.IsNullOrEmpty(backendTemplateResource.Properties.Title) && policyContent.Contains(backendTemplateResource.Properties.Title) ||
166+
!string.IsNullOrEmpty(backendTemplateResource.Properties.ResourceId) && policyContent.Contains(backendTemplateResource.Properties.ResourceId))
175167
{
176168
return true;
177169
}
178170

179-
return namedValueResourcesUsedByBackend.Any(x =>
180-
(x.Properties.DisplayName is not null && policyContent.Contains(x.Properties.DisplayName)) ||
181-
(x.Properties.Value is not null && policyContent.Contains(x.Properties.Value)));
182-
}
183-
184-
public bool DoesBackendReferenceNamedValue(NamedValueTemplateResource namedValueResource, BackendTemplateResource backendTemplateResource)
185-
{
186-
var namedValue = namedValueResource.Properties.Value;
187-
188-
return namedValue == backendTemplateResource.Properties.Url
189-
|| namedValue == backendTemplateResource.Properties.Description
190-
|| namedValue == backendTemplateResource.Properties.Title;
171+
return false;
191172
}
192173

193174
public async Task<bool> IsNamedValueUsedInBackends(
@@ -233,7 +214,7 @@ public async Task<bool> IsNamedValueUsedInBackends(
233214
foreach (var policyTemplateResource in apiPolicies)
234215
{
235216
var policyContent = this.policyExtractor.GetCachedPolicyContent(policyTemplateResource, baseFilesGenerationDirectory);
236-
if (this.DoesPolicyReferenceBackend(policyContent, Array.Empty<NamedValueTemplateResource>(), backendName, backendResource))
217+
if (this.DoesPolicyReferenceBackend(policyContent, backendName, backendResource))
237218
{
238219
// don't need to go through all policies and backends if the named values has already been found
239220
return true;

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public async Task GenerateAPIVersionSetTemplates_GeneratesApiTemplates()
159159

160160
var mockedBackendExtractor = new Mock<IBackendExtractor>(MockBehavior.Strict);
161161
mockedBackendExtractor
162-
.Setup(x => x.GenerateBackendsTemplateAsync(It.IsAny<string>(), It.IsAny<List<PolicyTemplateResource>>(), It.IsAny<List<NamedValueTemplateResource>>(), It.IsAny<string>(), It.IsAny<ExtractorParameters>()))
162+
.Setup(x => x.GenerateBackendsTemplateAsync(It.IsAny<string>(), It.IsAny<List<PolicyTemplateResource>>(), It.IsAny<string>(), It.IsAny<ExtractorParameters>()))
163163
.ReturnsAsync(new Template<BackendTemplateResources>()
164164
{
165165
TypedResources = new BackendTemplateResources()

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

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ public async Task GenerateBackendTemplates_ProperlyLaysTheInformation()
6464
var backendTemplate = await extractorExecutor.GenerateBackendTemplateAsync(
6565
singleApiName: null,
6666
new List<PolicyTemplateResource>(),
67-
new List<NamedValueTemplateResource>(),
6867
currentTestDirectory);
6968

7069
// assert
@@ -117,7 +116,7 @@ public async Task GenerateBackendTemplate_ProperlyParsesAndGeneratesTemplate()
117116
extractorExecutor.SetExtractorParameters(extractorParameters);
118117

119118
// act
120-
var backendTemplate = await extractorExecutor.GenerateBackendTemplateAsync(null, null, null, currentTestDirectory);
119+
var backendTemplate = await extractorExecutor.GenerateBackendTemplateAsync(null, null, currentTestDirectory);
121120

122121
// assert
123122
File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.Backends)).Should().BeTrue();
@@ -140,5 +139,72 @@ public async Task GenerateBackendTemplate_ProperlyParsesAndGeneratesTemplate()
140139
proxyBackend2.Properties.Proxy.Username.Should().Contain(ParameterNames.BackendProxy);
141140
proxyBackend2.Properties.Proxy.Url.Should().Contain(ParameterNames.BackendProxy);
142141
}
142+
143+
[Fact]
144+
public async Task GenerateBackendTemplate_GeneratesOnlyReferencedBackendInPolicy()
145+
{
146+
// arrange
147+
var responseFileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListBackends_success_response.json");
148+
var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GenerateBackendTemplate_GeneratesOnlyReferencedBackendInPolicy));
149+
150+
var mockedClient = await MockBackendClient.GetMockedHttpApiClient(new MockClientConfiguration(responseFileLocation: responseFileLocation));
151+
var apiName = "api-name-with-reference";
152+
153+
var extractorConfig = this.GetDefaultExtractorConsoleAppConfiguration(
154+
apiName: apiName);
155+
var extractorParameters = new ExtractorParameters(extractorConfig);
156+
157+
// mocked extractors
158+
var policyExtractor = new PolicyExtractor(
159+
this.GetTestLogger<PolicyExtractor>(),
160+
null,
161+
new TemplateBuilder());
162+
163+
var backendExtractor = new BackendExtractor(
164+
this.GetTestLogger<BackendExtractor>(),
165+
new TemplateBuilder(),
166+
policyExtractor,
167+
mockedClient);
168+
169+
var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
170+
this.GetTestLogger<ExtractorExecutor>(),
171+
backendExtractor: backendExtractor,
172+
policyExtractor: policyExtractor);
173+
extractorExecutor.SetExtractorParameters(extractorParameters);
174+
175+
var apiPolicies = new List<PolicyTemplateResource>()
176+
{
177+
new PolicyTemplateResource()
178+
{
179+
Properties = new PolicyTemplateProperties
180+
{
181+
PolicyContent = "<set-backend-service backend-id=\"proxybackend1\" />"
182+
}
183+
},
184+
new PolicyTemplateResource()
185+
{
186+
Properties = new PolicyTemplateProperties
187+
{
188+
PolicyContent = "<set-backend-service backend-id=\"proxybackend2\" />"
189+
}
190+
}
191+
};
192+
193+
// act
194+
var backendTemplate = await extractorExecutor.GenerateBackendTemplateAsync(apiName, apiPolicies, currentTestDirectory);
195+
196+
// assert
197+
File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.Backends)).Should().BeTrue();
198+
199+
backendTemplate.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);
200+
201+
backendTemplate.TypedResources.Backends.Count().Should().Be(2);
202+
backendTemplate.TypedResources.Backends.All(x => x.Type.Equals(ResourceTypeConstants.Backend)).Should().BeTrue();
203+
204+
var proxyBackend1 = backendTemplate.TypedResources.Backends.First(x => x.Name.Contains("proxybackend1"));
205+
proxyBackend1.Should().NotBeNull();
206+
var proxyBackend2 = backendTemplate.TypedResources.Backends.First(x => x.Name.Contains("proxybackend2"));
207+
proxyBackend2.Should().NotBeNull();
208+
}
143209
}
144210
}

0 commit comments

Comments
 (0)