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

Commit 75efd0c

Browse files
f-alizadaFarhad Alizada
andauthored
Feature/extract/policy fragments (#775)
* Add policy-fragments extraction * Add policy fragment tests, update main template tests Co-authored-by: Farhad Alizada <[email protected]>
1 parent a1fdf86 commit 75efd0c

26 files changed

+547
-26
lines changed

src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.NamedValues;
2525
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders;
2626
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
27+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments;
2728
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ProductApis;
2829
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products;
2930
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Schemas;
@@ -68,6 +69,7 @@ public class ExtractorExecutor
6869
readonly IApiManagementServiceExtractor apiManagementServiceExtractor;
6970
readonly ISchemaExtractor schemaExtractor;
7071
readonly IOpenIdConnectProviderExtractor openIdConnectProviderExtractor;
72+
readonly IPolicyFragmentsExtractor policyFragmentsExtractor;
7173

7274
public ExtractorExecutor(
7375
ILogger<ExtractorExecutor> logger,
@@ -92,7 +94,8 @@ public ExtractorExecutor(
9294
IIdentityProviderExtractor identityProviderExtractor,
9395
IApiManagementServiceExtractor apiManagementServiceExtractor,
9496
ISchemaExtractor schemaExtractor,
95-
IOpenIdConnectProviderExtractor openIdConnectProviderExtractor)
97+
IOpenIdConnectProviderExtractor openIdConnectProviderExtractor,
98+
IPolicyFragmentsExtractor policyFragmentsExtractor)
9699
{
97100
this.logger = logger;
98101
this.apisClient = apisClient;
@@ -117,6 +120,7 @@ public ExtractorExecutor(
117120
this.apiManagementServiceExtractor = apiManagementServiceExtractor;
118121
this.schemaExtractor = schemaExtractor;
119122
this.openIdConnectProviderExtractor = openIdConnectProviderExtractor;
123+
this.policyFragmentsExtractor = policyFragmentsExtractor;
120124
}
121125

122126
/// <summary>
@@ -146,7 +150,8 @@ public static ExtractorExecutor BuildExtractorExecutor(
146150
IIdentityProviderExtractor identityProviderExtractor = null,
147151
IApiManagementServiceExtractor apiManagementServiceExtractor = null,
148152
ISchemaExtractor schemaExtractor = null,
149-
IOpenIdConnectProviderExtractor openIdConnectProviderExtractor = null)
153+
IOpenIdConnectProviderExtractor openIdConnectProviderExtractor = null,
154+
IPolicyFragmentsExtractor policyFragmentsExtractor = null)
150155
=> new ExtractorExecutor(
151156
logger,
152157
apisClient,
@@ -170,7 +175,8 @@ public static ExtractorExecutor BuildExtractorExecutor(
170175
identityProviderExtractor,
171176
apiManagementServiceExtractor,
172177
schemaExtractor,
173-
openIdConnectProviderExtractor);
178+
openIdConnectProviderExtractor,
179+
policyFragmentsExtractor);
174180

175181
public void SetExtractorParameters(ExtractorParameters extractorParameters)
176182
{
@@ -469,7 +475,8 @@ public async Task<Template<MasterTemplateResources>> GenerateMasterTemplateAsync
469475
GroupTemplateResources groupTemplateResources = null,
470476
IdentityProviderResources identityProviderTemplateResources = null,
471477
SchemaTemplateResources schemaTemplateResources = null,
472-
OpenIdConnectProviderResources openIdConnectProviderResources = null)
478+
OpenIdConnectProviderResources openIdConnectProviderResources = null,
479+
PolicyFragmentsResources policyFragmentsResources = null)
473480
{
474481
if (string.IsNullOrEmpty(this.extractorParameters.LinkedTemplatesBaseUrl))
475482
{
@@ -483,7 +490,7 @@ public async Task<Template<MasterTemplateResources>> GenerateMasterTemplateAsync
483490
this.extractorParameters, apiTemplateResources, policyTemplateResources, apiVersionSetTemplateResources,
484491
productsTemplateResources, productApisTemplateResources, apiTagsTemplateResources, loggersTemplateResources,
485492
backendsTemplateResources, authorizationServersTemplateResources, namedValuesTemplateResources, tagTemplateResources,
486-
groupTemplateResources, identityProviderTemplateResources, schemaTemplateResources, openIdConnectProviderResources);
493+
groupTemplateResources, identityProviderTemplateResources, schemaTemplateResources, openIdConnectProviderResources, policyFragmentsResources);
487494

