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

Commit 5f8232e

Browse files
authored
Creator: parameterize named values and secrets (#660)
* implement creator:parameterize named values + secrets + cleanup launchsettings * provide full naming of parameters * name parameters in multiple count (namedValueS) Co-authored-by: Dmitrii Korolev <dmkorolev@microsoft.com>
1 parent 5378706 commit 5f8232e

File tree

6 files changed

+49
-4
lines changed

6 files changed

+49
-4
lines changed

src/ArmTemplates/Commands/Applications/CreateApplicationCommand.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Commands.Executors;
1414
using Microsoft.Extensions.Logging;
1515
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Builders.Abstractions;
16+
using System.IO;
1617

1718
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Commands.Applications
1819
{
@@ -72,6 +73,12 @@ public async Task<CreatorConfig> ParseInputConfigurationAsync(CreateConsoleAppCo
7273
creatorConfig.PreferredApis = configuration.PreferredAPIsForDeployment.Split(",");
7374
}
7475

76+
//if parameterizeNamedValuesAndSecrets passed as parameter
77+
if (!string.IsNullOrEmpty(configuration.ParameterizeNamedValues))
78+
{
79+
creatorConfig.parameterizeNamedValues = true;
80+
}
81+
7582
//if backendurlfile passed as parameter
7683
if (configuration.BackendUrlConfigFile != null && !string.IsNullOrEmpty(configuration.BackendUrlConfigFile))
7784
{
@@ -85,6 +92,11 @@ public async Task<CreatorConfig> ParseInputConfigurationAsync(CreateConsoleAppCo
8592

8693
public async Task ExecuteCommandAsync(CreatorConfig creatorConfig)
8794
{
95+
if (!Directory.Exists(creatorConfig.outputLocation))
96+
{
97+
Directory.CreateDirectory(creatorConfig.outputLocation);
98+
}
99+
88100
FileReader fileReader = new FileReader();
89101

90102
// initialize file helper classes

src/ArmTemplates/Commands/Configurations/CreateConsoleAppConfiguration.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,8 @@ public class CreateConsoleAppConfiguration
3232

3333
[Option(longName: "preferredAPIsForDeployment", HelpText = "Create ARM templates for the given APIs Name(comma separated) else leave this parameter blank then by default all api's will be considered")]
3434
public string PreferredAPIsForDeployment { get; set; }
35+
36+
[Option(longName: "parameterizeNamedValuesAndSecrets", HelpText = "Allows Creator to parameterize NamedValues and KeyVault Secrets. Output ARM Template then can be deployed to multiple environments")]
37+
public string ParameterizeNamedValues { get; set; }
3538
}
3639
}

src/ArmTemplates/Creator/Models/CreatorConfiguration.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ public class CreatorConfig
4545
public string linkedTemplatesBaseUrl { get; set; }
4646
public string linkedTemplatesUrlQueryString { get; set; }
4747
public string baseFileName { get; set; }
48+
49+
public bool parameterizeNamedValues { get; set; }
4850
public List<ServiceUrlProperty> serviceUrlParameters { get; set; }
4951
}
5052

src/ArmTemplates/Creator/TemplateCreators/PropertyTemplateCreator.cs

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
using System.Collections.Generic;
2+
using System.Linq;
23
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Constants;
4+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Extensions;
35
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.TemplateModels;
46
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Abstractions;
57
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common.Templates.Builders.Abstractions;
@@ -27,9 +29,35 @@ public Template CreatePropertyTemplate(CreatorConfig creatorConfig)
2729
{ ParameterNames.ApimServiceName, new TemplateParameterProperties(){ type = "string" } }
2830
};
2931

32+
if (creatorConfig.parameterizeNamedValues)
33+
{
34+
if (creatorConfig.namedValues.Any(x => x.value != null))
35+
{
36+
propertyTemplate.Parameters.Add(ParameterNames.NamedValues, new TemplateParameterProperties { type = "object" });
37+
}
38+
39+
if (creatorConfig.namedValues.Any(x => x.keyVault != null))
40+
{
41+
propertyTemplate.Parameters.Add(ParameterNames.NamedValueKeyVaultSecrets, new TemplateParameterProperties { type = "object" });
42+
}
43+
}
44+
3045
List<TemplateResource> resources = new List<TemplateResource>();
3146
foreach (PropertyConfig namedValue in creatorConfig.namedValues)
3247
{
48+
string value = namedValue.value == null ? null
49+
: creatorConfig.parameterizeNamedValues
50+
? $"[parameters('{ParameterNames.NamedValues}').{ParameterNamingHelper.GenerateValidParameterName(namedValue.displayName, ParameterPrefix.Property)}]"
51+
: namedValue.value;
52+
53+
PropertyResourceKeyVaultProperties keyVault = namedValue.keyVault == null ? null
54+
: creatorConfig.parameterizeNamedValues
55+
? new PropertyResourceKeyVaultProperties
56+
{
57+
secretIdentifier = $"[parameters('{ParameterNames.NamedValueKeyVaultSecrets}').{ParameterNamingHelper.GenerateValidParameterName(namedValue.displayName, ParameterPrefix.Property)}]"
58+
}
59+
: namedValue.keyVault;
60+
3361
// create property resource with properties
3462
PropertyTemplateResource propertyTemplateResource = new PropertyTemplateResource()
3563
{
@@ -39,10 +67,10 @@ public Template CreatePropertyTemplate(CreatorConfig creatorConfig)
3967
Properties = new PropertyResourceProperties()
4068
{
4169
displayName = namedValue.displayName,
42-
value = namedValue.value,
70+
value = value,
4371
secret = namedValue.secret,
4472
tags = namedValue.tags,
45-
keyVault = namedValue.keyVault
73+
keyVault = keyVault
4674

4775
},
4876
DependsOn = new string[] { }
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
{
22
"profiles": {
33
"apimtemplate": {
4-
"commandName": "Project",
5-
"commandLineArgs": "extract --extractorConfig C:\\Projects\\other\\extractorConfig.json"
4+
"commandName": "Project"
65
}
76
}
87
}

src/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,7 @@ Below are the steps to run the Creator from the source code:
346346
```dotnet run create --configFile CONFIG_YAML_FILE_LOCATION --namedValues namedvalue1|namevaluevalue1;namedvalue2|namevaluevalue2 ```
347347
Add new key to namedValues section in valid yaml file then use the same key name here in this cli parameter
348348
**Here displayName can not have | or ; in their name.**
349+
- Run the following command `dotnet run create --configFile CONFIG_YAML_FILE_LOCATION --parameterizeNamedValuesAndSecrets " "` to parameterize namedValues and KeyVault Secrets and allow to use single ARM template for multiple environments
349350

350351
You can also run it directly from the [releases](https://github.com/Azure/azure-api-management-devops-resource-kit/releases).
351352

0 commit comments

Comments
 (0)