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

Commit a846968

Browse files
f-alizadaFarhad Alizada
andauthored
Add possibility to override group/product guid to system predefined (#709)
* Add possibility to override group guid to system predefined * Implement Product/ProductAPI name override functionality * Add product data processor tests * Save original name for groups in data process * Add ProductApiDataProcessor tests * Cover case with single api extraction with overrided names of product Co-authored-by: Farhad Alizada <falizada@microsoft.com>
1 parent 4accf35 commit a846968

24 files changed

+631
-44
lines changed

src/ArmTemplates/Commands/Configurations/ExtractorConsoleAppConfiguration.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,5 +92,11 @@ public class ExtractorConsoleAppConfiguration
9292

9393
[Option(longName: "extractGateways", HelpText = "Attempt to extract information about Self-Hosted gateways")]
9494
public string ExtractGateways { get; set; }
95+
96+
[Option(longName: "overrideGroupGuids", HelpText = "Override group GUID identification to system generated")]
97+
public string OverrideGroupGuids { get; set; }
98+
99+
[Option(longName: "overrideProductGuids", HelpText = "Override product GUID identification to system generated")]
100+
public string OverrideProductGuids { get; set; }
95101
}
96102
}

src/ArmTemplates/Common/API/Clients/Groups/GroupsClient.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants;
1010
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Groups;
1111
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
12+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction;
1213

1314
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Groups
1415
{
@@ -17,14 +18,24 @@ public class GroupsClient : ApiClientBase, IGroupsClient
1718
const string GetAllGroupsLinkedToProductRequest = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/products/{4}/groups?api-version={5}";
1819
const string GetAllRequest = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/groups?api-version={4}";
1920

21+
readonly IGroupDataProcessor groupDataProcessor;
22+
23+
public GroupsClient(IGroupDataProcessor groupDataProcessor)
24+
{
25+
this.groupDataProcessor = groupDataProcessor;
26+
}
27+
2028
public async Task<List<GroupTemplateResource>> GetAllAsync(ExtractorParameters extractorParameters)
2129
{
2230
var (azToken, azSubId) = await this.Auth.GetAccessToken();
2331

2432
var requestUrl = string.Format(GetAllRequest,
2533
this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, GlobalConstants.ApiVersion);
2634

27-
return await this.GetPagedResponseAsync<GroupTemplateResource>(azToken, requestUrl);
35+
var groupTemplates = await this.GetPagedResponseAsync<GroupTemplateResource>(azToken, requestUrl);
36+
this.groupDataProcessor.ProcessData(groupTemplates, extractorParameters);
37+
38+
return groupTemplates;
2839
}
2940

3041
public async Task<List<GroupTemplateResource>> GetAllLinkedToProductAsync(string productName, ExtractorParameters extractorParameters)
@@ -34,7 +45,10 @@ public async Task<List<GroupTemplateResource>> GetAllLinkedToProductAsync(string
3445
var requestUrl = string.Format(GetAllGroupsLinkedToProductRequest,
3546
this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, productName, GlobalConstants.ApiVersion);
3647

37-
return await this.GetPagedResponseAsync<GroupTemplateResource>(azToken, requestUrl);
48+
var groupTemplates = await this.GetPagedResponseAsync<GroupTemplateResource>(azToken, requestUrl);
49+
this.groupDataProcessor.ProcessData(groupTemplates, extractorParameters);
50+
51+
return groupTemplates;
3852
}
3953
}
4054
}

src/ArmTemplates/Common/API/Clients/Product/ProductsClient.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ProductApis;
1111
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products;
1212
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
13+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Utilities.DataProcessors.Absctraction;
1314

