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

Commit 5378706

Browse files
authored
get policy content fixes (#654)
* get policy content fixes * fix references in mock policy client * rename policy cache Co-authored-by: Dmitrii Korolev <dmkorolev@microsoft.com>
1 parent 2583985 commit 5378706

File tree

14 files changed

+231
-86
lines changed

14 files changed

+231
-86
lines changed

src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,14 @@ async Task GenerateTemplates(
717717
var apiTemplateResources = apiTemplate.Resources.ToList();
718718
Template loggerTemplate = await this.loggerExtractor.GenerateLoggerTemplateAsync(this.extractorParameters, singleApiName, apiTemplateResources, apiLoggerId);
719719
List<TemplateResource> loggerResources = loggerTemplate.Resources.ToList();
720-
Template namedValueTemplate = await this.propertyExtractor.GenerateNamedValuesTemplateAsync(singleApiName, apiTemplateResources, this.extractorParameters, this.backendExtractor, loggerResources);
720+
Template namedValueTemplate = await this.propertyExtractor.GenerateNamedValuesTemplateAsync(singleApiName, apiTemplateResources, this.extractorParameters, this.backendExtractor, loggerResources, baseFilesGenerationDirectory);
721721
List<TemplateResource> namedValueResources = namedValueTemplate.Resources.ToList();
722-
var backendResult = await this.backendExtractor.GenerateBackendsARMTemplateAsync(this.extractorParameters.SourceApimName, this.extractorParameters.ResourceGroup, singleApiName, apiTemplateResources, namedValueResources, this.extractorParameters);
722+
var backendResult = await this.backendExtractor.GenerateBackendsARMTemplateAsync(
723+
singleApiName,
724+
apiTemplate.TypedResources.GetAllPolicies(),
725+
namedValueResources,
726+
this.extractorParameters,
727+
baseFilesGenerationDirectory);
723728

724729
Dictionary<string, string> loggerResourceIds = null;
725730
if (this.extractorParameters.ParameterizeLogResourceId)

src/ArmTemplates/Common/Extensions/ParameterNamingHelper.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ static class ParameterNamingHelper
77
{
88
static readonly Regex ExcludeOtherFromLettersAndDigitsRegex = new Regex("[^a-zA-Z0-9]");
99

10+
public static string GetSubstringBetweenTwoCharacters(char left, char right, string fullString)
11+
{
12+
var regex = new Regex($"(?<={left})(.*?)(?={right})");
13+
var matchString = regex.Match(fullString);
14+
return matchString.Captures.FirstOrDefault()?.Value ?? string.Empty;
15+
}
16+
1017
public static string GenerateValidParameterName(string apiName, string prefix)
1118
{
1219
if (string.IsNullOrEmpty(apiName))

src/ArmTemplates/Common/Templates/Apis/ApiTemplateResources.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,23 @@ public class ApiTemplateResources : TemplateResourcesBase, ITemplateResources
3838

3939
public List<PolicyTemplateResource> ApiPolicies { get; set; } = new();
4040

41+
public List<PolicyTemplateResource> GetAllPolicies()
42+
{
43+
var policies = new List<PolicyTemplateResource>();
44+
45+
if (!this.ApiPolicies.IsNullOrEmpty())
46+
{
47+
policies.AddRange(this.ApiPolicies);
48+
}
49+
50+
if (!this.ApiOperationsPolicies.IsNullOrEmpty())
51+
{
52+
policies.AddRange(this.ApiOperationsPolicies);
53+
}
54+
55+
return policies;
56+
}
57+
4158
public void AddResourcesData(ApiTemplateResources otherResources)
4259
{
4360
if (otherResources is null)

src/ArmTemplates/Common/Templates/Policy/PolicyTemplateProperties.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates
1010
{
1111
public class PolicyTemplateProperties
1212
{
13+
[JsonIgnore]
14+
public string PolicyContentFileFullPath { get; set; }
15+
1316
[JsonProperty("value")]
1417
public string PolicyContent { get; set; }
1518

src/ArmTemplates/Common/Templates/Policy/PolicyTemplateUtils.cs

Lines changed: 0 additions & 40 deletions
This file was deleted.
Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.TemplateModels;
22
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
3+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
34
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
45
using System;
56
using System.Collections.Generic;
@@ -9,8 +10,21 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Entity
910
{
1011
public interface IBackendExtractor
1112
{
12-
Task<Tuple<Template, Dictionary<string, BackendApiParameters>>> GenerateBackendsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, List<TemplateResource> propertyResources, ExtractorParameters extractorParameters);
13+
Task<Tuple<Template, Dictionary<string, BackendApiParameters>>> GenerateBackendsARMTemplateAsync(
14+
string singleApiName,
15+
List<PolicyTemplateResource> policyTemplateResources,
16+
List<TemplateResource> propertyResources,
17+
ExtractorParameters extractorParameters,
18+
string baseFilesGenerationDirectory);
1319

14-
Task<bool> IsNamedValueUsedInBackends(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, ExtractorParameters extractorParameters, string propertyName, string propertyDisplayName);
20+
Task<bool> IsNamedValueUsedInBackends(
21+
string apimname,
22+
string resourceGroup,
23+
string singleApiName,
24+
List<TemplateResource> apiTemplateResources,
25+
ExtractorParameters extractorParameters,
26+
string propertyName,
27+
string propertyDisplayName,
28+
string baseFilesGenerationDirectory);
1529
}
1630
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Entity
77
{
88
public interface IPolicyExtractor
99
{
10+
string GetCachedPolicyContent(PolicyTemplateResource policyTemplateResource, string baseFilesGenerationDirectory);
11+
1012
Task<PolicyTemplateResource> GenerateProductPolicyTemplateAsync(
1113
ExtractorParameters extractorParameters,
1214
string productName,

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Entity
77
{
88
public interface IPropertyExtractor
99
{
10-
Task<Template> GenerateNamedValuesTemplateAsync(string singleApiName, List<TemplateResource> apiTemplateResources, ExtractorParameters extractorParameters, IBackendExtractor backendExtractor, List<TemplateResource> loggerTemplateResources);
10+
Task<Template> GenerateNamedValuesTemplateAsync(
11+
string singleApiName,
12+
List<TemplateResource> apiTemplateResources,
13+
ExtractorParameters extractorParameters,
14+
IBackendExtractor backendExtractor,
15+
List<TemplateResource> loggerTemplateResources,
16+
string baseFilesGenerationDirectory);
1117
}
1218
}

src/ArmTemplates/Extractor/EntityExtractors/BackendExtractor.cs

Lines changed: 32 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using Newtonsoft.Json.Linq;
44
using System.Linq;
5-
using Newtonsoft.Json;
65
using System;
76
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.TemplateModels;
87
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
@@ -18,10 +17,14 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Entity
1817
public class BackendExtractor : EntityExtractorBase, IBackendExtractor
1918
{
2019
readonly ITemplateBuilder templateBuilder;
20+
readonly IPolicyExtractor policyExtractor;
2121

22-
public BackendExtractor(ITemplateBuilder templateBuilder)
22+
public BackendExtractor(
23+
ITemplateBuilder templateBuilder,
24+
IPolicyExtractor policyExtractor)
2325
{
2426
this.templateBuilder = templateBuilder;
27+
this.policyExtractor = policyExtractor;
2528
}
2629

2730
public async Task<string> GetBackendsAsync(string apiManagementName, string resourceGroupName, int skipNumOfRecords)
@@ -47,16 +50,13 @@ public async Task<string> GetBackendDetailsAsync(string apiManagementName, strin
4750
/// <summary>
4851
/// Generate the ARM assets for the backend resources
4952
/// </summary>
50-
/// <param name="apimname"></param>
51-
/// <param name="resourceGroup"></param>
52-
/// <param name="singleApiName"></param>
53-
/// <param name="apiTemplateResources"></param>
54-
/// <param name="propertyResources"></param>
55-
/// <param name="policyXMLBaseUrl"></param>
56-
/// <param name="policyXMLSasToken"></param>
57-
/// <param name="extractBackendParameters"></param>
5853
/// <returns>a combination of a Template and the value for the BackendSettings parameter</returns>
59-
public async Task<Tuple<Template, Dictionary<string, BackendApiParameters>>> GenerateBackendsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, List<TemplateResource> propertyResources, ExtractorParameters extractorParameters)
54+
public async Task<Tuple<Template, Dictionary<string, BackendApiParameters>>> GenerateBackendsARMTemplateAsync(
55+
string singleApiName,
56+
List<PolicyTemplateResource> policyTemplateResources,
57+
List<TemplateResource> propertyResources,
58+
ExtractorParameters extractorParameters,
59+
string baseFilesGenerationDirectory)
6060
{
6161
Console.WriteLine("------------------------------------------");
6262
Console.WriteLine("Extracting backends from service");
@@ -74,7 +74,6 @@ public async Task<Tuple<Template, Dictionary<string, BackendApiParameters>>> Gen
7474
List<TemplateResource> templateResources = new List<TemplateResource>();
7575

7676
// isolate api and operation policy resources in the case of a single api extraction, as they may reference backends
77-
var policyResources = apiTemplateResources.Where(resource => resource.Type == ResourceTypeConstants.APIPolicy || resource.Type == ResourceTypeConstants.APIOperationPolicy || resource.Type == ResourceTypeConstants.ProductPolicy);
7877
var namedValueResources = propertyResources.Where(resource => resource.Type == ResourceTypeConstants.Property);
7978

8079
// pull all backends for service
@@ -84,13 +83,20 @@ public async Task<Tuple<Template, Dictionary<string, BackendApiParameters>>> Gen
8483

8584
do
8685
{
87-
string backends = await this.GetBackendsAsync(apimname, resourceGroup, skipNumberOfBackends);
86+
string backends = await this.GetBackendsAsync(
87+
extractorParameters.SourceApimName,
88+
extractorParameters.ResourceGroup,
89+
skipNumberOfBackends);
90+
8891
oBackends = JObject.Parse(backends);
8992

9093
foreach (var item in oBackends["value"])
9194
{
9295
string backendName = ((JValue)item["name"]).Value.ToString();
93-
string backend = await this.GetBackendDetailsAsync(apimname, resourceGroup, backendName);
96+
string backend = await this.GetBackendDetailsAsync(
97+
extractorParameters.SourceApimName,
98+
extractorParameters.ResourceGroup,
99+
backendName);
94100

95101
// convert returned backend to template resource class
96102
BackendTemplateResource backendTemplateResource = backend.Deserialize<BackendTemplateResource>();
@@ -107,9 +113,9 @@ public async Task<Tuple<Template, Dictionary<string, BackendApiParameters>>> Gen
107113
else
108114
{
109115
// check extracted policies to see if the backend is referenced.
110-
foreach (PolicyTemplateResource policyTemplateResource in policyResources)
116+
foreach (var policyTemplateResource in policyTemplateResources)
111117
{
112-
string policyContent = PolicyTemplateUtils.GetPolicyContent(extractorParameters, policyTemplateResource);
118+
var policyContent = this.policyExtractor.GetCachedPolicyContent(policyTemplateResource, baseFilesGenerationDirectory);
113119

114120
if (this.DoesPolicyReferenceBackend(policyContent, namedValueResources, backendName, backendTemplateResource))
115121
{
@@ -193,7 +199,15 @@ public bool DoesBackendReferenceNamedValue(TemplateResource namedValueResource,
193199
|| namedValue == backendTemplateResource.Properties.title;
194200
}
195201

196-
public async Task<bool> IsNamedValueUsedInBackends(string apimname, string resourceGroup, string singleApiName, List<TemplateResource> apiTemplateResources, ExtractorParameters extractorParameters, string propertyName, string propertyDisplayName)
202+
public async Task<bool> IsNamedValueUsedInBackends(
203+
string apimname,
204+
string resourceGroup,
205+
string singleApiName,
206+
List<TemplateResource> apiTemplateResources,
207+
ExtractorParameters extractorParameters,
208+
string propertyName,
209+
string propertyDisplayName,
210+
string baseFilesGenerationDirectory)
197211
{
198212
// isolate api and operation policy resources in the case of a single api extraction, as they may reference backends
199213
var policyResources = apiTemplateResources.Where(resource => resource.Type == ResourceTypeConstants.APIPolicy || resource.Type == ResourceTypeConstants.APIOperationPolicy || resource.Type == ResourceTypeConstants.ProductPolicy);
@@ -238,7 +252,7 @@ public async Task<bool> IsNamedValueUsedInBackends(string apimname, string resou
238252
// this is why an empty named values must be passed to this method for validation
239253
foreach (PolicyTemplateResource policyTemplateResource in policyResources)
240254
{
241-
string policyContent = PolicyTemplateUtils.GetPolicyContent(extractorParameters, policyTemplateResource);
255+
var policyContent = this.policyExtractor.GetCachedPolicyContent(policyTemplateResource, baseFilesGenerationDirectory);
242256

243257
if (this.DoesPolicyReferenceBackend(policyContent, emptyNamedValueResources, backendName, backendTemplateResource))
244258
{

src/ArmTemplates/Extractor/EntityExtractors/MasterTemplateExtractor.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Entity
2828
public class MasterTemplateExtractor : ApiExtractor, IMasterTemplateExtractor
2929
{
3030
readonly ITemplateBuilder templateBuilder;
31+
readonly IPolicyExtractor policyExtractor;
3132

3233
public MasterTemplateExtractor(
3334
ILogger<ApiExtractor> logger,
@@ -42,6 +43,7 @@ public MasterTemplateExtractor(
4243
: base(logger, templateBuilder, apisClient, diagnosticExtractor, apiSchemaExtractor, policyExtractor, productApisExtractor, tagExtractor, apiOperationExtractor)
4344
{
4445
this.templateBuilder = templateBuilder;
46+
this.policyExtractor = policyExtractor;
4547
}
4648

4749
public Template GenerateLinkedMasterTemplate(
@@ -554,7 +556,7 @@ public async Task<Template> CreateMasterTemplateParameterValues(List<string> api
554556
if (extractorParameters.ParameterizeNamedValue)
555557
{
556558
Dictionary<string, string> namedValues = new Dictionary<string, string>();
557-
PropertyExtractor pExc = new PropertyExtractor(this.templateBuilder);
559+
PropertyExtractor pExc = new PropertyExtractor(this.templateBuilder, this.policyExtractor);
558560
string[] properties = await pExc.GetPropertiesAsync(extractorParameters.SourceApimName, extractorParameters.ResourceGroup);
559561

560562
foreach (var extractedProperty in properties)
@@ -586,7 +588,7 @@ public async Task<Template> CreateMasterTemplateParameterValues(List<string> api
586588
if (extractorParameters.ParamNamedValuesKeyVaultSecrets)
587589
{
588590
Dictionary<string, string> keyVaultNamedValues = new Dictionary<string, string>();
589-
PropertyExtractor pExc = new PropertyExtractor(this.templateBuilder);
591+
PropertyExtractor pExc = new PropertyExtractor(this.templateBuilder, this.policyExtractor);
590592
string[] properties = await pExc.GetPropertiesAsync(extractorParameters.SourceApimName, extractorParameters.ResourceGroup);
591593

592594
foreach (var extractedProperty in properties)

0 commit comments

Comments
 (0)