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

Commit 822c483

Browse files
committed
comments
1 parent 566f9a8 commit 822c483

File tree

7 files changed

+56
-29
lines changed

7 files changed

+56
-29
lines changed

src/APIM_ARMTemplate/apimtemplate/Commands/Extract.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public ExtractCommand()
2727
if (!resourceGroupName.HasValue()) throw new Exception("Missing parameter <resourceGroup>.");
2828
if (!fileFolderName.HasValue()) throw new Exception("Missing parameter <filefolder>.");
2929

30+
// isolate cli parameters
3031
string resourceGroup = resourceGroupName.Values[0].ToString();
3132
string apimname = apiManagementName.Values[0].ToString();
3233
string fileFolder = fileFolderName.Values[0].ToString();
@@ -41,6 +42,7 @@ public ExtractCommand()
4142
Console.WriteLine();
4243
Console.WriteLine("Connecting to {0} API Management Service on {1} Resource Group ...", apimname, resourceGroup);
4344

45+
// initialize entity extractor classes
4446
FileWriter fileWriter = new FileWriter();
4547
APIExtractor apiExtractor = new APIExtractor();
4648
AuthorizationServerExtractor authorizationServerExtractor = new AuthorizationServerExtractor();
@@ -49,7 +51,7 @@ public ExtractCommand()
4951
PropertyExtractor propertyExtractor = new PropertyExtractor();
5052
ProductExtractor productExtractor = new ProductExtractor();
5153

52-
// extract resources that do not fall under api. Pass in the single api name and associated resources for the single api case
54+
// extract templates from apim service
5355
Template apiTemplate = await apiExtractor.GenerateAPIsARMTemplate(apimname, resourceGroup, fileFolder, singleApiName);
5456
List<TemplateResource> apiTemplateResources = apiTemplate.resources.ToList();
5557
Template authorizationTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources);
@@ -59,6 +61,7 @@ public ExtractCommand()
5961
List<TemplateResource> namedValueResources = namedValueTemplate.resources.ToList();
6062
Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources, namedValueResources);
6163