488495
if (masterTemplate?.HasResources() == true)
489496
{
@@ -813,6 +820,29 @@ await FileWriter.SaveAsJsonAsync(
813820
return schemasTemplate;
814821
}
815822

823+
/// <summary>
824+
/// Generates policy fragments templates in the desired folder
825+
/// </summary>
826+
/// <param name="baseFilesGenerationDirectory">name of base folder where to save output files</param>
827+
/// <returns>generated policy fragments template</returns>
828+
public async Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTemplateAsync(List<PolicyTemplateResource> apiPolicies, string baseFilesGenerationDirectory)
829+
{
830+
this.logger.LogInformation("Started generation of policy fragments template...");
831+
832+
var policyFragmentTemplate = await this.policyFragmentsExtractor.GeneratePolicyFragmentsTemplateAsync(apiPolicies, this.extractorParameters);
833+
834+
if (policyFragmentTemplate?.HasResources() == true)
835+
{
836+
await FileWriter.SaveAsJsonAsync(
837+
policyFragmentTemplate,
838+
directory: baseFilesGenerationDirectory,
839+
fileName: this.extractorParameters.FileNames.PolicyFragments);
840+
}
841+
842+
this.logger.LogInformation("Finished generation of policy fragments template...");
843+
return policyFragmentTemplate;
844+
}
845+
816846
/// <summary>
817847
/// Generates split api templates / folders for each api in this sourceApim
818848
/// </summary>
@@ -995,6 +1025,7 @@ async Task GenerateTemplates(
9951025
var identityProviderTemplate = await this.GenerateIdentityProviderTemplateAsync(baseFilesGenerationDirectory);
9961026
var openIdConnectProviderTemplate = await this.GenerateOpenIdConnectProviderTemplateAsync(baseFilesGenerationDirectory);
9971027
var schemasTempate = await this.GenerateSchemasTemplateAsync(baseFilesGenerationDirectory);
1028+
var policyFragmentTemplate = await this.GeneratePolicyFragmentsTemplateAsync(apiTemplate.TypedResources.GetAllPolicies(), baseFilesGenerationDirectory);
9981029
await this.GenerateGatewayTemplateAsync(singleApiName, baseFilesGenerationDirectory);
9991030
await this.GenerateGatewayApiTemplateAsync(singleApiName, multipleApiNames, baseFilesGenerationDirectory);
10001031
await this.GenerateApiManagementServiceTemplate(baseFilesGenerationDirectory);
@@ -1016,7 +1047,8 @@ await this.GenerateMasterTemplateAsync(
10161047
groupTemplateResources: groupTemplate.TypedResources,
10171048
identityProviderTemplateResources: identityProviderTemplate.TypedResources,
10181049
schemaTemplateResources: schemasTempate.TypedResources,
1019-
openIdConnectProviderResources: openIdConnectProviderTemplate.TypedResources);
1050+
openIdConnectProviderResources: openIdConnectProviderTemplate.TypedResources,
1051+
policyFragmentsResources: policyFragmentTemplate.TypedResources);
10201052
}
10211053

10221054

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using System.Collections.Generic;
7+
using System.Threading.Tasks;
8+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments;
9+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
10+
11+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions
12+
{
13+
public interface IPolicyFragmentsClient
14+
{
15+
Task<List<PolicyFragmentsResource>> GetAllAsync(ExtractorParameters extractorParameters);
16+
}
17+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using System.Collections.Generic;
7+
using System.Net.Http;
8+
using System.Threading.Tasks;
9+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions;
10+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants;
11+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments;
12+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
13+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction;
14+
15+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.PolicyFragments
16+
{
17+
public class PolicyFragmentsClient : ApiClientBase, IPolicyFragmentsClient
18+
{
19+
const string GetAllRequest = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/policyFragments?api-version={4}&format=rawxml";
20+
21+
readonly IPolicyFragmentDataProcessor policyFragmentDataProcessor;
22+
23+
public PolicyFragmentsClient(
24+
IHttpClientFactory httpClientFactory,
25+
IPolicyFragmentDataProcessor policyFragmentDataProcessor): base(httpClientFactory)
26+
{
27+
this.policyFragmentDataProcessor = policyFragmentDataProcessor;
28+
}
29+
30+
public async Task<List<PolicyFragmentsResource>> GetAllAsync(ExtractorParameters extractorParameters)
31+
{
32+
var (azToken, azSubId) = await this.Auth.GetAccessToken();
33+
34+
var requestUrl = string.Format(GetAllRequest,
35+
this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, GlobalConstants.ApiVersionPreview);
36+
37+
var policyFragments = await this.GetPagedResponseAsync<PolicyFragmentsResource>(azToken, requestUrl);
38+
this.policyFragmentDataProcessor.ProcessData(policyFragments, extractorParameters);
39+
40+
return policyFragments;
41+
}
42+
}
43+
}

src/ArmTemplates/Common/Constants/GlobalConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public static class GlobalConstants
1616
public const string ExtractDescription = "Extract an existing API Management instance";
1717

1818
public const string ApiVersion = "2021-08-01";
19+
public const string ApiVersionPreview = "2021-12-01-preview";
1920
public const string ArmApiVersion = "2022-01-01";
2021
public const int NumOfRecords = 100;
2122

src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,6 @@ public static class ResourceTypeConstants
3838
public const string ApiManagementService = "Microsoft.ApiManagement/service";
3939
public const string Schema = "Microsoft.ApiManagement/service/schemas";
4040
public const string OpenIdConnectProvider = "Microsoft.ApiManagement/service/openidConnectProviders";
41+
public const string PolicyFragments = "Microsoft.ApiManagement/service/policyFragments";
4142
}
4243
}

