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

Commit 3822fcf

Browse files
f-alizadaFarhad Alizada
andauthored
Generate parameters per each resource file (#784)
* Generate parameters per each resource file * Add parameter for redefining parameters output folder * Update documentation with new parameter Co-authored-by: Farhad Alizada <falizada@microsoft.com>
1 parent 24d09ab commit 3822fcf

File tree

11 files changed

+374
-3
lines changed

11 files changed

+374
-3
lines changed

src/ArmTemplates/Commands/Configurations/ExtractorConsoleAppConfiguration.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ public class ExtractorConsoleAppConfiguration
106106
[Option(longName: "extractIdentityProviders", HelpText = "Extract identity providers from the service if applies")]
107107
public string ExtractIdentityProviders { get; set; }
108108

109+
[Option(longName: "parametersOutputDirectoryName ", HelpText = "Parameters output directory name, by default it is \"parameters\"")]
110+
public string ParametersOutputDirectoryName { get; set; }
111+
109112
/// <summary>
110113
/// Api parameter properties for overriding Api OAuth2 scope or/and Service urloverride. Available via extractor-config file only.
111114
/// </summary>

src/ArmTemplates/Commands/Executors/ExtractorExecutor.cs

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,7 @@ public async Task<Template<ApiTemplateResources>> GenerateApiTemplateAsync(
410410
if (apiTemplate?.HasResources() == true)
411411
{
412412
apiTemplate.TypedResources.FileName = FileNameGenerator.GenerateExtractorAPIFileName(singleApiName, this.extractorParameters.FileNames.BaseFileName);
413+
apiTemplate.TypedResources.ParametersFileName = FileNameGenerator.GenerateExtractorAPIParametersFileName(singleApiName);
413414

414415
await FileWriter.SaveAsJsonAsync(
415416
apiTemplate,
@@ -459,6 +460,79 @@ await FileWriter.SaveAsJsonAsync(
459460
return templateParameters;
460461
}
461462

463+
public async Task GenerateResourceParametersFiles(
464+
string baseFilesGenerationDirectory,
465+
Template mainParametersTemplate,
466+
Template<ApiTemplateResources> apiTemplate = null,
467+
Template<PolicyTemplateResources> policyTemplate = null,
468+
Template<ApiVersionSetTemplateResources> apiVersionSetTemplate = null,
469+
Template<ProductTemplateResources> productsTemplate = null,
470+
Template<ProductApiTemplateResources> productApisTemplate = null,
471+
Template<TagApiTemplateResources> apiTagsTemplate = null,
472+
Template<LoggerTemplateResources> loggersTemplate = null,
473+
Template<BackendTemplateResources> backendsTemplate = null,
474+
Template<AuthorizationServerTemplateResources> authorizationServersTemplate = null,
475+
Template<NamedValuesResources> namedValuesTemplate = null,
476+
Template<TagTemplateResources> tagTemplate = null,
477+
Template<GroupTemplateResources> groupTemplate = null,
478+
Template<IdentityProviderResources> identityProviderTemplate = null,
479+
Template<SchemaTemplateResources> schemaTemplate = null,
480+
Template<OpenIdConnectProviderResources> openIdConnectProviderTemplate = null,
481+
Template<PolicyFragmentsResources> policyFragmentsTemplate = null)
482+
{
483+
this.RenameExistingParametersDirectory(baseFilesGenerationDirectory);
484+
485+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, apiTemplate?.TypedResources.ParametersFileName, apiTemplate, mainParametersTemplate);
486+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.GlobalServicePolicyParameters , policyTemplate, mainParametersTemplate);
487+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.ApiVersionSetsParameters, apiVersionSetTemplate, mainParametersTemplate);
488+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.ProductsParameters, productsTemplate, mainParametersTemplate);
489+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.ProductAPIsParameters, productApisTemplate, mainParametersTemplate);
490+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.TagApiParameters, apiTagsTemplate, mainParametersTemplate);
491+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.LoggersParameters, loggersTemplate, mainParametersTemplate);
492+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.BackendsParameters, backendsTemplate, mainParametersTemplate);
493+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.AuthorizationServersParameters, authorizationServersTemplate, mainParametersTemplate);
494+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.NamedValuesParameters, namedValuesTemplate, mainParametersTemplate);
495+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.TagsParameters, tagTemplate, mainParametersTemplate);
496+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.GroupsParameters, groupTemplate, mainParametersTemplate);
497+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.IdentityProvidersParameters, identityProviderTemplate, mainParametersTemplate);
498+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.SchemaParameters, schemaTemplate, mainParametersTemplate);
499+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.OpenIdConnectProvidersParameters, openIdConnectProviderTemplate, mainParametersTemplate);
500+
await this.GenerateResourceParametersFile(baseFilesGenerationDirectory, this.extractorParameters.FileNames.PolicyFragmentsParameters, policyFragmentsTemplate, mainParametersTemplate);
501+
}
502+
503+
public async Task GenerateResourceParametersFile<TTemplateResource>(string baseFilesGenerationDirectory, string fileName, Template<TTemplateResource> resourceTemplate, Template mainParametersTemplate) where TTemplateResource : ITemplateResources, new()
504+
{
505+
if (string.IsNullOrEmpty(fileName) || string.IsNullOrEmpty(baseFilesGenerationDirectory))
506+
{
507+
this.logger.LogWarning("Filename or directory for parameters file generation is null or empty, skipping the generation");
508+
return;
509+
}
510+
511+
if (resourceTemplate?.TypedResources?.HasContent() == true)
512+
{
513+
var parametersTemplate = this.parametersExtractor.CreateResourceTemplateParameterTemplate(resourceTemplate, mainParametersTemplate);
514+
515+
if (!parametersTemplate.Parameters.IsNullOrEmpty())
516+
{
517+
await FileWriter.SaveAsJsonAsync(
518+
parametersTemplate,
519+
directory: Path.Combine(baseFilesGenerationDirectory, this.extractorParameters.FileNames.ParametersDirectory),
520+
fileName: fileName);
521+
}
522+
}
523+
}
524+
525+
void RenameExistingParametersDirectory(string baseDirectoryLocation)
526+
{
527+
var parametersLocation = Path.Combine(baseDirectoryLocation, this.extractorParameters.FileNames.ParametersDirectory);
528+
if (Directory.Exists(parametersLocation))
529+
{
530+
var creationDateTime = Directory.GetCreationTime(parametersLocation).ToString("yyyyMMddHHmmss");
531+
var newParameterDirectory = $"{this.extractorParameters.FileNames.ParametersDirectory}{creationDateTime}";
532+
Directory.Move(parametersLocation, Path.Combine(baseDirectoryLocation, newParameterDirectory));
533+
}
534+
}
535+
462536
public async Task<Template<MasterTemplateResources>> GenerateMasterTemplateAsync(
463537
string baseFilesGenerationDirectory,
464538
ApiTemplateResources apiTemplateResources = null,
@@ -1035,8 +1109,28 @@ async Task GenerateTemplates(
10351109
await this.GenerateGatewayTemplateAsync(singleApiName, baseFilesGenerationDirectory);
10361110
await this.GenerateGatewayApiTemplateAsync(singleApiName, multipleApiNames, baseFilesGenerationDirectory);
10371111
await this.GenerateApiManagementServiceTemplate(baseFilesGenerationDirectory);
1038-
await this.GenerateParametersTemplateAsync(apisToExtract, loggerTemplate.TypedResources, backendTemplate.TypedResources, namedValueTemplate.TypedResources, identityProviderTemplate.TypedResources, openIdConnectProviderTemplate.TypedResources, baseFilesGenerationDirectory);
1112+
var parametersTemplate = await this.GenerateParametersTemplateAsync(apisToExtract, loggerTemplate.TypedResources, backendTemplate.TypedResources, namedValueTemplate.TypedResources, identityProviderTemplate.TypedResources, openIdConnectProviderTemplate.TypedResources, baseFilesGenerationDirectory);
10391113

1114+
await this.GenerateResourceParametersFiles(
1115+
baseFilesGenerationDirectory,
1116+
parametersTemplate,
1117+
apiTemplate: apiTemplate,
1118+
policyTemplate: globalServicePolicyTemplate,
1119+
productApisTemplate: productApiTemplate,
1120+
productsTemplate: productTemplate,
1121+
apiVersionSetTemplate: apiVersionSetTemplate,
1122+
authorizationServersTemplate: authorizationServerTemplate,
1123+
tagTemplate: tagTemplate,
1124+
apiTagsTemplate: apiTagTemplate,
1125+
loggersTemplate: loggerTemplate,
1126+
namedValuesTemplate: namedValueTemplate,
1127+
backendsTemplate: backendTemplate,
1128+
groupTemplate: groupTemplate,
1129+
identityProviderTemplate: identityProviderTemplate,
1130+
openIdConnectProviderTemplate: openIdConnectProviderTemplate,
1131+
schemaTemplate: schemasTempate,
1132+
policyFragmentsTemplate: policyFragmentTemplate);
1133+
10401134
await this.GenerateMasterTemplateAsync(
10411135
baseFilesGenerationDirectory,
10421136
apiTemplateResources: apiTemplate.TypedResources,

src/ArmTemplates/Common/FileHandlers/FileNameGenerator.cs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,38 @@ public static FileNames GenerateFileNames(string baseFileName)
2424
return new FileNames
2525
{
2626
ApiVersionSets = $@"{baseFileName}apiVersionSets.template.json",
27+
ApiVersionSetsParameters = "apiVersionSets.parameters.json",
2728
AuthorizationServers = $@"{baseFileName}authorizationServers.template.json",
29+
AuthorizationServersParameters = "authorizationServers.parameters.json",
2830
Backends = $@"{baseFileName}backends.template.json",
31+
BackendsParameters = "backends.parameters.json",
2932
GlobalServicePolicy = $@"{baseFileName}globalServicePolicy.template.json",
33+
GlobalServicePolicyParameters = "globalServicePolicy.parameters.json",
3034
Loggers = $@"{baseFileName}loggers.template.json",
35+
LoggersParameters = "loggers.parameters.json",
3136
NamedValues = $@"{baseFileName}namedValues.template.json",
37+
NamedValuesParameters = "namedValues.parameters.json",
3238
Tags = $@"{baseFileName}tags.template.json",
39+
TagsParameters = "tags.parameters.json",
3340
Products = $@"{baseFileName}products.template.json",
41+
ProductsParameters = "products.parameters.json",
3442
ProductAPIs = $@"{baseFileName}productAPIs.template.json",
43+
ProductAPIsParameters = "productAPIs.parameters.json",
3544
Gateway = $@"{baseFileName}gateways.template.json",
45+
GatewayParameters = "gateways.parameters.json",
3646
GatewayApi = $@"{baseFileName}gateways-apis.template.json",
47+
GatewayApiParameters = "gateways-apis.parameters.json",
3748
IdentityProviders = $@"{baseFileName}identity-providers.template.json",
49+
IdentityProvidersParameters = "identity-providers.parameters.json",
3850
OpenIdConnectProviders = $@"{baseFileName}openid-connect-providers.template.json",
51+
OpenIdConnectProvidersParameters = "openid-connect-providers.parameters.json",
3952
ApiManagementService = $@"{baseFileName}api-management-service.template.json",
4053
TagApi = $@"{baseFileName}apiTags.template.json",
54+
TagApiParameters = "apiTags.parameters.json",
4155
Schema = $@"{baseFileName}schemas.template.json",
56+
SchemaParameters = "schemas.parameters.json",
4257
PolicyFragments = $@"{baseFileName}policy-fragments.template.json",
58+
PolicyFragmentsParameters = "policy-fragments.parameters.json",
4359
Parameters = $@"{baseFileName}parameters.json",
4460
LinkedMaster = $@"{baseFileName}master.template.json",
4561
Apis = "/Apis",
@@ -48,6 +64,8 @@ public static FileNames GenerateFileNames(string baseFileName)
4864
RevisionMasterFolder = "/RevisionMasterFolder",
4965
GroupAPIsMasterFolder = "/MultipleApisMasterFolder",
5066
Groups = $"{baseFileName}groups.template.json",
67+
GroupsParameters = "groups.parameters.json",
68+
ParametersDirectory = $"{baseFileName}parameters",
5169
BaseFileName = baseFileName
5270
};
5371
}
@@ -69,7 +87,16 @@ public static string GenerateCreatorAPIFileName(string apiName, bool isSplitAPI,
6987

7088
public static string GenerateExtractorAPIFileName(string singleAPIName, string baseFileName)
7189
{
72-
return singleAPIName == null ? $@"{baseFileName}apis.template.json" : $@"{baseFileName}{singleAPIName}-api.template.json";
90+
return $@"{baseFileName}{GenerateApiFileNameBase(singleAPIName)}.template.json";
91+
}
92+
93+
public static string GenerateExtractorAPIParametersFileName(string singleAPIName)
94+
{
95+
return $@"{GenerateApiFileNameBase(singleAPIName)}.parameters.json";
96+
}
97+
98+
public static string GenerateApiFileNameBase(string singleAPIName) {
99+
return singleAPIName == null ? "apis" : $"{singleAPIName}-api";
73100
}
74101

75102
public static string GenerateOriginalAPIName(string apiName)

src/ArmTemplates/Common/FileHandlers/FileNames.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,40 +9,74 @@ public class FileNames
99
{
1010
public string ApiVersionSets { get; set; }
1111

12+
public string ApiVersionSetsParameters { get; set; }
13+
1214
public string AuthorizationServers { get; set; }
1315

16+
public string AuthorizationServersParameters { get; set; }
17+
1418
public string Backends { get; set; }
1519

20+
public string BackendsParameters { get; set; }
21+
1622
public string GlobalServicePolicy { get; set; }
1723

24+
public string GlobalServicePolicyParameters { get; set; }
25+
1826
public string Loggers { get; set; }
1927

28+
public string LoggersParameters { get; set; }
29+
2030
public string NamedValues { get; set; }
2131

32+
public string NamedValuesParameters { get; set; }
33+
2234
public string Tags { get; set; }
2335

36+
public string TagsParameters { get; set; }
37+
2438
public string Products { get; set; }
2539

40+
public string ProductsParameters { get; set; }
41+
2642
public string ProductAPIs { get; set; }
2743

44+
public string ProductAPIsParameters { get; set; }
45+
2846
public string Groups { get; set; }
2947

48+
public string GroupsParameters { get; set; }
49+
3050
public string TagApi { get; set; }
3151

52+
public string TagApiParameters { get; set; }
53+
3254
public string Gateway { get; set; }
3355

56+
public string GatewayParameters { get; set; }
57+
3458
public string GatewayApi { get; set; }
3559

60+
public string GatewayApiParameters { get; set; }
61+
3662
public string IdentityProviders { get; set; }
3763

64+
public string IdentityProvidersParameters { get; set; }
65+
3866
public string OpenIdConnectProviders { get; set; }
3967

68+
public string OpenIdConnectProvidersParameters { get; set; }
69+
4070
public string ApiManagementService { get; set; }
4171

4272
public string Schema { get; set; }
4373

74+
public string SchemaParameters { get; set; }
75+
4476
public string PolicyFragments { get; set; }
4577

78+
public string PolicyFragmentsParameters { get; set; }
79+
4680
public string Parameters { get; set; }
4781

4882
// linked property outputs 1 master template
@@ -59,5 +93,7 @@ public class FileNames
5993
public string GroupAPIsMasterFolder { get; set; }
6094

6195
public string BaseFileName { get; set; }
96+
97+
public string ParametersDirectory { get; set; }
6298
}
6399
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ public class ApiTemplateResources : TemplateResourcesBase, ITemplateResources
1919
{
2020
public string FileName { get; set; }
2121

22+
public string ParametersFileName { get; set; }
23+
2224
public List<ApiTemplateResource> Apis { get; set; } = new();
2325

2426
public List<ApiSchemaTemplateResource> ApiSchemas { get; set; } = new();

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,7 @@ Task<Template> CreateMasterTemplateParameterValues(
2727
IdentityProviderResources identityProviderResources,
2828
OpenIdConnectProviderResources openIdConnectProviderResources,
2929
ExtractorParameters extractorParameters);
30+
31+
Template CreateResourceTemplateParameterTemplate(Template resourceTemplate, Template mainParametersTemplate);
3032
}
3133
}

src/ArmTemplates/Extractor/EntityExtractors/ParametersExtractor.cs

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

2223
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extractor.EntityExtractors
2324
{
@@ -27,13 +28,16 @@ public class ParametersExtractor : IParametersExtractor
2728
readonly IApisClient apisClient;
2829
readonly IIdentityProviderClient identityProviderClient;
2930
readonly IOpenIdConnectProvidersClient openIdConnectProviderClient;
31+
readonly ILogger<ParametersExtractor> logger;
3032

3133
public ParametersExtractor(
34+
ILogger<ParametersExtractor> logger,
3235
ITemplateBuilder templateBuilder,
3336
IApisClient apisClient,
3437
IIdentityProviderClient identityProviderClient,
3538
IOpenIdConnectProvidersClient openIdConnectProviderClient)
3639
{
40+
this.logger = logger;
3741
this.templateBuilder = templateBuilder;
3842
this.apisClient = apisClient;
3943
this.identityProviderClient = identityProviderClient;
@@ -268,5 +272,31 @@ async Task AddSecretValuesParameters()
268272

269273
return parametersTemplate;
270274
}
275+
276+
public Template CreateResourceTemplateParameterTemplate(Template resourceTemplate, Template mainParameterTemplate)
277+
{
278+
var parametersTemplate = this.templateBuilder
279+
.GenerateEmptyTemplate()
280+
.Build();
281+
parametersTemplate.Parameters = new();
282+
var parameters = parametersTemplate.Parameters;
283+
284+
if (resourceTemplate?.Parameters.IsNullOrEmpty() != true)
285+
{
286+
foreach (var parameterKey in resourceTemplate.Parameters.Keys)
287+
{
288+
if (!mainParameterTemplate.Parameters.ContainsKey(parameterKey))
289+
{
290+
this.logger.LogWarning($"Parameter {parameterKey} were not found in main parameters template");
291+
continue;
292+
}
293+
294+
var parameterValue = mainParameterTemplate.Parameters[parameterKey];
295+
parameters.Add(parameterKey, parameterValue);
296+
}
297+
}
298+
299+
return parametersTemplate;
300+
}
271301
}
272302
}

0 commit comments

Comments
 (0)