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

Commit c9885e8

Browse files
fortunkamMatthew Fortunka
andauthored
Added support for KeyVault Named Values (new parameter) (#523)
* Added support for KeyVault Named Values (new parameter) * fix issue where param is false and it tries to write secret value for named value (keyvault) Co-authored-by: Matthew Fortunka <mafortun@microsoft.com>
1 parent 19b2373 commit c9885e8

File tree

7 files changed

+81
-4
lines changed

7 files changed

+81
-4
lines changed

src/APIM_ARMTemplate/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -381,10 +381,11 @@ You have two choices when specifying your settings:
381381
| serviceUrlParameters | No | Parameterize service url in advance (you can replace serviceUrl afterwards as well, you can refer example for more information). |
382382
| paramServiceUrl | No | Set to "true" will parameterize all serviceUrl for each api and generate serviceUrl parameter to api template/parameter template/master template files |
383383
| paramNamedValue | No | Set to "true" will parameterize all named values and add named values parameter to property template/parameter template/mastert emplate files |
384-
| paramApiLoggerId | No | Set to "true" will parameterize all logger ids in all apis (within api templates) |
384+
| paramApiLoggerId | No | Set to "true" will parameterize all logger ids in all apis (within api templates), Also includes the "All API" monitoring configuration |
385385
| paramLogResourceId | No | Set to "true" will parameterize all loggers' resource ids (within logger template)|
386386
| serviceBaseUrl | No | Specify the base url where you want to run your extractor |
387387
| notIncludeNamedValue | No | Set to "true" will not generate Named Value Templates|
388+
| paramNamedValuesKeyVaultSecrets | No | Set to true will parameterize all named values where the value is from a key vault secret |
388389

389390
#### Note
390391
* Can not use "splitAPIs" and "apiName" at the same time, since using "apiName" only extract one API

src/APIM_ARMTemplate/apimtemplate/Common/Constants/GlobalConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public static class ParameterNames
3434
public const string LinkedTemplatesSasToken = "LinkedTemplatesSasToken";
3535
public const string ApimServiceName = "ApimServiceName";
3636
public const string LinkedTemplatesBaseUrl = "LinkedTemplatesBaseUrl";
37+
public const string NamedValueKeyVaultSecrets = "NamedValueKeyVaultSecrets";
3738
}
3839

3940
public static class ParameterPrefix

src/APIM_ARMTemplate/apimtemplate/Common/TemplateModels/PropertyTemplateResource.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,11 @@ public class PropertyResourceProperties
1313
public bool secret { get; set; }
1414
public string displayName { get; set; }
1515
public string value { get; set; }
16+
public PropertyResourceKeyVaultProperties keyVault { get; set; }
17+
}
18+
19+
public class PropertyResourceKeyVaultProperties
20+
{
21+
public string secretIdentifier { get; set; }
1622
}
1723
}

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/EntityExtractor.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,14 @@ public Template GenerateEmptyPropertyTemplateWithParameters(Extractor exc)
7474
};
7575
armTemplate.parameters.Add(ParameterNames.NamedValues, namedValueParameterProperties);
7676
}
77+
if (exc.paramNamedValuesKeyVaultSecrets)
78+
{
79+
TemplateParameterProperties keyVaultNamedValueParameterProperties = new TemplateParameterProperties()
80+
{
81+
type = "object"
82+
};
83+
armTemplate.parameters.Add(ParameterNames.NamedValueKeyVaultSecrets, keyVaultNamedValueParameterProperties);
84+
}
7785
return armTemplate;
7886
}
7987

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/MasterTemplateExtractor.cs

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ public MasterTemplateResource CreateLinkedMasterTemplateResourceForPropertyTempl
167167
{
168168
masterResourceTemplate.properties.parameters.Add(ParameterNames.NamedValues, new TemplateParameterProperties() { value = $"[parameters('{ParameterNames.NamedValues}')]" });
169169
}
170+
if (exc.paramNamedValuesKeyVaultSecrets)
171+
{
172+
masterResourceTemplate.properties.parameters.Add(ParameterNames.NamedValueKeyVaultSecrets, new TemplateParameterProperties() { value = $"[parameters('{ParameterNames.NamedValueKeyVaultSecrets}')]" });
173+
}
170174
return masterResourceTemplate;
171175
}
172176

@@ -359,6 +363,18 @@ public Dictionary<string, TemplateParameterProperties> CreateMasterTemplateParam
359363
};
360364
parameters.Add(ParameterNames.LoggerResourceId, loggerResourceIdProperties);
361365
}
366+
if (exc.paramNamedValuesKeyVaultSecrets)
367+
{
368+
TemplateParameterProperties namedValueKeyVaultSecretsProperties = new TemplateParameterProperties()
369+
{
370+
metadata = new TemplateParameterMetadata()
371+
{
372+
description = "Key Vault Secrets for Named Values"
373+
},
374+
type = "object"
375+
};
376+
parameters.Add(ParameterNames.NamedValueKeyVaultSecrets, namedValueKeyVaultSecretsProperties);
377+
}
362378
return parameters;
363379
}
364380

