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

Commit 071fece

Browse files
committed
move policies/ops into api template, stop writing null properties
1 parent a1c5081 commit 071fece

File tree

11 files changed

+97
-239
lines changed

11 files changed

+97
-239
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Create.cs

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -56,49 +56,24 @@ public CreateCommand()
5656
FileNameGenerator fileNameGenerator = new FileNameGenerator();
5757
TemplateCreator templateCreator = new TemplateCreator();
5858
APIVersionSetTemplateCreator apiVersionSetTemplateCreator = new APIVersionSetTemplateCreator(templateCreator);
59-
APITemplateCreator apiTemplateCreator = new APITemplateCreator(templateCreator, fileReader);
60-
ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator(templateCreator);
61-
PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(templateCreator, fileReader);
59+
ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator();
60+
PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(fileReader);
61+
APITemplateCreator apiTemplateCreator = new APITemplateCreator(fileReader, templateCreator, policyTemplateCreator, productAPITemplateCreator);
6262
MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator(templateCreator, fileNameGenerator);
6363
ARMTemplateWriter armTemplateWriter = new ARMTemplateWriter();
6464

6565
// create templates from provided configuration
66+
CreatorFileNames creatorFileNames = fileNameGenerator.GenerateCreatorFileNames();
6667
Template apiVersionSetTemplate = creatorConfig.apiVersionSet != null ? apiVersionSetTemplateCreator.CreateAPIVersionSetTemplate(creatorConfig) : null;
67-
Template initialAPITemplate = apiTemplateCreator.CreateInitialAPITemplateAsync(creatorConfig);
68-
Template subsequentAPITemplate = await apiTemplateCreator.CreateSubsequentAPITemplate(creatorConfig);
69-
List<Template> productAPITemplates = productAPITemplateCreator.CreateProductAPITemplates(creatorConfig);
70-
Template apiPolicyTemplate = creatorConfig.api.policy != null ? await policyTemplateCreator.CreateAPIPolicyAsync(creatorConfig) : null;
71-
List<Template> operationPolicyTemplates = await policyTemplateCreator.CreateOperationPolicies(creatorConfig);
72-
CreatorFileNames creatorFileNames = fileNameGenerator.GenerateCreatorFileNames(apiVersionSetTemplate, initialAPITemplate, subsequentAPITemplate, productAPITemplates, apiPolicyTemplate, operationPolicyTemplates, creatorConfig);
73-
Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, apiVersionSetTemplate, initialAPITemplate, subsequentAPITemplate, productAPITemplates, apiPolicyTemplate, operationPolicyTemplates, creatorFileNames);
68+
Template apiTemplate = await apiTemplateCreator.CreateAPITemplateAsync(creatorConfig);
69+
Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, apiVersionSetTemplate, apiTemplate, creatorFileNames);
7470

7571
// write templates to outputLocation
7672
if (apiVersionSetTemplate != null)
7773
{
7874
armTemplateWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.apiVersionSet));
7975
}
80-
armTemplateWriter.WriteJSONToFile(initialAPITemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.initialAPI));
81-
armTemplateWriter.WriteJSONToFile(subsequentAPITemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.subsequentAPI));
82-
if (apiPolicyTemplate != null)
83-
{
84-
armTemplateWriter.WriteJSONToFile(apiPolicyTemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.apiPolicy));
85-
}
86-
if (operationPolicyTemplates.Count > 0)
87-
{
88-
foreach (Template operationPolicyTemplate in operationPolicyTemplates)
89-
{
90-
string name = fileNameGenerator.RetrieveFileNameForOperationPolicyTemplate(operationPolicyTemplate, creatorConfig).Value;
91-
armTemplateWriter.WriteJSONToFile(operationPolicyTemplate, String.Concat(creatorConfig.outputLocation, name));
92-
}
93-
}
94-
if (productAPITemplates.Count > 0)
95-
{
96-
foreach (Template productAPITemplate in productAPITemplates)
97-
{
98-
string name = fileNameGenerator.RetrieveFileNameForProductAPITemplate(productAPITemplate, creatorConfig).Value;
99-
armTemplateWriter.WriteJSONToFile(productAPITemplate, String.Concat(creatorConfig.outputLocation, name));
100-
}
101-
}
76+
armTemplateWriter.WriteJSONToFile(apiTemplate, String.Concat(creatorConfig.outputLocation, creatorFileNames.api));
10277
armTemplateWriter.WriteJSONToFile(masterTemplate, String.Concat(creatorConfig.outputLocation, @"/", "master.template.json"));
10378

