From 75efd0cb8beac9f8a2c0452cfca04257d33b7ea8 Mon Sep 17 00:00:00 2001 From: f-alizada <104755925+f-alizada@users.noreply.github.com> Date: Thu, 21 Jul 2022 11:51:08 +0200 Subject: [PATCH] Feature/extract/policy fragments (#775) * Add policy-fragments extraction * Add policy fragment tests, update main template tests Co-authored-by: Farhad Alizada --- .../Commands/Executors/ExtractorExecutor.cs | 44 ++++++- .../Abstractions/IPolicyFragmentsClient.cs | 17 +++ .../PolicyFragments/PolicyFragmentsClient.cs | 43 +++++++ .../Common/Constants/GlobalConstants.cs | 1 + .../Common/Constants/ResourceTypeConstants.cs | 1 + .../Common/FileHandlers/FileNameGenerator.cs | 1 + .../Common/FileHandlers/FileNames.cs | 2 + .../PolicyFragmentsProperties.cs | 16 +++ .../PolicyFragmentsResource.cs | 18 +++ .../PolicyFragmentsResources.cs | 26 +++++ .../Abstractions/IMasterTemplateExtractor.cs | 4 +- .../Abstractions/IPolicyFragmentsExtractor.cs | 19 +++ .../MasterTemplateExtractor.cs | 21 +++- .../PolicyFragmentsExtractor.cs | 75 ++++++++++++ .../IPolicyFragmentDataProcessor.cs | 16 +++ .../PolicyFragmentDataProcessor.cs | 29 +++++ src/ArmTemplates/ServiceExtensions.cs | 4 + .../Scenarios/MasterTemplateExtractorTests.cs | 52 ++++++++- .../PolicyFragmentsExtractorTests.cs | 109 ++++++++++++++++++ .../Moqs/ApiClients/MockApiSchemaClient.cs | 5 +- .../Moqs/ApiClients/MockClientUtils.cs | 7 ++ .../Moqs/ApiClients/MockGroupsClient.cs | 5 +- .../MockOpenIdConnectProviderClient.cs | 5 +- .../ApiClients/MockPolicyFragmentClient.cs | 25 ++++ .../Moqs/ApiClients/MockSchemaClient.cs | 3 +- ...tListPolicyFragments_success_response.json | 25 ++++ 26 files changed, 547 insertions(+), 26 deletions(-) create mode 100644 src/ArmTemplates/Common/API/Clients/Abstractions/IPolicyFragmentsClient.cs create mode 100644 src/ArmTemplates/Common/API/Clients/PolicyFragments/PolicyFragmentsClient.cs create mode 100644 src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsProperties.cs create mode 100644 src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResource.cs create mode 100644 src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResources.cs create mode 100644 src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IPolicyFragmentsExtractor.cs create mode 100644 src/ArmTemplates/Extractor/EntityExtractors/PolicyFragmentsExtractor.cs create mode 100644 src/ArmTemplates/Extractor/Utilities/DataProcessors/Absctraction/IPolicyFragmentDataProcessor.cs create mode 100644 src/ArmTemplates/Extractor/Utilities/DataProcessors/PolicyFragmentDataProcessor.cs create mode 100644 tests/ArmTemplates.Tests/Extractor/Scenarios/PolicyFragmentsExtractorTests.cs create mode 100644 tests/ArmTemplates.Tests/Moqs/ApiClients/MockPolicyFragmentClient.cs create mode 100644 tests/ArmTemplates.Tests/Resources/ApiClientJsonResponses/ApiManagementListPolicyFragments_success_response.json diff --git a/src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs b/src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs index 9cc4c9b5..19d69746 100644 --- a/src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs +++ b/src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs @@ -24,6 +24,7 @@ using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.NamedValues; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ProductApis; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Schemas; @@ -68,6 +69,7 @@ public class ExtractorExecutor readonly IApiManagementServiceExtractor apiManagementServiceExtractor; readonly ISchemaExtractor schemaExtractor; readonly IOpenIdConnectProviderExtractor openIdConnectProviderExtractor; + readonly IPolicyFragmentsExtractor policyFragmentsExtractor; public ExtractorExecutor( ILogger logger, @@ -92,7 +94,8 @@ public ExtractorExecutor( IIdentityProviderExtractor identityProviderExtractor, IApiManagementServiceExtractor apiManagementServiceExtractor, ISchemaExtractor schemaExtractor, - IOpenIdConnectProviderExtractor openIdConnectProviderExtractor) + IOpenIdConnectProviderExtractor openIdConnectProviderExtractor, + IPolicyFragmentsExtractor policyFragmentsExtractor) { this.logger = logger; this.apisClient = apisClient; @@ -117,6 +120,7 @@ public ExtractorExecutor( this.apiManagementServiceExtractor = apiManagementServiceExtractor; this.schemaExtractor = schemaExtractor; this.openIdConnectProviderExtractor = openIdConnectProviderExtractor; + this.policyFragmentsExtractor = policyFragmentsExtractor; } /// @@ -146,7 +150,8 @@ public static ExtractorExecutor BuildExtractorExecutor( IIdentityProviderExtractor identityProviderExtractor = null, IApiManagementServiceExtractor apiManagementServiceExtractor = null, ISchemaExtractor schemaExtractor = null, - IOpenIdConnectProviderExtractor openIdConnectProviderExtractor = null) + IOpenIdConnectProviderExtractor openIdConnectProviderExtractor = null, + IPolicyFragmentsExtractor policyFragmentsExtractor = null) => new ExtractorExecutor( logger, apisClient, @@ -170,7 +175,8 @@ public static ExtractorExecutor BuildExtractorExecutor( identityProviderExtractor, apiManagementServiceExtractor, schemaExtractor, - openIdConnectProviderExtractor); + openIdConnectProviderExtractor, + policyFragmentsExtractor); public void SetExtractorParameters(ExtractorParameters extractorParameters) { @@ -469,7 +475,8 @@ public async Task> GenerateMasterTemplateAsync GroupTemplateResources groupTemplateResources = null, IdentityProviderResources identityProviderTemplateResources = null, SchemaTemplateResources schemaTemplateResources = null, - OpenIdConnectProviderResources openIdConnectProviderResources = null) + OpenIdConnectProviderResources openIdConnectProviderResources = null, + PolicyFragmentsResources policyFragmentsResources = null) { if (string.IsNullOrEmpty(this.extractorParameters.LinkedTemplatesBaseUrl)) { @@ -483,7 +490,7 @@ public async Task> GenerateMasterTemplateAsync this.extractorParameters, apiTemplateResources, policyTemplateResources, apiVersionSetTemplateResources, productsTemplateResources, productApisTemplateResources, apiTagsTemplateResources, loggersTemplateResources, backendsTemplateResources, authorizationServersTemplateResources, namedValuesTemplateResources, tagTemplateResources, - groupTemplateResources, identityProviderTemplateResources, schemaTemplateResources, openIdConnectProviderResources); + groupTemplateResources, identityProviderTemplateResources, schemaTemplateResources, openIdConnectProviderResources, policyFragmentsResources); if (masterTemplate?.HasResources() == true) { @@ -813,6 +820,29 @@ await FileWriter.SaveAsJsonAsync( return schemasTemplate; } + /// + /// Generates policy fragments templates in the desired folder + /// + /// name of base folder where to save output files + /// generated policy fragments template + public async Task> GeneratePolicyFragmentsTemplateAsync(List apiPolicies, string baseFilesGenerationDirectory) + { + this.logger.LogInformation("Started generation of policy fragments template..."); + + var policyFragmentTemplate = await this.policyFragmentsExtractor.GeneratePolicyFragmentsTemplateAsync(apiPolicies, this.extractorParameters); + + if (policyFragmentTemplate?.HasResources() == true) + { + await FileWriter.SaveAsJsonAsync( + policyFragmentTemplate, + directory: baseFilesGenerationDirectory, + fileName: this.extractorParameters.FileNames.PolicyFragments); + } + + this.logger.LogInformation("Finished generation of policy fragments template..."); + return policyFragmentTemplate; + } + /// /// Generates split api templates / folders for each api in this sourceApim /// @@ -995,6 +1025,7 @@ async Task GenerateTemplates( var identityProviderTemplate = await this.GenerateIdentityProviderTemplateAsync(baseFilesGenerationDirectory); var openIdConnectProviderTemplate = await this.GenerateOpenIdConnectProviderTemplateAsync(baseFilesGenerationDirectory); var schemasTempate = await this.GenerateSchemasTemplateAsync(baseFilesGenerationDirectory); + var policyFragmentTemplate = await this.GeneratePolicyFragmentsTemplateAsync(apiTemplate.TypedResources.GetAllPolicies(), baseFilesGenerationDirectory); await this.GenerateGatewayTemplateAsync(singleApiName, baseFilesGenerationDirectory); await this.GenerateGatewayApiTemplateAsync(singleApiName, multipleApiNames, baseFilesGenerationDirectory); await this.GenerateApiManagementServiceTemplate(baseFilesGenerationDirectory); @@ -1016,7 +1047,8 @@ await this.GenerateMasterTemplateAsync( groupTemplateResources: groupTemplate.TypedResources, identityProviderTemplateResources: identityProviderTemplate.TypedResources, schemaTemplateResources: schemasTempate.TypedResources, - openIdConnectProviderResources: openIdConnectProviderTemplate.TypedResources); + openIdConnectProviderResources: openIdConnectProviderTemplate.TypedResources, + policyFragmentsResources: policyFragmentTemplate.TypedResources); } diff --git a/src/ArmTemplates/Common/API/Clients/Abstractions/IPolicyFragmentsClient.cs b/src/ArmTemplates/Common/API/Clients/Abstractions/IPolicyFragmentsClient.cs new file mode 100644 index 00000000..cbd75ad4 --- /dev/null +++ b/src/ArmTemplates/Common/API/Clients/Abstractions/IPolicyFragmentsClient.cs @@ -0,0 +1,17 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions +{ + public interface IPolicyFragmentsClient + { + Task> GetAllAsync(ExtractorParameters extractorParameters); + } +} diff --git a/src/ArmTemplates/Common/API/Clients/PolicyFragments/PolicyFragmentsClient.cs b/src/ArmTemplates/Common/API/Clients/PolicyFragments/PolicyFragmentsClient.cs new file mode 100644 index 00000000..394d6650 --- /dev/null +++ b/src/ArmTemplates/Common/API/Clients/PolicyFragments/PolicyFragmentsClient.cs @@ -0,0 +1,43 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.PolicyFragments +{ + public class PolicyFragmentsClient : ApiClientBase, IPolicyFragmentsClient + { + const string GetAllRequest = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/policyFragments?api-version={4}&format=rawxml"; + + readonly IPolicyFragmentDataProcessor policyFragmentDataProcessor; + + public PolicyFragmentsClient( + IHttpClientFactory httpClientFactory, + IPolicyFragmentDataProcessor policyFragmentDataProcessor): base(httpClientFactory) + { + this.policyFragmentDataProcessor = policyFragmentDataProcessor; + } + + public async Task> GetAllAsync(ExtractorParameters extractorParameters) + { + var (azToken, azSubId) = await this.Auth.GetAccessToken(); + + var requestUrl = string.Format(GetAllRequest, + this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, GlobalConstants.ApiVersionPreview); + + var policyFragments = await this.GetPagedResponseAsync(azToken, requestUrl); + this.policyFragmentDataProcessor.ProcessData(policyFragments, extractorParameters); + + return policyFragments; + } + } +} diff --git a/src/ArmTemplates/Common/Constants/GlobalConstants.cs b/src/ArmTemplates/Common/Constants/GlobalConstants.cs index 58e171ad..c7d9dca0 100644 --- a/src/ArmTemplates/Common/Constants/GlobalConstants.cs +++ b/src/ArmTemplates/Common/Constants/GlobalConstants.cs @@ -16,6 +16,7 @@ public static class GlobalConstants public const string ExtractDescription = "Extract an existing API Management instance"; public const string ApiVersion = "2021-08-01"; + public const string ApiVersionPreview = "2021-12-01-preview"; public const string ArmApiVersion = "2022-01-01"; public const int NumOfRecords = 100; diff --git a/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs b/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs index 3f7c740b..72b5e7c9 100644 --- a/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs +++ b/src/ArmTemplates/Common/Constants/ResourceTypeConstants.cs @@ -38,5 +38,6 @@ public static class ResourceTypeConstants public const string ApiManagementService = "Microsoft.ApiManagement/service"; public const string Schema = "Microsoft.ApiManagement/service/schemas"; public const string OpenIdConnectProvider = "Microsoft.ApiManagement/service/openidConnectProviders"; + public const string PolicyFragments = "Microsoft.ApiManagement/service/policyFragments"; } } \ No newline at end of file diff --git a/src/ArmTemplates/Common/FileHandlers/FileNameGenerator.cs b/src/ArmTemplates/Common/FileHandlers/FileNameGenerator.cs index b18a970e..19a8e21a 100644 --- a/src/ArmTemplates/Common/FileHandlers/FileNameGenerator.cs +++ b/src/ArmTemplates/Common/FileHandlers/FileNameGenerator.cs @@ -39,6 +39,7 @@ public static FileNames GenerateFileNames(string baseFileName) ApiManagementService = $@"{baseFileName}api-management-service.template.json", TagApi = $@"{baseFileName}apiTags.template.json", Schema = $@"{baseFileName}schemas.template.json", + PolicyFragments = $@"{baseFileName}policy-fragments.template.json", Parameters = $@"{baseFileName}parameters.json", LinkedMaster = $@"{baseFileName}master.template.json", Apis = "/Apis", diff --git a/src/ArmTemplates/Common/FileHandlers/FileNames.cs b/src/ArmTemplates/Common/FileHandlers/FileNames.cs index 21b3217b..2fd8a68d 100644 --- a/src/ArmTemplates/Common/FileHandlers/FileNames.cs +++ b/src/ArmTemplates/Common/FileHandlers/FileNames.cs @@ -41,6 +41,8 @@ public class FileNames public string Schema { get; set; } + public string PolicyFragments { get; set; } + public string Parameters { get; set; } // linked property outputs 1 master template diff --git a/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsProperties.cs b/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsProperties.cs new file mode 100644 index 00000000..b4acdd33 --- /dev/null +++ b/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsProperties.cs @@ -0,0 +1,16 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments +{ + public class PolicyFragmentsProperties + { + public string Description { get; set; } + + public string Format { get; set; } + + public string Value { get; set; } + } +} diff --git a/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResource.cs b/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResource.cs new file mode 100644 index 00000000..2e52d189 --- /dev/null +++ b/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResource.cs @@ -0,0 +1,18 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using Newtonsoft.Json; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments +{ + public class PolicyFragmentsResource : TemplateResource + { + [JsonIgnore] + public string OriginalName { get; set; } + + public PolicyFragmentsProperties Properties { get; set; } + } +} diff --git a/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResources.cs b/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResources.cs new file mode 100644 index 00000000..f91f92ae --- /dev/null +++ b/src/ArmTemplates/Common/Templates/PolicyFragments/PolicyFragmentsResources.cs @@ -0,0 +1,26 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments +{ + public class PolicyFragmentsResources : ITemplateResources + { + public List PolicyFragments { get; set; } = new(); + + public TemplateResource[] BuildTemplateResources() + { + return this.PolicyFragments.ToArray(); + } + + public bool HasContent() + { + return !this.PolicyFragments.IsNullOrEmpty(); + } + } +} diff --git a/src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IMasterTemplateExtractor.cs b/src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IMasterTemplateExtractor.cs index 4c6dda8b..d5721cba 100644 --- a/src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IMasterTemplateExtractor.cs +++ b/src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IMasterTemplateExtractor.cs @@ -15,6 +15,7 @@ using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.NamedValues; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ProductApis; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Schemas; @@ -42,6 +43,7 @@ Template GenerateLinkedMasterTemplate( GroupTemplateResources groupTemplateResources = null, IdentityProviderResources identityProviderTemplateResources = null, SchemaTemplateResources schemaTemplateResources = null, - OpenIdConnectProviderResources openIdConnectProviderResources = null); + OpenIdConnectProviderResources openIdConnectProviderResources = null, + PolicyFragmentsResources policyFragmentsResources = null); } } diff --git a/src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IPolicyFragmentsExtractor.cs b/src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IPolicyFragmentsExtractor.cs new file mode 100644 index 00000000..8df8eaed --- /dev/null +++ b/src/ArmTemplates/Extractor/EntityExtractors/Abstractions/IPolicyFragmentsExtractor.cs @@ -0,0 +1,19 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors.Abstractions +{ + public interface IPolicyFragmentsExtractor + { + Task> GeneratePolicyFragmentsTemplateAsync(List apiTemplatePolicies, ExtractorParameters extractorParameters); + } +} diff --git a/src/ArmTemplates/Extractor/EntityExtractors/MasterTemplateExtractor.cs b/src/ArmTemplates/Extractor/EntityExtractors/MasterTemplateExtractor.cs index 5ed63101..28889121 100644 --- a/src/ArmTemplates/Extractor/EntityExtractors/MasterTemplateExtractor.cs +++ b/src/ArmTemplates/Extractor/EntityExtractors/MasterTemplateExtractor.cs @@ -27,6 +27,7 @@ using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.IdentityProviders; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Schemas; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors { @@ -59,7 +60,8 @@ public Template GenerateLinkedMasterTemplate( GroupTemplateResources groupTemplateResources = null, IdentityProviderResources identityProviderTemplateResources = null, SchemaTemplateResources schemaTemplateResources = null, - OpenIdConnectProviderResources openIdConnectProviderResources = null) + OpenIdConnectProviderResources openIdConnectProviderResources = null, + PolicyFragmentsResources policyFragmentsResources = null) { var masterTemplate = this.templateBuilder .GenerateEmptyTemplate() @@ -76,6 +78,7 @@ public Template GenerateLinkedMasterTemplate( var apiDependsOn = new List(); var productApiDependsOn = new List(); var apiTagDependsOn = new List(); + var globalPolicyDependsOn = new List(); if (namedValuesTemplateResources?.HasContent() == true) { @@ -83,6 +86,7 @@ public Template GenerateLinkedMasterTemplate( const string NamedValuesTemplateName = "namedValuesTemplate"; dependsOnNamedValues = new string[] { $"[resourceId('{ResourceTypeConstants.ArmDeployments}', '{NamedValuesTemplateName}')]" }; + globalPolicyDependsOn.AddRange(dependsOnNamedValues); apiDependsOn.Add($"[resourceId('{ResourceTypeConstants.ArmDeployments}', '{NamedValuesTemplateName}')]"); var namedValuesUri = this.GenerateLinkedTemplateUri(fileNames.NamedValues, extractorParameters); var namedValuesDeployment = CreateLinkedMasterTemplateResourceForPropertyTemplate( @@ -94,6 +98,19 @@ public Template GenerateLinkedMasterTemplate( masterResources.DeploymentResources.Add(namedValuesDeployment); } + if (policyFragmentsResources?.HasContent() == true) + { + this.logger.LogDebug("Adding policy fragments to master template"); + const string PolicyFragmentsTemplate = "policyFragmentsTemplate"; + + var policyFragmentUri = this.GenerateLinkedTemplateUri(fileNames.PolicyFragments, extractorParameters); + var policyFragmentDeployment = CreateLinkedMasterTemplateResource(PolicyFragmentsTemplate, policyFragmentUri, Array.Empty()); + + masterResources.DeploymentResources.Add(policyFragmentDeployment); + apiDependsOn.Add($"[resourceId('{ResourceTypeConstants.ArmDeployments}', '{PolicyFragmentsTemplate}')]"); + globalPolicyDependsOn.Add($"[resourceId('{ResourceTypeConstants.ArmDeployments}', '{PolicyFragmentsTemplate}')]"); + } + if (policyTemplateResources?.HasContent() == true) { this.logger.LogDebug("Adding policy to master template"); @@ -104,7 +121,7 @@ public Template GenerateLinkedMasterTemplate( var policyDeployment = CreateLinkedMasterTemplateResourceWithPolicyToken( GlobalServicePolicyTemplate, globalServicePolicyUri, - dependsOnNamedValues, + globalPolicyDependsOn.ToArray(), extractorParameters); masterResources.DeploymentResources.Add(policyDeployment); diff --git a/src/ArmTemplates/Extractor/EntityExtractors/PolicyFragmentsExtractor.cs b/src/ArmTemplates/Extractor/EntityExtractors/PolicyFragmentsExtractor.cs new file mode 100644 index 00000000..a8a6a5f0 --- /dev/null +++ b/src/ArmTemplates/Extractor/EntityExtractors/PolicyFragmentsExtractor.cs @@ -0,0 +1,75 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Builders.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; +using Microsoft.Extensions.Logging; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors +{ + public class PolicyFragmentsExtractor : IPolicyFragmentsExtractor + { + readonly ILogger logger; + readonly IPolicyFragmentsClient policyFragmentsClient; + readonly ITemplateBuilder templateBuilder; + + public PolicyFragmentsExtractor( + ILogger logger, + ITemplateBuilder templateBuilder, + IPolicyFragmentsClient policyFragmentsClient) + { + this.logger = logger; + this.templateBuilder = templateBuilder; + this.policyFragmentsClient = policyFragmentsClient; + } + + public async Task> GeneratePolicyFragmentsTemplateAsync(List apiTemplatePolicies, ExtractorParameters extractorParameters) + { + var policyFragmentsTemplate = this.templateBuilder + .GenerateTemplateWithApimServiceNameProperty() + .Build(); + + var policyFragments = await this.policyFragmentsClient.GetAllAsync(extractorParameters); + if (policyFragments.IsNullOrEmpty()) + { + this.logger.LogWarning($"No policy fragments were found for '{extractorParameters.SourceApimName}' at '{extractorParameters.ResourceGroup}'"); + return policyFragmentsTemplate; + } + + foreach (var policyFragment in policyFragments) + { + policyFragment.Type = ResourceTypeConstants.PolicyFragments; + policyFragment.Name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{policyFragment.Name}')]"; + policyFragment.ApiVersion = GlobalConstants.ApiVersionPreview; + + if (string.IsNullOrEmpty(extractorParameters.SingleApiName)) + { + policyFragmentsTemplate.TypedResources.PolicyFragments.Add(policyFragment); + } + else + { + var policyFragmentReferenceString = $"fragment-id=\"{policyFragment.OriginalName}\""; + var isReferencedInPolicy = apiTemplatePolicies?.Any(x => x.Properties.PolicyContent.Contains(policyFragmentReferenceString)); + if (isReferencedInPolicy == true) + { + policyFragmentsTemplate.TypedResources.PolicyFragments.Add(policyFragment); + } + } + } + + return policyFragmentsTemplate; + } + } +} diff --git a/src/ArmTemplates/Extractor/Utilities/DataProcessors/Absctraction/IPolicyFragmentDataProcessor.cs b/src/ArmTemplates/Extractor/Utilities/DataProcessors/Absctraction/IPolicyFragmentDataProcessor.cs new file mode 100644 index 00000000..047e54c3 --- /dev/null +++ b/src/ArmTemplates/Extractor/Utilities/DataProcessors/Absctraction/IPolicyFragmentDataProcessor.cs @@ -0,0 +1,16 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction +{ + public interface IPolicyFragmentDataProcessor + { + void ProcessData(List templates, ExtractorParameters extractorParameters); + } +} diff --git a/src/ArmTemplates/Extractor/Utilities/DataProcessors/PolicyFragmentDataProcessor.cs b/src/ArmTemplates/Extractor/Utilities/DataProcessors/PolicyFragmentDataProcessor.cs new file mode 100644 index 00000000..1ec465df --- /dev/null +++ b/src/ArmTemplates/Extractor/Utilities/DataProcessors/PolicyFragmentDataProcessor.cs @@ -0,0 +1,29 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors +{ + public class PolicyFragmentDataProcessor: IPolicyFragmentDataProcessor + { + public void ProcessData(List policyFragmentResources, ExtractorParameters extractorParameters) + { + if (policyFragmentResources.IsNullOrEmpty()) + { + return; + } + + foreach (var policyFragment in policyFragmentResources) + { + policyFragment.OriginalName = policyFragment.Name; + } + } + } +} diff --git a/src/ArmTemplates/ServiceExtensions.cs b/src/ArmTemplates/ServiceExtensions.cs index 888aaf31..2cb45014 100644 --- a/src/ArmTemplates/ServiceExtensions.cs +++ b/src/ArmTemplates/ServiceExtensions.cs @@ -38,6 +38,7 @@ using Microsoft.Extensions.Http; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Schemas; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.OpenIdConnectProviders; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.PolicyFragments; namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates { @@ -75,6 +76,7 @@ static void SetupDataProcessors(IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } static void SetupCommands(IServiceCollection services) @@ -141,6 +143,7 @@ static void SetupExtractors(IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } static void SetupApiClients(IServiceCollection services) @@ -164,6 +167,7 @@ static void SetupApiClients(IServiceCollection services) services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); } } } \ No newline at end of file diff --git a/tests/ArmTemplates.Tests/Extractor/Scenarios/MasterTemplateExtractorTests.cs b/tests/ArmTemplates.Tests/Extractor/Scenarios/MasterTemplateExtractorTests.cs index cafdcfa0..1dec6ef2 100644 --- a/tests/ArmTemplates.Tests/Extractor/Scenarios/MasterTemplateExtractorTests.cs +++ b/tests/ArmTemplates.Tests/Extractor/Scenarios/MasterTemplateExtractorTests.cs @@ -18,6 +18,10 @@ using Xunit; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.IdentityProviders; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Schemas; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.PolicyFragments; +using System.Linq; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Apis; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy; namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Extractor.Scenarios { @@ -121,13 +125,47 @@ public async Task GenerateMasterTemplates_ProperlyLaysTheInformation() } }; + var policyFragmentResources = new PolicyFragmentsResources() + { + PolicyFragments = new() + { + new PolicyFragmentsResource() + { + OriginalName = "originalName", + } + } + }; + + var apisResources = new ApiTemplateResources() + { + Apis = new() + { + new ApiTemplateResource() + { + Name = "originalName", + } + } + }; + + var globalPolicyTemplate = new PolicyTemplateResources() + { + GlobalServicePolicy = new() + { + Name = "originalName", + } + }; + // act var masterTemplate = await extractorExecutor.GenerateMasterTemplateAsync( currentTestDirectory, tagTemplateResources: tagTemplateResources, groupTemplateResources: groupTemplateResources, identityProviderTemplateResources: identityProviderResources, - schemaTemplateResources: schemaResources); + schemaTemplateResources: schemaResources, + policyFragmentsResources: policyFragmentResources, + apiTemplateResources: apisResources, + policyTemplateResources: globalPolicyTemplate + ); File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.LinkedMaster)).Should().BeTrue(); @@ -146,13 +184,21 @@ public async Task GenerateMasterTemplates_ProperlyLaysTheInformation() masterTemplate.Parameters.Should().ContainKey(ParameterNames.ApiOauth2ScopeSettings); masterTemplate.Parameters.Should().ContainKey(ParameterNames.SecretValues); - masterTemplate.TypedResources.DeploymentResources.Should().HaveCount(4); - masterTemplate.Resources.Should().HaveCount(4); + masterTemplate.TypedResources.DeploymentResources.Should().HaveCount(7); + masterTemplate.Resources.Should().HaveCount(7); foreach(var deploymentResource in masterTemplate.TypedResources.DeploymentResources) { deploymentResource.Type.Should().Be(ResourceTypeConstants.ArmDeployments); deploymentResource.Properties.Should().NotBeNull(); } + + //verify depends on values + var apiDeployment = masterTemplate.TypedResources.DeploymentResources.Single(x => x.Name == "apisTemplate"); + apiDeployment.DependsOn.Single(x => x.Contains("policyFragmentsTemplate")).Should().NotBeNull(); + apiDeployment.DependsOn.Single(x => x.Contains("globalServicePolicyTemplate")).Should().NotBeNull(); + + var globalPolicyDeployment = masterTemplate.TypedResources.DeploymentResources.Single(x => x.Name == "globalServicePolicyTemplate"); + globalPolicyDeployment.DependsOn.Single(x => x.Contains("policyFragmentsTemplate")).Should().NotBeNull(); } } } diff --git a/tests/ArmTemplates.Tests/Extractor/Scenarios/PolicyFragmentsExtractorTests.cs b/tests/ArmTemplates.Tests/Extractor/Scenarios/PolicyFragmentsExtractorTests.cs new file mode 100644 index 00000000..ab9ed152 --- /dev/null +++ b/tests/ArmTemplates.Tests/Extractor/Scenarios/PolicyFragmentsExtractorTests.cs @@ -0,0 +1,109 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using FluentAssertions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Commands.Executors; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Builders; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Extractor.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Moqs.ApiClients; +using Xunit; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Extractor.Scenarios +{ + [Trait("Category", "Policy fragments Extraction")] + public class PolicyFragmentsExtractorTests : ExtractorMockerWithOutputTestsBase + { + public PolicyFragmentsExtractorTests() : base("policy-fragments-tests") + { + } + + [Fact] + public async Task GeneratePolicyFragmentTemplates_ProperlyParsesResponse() + { + // arrange + var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GeneratePolicyFragmentTemplates_ProperlyParsesResponse)); + + var extractorConfig = this.GetDefaultExtractorConsoleAppConfiguration( + apiName: ""); + var extractorParameters = new ExtractorParameters(extractorConfig); + var fileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListPolicyFragments_success_response.json"); + var mockedClient = await MockPolicyFragmentClient.GetMockedHttpPolicyFragmentClient(fileLocation); + var policyFragmentExtractor = new PolicyFragmentsExtractor(this.GetTestLogger(), new TemplateBuilder(), mockedClient); + + var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor( + this.GetTestLogger(), + policyFragmentsExtractor: policyFragmentExtractor); + extractorExecutor.SetExtractorParameters(extractorParameters); + + // act + var policyFragments = await extractorExecutor.GeneratePolicyFragmentsTemplateAsync(null, currentTestDirectory); + + // assert + File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.PolicyFragments)).Should().BeTrue(); + + policyFragments.Parameters.Should().ContainKey(ParameterNames.ApimServiceName); + policyFragments.TypedResources.PolicyFragments.Count().Should().Be(2); + + var policyFragment1 = policyFragments.TypedResources.PolicyFragments.First(x => x.OriginalName.Equals("policyFragment1")); + policyFragment1.Should().NotBeNull(); + policyFragment1.Properties.Description.Should().Be("A policy fragment example 1"); + + var policyFragment2 = policyFragments.TypedResources.PolicyFragments.First(x => x.OriginalName.Equals("policyFragment2")); + policyFragment2.Should().NotBeNull(); + policyFragment2.Properties.Description.Should().Be("A policy fragment example 2"); + + } + + [Fact] + public async Task GeneratePolicyFragmentTemplates_GeneratesPolicyFragmentTemplateForSingleApi() + { + // arrange + var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GeneratePolicyFragmentTemplates_GeneratesPolicyFragmentTemplateForSingleApi)); + + var extractorConfig = this.GetDefaultExtractorConsoleAppConfiguration( + apiName: "api"); + var extractorParameters = new ExtractorParameters(extractorConfig); + var fileLocation = Path.Combine(MockClientUtils.ApiClientJsonResponsesPath, "ApiManagementListPolicyFragments_success_response.json"); + var mockedClient = await MockPolicyFragmentClient.GetMockedHttpPolicyFragmentClient(fileLocation); + var policyFragmentExtractor = new PolicyFragmentsExtractor(this.GetTestLogger(), new TemplateBuilder(), mockedClient); + + var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor( + this.GetTestLogger(), + policyFragmentsExtractor: policyFragmentExtractor); + extractorExecutor.SetExtractorParameters(extractorParameters); + + var apiPolicies = new List() + { + new PolicyTemplateResource() + { + Properties = new PolicyTemplateProperties() + { + PolicyContent = "fragment-id=\"policyFragment1\"" + } + } + }; + // act + var policyFragments = await extractorExecutor.GeneratePolicyFragmentsTemplateAsync(apiPolicies, currentTestDirectory); + + // assert + File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.PolicyFragments)).Should().BeTrue(); + + policyFragments.Parameters.Should().ContainKey(ParameterNames.ApimServiceName); + policyFragments.TypedResources.PolicyFragments.Count().Should().Be(1); + + var policyFragment1 = policyFragments.TypedResources.PolicyFragments.First(x => x.OriginalName.Equals("policyFragment1")); + policyFragment1.Should().NotBeNull(); + policyFragment1.Properties.Description.Should().Be("A policy fragment example 1"); + } + } +} diff --git a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs index e440f7d8..a8828903 100644 --- a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs +++ b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockApiSchemaClient.cs @@ -11,9 +11,7 @@ using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.FileHandlers; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ApiSchemas; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; -using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities; using Moq; -using Moq.Protected; namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Moqs.ApiClients { @@ -83,8 +81,7 @@ public static IApiSchemaClient GetMockedApiClientWithGraphQLSchemaValues() public static async Task GetMockedHttpApiSchemaClient(string responseFileLocation) { var mockedClient= new Mock(MockBehavior.Strict, await MockClientUtils.GenerateMockedIHttpClientFactoryWithResponse(responseFileLocation)); - mockedClient.Protected() - .Setup("Auth").Returns(MockClientUtils.GetMockedAzureClient()); + MockClientUtils.MockAuthOfApiClient(mockedClient); return mockedClient.Object; } diff --git a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockClientUtils.cs b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockClientUtils.cs index f44f8ad0..c0a0c83a 100644 --- a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockClientUtils.cs +++ b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockClientUtils.cs @@ -7,6 +7,7 @@ using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.FileHandlers; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities; @@ -57,5 +58,11 @@ public static async Task GenerateMockedIHttpClientFactoryWit return httpClientFactory.Object; } + + public static void MockAuthOfApiClient(Mock mockedClient) where T: ApiClientBase + { + mockedClient.Protected() + .Setup("Auth").Returns(GetMockedAzureClient()); + } } } diff --git a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockGroupsClient.cs b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockGroupsClient.cs index 8f5dbdf0..b3ed97da 100644 --- a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockGroupsClient.cs +++ b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockGroupsClient.cs @@ -10,10 +10,8 @@ using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Groups; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; -using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction; using Moq; -using Moq.Protected; namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Moqs.ApiClients { @@ -95,8 +93,7 @@ public static async Task GetMockedHttpGroupClient(string response { var mockedProcessor = new Mock(MockBehavior.Loose).Object; var mockGroupsClient = new Mock(MockBehavior.Strict, await MockClientUtils.GenerateMockedIHttpClientFactoryWithResponse(responseFileLocation) , mockedProcessor); - mockGroupsClient.Protected() - .Setup("Auth").Returns(MockClientUtils.GetMockedAzureClient()); + MockClientUtils.MockAuthOfApiClient(mockGroupsClient); return mockGroupsClient.Object; } diff --git a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockOpenIdConnectProviderClient.cs b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockOpenIdConnectProviderClient.cs index 37591135..7bcb6b32 100644 --- a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockOpenIdConnectProviderClient.cs +++ b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockOpenIdConnectProviderClient.cs @@ -9,11 +9,9 @@ using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.OpenIdConnectProviders; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.OpenIdConnectProviders; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models; -using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction; using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Moqs.ApiClients; using Moq; -using Moq.Protected; namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Moqs.IdentityProviderClients { @@ -71,8 +69,7 @@ public static async Task GetMockedHttpOpenIdConne { var mockedProcessor = new Mock(MockBehavior.Loose).Object; var mockedClient = new Mock(MockBehavior.Strict, await MockClientUtils.GenerateMockedIHttpClientFactoryWithResponse(responseFileLocation), mockedProcessor); - mockedClient.Protected() - .Setup("Auth").Returns(MockClientUtils.GetMockedAzureClient()); + MockClientUtils.MockAuthOfApiClient(mockedClient); return mockedClient.Object; } diff --git a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockPolicyFragmentClient.cs b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockPolicyFragmentClient.cs new file mode 100644 index 00000000..fd5508f9 --- /dev/null +++ b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockPolicyFragmentClient.cs @@ -0,0 +1,25 @@ +// -------------------------------------------------------------------------- +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// -------------------------------------------------------------------------- + +using System.Threading.Tasks; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Abstractions; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.PolicyFragments; +using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors; +using Moq; + +namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Tests.Moqs.ApiClients +{ + class MockPolicyFragmentClient + { + public static async Task GetMockedHttpPolicyFragmentClient(string responseFileLocation) + { + var mockedProcessor = new PolicyFragmentDataProcessor(); + var mockedClient = new Mock(MockBehavior.Strict, await MockClientUtils.GenerateMockedIHttpClientFactoryWithResponse(responseFileLocation) , mockedProcessor); + MockClientUtils.MockAuthOfApiClient(mockedClient); + + return mockedClient.Object; + } + } +} diff --git a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockSchemaClient.cs b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockSchemaClient.cs index a9a2d5c4..db378c45 100644 --- a/tests/ArmTemplates.Tests/Moqs/ApiClients/MockSchemaClient.cs +++ b/tests/ArmTemplates.Tests/Moqs/ApiClients/MockSchemaClient.cs @@ -19,8 +19,7 @@ public static async Task GetMockedHttpSchemaClient(string respon { var dataProcessor = new SchemaDataProcessor(); var mockedClient = new Mock(MockBehavior.Strict, await MockClientUtils.GenerateMockedIHttpClientFactoryWithResponse(responseFileLocation) , dataProcessor); - mockedClient.Protected() - .Setup("Auth").Returns(MockClientUtils.GetMockedAzureClient()); + MockClientUtils.MockAuthOfApiClient(mockedClient); return mockedClient.Object; } diff --git a/tests/ArmTemplates.Tests/Resources/ApiClientJsonResponses/ApiManagementListPolicyFragments_success_response.json b/tests/ArmTemplates.Tests/Resources/ApiClientJsonResponses/ApiManagementListPolicyFragments_success_response.json new file mode 100644 index 00000000..1520094f --- /dev/null +++ b/tests/ArmTemplates.Tests/Resources/ApiClientJsonResponses/ApiManagementListPolicyFragments_success_response.json @@ -0,0 +1,25 @@ +{ + "value": [ + { + "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.ApiManagement/service/apimService1/policyFragments/policyFragment1", + "type": "Microsoft.ApiManagement/service/policyFragments", + "name": "policyFragment1", + "properties": { + "format": "xml", + "description": "A policy fragment example 1", + "value": "" + } + }, + { + "id": "/subscriptions/subid/resourceGroups/rg1/providers/Microsoft.ApiManagement/service/apimService1/policyFragments/policyFragment2", + "type": "Microsoft.ApiManagement/service/policyFragments", + "name": "policyFragment2", + "properties": { + "format": "xml", + "description": "A policy fragment example 2", + "value": "" + } + } + ], + "count": 2 +} \ No newline at end of file