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

Commit 6908c90

Browse files
committed
extract schemas, add schemas to operation representations and depend on them
1 parent 9992e27 commit 6908c90

File tree

5 files changed

+109
-12
lines changed

5 files changed

+109
-12
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Extract.cs

Lines changed: 76 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public ExtractCommand()
4747
GenerateARMTemplate(apimname, resourceGroup, fileFolder, singleApiName);
4848

4949
Console.WriteLine("Templates written to output location");
50+
Console.WriteLine("Press any key to exit process:");
5051
#if DEBUG
5152
Console.ReadKey();
5253
#endif
@@ -79,7 +80,7 @@ private void GenerateARMTemplate(string apimname, string resourceGroup, string f
7980
string apiDetails = apiExtractor.GetAPIDetails(apimname, resourceGroup, apiName).Result;
8081

8182
Console.WriteLine("------------------------------------------");
82-
Console.WriteLine("Geting operations from {0} API:", apiName);
83+
Console.WriteLine("Getting operations from {0} API:", apiName);
8384

8485
JObject oApiDetails = JObject.Parse(apiDetails);
8586
APITemplateResource apiResource = JsonConvert.DeserializeObject<APITemplateResource>(apiDetails);
@@ -108,6 +109,11 @@ private void GenerateARMTemplate(string apimname, string resourceGroup, string f
108109

109110
templateResources.Add(apiResource);
110111

112+
#region Schemas
113+
List<TemplateResource> schemaResources = GenerateSchemasARMTemplate(apimname, apiName, resourceGroup, fileFolder);
114+
templateResources.AddRange(schemaResources);
115+
#endregion
116+
111117
#region Operations
112118

113119
string operations = apiExtractor.GetAPIOperations(apimname, resourceGroup, apiName).Result;
@@ -125,7 +131,37 @@ private void GenerateARMTemplate(string apimname, string resourceGroup, string f
125131
operationResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}')]";
126132
operationResource.apiVersion = "2018-06-01-preview";
127133
operationResource.scale = null;
128-
operationResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" };
134+
135+
// depend on api and schemas if necessary
136+
List<string> operationDependsOn = new List<string>() { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" };
137+
foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationResource.properties.request.representations)
138+
{
139+
if (operationTemplateRepresentation.schemaId != null)
140+
{
141+
string dependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/schemas', parameters('ApimServiceName'), '{oApiName}', '{operationTemplateRepresentation.schemaId}')]";
142+
// add value to list if schema has not already been added
143+
if (!operationDependsOn.Exists(o => o == dependsOn))
144+
{
145+
operationDependsOn.Add(dependsOn);
146+
}
147+
}
148+
}
149+
foreach (OperationsTemplateResponse operationTemplateResponse in operationResource.properties.responses)
150+
{
151+
foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationTemplateResponse.representations)
152+
{
153+
if (operationTemplateRepresentation.schemaId != null)
154+
{
155+
string dependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/schemas', parameters('ApimServiceName'), '{oApiName}', '{operationTemplateRepresentation.schemaId}')]";
156+
// add value to list if schema has not already been added
157+
if (!operationDependsOn.Exists(o => o == dependsOn))
158+
{
159+
operationDependsOn.Add(dependsOn);
160+
}
161+
}
162+
}
163+
}
164+
operationResource.dependsOn = operationDependsOn.ToArray();
129165

130166
templateResources.Add(operationResource);
131167
try
@@ -150,7 +186,7 @@ private void GenerateARMTemplate(string apimname, string resourceGroup, string f
150186
#region API Policies
151187
try
152188
{
153-
Console.WriteLine("Geting API Policy from {0} API: ", apiName);
189+
Console.WriteLine("Getting API Policy from {0} API: ", apiName);
154190
string apiPolicies = apiExtractor.GetAPIPolicies(apimname, resourceGroup, apiName).Result;
155191
Console.WriteLine("API Policy found!");
156192
PolicyTemplateResource apiPoliciesResource = JsonConvert.DeserializeObject<PolicyTemplateResource>(apiPolicies);
@@ -170,7 +206,7 @@ private void GenerateARMTemplate(string apimname, string resourceGroup, string f
170206
#region API Products
171207
try
172208
{
173-
Console.WriteLine("Geting API Products from {0} API: ", apiName);
209+
Console.WriteLine("Getting API Products from {0} API: ", apiName);
174210
string apiProducts = apiExtractor.GetApiProducts(apimname, resourceGroup, apiName).Result;
175211
JObject oApiProducts = JObject.Parse(apiProducts);
176212

@@ -198,7 +234,7 @@ private void GenerateARMTemplate(string apimname, string resourceGroup, string f
198234
#region Diagnostics
199235

200236
Console.WriteLine("------------------------------------------");
201-
Console.WriteLine("Geting diagnostics from {0} API:", apiName);
237+
Console.WriteLine("Getting diagnostics from {0} API:", apiName);
202238
string diagnostics = apiExtractor.GetAPIDiagnostics(apimname, resourceGroup, apiName).Result;
203239
JObject oDiagnostics = JObject.Parse(diagnostics);
204240
foreach (var diagnostic in oDiagnostics["value"])
@@ -316,10 +352,43 @@ private void GenerateProductsARMTemplate(string apimname, string resourceGroup,
316352
fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-products.json");
317353

318354
}
355+
356+
private List<TemplateResource> GenerateSchemasARMTemplate(string apimServiceName, string apiName, string resourceGroup, string fileFolder)
357+
{
358+
Console.WriteLine("------------------------------------------");
359+
Console.WriteLine("Getting operation schemas from service");
360+
361+
APIExtractor apiExtractor = new APIExtractor();
362+
List<TemplateResource> templateResources = new List<TemplateResource>();
363+
364+
string schemas = apiExtractor.GetApiSchemas(apimServiceName, resourceGroup, apiName).Result;
365+
JObject oSchemas = JObject.Parse(schemas);
366+
367+
foreach (var item in oSchemas["value"])
368+
{
369+
string schemaName = ((JValue)item["name"]).Value.ToString();
370+
Console.WriteLine("'{0}' Schema found", schemaName);
371+
372+
string schemaDetails = apiExtractor.GetApiSchemaDetails(apimServiceName, resourceGroup, apiName, schemaName).Result;
373+
374+
// pull returned document and convert to correct format
375+
RESTReturnedSchemaTemplate restReturnedSchemaTemplate = JsonConvert.DeserializeObject<RESTReturnedSchemaTemplate>(schemaDetails);
376+
SchemaTemplateResource schemaDetailsResource = JsonConvert.DeserializeObject<SchemaTemplateResource>(schemaDetails);
377+
schemaDetailsResource.properties.document.value = JsonConvert.SerializeObject(restReturnedSchemaTemplate.properties.document);
378+
schemaDetailsResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{schemaName}')]";
379+
schemaDetailsResource.apiVersion = "2018-06-01-preview";
380+
schemaDetailsResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" };
381+
382+
templateResources.Add(schemaDetailsResource);
383+
384+
}
385+
return templateResources;
386+
}
387+
319388
private async void GenerateLoggerTemplate(string resourceGroup, string apimname, string fileFolder)
320389
{
321390
Console.WriteLine("------------------------------------------");
322-
Console.WriteLine("Geting loggers from service");
391+
Console.WriteLine("Getting loggers from service");
323392
LoggerExtractor loggerExtractor = new LoggerExtractor();
324393
PropertyExtractor propertyExtractor = new PropertyExtractor();
325394
Template armTemplate = GenerateEmptyTemplateWithParameters();
@@ -365,8 +434,7 @@ private async void GenerateLoggerTemplate(string resourceGroup, string apimname,
365434

366435
armTemplate.resources = templateResources.ToArray();
367436
FileWriter fileWriter = new FileWriter();
368-
string filePath = fileFolder + Path.DirectorySeparatorChar + string.Format("loggers", "/", "-") + ".json";
369-
fileWriter.WriteJSONToFile(armTemplate, filePath);
437+
fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-loggers.json");
370438
}
371439

372440
public Template GenerateEmptyTemplateWithParameters()

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class OperationTemplateRequest
3434
public string description { get; set; }
3535
public OperationTemplateParameter[] queryParameters { get; set; }
3636
public OperationTemplateParameter[] headers { get; set; }
37-
//public OperationTemplateRepresentation[] representations { get; set; }
37+
public OperationTemplateRepresentation[] representations { get; set; }
3838
}
3939

4040
public class OperationTemplateRepresentation
@@ -51,6 +51,6 @@ public class OperationsTemplateResponse
5151
public string statusCode { get; set; }
5252
public string description { get; set; }
5353
public OperationTemplateParameter[] headers { get; set; }
54-
//public OperationTemplateRepresentation[] representations { get; set; }
54+
public OperationTemplateRepresentation[] representations { get; set; }
5555
}
5656
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,15 @@ public class SchemaTemplateDocument
1616
{
1717
public string value { get; set; }
1818
}
19+
20+
public class RESTReturnedSchemaTemplate : APITemplateSubResource
21+
{
22+
public RESTReturnedSchemaTemplateProperties properties { get; set; }
23+
}
24+
25+
public class RESTReturnedSchemaTemplateProperties
26+
{
27+
public string contentType { get; set; }
28+
public object document { get; set; }
29+
}
1930
}

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,12 +128,30 @@ private static async Task<string> CallApiManagement(string azToken, string reque
128128
public async Task<string> GetApiProducts(string ApiManagementName, string ResourceGroupName, string ApiName)
129129
{
130130
(string azToken, string azSubId) = await auth.GetAccessToken();
131-
131+
132132
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/apis/{4}/products?api-version={5}",
133133
baseUrl, azSubId, ResourceGroupName, ApiManagementName, ApiName, Constants.APIVersion);
134134

135135
return await CallApiManagement(azToken, requestUrl);
136136
}
137+
public async Task<string> GetApiSchemas(string ApiManagementName, string ResourceGroupName, string ApiName)
138+
{
139+
(string azToken, string azSubId) = await auth.GetAccessToken();
140+
141+
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/apis/{4}/schemas?api-version={5}",
142+
baseUrl, azSubId, ResourceGroupName, ApiManagementName, ApiName, Constants.APIVersion);
143+
144+
return await CallApiManagement(azToken, requestUrl);
145+
}
146+
public async Task<string> GetApiSchemaDetails(string ApiManagementName, string ResourceGroupName, string ApiName, string schemaName)
147+
{
148+
(string azToken, string azSubId) = await auth.GetAccessToken();
149+
150+
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/apis/{4}/schemas/{5}?api-version={6}",
151+
baseUrl, azSubId, ResourceGroupName, ApiManagementName, ApiName, schemaName, Constants.APIVersion);
152+
153+
return await CallApiManagement(azToken, requestUrl);
154+
}
137155

138156
}
139157
}

src/APIM_ARMTemplate/apimtemplate/Properties/launchSettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"profiles": {
33
"apimtemplate": {
44
"commandName": "Project",
5-
"commandLineArgs": "create --configFile ./Creator/ExampleFiles/YAMLConfigs/validTesting.yml"
5+
"commandLineArgs": "extract --name LucasLinked2 --resourceGroup LucasHuetHudsonInternal --fileFolder C:\\Users\\lucashh\\Desktop\\Projects\\APIM-ARM\\ExtractedTemplates"
66
}
77
}
88
}

0 commit comments

Comments
 (0)