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

Commit 4ef967b

Browse files
f-alizadaFarhad Alizada
andauthored
Parametrize backend proxy (#787)
* Parametrize backend proxy Co-authored-by: Farhad Alizada <[email protected]>
1 parent 3b04442 commit 4ef967b

File tree

13 files changed

+282
-1
lines changed

13 files changed

+282
-1
lines changed

src/ArmTemplates/Common/Constants/GlobalConstants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public static class ParameterNames
4444
public const string SecretValues = "secretValues";
4545
public const string IdentityProvidersSecretValues = "identityProviders";
4646
public const string OpenIdConnectProvidersSecretValues = "openIdConnectProviders";
47+
public const string BackendProxy = "backendProxy";
4748
}
4849

4950
public static class ParameterPrefix
@@ -54,5 +55,6 @@ public static class ParameterPrefix
5455
public const string LogResourceId = "LogResourceId";
5556
public const string Backend = "Backend";
5657
public const string ApiOauth2Scope = "ApiOauth2Scope";
58+
public const string BackendProxy = "BackendProxy";
5759
}
5860
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Backend
7+
{
8+
public class BackendProxyParameters
9+
{
10+
public string Url { get; set; }
11+
12+
public string Username { get; set; }
13+
14+
public string Password { get; set; }
15+
}
16+
}

src/ArmTemplates/Common/Templates/Backend/BackendTemplateResources.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public class BackendTemplateResources : ITemplateResources
1515

1616
public IDictionary<string, BackendApiParameters> BackendNameParametersCache { get; set; } = new Dictionary<string, BackendApiParameters>();
1717

18+
public IDictionary<string, BackendProxyParameters> BackendProxyParametersCache { get; set; } = new Dictionary<string, BackendProxyParameters>();
19+
1820
public TemplateResource[] BuildTemplateResources()
1921
{
2022
return this.Backends.ToArray();

src/ArmTemplates/Common/Templates/Builders/TemplateBuilder.Backend.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public TemplateBuilder AddParameterizedBackendSettings(ExtractorParameters extra
2121
Type = "object"
2222
};
2323
this.template.Parameters.Add(ParameterNames.BackendSettings, extractBackendParametersProperties);
24+
this.template.Parameters.Add(ParameterNames.BackendProxy, extractBackendParametersProperties);
2425
}
2526

2627
return this;

src/ArmTemplates/Extractor/EntityExtractors/BackendExtractor.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,27 @@ void SaveBackendApiParametersToCache()
134134
{
135135
backendTemplate.TypedResources.BackendNameParametersCache.Add(backendValidName, backendApiParameters);
136136
}
137+
138+
if (backendResource.Properties.Proxy != null)
139+
{
140+
var proxyUniqueId = $"{backendResource.Properties.Proxy.Url}_{backendResource.Properties.Proxy.Username}";
141+
var backendProxyParameterName = NamingHelper.GenerateValidParameterName(proxyUniqueId, ParameterPrefix.BackendProxy);
142+
143+
if (!backendTemplate.TypedResources.BackendProxyParametersCache.ContainsKey(backendProxyParameterName))
144+
{
145+
var backendProxyParameters = new BackendProxyParameters
146+
{
147+
Url = backendResource.Properties.Proxy.Url,
148+
Username = backendResource.Properties.Proxy.Username,
149+
Password = backendResource.Properties.Proxy.Password
150+
};
151+
backendTemplate.TypedResources.BackendProxyParametersCache.Add(backendProxyParameterName, backendProxyParameters);
152+
}
153+
154+
backendResource.Properties.Proxy.Url = $"[parameters('{ParameterNames.BackendProxy}').{backendProxyParameterName}.url]";
155+
backendResource.Properties.Proxy.Username = $"[parameters('{ParameterNames.BackendProxy}').{backendProxyParameterName}.username]";
156+
backendResource.Properties.Proxy.Password = $"[parameters('{ParameterNames.BackendProxy}').{backendProxyParameterName}.password]";
157+
}
137158
}
138159
}
139160

src/ArmTemplates/Extractor/EntityExtractors/MasterTemplateExtractor.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,9 @@ public Template<MasterTemplateResources> GenerateLinkedMasterTemplate(
202202
{
203203
backendsDeployment.Properties.Parameters.Add(ParameterNames.BackendSettings,
204204
new TemplateParameterProperties() { Value = $"[parameters('{ParameterNames.BackendSettings}')]" });
205+
206+
backendsDeployment.Properties.Parameters.Add(ParameterNames.BackendProxy,
207+
new TemplateParameterProperties() { Value = $"[parameters('{ParameterNames.BackendProxy}')]" });
205208
}
206209

207210
masterResources.DeploymentResources.Add(backendsDeployment);
@@ -497,6 +500,10 @@ Dictionary<string, TemplateParameterProperties> CreateMasterTemplateParameters(E
497500
parameters.Add(
498501
ParameterNames.BackendSettings,
499502
new TemplateParameterProperties(metadataDescription: "The settings for the Backends", type: "object"));
503+
504+
parameters.Add(
505+
ParameterNames.BackendProxy,
506+
new TemplateParameterProperties(metadataDescription: "The proxies for the Backends", type: "object"));
500507
}
501508

502509
if (extractorParameters.ParametrizeApiOauth2Scope)

src/ArmTemplates/Extractor/EntityExtractors/ParametersExtractor.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ async Task AddSecretValuesParameters()
268268
if (extractorParameters.ParameterizeBackend)
269269
{
270270
parameters.Add(ParameterNames.BackendSettings, new TemplateObjectParameterProperties() { Value = backendResources.BackendNameParametersCache });
271+
parameters.Add(ParameterNames.BackendProxy, new TemplateObjectParameterProperties() { Value = backendResources.BackendProxyParametersCache });
271272
}
272273

273274
return parametersTemplate;

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@ public async Task GenerateAllCurrentApiReleaseTemplateAsync_ProperlyCreatesTempl
9191
apiReleasesTemplate.TypedResources.ApiReleases.Any(x => x.Properties.ApiId.Contains($"/apis/echo-api;rev=1")).Should().BeTrue();
9292
apiReleasesTemplate.TypedResources.ApiReleases.Any(x => x.Properties.ApiId.Contains($"/apis/5a7390baa5816a110435aee0;rev=1")).Should().BeTrue();
9393
apiReleasesTemplate.TypedResources.ApiReleases.Any(x => x.Properties.ApiId.Contains($"/apis/5a73933b8f27f7cc82a2d533;rev=1")).Should().BeTrue();
94-
9594
}
9695
}
9796
}

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public async Task GenerateBackendTemplates_ProperlyLaysTheInformation()
7272