1415
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.API.Clients.Product
1516
{
@@ -18,14 +19,26 @@ public class ProductsClient : ApiClientBase, IProductsClient
1819
const string GetAllProductsLinkedToApiRequest = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/apis/{4}/products?api-version={5}";
1920
const string GetAllProductsRequest = "{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/products?api-version={4}";
2021

22+
readonly IProductDataProcessor productDataProcessor;
23+
readonly IProductApiDataProcessor productApiDataProcessor;
24+
25+
public ProductsClient(IProductDataProcessor productDataProcessor, IProductApiDataProcessor productApiDataProcessor)
26+
{
27+
this.productDataProcessor = productDataProcessor;
28+
this.productApiDataProcessor = productApiDataProcessor;
29+
}
30+
2131
public async Task<List<ProductsTemplateResource>> GetAllAsync(ExtractorParameters extractorParameters)
2232
{
2333
var (azToken, azSubId) = await this.Auth.GetAccessToken();
2434

2535
string requestUrl = string.Format(GetAllProductsRequest,
2636
this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, GlobalConstants.ApiVersion);
2737

28-
return await this.GetPagedResponseAsync<ProductsTemplateResource>(azToken, requestUrl);
38+
var productTemplates = await this.GetPagedResponseAsync<ProductsTemplateResource>(azToken, requestUrl);
39+
this.productDataProcessor.ProcessData(productTemplates, extractorParameters);
40+
41+
return productTemplates;
2942
}
3043

3144
public async Task<List<ProductApiTemplateResource>> GetAllLinkedToApiAsync(string apiName, ExtractorParameters extractorParameters)
@@ -35,7 +48,10 @@ public async Task<List<ProductApiTemplateResource>> GetAllLinkedToApiAsync(strin
3548
string requestUrl = string.Format(GetAllProductsLinkedToApiRequest,
3649
this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, apiName, GlobalConstants.ApiVersion);
3750

38-
return await this.GetPagedResponseAsync<ProductApiTemplateResource>(azToken, requestUrl);
51+
var productApiTemplateResources = await this.GetPagedResponseAsync<ProductApiTemplateResource>(azToken, requestUrl);
52+
this.productApiDataProcessor.ProcessData(productApiTemplateResources, extractorParameters);
53+
54+
return productApiTemplateResources;
3955
}
4056
}
4157
}

src/ArmTemplates/Common/Templates/Groups/GroupTemplateResource.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
// Licensed under the MIT License.
44
// --------------------------------------------------------------------------
55

6+
using Newtonsoft.Json;
67
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
78

89
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Groups
910
{
1011
public class GroupTemplateResource : TemplateResource
1112
{
13+
[JsonIgnore]
14+
public string OriginalName { get; set; }
15+
16+
[JsonIgnore]
17+
public string NewName { get; set; }
18+
1219
public GroupProperties Properties { get; set; }
1320
}
1421
}

src/ArmTemplates/Common/Templates/ProductApis/ProductApiTemplateResource.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
// Licensed under the MIT License.
44
// --------------------------------------------------------------------------
55

6+
using Newtonsoft.Json;
67
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
78

89
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.ProductApis
910
{
1011
public class ProductApiTemplateResource : TemplateResource
1112
{
13+
[JsonIgnore]
14+
public string OriginalName { get; set; }
15+
16+
[JsonIgnore]
17+
public string NewName { get; set; }
18+
1219
public ProductApiProperties Properties { get; set; }
1320
}
1421
}

src/ArmTemplates/Common/Templates/Products/ProductsTemplateResource.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,19 @@
33
// Licensed under the MIT License.
44
// --------------------------------------------------------------------------
55

6+
using Newtonsoft.Json;
67
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
78