@@ -488,16 +504,45 @@ public async Task<Template> CreateMasterTemplateParameterValues(List<string> api
488504
string propertyName = ((JValue)oProperty["name"]).Value.ToString();
489505
string fullPropertyResource = await pExc.GetPropertyDetailsAsync(exc.sourceApimName, exc.resourceGroup, propertyName);
490506
PropertyTemplateResource propertyTemplateResource = JsonConvert.DeserializeObject<PropertyTemplateResource>(fullPropertyResource);
491-
string propertyValue = propertyTemplateResource.properties.value;
492-
string validPName = ExtractorUtils.GenValidParamName(propertyName, ParameterPrefix.Property);
493-
namedValues.Add(validPName, propertyValue);
507+
//Only add the property if it is not controlled by keyvault
508+
if (propertyTemplateResource?.properties.keyVault == null)
509+
{
510+
string propertyValue = propertyTemplateResource.properties.value;
511+
string validPName = ExtractorUtils.GenValidParamName(propertyName, ParameterPrefix.Property);
512+
namedValues.Add(validPName, propertyValue);
513+
}
494514
}
495515
TemplateObjectParameterProperties namedValueProperties = new TemplateObjectParameterProperties()
496516
{
497517
value = namedValues
498518
};
499519
parameters.Add(ParameterNames.NamedValues, namedValueProperties);
500520
}
521+
if (exc.paramNamedValuesKeyVaultSecrets)
522+
{
523+
Dictionary<string, string> keyVaultNamedValues = new Dictionary<string, string>();
524+
PropertyExtractor pExc = new PropertyExtractor();
525+
string[] properties = await pExc.GetPropertiesAsync(exc.sourceApimName, exc.resourceGroup);
526+
527+
foreach (var extractedProperty in properties)
528+
{
529+
JToken oProperty = JObject.Parse(extractedProperty);
530+
string propertyName = ((JValue)oProperty["name"]).Value.ToString();
531+
string fullPropertyResource = await pExc.GetPropertyDetailsAsync(exc.sourceApimName, exc.resourceGroup, propertyName);
532+
PropertyTemplateResource propertyTemplateResource = JsonConvert.DeserializeObject<PropertyTemplateResource>(fullPropertyResource);
533+
if (propertyTemplateResource?.properties.keyVault != null)
534+
{
535+
string propertyValue = propertyTemplateResource.properties.keyVault.secretIdentifier;
536+
string validPName = ExtractorUtils.GenValidParamName(propertyName, ParameterPrefix.Property);
537+
keyVaultNamedValues.Add(validPName, propertyValue);
538+
}
539+
}
540+
TemplateObjectParameterProperties keyVaultNamedValueProperties = new TemplateObjectParameterProperties()
541+
{
542+
value = keyVaultNamedValues
543+
};
544+
parameters.Add(ParameterNames.NamedValueKeyVaultSecrets, keyVaultNamedValueProperties);
545+
}
501546
if (exc.paramApiLoggerId)
502547
{
503548
TemplateObjectParameterProperties loggerIdProperties = new TemplateObjectParameterProperties()

src/APIM_ARMTemplate/apimtemplate/Extractor/EntityExtractors/PropertyExtractor.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ public async Task<Template> GenerateNamedValuesTemplateAsync(string singleApiNam
8383
propertyTemplateResource.properties.value = $"[parameters('{ParameterNames.NamedValues}').{ExtractorUtils.GenValidParamName(propertyName, ParameterPrefix.Property)}]";
8484
}
8585

86+
//Hide the value field if it is a keyvault named value
87+
if (propertyTemplateResource.properties.keyVault != null)
88+
{
89+
propertyTemplateResource.properties.value = null;
90+
}
91+
92+
if (propertyTemplateResource.properties.keyVault != null && exc.paramNamedValuesKeyVaultSecrets )
93+
{
94+
propertyTemplateResource.properties.keyVault.secretIdentifier = $"[parameters('{ParameterNames.NamedValueKeyVaultSecrets}').{ExtractorUtils.GenValidParamName(propertyName, ParameterPrefix.Property)}]";
95+
}
96+
8697
if (singleApiName == null)
8798
{
8899
// if the user is executing a full extraction, extract all the loggers

src/APIM_ARMTemplate/apimtemplate/Extractor/Models/ExtractorConfiguration.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@ public class ExtractorConfig
4949
[Description("Should not include named values template")]
5050
public string notIncludeNamedValue { get; set; }
5151

52+
[Description("Parameterize named values where value is retrieved from a Key Vault secret")]
53+
public bool paramNamedValuesKeyVaultSecrets { get; set; }
54+
5255
[Description("Group the operations into batches of x?")]
5356
public int operationBatchSize {get;set;}
5457
public void Validate()
@@ -110,6 +113,7 @@ public class Extractor
110113
public bool paramApiLoggerId { get; private set; }
111114
public bool paramLogResourceId { get; private set; }
112115
public bool notIncludeNamedValue { get; private set; }
116+
public bool paramNamedValuesKeyVaultSecrets { get; private set; }
113117

114118
public int operationBatchSize { get; private set;}
115119

@@ -133,6 +137,7 @@ public Extractor(ExtractorConfig exc, string dirName)
133137
this.paramLogResourceId = exc.paramLogResourceId != null && exc.paramLogResourceId.Equals("true");
134138
this.notIncludeNamedValue = exc.notIncludeNamedValue != null && exc.notIncludeNamedValue.Equals("true");
135139
this.operationBatchSize = exc.operationBatchSize;
140+
this.paramNamedValuesKeyVaultSecrets = exc.paramNamedValuesKeyVaultSecrets;
136141
}
137142

138143
public Extractor(ExtractorConfig exc) : this(exc, exc.fileFolder)

0 commit comments

Comments
 (0)