10479
ColoredConsole.WriteLine("Templates written to output location");

src/APIM_ARMTemplate/apimtemplate/Common/Templates/Template.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
using System;
1+
using Newtonsoft.Json;
2+
using System;
23
using System.Collections.Generic;
34
using System.Text;
45

56
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates
67
{
78
public class Template
89
{
10+
[JsonProperty(PropertyName = "$schema")]
911
public string schema { get; set; }
1012
public string contentVersion { get; set; }
1113
public Dictionary<string, TemplateParameterProperties> parameters { get; set; }
@@ -32,5 +34,6 @@ public class TemplateResource {
3234
public string type { get; set; }
3335
public string apiVersion { get; set; }
3436
public string scale { get; set; }
37+
public string[] dependsOn { get; set; }
3538
}
3639
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
version: 0.0.1
2-
apimServiceName: "myService"
2+
apimServiceName: "testing-grounds"
33
apiVersionSet:
44
id: 1b3dee
55
displayName: myAPIVersionSet

src/APIM_ARMTemplate/apimtemplate/Creator/FileHandlers/ARMTemplateWriter.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,13 @@ public class ARMTemplateWriter
1010
{
1111
public void WriteJSONToFile(object template, string location)
1212
{
13-
JObject json = JObject.FromObject(template);
14-
using (StreamWriter file = File.CreateText(location))
15-
using (JsonTextWriter writer = new JsonTextWriter(file))
16-
{
17-
json.WriteTo(writer);
18-
}
13+
string jsonString = JsonConvert.SerializeObject(template,
14+
Formatting.None,
15+
new JsonSerializerSettings
16+
{
17+
NullValueHandling = NullValueHandling.Ignore
18+
});
19+
File.WriteAllText(location, jsonString);
1920
}
2021
}
2122
}

src/APIM_ARMTemplate/apimtemplate/Creator/FileHandlers/FileNameGenerator.cs

Lines changed: 2 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -6,64 +6,14 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates
66
{
77
public class FileNameGenerator
88
{
9-
public CreatorFileNames GenerateCreatorFileNames(Template apiVersionSetTemplate,
10-
Template initialAPITemplate,
11-
Template subsequentAPITemplate,
12-
List<Template> productAPITemplates,
13-
Template apiPolicyTemplate,
14-
List<Template> operationPolicyTemplates,
15-
CreatorConfig creatorConfig)
9+
public CreatorFileNames GenerateCreatorFileNames()
1610
{
17-
Dictionary<string, string> operationPolicies = new Dictionary<string, string>();
18-
Dictionary<string, string> productAPIs = new Dictionary<string, string>();
19-
foreach (Template operationPolicyTemplate in operationPolicyTemplates)
20-
{
21-
// outputs { "getSessions" : "/operationpolicy-getSessions.template.json"}
22-
KeyValuePair<string, string> pair = this.RetrieveFileNameForOperationPolicyTemplate(operationPolicyTemplate, creatorConfig);
23-
operationPolicies.Add(pair.Key, pair.Value);
24-
}
25-
foreach (Template productAPITemplate in productAPITemplates)
26-
{
27-
// outputs { "starter" : "/productapi-starter.template.json"}
28-
KeyValuePair<string, string> pair = this.RetrieveFileNameForProductAPITemplate(productAPITemplate, creatorConfig);
29-
productAPIs.Add(pair.Key, pair.Value);
30-
}
3111
return new CreatorFileNames()
3212
{
3313
apiVersionSet = $@"/versionset.template.json",
34-
initialAPI = $@"/api-initial.template.json",
35-
subsequentAPI = $@"/api-subsequent.template.json",
36-
apiPolicy = $@"/apipolicy.template.json",
37-
operationPolicies = operationPolicies,
38-
productAPIs = productAPIs,
14+
api = $@"/api.template.json",
3915
master = @"/master.template.json"
4016
};
4117
}
42-
43-
public KeyValuePair<string, string> RetrieveFileNameForOperationPolicyTemplate(Template operationPolicyTemplate, CreatorConfig creatorConfig)
44-
{
45-
foreach (string operation in creatorConfig.api.operations.Keys)
46-
{
47-
if (operationPolicyTemplate.resources[0].name.Contains(operation))
48-
{
49-
return new KeyValuePair<string, string>(operation, $@"/operationpolicy-{operation}.template.json");
50-
};
51-
};
52-
return new KeyValuePair<string, string>("", "");
53-
}
54-
55-
public KeyValuePair<string, string> RetrieveFileNameForProductAPITemplate(Template productAPITemplate, CreatorConfig creatorConfig)
56-
{
57-
string[] productIDs = creatorConfig.api.products.Split(", ");
58-
foreach (string productID in productIDs)
59-
{
60-
if (productAPITemplate.resources[0].name.Contains(productID))
61-
{
62-
return new KeyValuePair<string, string>(productID, $@"/productapi-{productID}.template.json");
63-
};
64-
};
65-
return new KeyValuePair<string, string>("", "");
66-
}
67-
6818
}
6919
}

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates
77
public class CreatorFileNames
88
{
99
public string apiVersionSet { get; set; }
10-
public string initialAPI { get; set; }
11-
public string subsequentAPI { get; set; }
12-
public string apiPolicy { get; set; }
13-
public Dictionary<string, string> operationPolicies { get; set; }
14-
public Dictionary<string, string> productAPIs { get; set; }
10+
public string api { get; set; }
1511
public string master { get; set; }
1612
}
1713
}

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

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,20 @@ namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates
99
{
1010
public class APITemplateCreator
1111
{
12-
private TemplateCreator templateCreator;
1312
private FileReader fileReader;
13+
private TemplateCreator templateCreator;
14+
private PolicyTemplateCreator policyTemplateCreator;
15+
private ProductAPITemplateCreator productAPITemplateCreator;
1416

15-
public APITemplateCreator(TemplateCreator templateCreator, FileReader fileReader)
17+
public APITemplateCreator(FileReader fileReader, TemplateCreator templateCreator, PolicyTemplateCreator policyTemplateCreator, ProductAPITemplateCreator productAPITemplateCreator)
1618
{
17-
this.templateCreator = templateCreator;
1819
this.fileReader = fileReader;
20+
this.templateCreator = templateCreator;
21+
this.policyTemplateCreator = policyTemplateCreator;
22+
this.productAPITemplateCreator = productAPITemplateCreator;
1923
}
2024

21-
public Template CreateInitialAPITemplateAsync(CreatorConfig creatorConfig)
25+
public async Task<Template> CreateAPITemplateAsync(CreatorConfig creatorConfig)
2226
{
2327
Template apiTemplate = this.templateCreator.CreateEmptyTemplate();
2428

@@ -28,7 +32,29 @@ public Template CreateInitialAPITemplateAsync(CreatorConfig creatorConfig)
2832
{ "ApimServiceName", new TemplateParameterProperties(){ type = "string" } }
2933
};
3034

35+
string subsequentAPIName = "[concat(parameters('ApimServiceName'), '/api')]";
36+
string subsequentAPIType = "Microsoft.ApiManagement/service/apis";
37+
string[] dependsOnSubsequentAPI = new string[] { $"[resourceId('{subsequentAPIType}', '{subsequentAPIName}')]" };
38+
3139
List<TemplateResource> resources = new List<TemplateResource>();
40+
// create api resource with properties
41+
APITemplateResource initialAPITemplateResource = this.CreateInitialAPITemplateResource(creatorConfig);
42+
APITemplateResource subsequentAPITemplateResource = await this.CreateSubsequentAPITemplateResourceAsync(creatorConfig);
43+
PolicyTemplateResource apiPolicyResource = await this.policyTemplateCreator.CreateAPIPolicyTemplateResourceAsync(creatorConfig, dependsOnSubsequentAPI);
44+
List<PolicyTemplateResource> operationPolicyResources = await this.policyTemplateCreator.CreateOperationPolicyTemplateResourcesAsync(creatorConfig, dependsOnSubsequentAPI);
45+
List<ProductAPITemplateResource> productAPIResources = this.productAPITemplateCreator.CreateProductAPITemplateResources(creatorConfig, dependsOnSubsequentAPI);
46+
resources.Add(initialAPITemplateResource);
47+
resources.Add(subsequentAPITemplateResource);
48+
resources.Add(apiPolicyResource);
49+
resources.AddRange(operationPolicyResources);
50+
resources.AddRange(productAPIResources);
51+
52+
apiTemplate.resources = resources.ToArray();
53+
return apiTemplate;
54+
}
55+
56+
public APITemplateResource CreateInitialAPITemplateResource(CreatorConfig creatorConfig)
57+
{
3258
// create api resource with properties
3359
APITemplateResource apiTemplateResource = new APITemplateResource()
3460
{
@@ -44,45 +70,34 @@ public Template CreateInitialAPITemplateAsync(CreatorConfig creatorConfig)
4470
apiRevisionDescription = creatorConfig.api.revisionDescription ?? "",
4571
apiVersionDescription = creatorConfig.api.apiVersionDescription ?? "",
4672
authenticationSettings = creatorConfig.api.authenticationSettings ?? null
47-
}
73+
},
74+
dependsOn = new string[] { }
4875
};
49-
resources.Add(apiTemplateResource);
50-
51-
apiTemplate.resources = resources.ToArray();
52-
return apiTemplate;
76+
return apiTemplateResource;
5377
}
5478

