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

Commit b739b0f

Browse files
authored
Added Named Values support for Creator (#375)
* Added Named Values to Creator * Updated Test and README * Added secret and tags properties * Updated README to contain all fields for PropertyConfiguration
1 parent 097a944 commit b739b0f

File tree

9 files changed

+141
-4
lines changed

9 files changed

+141
-4
lines changed

src/APIM_ARMTemplate/README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ The utility requires one argument, --configFile, which points to a yaml file tha
2626
| apiVersionSets | Array<[APIVersionSetConfiguration](#APIVersionSetConfiguration)> | No | List of API Version Set configurations. |
2727
| apis | Array<[APIConfiguration](#APIConfiguration)> | Yes | List of API configurations. |
2828
| products | Array<[ProductConfiguration](#ProductConfiguration)> | No | List of Product configurations. |
29+
| namedValues | Array<[PropertyConfiguration](#PropertyConfiguration)> | No | List of Named Values
2930
| loggers | Array<[LoggerConfiguration](#LoggerConfiguration)> | No | List of Logger configurations. |
3031
| authorizationServers | Array<[AuthorizationServerContractProperties](#https://docs.microsoft.com/en-us/azure/templates/microsoft.apimanagement/2019-01-01/service/authorizationservers#AuthorizationServerContractProperties)> | No | List of Authorization Server configurations. |
3132
| backends | Array<[BackendContractProperties](#https://docs.microsoft.com/en-us/azure/templates/microsoft.apimanagement/2019-01-01/service/backends#BackendContractProperties)> | No | List of Backend configurations. |
@@ -92,6 +93,17 @@ _Additional properties found in [ApiVersionSetContractProperties](https://docs.m
9293

9394
_Additional properties found in [ProductContractProperties](https://docs.microsoft.com/en-us/azure/templates/microsoft.apimanagement/2019-01-01/service/products#ProductContractProperties)_
9495

96+
#### PropertyConfiguration
97+
98+
| Property | Type | Required | Value |
99+
|-----------------------|-----------------------|-----------------------|--------------------------------------------------|
100+
| tags | array | No | Optional tags that when provided can be used to filter the property list. - string
101+
| secret | boolean | No | Determines whether the value is a secret and should be encrypted or not. Default value is false.
102+
| displayName | string | Yes | Unique name of Property. It may contain only letters, digits, period, dash, and underscore characters. |
103+
| value | string | Yes | Value of the property. Can contain policy expressions. It may not be empty or consist only of whitespace. |
104+
105+
_Additional properties found in [PropertyContractProperties](https://docs.microsoft.com/en-us/azure/templates/microsoft.apimanagement/2019-01-01/service/properties#propertycontractproperties-object)_
106+
95107
#### LoggerConfiguration
96108

97109
| Property | Type | Required | Value |

src/APIM_ARMTemplate/apimtemplate.test/Creator/TemplateCreatorTests/MasterTemplateCreatorTests.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@ public void ShouldCreateCorrectNumberOfDeploymentResources()
1616
Template apiVersionSetsTemplate = new Template();
1717
Template globalServicePolicyTemplate = new Template();
1818
Template productsTemplate = new Template();
19+
Template propertyTemplate = new Template();
1920
Template tagTemplate = new Template();
2021
Template loggersTemplate = new Template();
2122
List<LinkedMasterTemplateAPIInformation> apiInfoList = new List<LinkedMasterTemplateAPIInformation>() { new LinkedMasterTemplateAPIInformation() { name = "api", isSplit = true } };
2223
FileNameGenerator fileNameGenerator = new FileNameGenerator();
2324
FileNames creatorFileNames = fileNameGenerator.GenerateFileNames(creatorConfig.apimServiceName);
2425

25-
// should create 7 resources (globalServicePolicy, apiVersionSet, product, tag, logger, both api templates)
26-
int count = 7;
26+
// should create 7 resources (globalServicePolicy, apiVersionSet, product, property, tag, logger, both api templates)
27+
int count = 8;
2728

2829
// act
29-
Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, globalServicePolicyTemplate, apiVersionSetsTemplate, productsTemplate, loggersTemplate, null, null, tagTemplate, apiInfoList, creatorFileNames, creatorConfig.apimServiceName, fileNameGenerator);
30+
Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, globalServicePolicyTemplate, apiVersionSetsTemplate, productsTemplate, propertyTemplate, loggersTemplate, null, null, tagTemplate, apiInfoList, creatorFileNames, creatorConfig.apimServiceName, fileNameGenerator);
3031

3132
// assert
3233
Assert.Equal(count, masterTemplate.resources.Length);
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using Xunit;
2+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common;
3+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create;
4+
using System.Collections.Generic;
5+
6+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Test
7+
{
8+
public class PropertyTemplateCreatorTests
9+
{
10+
[Fact]
11+
public void ShouldCreatePropertyFromCreatorConfig()
12+
{
13+
// arrange
14+
PropertyTemplateCreator propertyTemplateCreator = new PropertyTemplateCreator();
15+
CreatorConfig creatorConfig = new CreatorConfig() { namedValues = new List<PropertyConfig>() };
16+
PropertyConfig property = new PropertyConfig()
17+
{
18+
displayName = "displayName",
19+
value = "value"
20+
};
21+
creatorConfig.namedValues.Add(property);
22+
23+
// act
24+
Template propertyTemplate = propertyTemplateCreator.CreatePropertyTemplate(creatorConfig);
25+
PropertyTemplateResource propertyTemplateResource = (PropertyTemplateResource)propertyTemplate.resources[0];
26+
27+
// assert
28+
Assert.Equal($"[concat(parameters('ApimServiceName'), '/{property.displayName}')]", propertyTemplateResource.name);
29+
Assert.Equal(property.displayName, propertyTemplateResource.properties.displayName);
30+
Assert.Equal(property.value, propertyTemplateResource.properties.value);
31+
}
32+
}
33+
}

src/APIM_ARMTemplate/apimtemplate/Commands/Create.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public CreateCommand()
4848
DiagnosticTemplateCreator diagnosticTemplateCreator = new DiagnosticTemplateCreator();
4949
ReleaseTemplateCreator releaseTemplateCreator = new ReleaseTemplateCreator();
5050
ProductTemplateCreator productTemplateCreator = new ProductTemplateCreator(policyTemplateCreator, productGroupTemplateCreator);
51+
PropertyTemplateCreator propertyTemplateCreator = new PropertyTemplateCreator();
5152
TagTemplateCreator tagTemplateCreator = new TagTemplateCreator();
5253
APITemplateCreator apiTemplateCreator = new APITemplateCreator(fileReader, policyTemplateCreator, productAPITemplateCreator, tagAPITemplateCreator, diagnosticTemplateCreator, releaseTemplateCreator);
5354
MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator();
@@ -62,6 +63,9 @@ public CreateCommand()
6263
Console.WriteLine("Creating product template");
6364
Console.WriteLine("------------------------------------------");
6465
Template productsTemplate = creatorConfig.products != null ? productTemplateCreator.CreateProductTemplate(creatorConfig) : null;
66+
Console.WriteLine("Creating named values template");
67+
Console.WriteLine("------------------------------------------");
68+
Template propertyTemplate = creatorConfig.namedValues != null ? propertyTemplateCreator.CreatePropertyTemplate(creatorConfig) : null;
6569
Console.WriteLine("Creating logger template");
6670
Console.WriteLine("------------------------------------------");
6771
Template loggersTemplate = creatorConfig.loggers != null ? loggerTemplateCreator.CreateLoggerTemplate(creatorConfig) : null;
@@ -108,7 +112,7 @@ public CreateCommand()
108112
if (creatorConfig.linked == true)
109113
{
110114
// create linked master template
111-
Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, globalServicePolicyTemplate, apiVersionSetsTemplate, productsTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, tagTemplate, apiInformation, fileNames, creatorConfig.apimServiceName, fileNameGenerator);
115+
Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, globalServicePolicyTemplate, apiVersionSetsTemplate, productsTemplate, propertyTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, tagTemplate, apiInformation, fileNames, creatorConfig.apimServiceName, fileNameGenerator);
112116
fileWriter.WriteJSONToFile(masterTemplate, String.Concat(creatorConfig.outputLocation, fileNames.linkedMaster));
113117
}
114118
foreach (Template apiTemplate in apiTemplates)
@@ -131,6 +135,10 @@ public CreateCommand()
131135
{
132136
fileWriter.WriteJSONToFile(productsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.products));
133137
}
138+
if (propertyTemplate != null)
139+
{
140+
fileWriter.WriteJSONToFile(propertyTemplate, String.Concat(creatorConfig.outputLocation, fileNames.namedValues));
141+
}
134142
if (loggersTemplate != null)
135143
{
136144
fileWriter.WriteJSONToFile(loggersTemplate, String.Concat(creatorConfig.outputLocation, fileNames.loggers));

src/APIM_ARMTemplate/apimtemplate/Creator/ExampleFiles/YAMLConfigs/valid.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ products:
7373
subscriptionsLimit: 1
7474
state: notPublished
7575
policy: C:\Users\myUsername\Projects\azure-api-management-devops-example\src\APIM_ARMTemplate\apimtemplate\Creator\ExampleFile\XMLPolicies\productSetBodyBasic.xml
76+
namedValues:
77+
- displayName: Test
78+
value: Item 1
79+
- displayname: Test2
80+
value: Item 2
7681
loggers:
7782
- name: myAppInsights
7883
loggerType: applicationInsights

src/APIM_ARMTemplate/apimtemplate/Creator/Models/CreatorConfiguration.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class CreatorConfig
1717
public List<APIVersionSetConfig> apiVersionSets { get; set; }
1818
public List<APIConfig> apis { get; set; }
1919
public List<ProductConfig> products { get; set; }
20+
public List<PropertyConfig> namedValues {get;set;}
2021
public List<LoggerConfig> loggers { get; set; }
2122
public List<AuthorizationServerTemplateProperties> authorizationServers { get; set; }
2223
public List<BackendTemplateProperties> backends { get; set; }
@@ -87,5 +88,10 @@ public class ProductConfig : ProductsTemplateProperties
8788
// coma separated names
8889
public string groups { get; set; }
8990
}
91+
92+
public class PropertyConfig : PropertyResourceProperties
93+
{
94+
95+
}
9096

9197
}

src/APIM_ARMTemplate/apimtemplate/Creator/TemplateCreators/MasterTemplateCreator.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public Template CreateLinkedMasterTemplate(CreatorConfig creatorConfig,
1010
Template globalServicePolicyTemplate,
1111
Template apiVersionSetTemplate,
1212
Template productsTemplate,
13+
Template propertyTemplate,
1314
Template loggersTemplate,
1415
Template backendsTemplate,
1516
Template authorizationServersTemplate,
@@ -49,6 +50,13 @@ public Template CreateLinkedMasterTemplate(CreatorConfig creatorConfig,
4950
resources.Add(this.CreateLinkedMasterTemplateResource("productsTemplate", productsUri, new string[] { }));
5051
}
5152

53+
// property
54+
if (propertyTemplate != null)
55+
{
56+
string propertyUri = GenerateLinkedTemplateUri(creatorConfig, fileNames.namedValues);
57+
resources.Add(this.CreateLinkedMasterTemplateResource("propertyTemplate", propertyUri, new string[] { }));
58+
}
59+
5260
// logger
5361
if (loggersTemplate != null)
5462
{
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.Collections.Generic;
2+
using Microsoft.Azure.Management.ApiManagement.ArmTemplates.Common;
3+
4+
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Create
5+
{
6+
public class PropertyTemplateCreator : TemplateCreator
7+
{
8+
public Template CreatePropertyTemplate(CreatorConfig creatorConfig)
9+
{
10+
// create empty template
11+
Template propertyTemplate = CreateEmptyTemplate();
12+
13+
// add parameters
14+
propertyTemplate.parameters = new Dictionary<string, TemplateParameterProperties>
15+
{
16+
{ ParameterNames.ApimServiceName, new TemplateParameterProperties(){ type = "string" } }
17+
};
18+
19+
List<TemplateResource> resources = new List<TemplateResource>();
20+
foreach (PropertyConfig namedValue in creatorConfig.namedValues)
21+
{
22+
// create property resource with properties
23+
PropertyTemplateResource propertyTemplateResource = new PropertyTemplateResource()
24+
{
25+
name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{namedValue.displayName}')]",
26+
type = ResourceTypeConstants.Property,
27+
apiVersion = GlobalConstants.APIVersion,
28+
properties = new PropertyResourceProperties()
29+
{
30+
displayName = namedValue.displayName,
31+
value = namedValue.value,
32+
secret = namedValue.secret,
33+
tags = namedValue.tags
34+
},
35+
dependsOn = new string[] {}
36+
};
37+
resources.Add(propertyTemplateResource);
38+
}
39+
40+
propertyTemplate.resources = resources.ToArray();
41+
return propertyTemplate;
42+
}
43+
}
44+
}

src/APIM_ARMTemplate/apimtemplate/Creator/Utilities/CreatorConfigurationValidator.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ public bool ValidateCreatorConfig(CreatorConfig creatorConfig)
3333
{
3434
return false;
3535
}
36+
if (ValidateNamedValues(creatorConfig) != true)
37+
{
38+
return false;
39+
}
3640
if (ValidateLoggers(creatorConfig) != true)
3741
{
3842
return false;
@@ -48,6 +52,22 @@ public bool ValidateCreatorConfig(CreatorConfig creatorConfig)
4852
return true;
4953
}
5054

55+
public bool ValidateNamedValues(CreatorConfig creatorConfig)
56+
{
57+
bool isValid = true;
58+
if (creatorConfig.namedValues != null)
59+
{
60+
foreach (PropertyResourceProperties property in creatorConfig.namedValues)
61+
{
62+
if (property.displayName == null)
63+
{
64+
isValid = false;
65+
throw new CommandParsingException(commandLineApplication, "Display name is required is a Named Value is provided");
66+
}
67+
}
68+
}
69+
return isValid;
70+
}
5171
public bool ValidateProducts(CreatorConfig creatorConfig)
5272
{
5373
bool isValid = true;

0 commit comments

Comments
 (0)