src/ArmTemplates/Common/FileHandlers/FileNameGenerator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public static FileNames GenerateFileNames(string baseFileName)
3939
ApiManagementService = $@"{baseFileName}api-management-service.template.json",
4040
TagApi = $@"{baseFileName}apiTags.template.json",
4141
Schema = $@"{baseFileName}schemas.template.json",
42+
PolicyFragments = $@"{baseFileName}policy-fragments.template.json",
4243
Parameters = $@"{baseFileName}parameters.json",
4344
LinkedMaster = $@"{baseFileName}master.template.json",
4445
Apis = "/Apis",

src/ArmTemplates/Common/FileHandlers/FileNames.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public class FileNames
4141

4242
public string Schema { get; set; }
4343

44+
public string PolicyFragments { get; set; }
45+
4446
public string Parameters { get; set; }
4547

4648
// linked property outputs 1 master template
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.PolicyFragments
7+
{
8+
public class PolicyFragmentsProperties
9+
{
10+
public string Description { get; set; }
11+
12+
public string Format { get; set; }
13+
14+
public string Value { get; set; }
15+
}
16+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using Newtonsoft.Json;
7+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
8+
9+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments
10+
{
11+
public class PolicyFragmentsResource : TemplateResource
12+
{
13+
[JsonIgnore]
14+
public string OriginalName { get; set; }
15+
16+
public PolicyFragmentsProperties Properties { get; set; }
17+
}
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using System.Collections.Generic;
7+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions;
8+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
9+
10+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments
11+
{
12+
public class PolicyFragmentsResources : ITemplateResources
13+
{
14+
public List<PolicyFragmentsResource> PolicyFragments { get; set; } = new();
15+
16+
public TemplateResource[] BuildTemplateResources()
17+
{
18+
return this.PolicyFragments.ToArray();
19+
}
20+
21+
public bool HasContent()
22+
{
23+
return !this.PolicyFragments.IsNullOrEmpty();
24+
}
25+
}
26+
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.NamedValues;
1616
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders;
1717
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
18+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments;
1819
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ProductApis;
1920
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products;
2021
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Schemas;
@@ -42,6 +43,7 @@ Template<MasterTemplateResources> GenerateLinkedMasterTemplate(
4243
GroupTemplateResources groupTemplateResources = null,
4344
IdentityProviderResources identityProviderTemplateResources = null,
4445
SchemaTemplateResources schemaTemplateResources = null,
45-
OpenIdConnectProviderResources openIdConnectProviderResources = null);
46+
OpenIdConnectProviderResources openIdConnectProviderResources = null,
47+
PolicyFragmentsResources policyFragmentsResources = null);
4648
}
4749
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// --------------------------------------------------------------------------
2+
// Copyright (c) Microsoft Corporation. All rights reserved.
3+
// Licensed under the MIT License.
4+
// --------------------------------------------------------------------------
5+
6+
using System.Collections.Generic;
7+
using System.Threading.Tasks;
8+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
9+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
10+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments;
11+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
12+
13+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors.Abstractions
14+
{
15+
public interface IPolicyFragmentsExtractor
16+
{
17+
Task<Template<PolicyFragmentsResources>> GeneratePolicyFragmentsTemplateAsync(List<PolicyTemplateResource> apiTemplatePolicies, ExtractorParameters extractorParameters);
18+
}
19+
}

0 commit comments

Comments
 (0)