55-
public async Task<Template> CreateSubsequentAPITemplate(CreatorConfig creatorConfig)
79+
public async Task<APITemplateResource> CreateSubsequentAPITemplateResourceAsync(CreatorConfig creatorConfig)
5680
{
57-
Template apiTemplate = this.templateCreator.CreateEmptyTemplate();
58-
59-
// add parameters
60-
apiTemplate.parameters = new Dictionary<string, TemplateParameterProperties>
61-
{
62-
{ "ApimServiceName", new TemplateParameterProperties(){ type = "string" } }
63-
};
64-
65-
List<TemplateResource> resources = new List<TemplateResource>();
6681
// create api resource with properties
6782
// used to escape characters in json file
6883
object deserializedFileContents = JsonConvert.DeserializeObject<object>(await this.fileReader.RetrieveLocationContentsAsync(creatorConfig.api.openApiSpec));
84+
string subsequentAPIName = "[concat(parameters('ApimServiceName'), '/api')]";
85+
string subsequentAPIType = "Microsoft.ApiManagement/service/apis";
6986
APITemplateResource apiTemplateResource = new APITemplateResource()
7087
{
71-
name = "[concat(parameters('ApimServiceName'), '/api')]",
72-
type = "Microsoft.ApiManagement/service/apis",
88+
name = subsequentAPIName,
89+
type = subsequentAPIType,
7390
apiVersion = "2018-06-01-preview",
7491
properties = new APITemplateProperties()
7592
{
7693
contentFormat = "swagger-json",
7794
contentValue = JsonConvert.SerializeObject(deserializedFileContents),
7895
// supplied via optional arguments
7996
path = creatorConfig.api.suffix ?? ""
80-
}
81-
};
82-
resources.Add(apiTemplateResource);
83-
84-
apiTemplate.resources = resources.ToArray();
85-
return apiTemplate;
97+
},
98+
dependsOn = new string[] { $"[resourceId('{subsequentAPIType}', '{subsequentAPIName}')]" }
99+
};
100+
return apiTemplateResource;
86101
}
87102
}
88103
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ public Template CreateAPIVersionSetTemplate(CreatorConfig creatorConfig)
4040
versionHeaderName = creatorConfig.apiVersionSet.versionHeaderName,
4141
versionQueryName = creatorConfig.apiVersionSet.versionQueryName,
4242
versioningScheme = creatorConfig.apiVersionSet.versioningScheme,
43-
}
43+
},
44+
dependsOn = new string[] { }
4445
};
4546
resources.Add(apiVersionSetTemplateResource);
4647

0 commit comments

Comments
 (0)