7373
backendTemplate.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);
7474
backendTemplate.Parameters.Should().ContainKey(ParameterNames.BackendSettings);
75+
backendTemplate.Parameters.Should().ContainKey(ParameterNames.BackendProxy);
7576

7677
backendTemplate.TypedResources.Backends.Should().HaveCount(1);
7778
backendTemplate.Resources.Should().HaveCount(1);
@@ -83,6 +84,61 @@ public async Task GenerateBackendTemplates_ProperlyLaysTheInformation()
8384
backendProperties.Should().NotBeNull();
8485
backendProperties.Url.Should().Contain(ParameterNames.BackendSettings);
8586
backendProperties.Protocol.Should().Contain(ParameterNames.BackendSettings);
87+
88+
backendProperties.Proxy.Password.Should().Contain(ParameterNames.BackendProxy);
89+
backendProperties.Proxy.Username.Should().Contain(ParameterNames.BackendProxy);
90+
backendProperties.Proxy.Url.Should().Contain(ParameterNames.BackendProxy);
91+
}
92+
93+
[Fact]
94+
public async Task GenerateBackendTemplate_ProperlyParsesAndGeneratesTemplate()
95+
{
96+
// arrange
97+
var responseFileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListBackends_success_response.json");
98+
var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GenerateBackendTemplate_ProperlyParsesAndGeneratesTemplate));
99+
100+
var mockedClient = await MockBackendClient.GetMockedHttpApiClient(responseFileLocation);
101+
102+
var extractorConfig = this.GetDefaultExtractorConsoleAppConfiguration(
103+
apiName: string.Empty,
104+
paramBackend: "true");
105+
var extractorParameters = new ExtractorParameters(extractorConfig);
106+
107+
// mocked extractors
108+
var backendExtractor = new BackendExtractor(
109+
this.GetTestLogger<BackendExtractor>(),
110+
new TemplateBuilder(),
111+
null,
112+
mockedClient);
113+
114+
var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
115+
this.GetTestLogger<ExtractorExecutor>(),
116+
backendExtractor: backendExtractor);
117+
extractorExecutor.SetExtractorParameters(extractorParameters);
118+
119+
// act
120+
var backendTemplate = await extractorExecutor.GenerateBackendTemplateAsync(null, null, null, currentTestDirectory);
121+
122+
// assert
123+
File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.Backends)).Should().BeTrue();
124+
125+
backendTemplate.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);
126+
backendTemplate.Parameters.Should().ContainKey(ParameterNames.BackendSettings);
127+
backendTemplate.Parameters.Should().ContainKey(ParameterNames.BackendProxy);
128+
129+
130+
backendTemplate.TypedResources.Backends.Count().Should().Be(3);
131+
backendTemplate.TypedResources.Backends.All(x => x.Type.Equals(ResourceTypeConstants.Backend)).Should().BeTrue();
132+
133+
var proxyBackend1 = backendTemplate.TypedResources.Backends.First(x => x.Name.Contains("proxybackend1"));
134+
proxyBackend1.Properties.Proxy.Password.Should().Contain(ParameterNames.BackendProxy);
135+
proxyBackend1.Properties.Proxy.Username.Should().Contain(ParameterNames.BackendProxy);
136+
proxyBackend1.Properties.Proxy.Url.Should().Contain(ParameterNames.BackendProxy);
137+
138+
var proxyBackend2 = backendTemplate.TypedResources.Backends.First(x => x.Name.Contains("proxybackend2"));
139+
proxyBackend2.Properties.Proxy.Password.Should().Contain(ParameterNames.BackendProxy);
140+
proxyBackend2.Properties.Proxy.Username.Should().Contain(ParameterNames.BackendProxy);
141+
proxyBackend2.Properties.Proxy.Url.Should().Contain(ParameterNames.BackendProxy);
86142
}
87143
}
88144
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ public async Task GenerateMasterTemplates_ProperlyLaysTheInformation()
179179
masterTemplate.Parameters.Should().ContainKey(ParameterNames.LoggerResourceId);
180180
masterTemplate.Parameters.Should().ContainKey(ParameterNames.NamedValueKeyVaultSecrets);
181181
masterTemplate.Parameters.Should().ContainKey(ParameterNames.BackendSettings);
182+
masterTemplate.Parameters.Should().ContainKey(ParameterNames.BackendProxy);
182183
masterTemplate.Parameters.Should().ContainKey(ParameterNames.PolicyXMLBaseUrl);
183184
masterTemplate.Parameters.Should().ContainKey(ParameterNames.PolicyXMLBaseUrl);
184185
masterTemplate.Parameters.Should().ContainKey(ParameterNames.ApiOauth2ScopeSettings);

0 commit comments

Comments
 (0)