89
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products
910
{
1011
public class ProductsTemplateResource : TemplateResource
1112
{
13+
[JsonIgnore]
14+
public string OriginalName { get; set; }
15+
16+
[JsonIgnore]
17+
public string NewName { get; set; }
18+
1219
public ProductsProperties Properties { get; set; }
1320
}
1421
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
77
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Policy;
8+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products;
89
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.Models;
910
using System.Threading.Tasks;
1011

@@ -16,7 +17,7 @@ public interface IPolicyExtractor
1617

1718
Task<PolicyTemplateResource> GenerateProductPolicyTemplateAsync(
1819
ExtractorParameters extractorParameters,
19-
string productName,
20+
ProductsTemplateResource productTemplateResource,
2021
string[] productResourceId,
2122
string baseFilesGenerationDirectory);
2223

src/ArmTemplates/Extractor/EntityExtractors/PolicyExtractor.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
using Microsoft.Extensions.Logging;
1919
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Builders.Abstractions;
2020
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions;
21+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Products;
2122

2223
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors
2324
{
@@ -154,21 +155,21 @@ public async Task<PolicyTemplateResource> GenerateApiPolicyResourceAsync(
154155

155156
public async Task<PolicyTemplateResource> GenerateProductPolicyTemplateAsync(
156157
ExtractorParameters extractorParameters,
157-
string productName,
158+
ProductsTemplateResource productTemplateResource,
158159
string[] productResourceId,
159160
string baseFilesGenerationDirectory)
160161
{
161-
var productPolicy = await this.policyClient.GetPolicyLinkedToProductAsync(productName, extractorParameters);
162+
var productPolicy = await this.policyClient.GetPolicyLinkedToProductAsync(productTemplateResource.OriginalName, extractorParameters);
162163

163164
if (productPolicy is null)
164165
{
165-
this.logger.LogWarning($"Policy not found for product '{productName}'");
166+
this.logger.LogWarning($"Policy not found for product '{productTemplateResource.OriginalName}'");
166167
return productPolicy;
167168
}
168169

169-
this.logger.LogDebug($"Policy linked to {productName} product found successfuly");
170+
this.logger.LogDebug($"Policy linked to {productTemplateResource.OriginalName} product found successfuly");
170171

171-
productPolicy.Name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{productName}/policy')]";
172+
productPolicy.Name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{productTemplateResource.NewName}/policy')]";
172173
productPolicy.ApiVersion = GlobalConstants.ApiVersion;
173174
productPolicy.Scale = null;
174175
productPolicy.DependsOn = productResourceId;
@@ -177,7 +178,7 @@ public async Task<PolicyTemplateResource> GenerateProductPolicyTemplateAsync(
177178
// telling that it is needed to provide a policy Xml file
178179
if (extractorParameters.PolicyXMLBaseUrl is not null)
179180
{
180-
var policyFileName = string.Format(ProductPolicyFileNameFormat, productName);
181+
var policyFileName = string.Format(ProductPolicyFileNameFormat, productTemplateResource.NewName);
181182
await this.SavePolicyXmlAsync(productPolicy, baseFilesGenerationDirectory, policyFileName);
182183

183184
this.SetPolicyTemplateResourcePolicyContentWithArmPresetValues(extractorParameters, productPolicy, policyFileName);

src/ArmTemplates/Extractor/EntityExtractors/ProductApisExtractor.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,19 +131,18 @@ async Task<List<ProductApiTemplateResource>> GenerateProductApiTemplateResources
131131
string lastProductAPIName = null;
132132
foreach (var productApi in productApis)
133133
{
134-
var originalProductApiName = productApi.Name;
135-
this.logger.LogInformation("'{0}' Product association found", originalProductApiName);
134+
this.logger.LogInformation("'{0}' Product association found", productApi.OriginalName);
136135

137136
// convert returned api product associations to template resource class
138137
productApi.Type = ResourceTypeConstants.ProductApi;
139-
productApi.Name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{originalProductApiName}/{apiName}')]";
138+
productApi.Name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{productApi.NewName}/{apiName}')]";
140139
productApi.ApiVersion = GlobalConstants.ApiVersion;
141140
productApi.Scale = null;
142141
productApi.DependsOn = lastProductAPIName != null ? new string[] { lastProductAPIName } : dependsOn;
143142

144143
productApiResources.Add(productApi);
145144

146-
lastProductAPIName = $"[resourceId('Microsoft.ApiManagement/service/products/apis', parameters('{ParameterNames.ApimServiceName}'), '{originalProductApiName}', '{apiName}')]";
145+
lastProductAPIName = $"[resourceId('Microsoft.ApiManagement/service/products/apis', parameters('{ParameterNames.ApimServiceName}'), '{productApi.NewName}', '{apiName}')]";
147146
}
148147
}
149148
catch (Exception ex)

0 commit comments

Comments
 (0)