64+
// write templates to output file location
6265
string apiFileName = singleApiName == null ? @fileFolder + Path.DirectorySeparatorChar + apimname + "-apis-template.json" : @fileFolder + Path.DirectorySeparatorChar + apimname + "-" + singleApiName + "-api-template.json";
6366
fileWriter.WriteJSONToFile(apiTemplate, apiFileName);
6467
fileWriter.WriteJSONToFile(authorizationTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-authorizationServers.json");

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

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
namespace Microsoft.Azure.Management.ApiManagement.ArmTemplates.Extract
1313
{
14-
public class APIExtractor: EntityExtractor
15-
{
14+
public class APIExtractor : EntityExtractor
15+
{
1616
public async Task<string> GetAPIOperations(string ApiManagementName, string ResourceGroupName, string ApiName)
1717
{
1818
(string azToken, string azSubId) = await auth.GetAccessToken();
@@ -56,7 +56,7 @@ public async Task<string> GetAPIDetails(string ApiManagementName, string Resourc
5656
public async Task<string> GetAPIVersionSet(string ApiManagementName, string ResourceGroupName, string VersionSetName)
5757
{
5858
(string azToken, string azSubId) = await auth.GetAccessToken();
59-
59+
6060
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/{4}?api-version={5}",
6161
baseUrl, azSubId, ResourceGroupName, ApiManagementName, VersionSetName, GlobalConstants.APIVersion);
6262

@@ -69,7 +69,7 @@ public async Task<string> GetAPIs(string ApiManagementName, string ResourceGroup
6969

7070
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/apis?api-version={4}",
7171
baseUrl, azSubId, ResourceGroupName, ApiManagementName, GlobalConstants.APIVersion);
72-
72+
7373
return await CallApiManagement(azToken, requestUrl);
7474
}
7575

@@ -93,17 +93,17 @@ public async Task<string> GetAPIDiagnostics(string ApiManagementName, string Res
9393
return await CallApiManagement(azToken, requestUrl);
9494
}
9595

96-
public async Task<string> GetApiOperationPolicies(string ApiManagementName, string ResourceGroupName, string ApiName, string OperationName)
96+
public async Task<string> GetAPIOperationPolicies(string ApiManagementName, string ResourceGroupName, string ApiName, string OperationName)
9797
{
9898
(string azToken, string azSubId) = await auth.GetAccessToken();
99-
99+
100100
string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/apis/{4}/operations/get/policies/policy?api-version={5}",
101101
baseUrl, azSubId, ResourceGroupName, ApiManagementName, ApiName, GlobalConstants.APIVersion);
102102

103103
return await CallApiManagement(azToken, requestUrl);
104104
}
105105

106-
public async Task<string> GetApiProducts(string ApiManagementName, string ResourceGroupName, string ApiName)
106+
public async Task<string> GetAPIProducts(string ApiManagementName, string ResourceGroupName, string ApiName)
107107
{
108108
(string azToken, string azSubId) = await auth.GetAccessToken();
109109

@@ -113,7 +113,7 @@ public async Task<string> GetApiProducts(string ApiManagementName, string Resour
113113
return await CallApiManagement(azToken, requestUrl);
114114
}
115115

116-
public async Task<string> GetApiSchemas(string ApiManagementName, string ResourceGroupName, string ApiName)
116+
public async Task<string> GetAPISchemas(string ApiManagementName, string ResourceGroupName, string ApiName)
117117
{
118118
(string azToken, string azSubId) = await auth.GetAccessToken();
119119

@@ -123,7 +123,7 @@ public async Task<string> GetApiSchemas(string ApiManagementName, string Resourc
123123
return await CallApiManagement(azToken, requestUrl);
124124
}
125125

126-
public async Task<string> GetApiSchemaDetails(string ApiManagementName, string ResourceGroupName, string ApiName, string schemaName)
126+
public async Task<string> GetAPISchemaDetails(string ApiManagementName, string ResourceGroupName, string ApiName, string schemaName)
127127
{
128128
(string azToken, string azSubId) = await auth.GetAccessToken();
129129

@@ -135,7 +135,9 @@ public async Task<string> GetApiSchemaDetails(string ApiManagementName, string R
135135

136136
public async Task<Template> GenerateAPIsARMTemplate(string apimname, string resourceGroup, string fileFolder, string singleApiName)
137137
{
138+
// pull all apis from service
138139
string apis = await GetAPIs(apimname, resourceGroup);
140+
// initialize arm template
139141
Template armTemplate = GenerateEmptyTemplateWithParameters();
140142

141143
JObject oApi = JObject.Parse(apis);
@@ -153,6 +155,7 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
153155
Console.WriteLine("------------------------------------------");
154156
Console.WriteLine("Getting operations from {0} API:", apiName);
155157

158+
// convert returned api to template resource class
156159
JObject oApiDetails = JObject.Parse(apiDetails);
157160
APITemplateResource apiResource = JsonConvert.DeserializeObject<APITemplateResource>(apiDetails);
158161
string oApiName = ((JValue)oApiDetails["name"]).Value.ToString();
@@ -164,6 +167,7 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
164167

165168
if (apiResource.properties.apiVersionSetId != null)
166169
{
170+
// extract the version set if referenced by an
167171
apiResource.dependsOn = new string[] { };
168172

169173
string versionSetName = apiResource.properties.apiVersionSetId;
@@ -181,12 +185,14 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
181185
templateResources.Add(apiResource);
182186

183187
#region Schemas
188+
// add schema resources to api template
184189
List<TemplateResource> schemaResources = await GenerateSchemasARMTemplate(apimname, apiName, resourceGroup, fileFolder);
185190
templateResources.AddRange(schemaResources);
186191
#endregion
187192

188193
#region Operations
189194

195+
// pull api operations for service
190196
string operations = await GetAPIOperations(apimname, resourceGroup, apiName);
191197
JObject oOperations = JObject.Parse(operations);
192198

@@ -197,13 +203,14 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
197203

198204
Console.WriteLine("'{0}' Operation found", operationName);
199205

206+
// convert returned operation to template resource class
200207
OperationTemplateResource operationResource = JsonConvert.DeserializeObject<OperationTemplateResource>(operationDetails);
201208
string operationResourceName = operationResource.name;
202209
operationResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}')]";
203210
operationResource.apiVersion = GlobalConstants.APIVersion;
204211
operationResource.scale = null;
205212

206-
// depend on api and schemas if necessary
213+
// add api and schemas to operation dependsOn, if necessary
207214
List<string> operationDependsOn = new List<string>() { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" };
208215
foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationResource.properties.request.representations)
209216
{
@@ -233,8 +240,9 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
233240
}
234241
}
235242
operationResource.dependsOn = operationDependsOn.ToArray();
236-
237243
templateResources.Add(operationResource);
244+
245+
// add operation policy resource to api template
238246
try
239247
{
240248
string operationPolicy = await GetOperationPolicy(apimname, resourceGroup, oApiName, operationName);
@@ -255,6 +263,7 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
255263
#endregion
256264

257265
#region API Policies
266+
// add api policy resource to api template
258267
try
259268
{
260269
Console.WriteLine("Getting API Policy from {0} API: ", apiName);
@@ -274,17 +283,22 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
274283
}
275284
#endregion
276285

286+
// add product api associations to template
277287
#region API Products
278288
try
279289
{
280290
Console.WriteLine("Getting API Products from {0} API: ", apiName);
281-
string apiProducts = await GetApiProducts(apimname, resourceGroup, apiName);
291+
292+
// pull product api associations
293+
string apiProducts = await GetAPIProducts(apimname, resourceGroup, apiName);
282294
JObject oApiProducts = JObject.Parse(apiProducts);
283295

284296
foreach (var item in oApiProducts["value"])
285297
{
286298
string apiProductName = ((JValue)item["name"]).Value.ToString();
287299
Console.WriteLine($" -- {apiProductName} Product found to {oApiName} API");
300+
301+
// convert returned api product associations to template resource class
288302
ProductAPITemplateResource productAPIResource = JsonConvert.DeserializeObject<ProductAPITemplateResource>(apiProducts);
289303
productAPIResource.type = ResourceTypeConstants.ProductAPI;
290304
productAPIResource.name = $"[concat(parameters('ApimServiceName'), '/{apiProductName}/{oApiName}')]";
@@ -302,16 +316,18 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
302316
#endregion
303317

304318
#region Diagnostics
305-
319+
// add diagnostics to template
306320
Console.WriteLine("------------------------------------------");
307321
Console.WriteLine("Getting diagnostics from {0} API:", apiName);
322+
// pull diagnostics for api
308323
string diagnostics = await GetAPIDiagnostics(apimname, resourceGroup, apiName);
309324
JObject oDiagnostics = JObject.Parse(diagnostics);
310325
foreach (var diagnostic in oDiagnostics["value"])
311326
{
312327
string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString();
313328
Console.WriteLine("'{0}' Diagnostic found", diagnosticName);
314329

330+
// convert returned diagnostic to template resource class
315331
DiagnosticTemplateResource diagnosticResource = diagnostic.ToObject<DiagnosticTemplateResource>();
316332
diagnosticResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{diagnosticName}')]";
317333
diagnosticResource.type = ResourceTypeConstants.APIDiagnostic;
@@ -328,7 +344,6 @@ public async Task<Template> GenerateAPIsARMTemplate(string apimname, string reso
328344
templateResources.Add(diagnosticResource);
329345

330346
}
331-
332347
#endregion
333348
}
334349

@@ -364,7 +379,9 @@ public async void GenerateVersionSetARMTemplate(string apimname, string resource
364379

365380
List<TemplateResource> templateResources = new List<TemplateResource>();
366381

382+
// pull version set resource
367383
string versionSet = await GetAPIVersionSet(apimname, resourceGroup, versionSetName);
384+
// convert returned version set to template resource
368385
APIVersionSetTemplateResource versionSetResource = JsonConvert.DeserializeObject<APIVersionSetTemplateResource>(versionSet);
369386

370387
string filePath = fileFolder + Path.DirectorySeparatorChar + string.Format(versionSetResource.name, "/", "-") + ".json";
@@ -375,6 +392,7 @@ public async void GenerateVersionSetARMTemplate(string apimname, string resource
375392
templateResources.Add(versionSetResource);
376393
armTemplate.resources = templateResources.ToArray();
377394

395+
// write version set template to output file location
378396
FileWriter fileWriter = new FileWriter();
379397
fileWriter.WriteJSONToFile(armTemplate, filePath);
380398
}
@@ -385,17 +403,18 @@ public async Task<List<TemplateResource>> GenerateSchemasARMTemplate(string apim
385403
Console.WriteLine("Getting operation schemas from service");
386404
List<TemplateResource> templateResources = new List<TemplateResource>();
387405

388-
string schemas = await GetApiSchemas(apimServiceName, resourceGroup, apiName);
406+
// pull all schemas from service
407+
string schemas = await GetAPISchemas(apimServiceName, resourceGroup, apiName);
389408
JObject oSchemas = JObject.Parse(schemas);
390409

391410
foreach (var item in oSchemas["value"])
392411
{
393412
string schemaName = ((JValue)item["name"]).Value.ToString();
394413
Console.WriteLine("'{0}' Schema found", schemaName);
395414

396-
string schemaDetails = await GetApiSchemaDetails(apimServiceName, resourceGroup, apiName, schemaName);
415+
string schemaDetails = await GetAPISchemaDetails(apimServiceName, resourceGroup, apiName, schemaName);
397416

398-
// pull returned document and convert to correct format
417+
// pull returned schema and convert to template resource
399418
RESTReturnedSchemaTemplate restReturnedSchemaTemplate = JsonConvert.DeserializeObject<RESTReturnedSchemaTemplate>(schemaDetails);
400419
SchemaTemplateResource schemaDetailsResource = JsonConvert.DeserializeObject<SchemaTemplateResource>(schemaDetails);
401420
schemaDetailsResource.properties.document.value = JsonConvert.SerializeObject(restReturnedSchemaTemplate.properties.document);

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public async Task<Template> GenerateAuthorizationServersARMTemplate(string apimn
4141
// isolate api resources in the case of a single api extraction, as they may reference authorization servers
4242
var apiResources = apiTemplateResources.Where(resource => resource.type == ResourceTypeConstants.API);
4343

44+
// pull all authorization servers for service
4445
string authorizationServers = await GetAuthorizationServers(apimname, resourceGroup);
4546
JObject oAuthorizationServers = JObject.Parse(authorizationServers);
4647

@@ -49,6 +50,7 @@ public async Task<Template> GenerateAuthorizationServersARMTemplate(string apimn
4950
string authorizationServerName = ((JValue)item["name"]).Value.ToString();
5051
string authorizationServer = await GetAuthorizationServer(apimname, resourceGroup, authorizationServerName);
5152

53+
// convert returned authorization server to template resource class
5254
AuthorizationServerTemplateResource authorizationServerTemplateResource = JsonConvert.DeserializeObject<AuthorizationServerTemplateResource>(authorizationServer);
5355
authorizationServerTemplateResource.name = $"[concat(parameters('ApimServiceName'), '/{authorizationServerName}')]";
5456
authorizationServerTemplateResource.apiVersion = GlobalConstants.APIVersion;

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
4242
var policyResources = apiTemplateResources.Where(resource => (resource.type == ResourceTypeConstants.APIPolicy || resource.type == ResourceTypeConstants.APIOperationPolicy));
4343
var namedValueResources = propertyResources.Where(resource => (resource.type == ResourceTypeConstants.Property));
4444

45+
// pull all backends for service
4546
string backends = await GetBackends(apimname, resourceGroup);
4647
JObject oBackends = JObject.Parse(backends);
4748

@@ -50,6 +51,7 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
5051
string backendName = ((JValue)item["name"]).Value.ToString();
5152
string backend = await GetBackend(apimname, resourceGroup, backendName);
5253

54+
// convert returned backend to template resource class
5355
BackendTemplateResource backendTemplateResource = JsonConvert.DeserializeObject<BackendTemplateResource>(backend);
5456
backendTemplateResource.name = $"[concat(parameters('ApimServiceName'), '/{backendName}')]";
5557
backendTemplateResource.apiVersion = GlobalConstants.APIVersion;
@@ -85,6 +87,7 @@ public async Task<Template> GenerateBackendsARMTemplate(string apimname, string
8587

8688
public bool DoesPolicyReferenceBackend(string policyContent, IEnumerable<TemplateResource> namedValueResources, string backendName, BackendTemplateResource backendTemplateResource)
8789
{
90+
// a policy is referenced by a backend with the set-backend-service policy, which will reference use the backends name or url, or through referencing a named value that applies to the backend
8891
var namedValueResourcesUsedByBackend = namedValueResources.Where(resource => DoesBackendReferenceNamedValue(resource, backendTemplateResource));
8992
if (policyContent.Contains(backendName) || policyContent.Contains(backendTemplateResource.properties.url) || policyContent.Contains(backendTemplateResource.properties.resourceId))
9093
{

0 commit comments

Comments
 (0)