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

Commit f7db8e2

Browse files
authored
[Extractor]Parameter api logger id (#336)
1 parent 3970e94 commit f7db8e2

File tree

6 files changed

+105
-55
lines changed

6 files changed

+105
-55
lines changed

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public async Task<string> GetAPIServiceUrl(string ApiManagementName, string Reso
8484
string apiDetails = await CallApiManagementAsync(azToken, requestUrl);
8585
JObject oApiDetails = JObject.Parse(apiDetails);
8686
APITemplateResource apiResource = JsonConvert.DeserializeObject<APITemplateResource>(apiDetails);
87-
return apiResource.properties.serviceUrl;
87+
return apiResource.properties.serviceUrl;
8888
}
8989

9090
public async Task<string> GetAPIDetailsAsync(string ApiManagementName, string ResourceGroupName, string ApiName)
@@ -123,6 +123,19 @@ public async Task<JToken[]> GetAllAPIObjsAsync(string ApiManagementName, string
123123
return apiObjs.ToArray();
124124
}
125125

126+
public async Task<List<string>> GetAllAPINamesAsync(string ApiManagementName, string ResourceGroupName)
127+
{
128+
JToken[] oApis = await GetAllAPIObjsAsync(ApiManagementName, ResourceGroupName);
129+
List<string> apiNames = new List<string>();
130+
131+
foreach (JToken curApi in oApis)
132+
{
133+
string apiName = ((JValue)curApi["name"]).Value.ToString();
134+
apiNames.Add(apiName);
135+
}
136+
return apiNames;
137+
}
138+
126139
public async Task<string> GetAPIChangeLogAsync(string ApiManagementName, string ResourceGroupName, string ApiName)
127140
{
128141
(string azToken, string azSubId) = await auth.GetAccessToken();
@@ -222,7 +235,7 @@ public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string
222235

223236
if (exc.paramServiceUrl)
224237
{
225-
apiResource.properties.serviceUrl = $"[parameters('serviceUrl').{ExtractorUtils.GenValidApiParamName(apiName)}]";
238+
apiResource.properties.serviceUrl = $"[parameters('serviceUrl').{ExtractorUtils.GenValidParamName(apiName, "Api")}]";
226239
}
227240

228241
if (apiResource.properties.apiVersionSetId != null)
@@ -449,6 +462,10 @@ public async Task<List<TemplateResource>> GenerateSingleAPIResourceAsync(string
449462
diagnosticResource.scale = null;
450463
diagnosticResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" };
451464

465+
if (exc.paramApiLoggerId) {
466+
diagnosticResource.properties.loggerId = $"[parameters('ApiLoggerId').{ExtractorUtils.GenValidParamName(apiName, "Api")}.{ExtractorUtils.GenValidParamName(diagnosticName, "Diagnostic")}]";
467+
}
468+
452469
if (!diagnosticName.Contains("applicationinsights"))
453470
{
454471
// enableHttpCorrelationHeaders only works for application insights, causes errors otherwise
@@ -524,7 +541,7 @@ public async Task<List<TemplateResource>> GenerateCurrentRevisionAPIResourceAsyn
524541

525542
if (exc.paramServiceUrl)
526543
{
527-
apiResource.properties.serviceUrl = $"[parameters('serviceUrl').{ExtractorUtils.GenValidApiParamName(apiName)}]";
544+
apiResource.properties.serviceUrl = $"[parameters('serviceUrl').{ExtractorUtils.GenValidParamName(apiName, "Api")}]";
528545
}
529546

530547
if (apiResource.properties.apiVersionSetId != null)
@@ -751,6 +768,10 @@ public async Task<List<TemplateResource>> GenerateCurrentRevisionAPIResourceAsyn
751768
diagnosticResource.scale = null;
752769
diagnosticResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" };
753770

771+
if (exc.paramApiLoggerId) {
772+
diagnosticResource.properties.loggerId = $"[parameters('ApiLoggerId').{ExtractorUtils.GenValidParamName(apiName, "Api")}.{ExtractorUtils.GenValidParamName(diagnosticName, "Diagnostic")}]";
773+
}
774+
754775
if (!diagnosticName.Contains("applicationinsights"))
755776
{
756777
// enableHttpCorrelationHeaders only works for application insights, causes errors otherwise

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,14 @@ public Template GenerateEmptyApiTemplateWithParameters(Extractor exc)
127127
};
128128
armTemplate.parameters.Add("serviceUrl", serviceUrlParamProperty);
129129
}
130+
if (exc.paramApiLoggerId)
131+
{
132+
TemplateParameterProperties apiLoggerProperty = new TemplateParameterProperties()
133+
{
134+
type = "object"
135+
};
136+
armTemplate.parameters.Add("ApiLoggerId", apiLoggerProperty);
137+
}
130138
return armTemplate;
131139
}
132140
}

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

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public Template GenerateLinkedMasterTemplate(Template apiTemplate,
2323
string apiFileName,
2424
Extractor exc)
2525
{
26+
Console.WriteLine("------------------------------------------");
27+
Console.WriteLine("Generating master template");
2628
// create empty template
2729
Template masterTemplate = GenerateEmptyTemplate();
2830

@@ -109,7 +111,7 @@ public Template GenerateLinkedMasterTemplate(Template apiTemplate,
109111
string apisUri = GenerateLinkedTemplateUri(exc.linkedTemplatesUrlQueryString, exc.linkedTemplatesSasToken, apiFileName);
110112
resources.Add(this.CreateLinkedMasterTemplateResourceForApiTemplate("apisTemplate", apisUri, apiDependsOn.ToArray(), exc));
111113
}
112-
114+
Console.WriteLine("Master template generated");
113115
masterTemplate.resources = resources.ToArray();
114116
return masterTemplate;
115117
}
@@ -125,6 +127,10 @@ public MasterTemplateResource CreateLinkedMasterTemplateResourceForApiTemplate(s
125127
{
126128
masterResourceTemplate.properties.parameters.Add("serviceUrl", new TemplateParameterProperties() { value = "[parameters('serviceUrl')]" });
127129
}
130+
if (exc.paramApiLoggerId)
131+
{
132+
masterResourceTemplate.properties.parameters.Add("ApiLoggerId", new TemplateParameterProperties() { value = "[parameters('ApiLoggerId')]" });
133+
}
128134
return masterResourceTemplate;
129135
}
130136

@@ -283,6 +289,18 @@ public Dictionary<string, TemplateParameterProperties> CreateMasterTemplateParam
283289
};
284290
parameters.Add("NamedValues", namedValueProperties);
285291
}
292+
if (exc.paramApiLoggerId)
293+
{
294+
TemplateParameterProperties loggerIdProperties = new TemplateParameterProperties()
295+
{
296+
metadata = new TemplateParameterMetadata()
297+
{
298+
description = "LoggerId for this api"
299+
},
300+
type = "object"
301+
};
302+
parameters.Add("ApiLoggerId", loggerIdProperties);
303+
}
286304
return parameters;
287305
}
288306

@@ -327,7 +345,7 @@ public string[] GenerateAPIRevisionDependencies(string curRevTemplate)
327345
return revDependsOn.ToArray();
328346
}
329347

330-
public async Task<Template> CreateMasterTemplateParameterValues(string singleApiName, List<string> multipleApiNames, Extractor exc)
348+
public async Task<Template> CreateMasterTemplateParameterValues(List<string> apisToExtract, Extractor exc)
331349
{
332350
// used to create the parameter values for use in parameters file
333351
// create empty template
@@ -387,44 +405,16 @@ public async Task<Template> CreateMasterTemplateParameterValues(string singleApi
387405
{
388406
Dictionary<string, string> serviceUrls = new Dictionary<string, string>();
389407
APIExtractor apiExc = new APIExtractor(new FileWriter());
390-
if (singleApiName != null)
408+
foreach (string apiName in apisToExtract)
391409
{
392-
string validApiName = ExtractorUtils.GenValidApiParamName(singleApiName);
393-
string serviceUrl = GetApiServiceUrlFromParameters(singleApiName, exc.serviceUrlParameters);
410+
string validApiName = ExtractorUtils.GenValidParamName(apiName, "Api");
411+
string serviceUrl = GetApiServiceUrlFromParameters(apiName, exc.serviceUrlParameters);
394412
if (serviceUrl == null)
395413
{
396-
serviceUrl = await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, singleApiName);
414+
serviceUrl = await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, apiName);
397415
}
398416
serviceUrls.Add(validApiName, serviceUrl);
399417
}
400-
else if (multipleApiNames != null)
401-
{
402-
foreach (string apiName in multipleApiNames)
403-
{
404-
string validApiName = ExtractorUtils.GenValidApiParamName(apiName);
405-
string serviceUrl = GetApiServiceUrlFromParameters(apiName, exc.serviceUrlParameters);
406-
if (serviceUrl == null)
407-
{
408-
serviceUrl = await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, apiName);
409-
}
410-
serviceUrls.Add(validApiName, serviceUrl);
411-
}
412-
}
413-
else
414-
{
415-
JToken[] oApis = await apiExc.GetAllAPIObjsAsync(exc.sourceApimName, exc.resourceGroup);
416-
foreach (JToken oApi in oApis)
417-
{
418-
string apiName = ((JValue)oApi["name"]).Value.ToString();
419-
string validApiName = ExtractorUtils.GenValidApiParamName(apiName);
420-
string serviceUrl = GetApiServiceUrlFromParameters(apiName, exc.serviceUrlParameters);
421-
if (serviceUrl == null)
422-
{
423-
serviceUrl = await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, apiName);
424-
}
425-
serviceUrls.Add(validApiName, serviceUrl);
426-
}
427-
}
428418
TemplateServiceUrlProperties serviceUrlProperties = new TemplateServiceUrlProperties()
429419
{
430420
value = serviceUrls
@@ -444,7 +434,7 @@ public async Task<Template> CreateMasterTemplateParameterValues(string singleApi
444434
string fullPropertyResource = await pExc.GetPropertyDetailsAsync(exc.sourceApimName, exc.resourceGroup, propertyName);
445435
PropertyTemplateResource propertyTemplateResource = JsonConvert.DeserializeObject<PropertyTemplateResource>(fullPropertyResource);
446436
string propertyValue = propertyTemplateResource.properties.value;
447-
string validPName = ExtractorUtils.GenValidPropertyParamName(propertyName);
437+
string validPName = ExtractorUtils.GenValidParamName(propertyName, "Property");
448438
namedValues.Add(validPName, propertyValue);
449439
}
450440
TemplateServiceUrlProperties namedValueProperties = new TemplateServiceUrlProperties()
@@ -453,6 +443,31 @@ public async Task<Template> CreateMasterTemplateParameterValues(string singleApi
453443
};
454444
parameters.Add("NamedValues", namedValueProperties);
455445
}
446+
if (exc.paramApiLoggerId)
447+
{
448+
Dictionary<string, Dictionary<string, string>> ApiLoggerId = new Dictionary<string, Dictionary<string, string>>();
449+
APIExtractor apiExc = new APIExtractor(new FileWriter());
450+
foreach (string curApiName in apisToExtract)
451+
{
452+
Dictionary<string, string> loggerIds = new Dictionary<string, string>();
453+
string diagnostics = await apiExc.GetAPIDiagnosticsAsync(exc.sourceApimName, exc.resourceGroup, curApiName);
454+
JObject oDiagnostics = JObject.Parse(diagnostics);
455+
foreach (var diagnostic in oDiagnostics["value"])
456+
{
457+
string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString();
458+
string loggerId = ((JValue)diagnostic["properties"]["loggerId"]).Value.ToString();
459+
loggerIds.Add(ExtractorUtils.GenValidParamName(diagnosticName, "Diagnostic"), loggerId);
460+
}
461+
if (loggerIds.Count != 0) {
462+
ApiLoggerId.Add(ExtractorUtils.GenValidParamName(curApiName, "Api"), loggerIds);
463+
}
464+
}
465+
TemplateServiceUrlProperties loggerIdProperties = new TemplateServiceUrlProperties()
466+
{
467+
value = ApiLoggerId
468+
};
469+
parameters.Add("ApiLoggerId", loggerIdProperties);
470+
}
456471
masterTemplate.parameters = parameters;
457472
return masterTemplate;
458473
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public async Task<Template> GenerateNamedValuesTemplateAsync(string singleApiNam
5555

5656
if (exc.paramNamedValue)
5757
{
58-
propertyTemplateResource.properties.value = $"[parameters('NamedValues').{ExtractorUtils.GenValidPropertyParamName(propertyName)}]";
58+
propertyTemplateResource.properties.value = $"[parameters('NamedValues').{ExtractorUtils.GenValidParamName(propertyName, "Property")}]";
5959
}
6060

6161
if (singleApiName == null)

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ public class ExtractorConfig
4040
public string paramServiceUrl { get; set; }
4141
[Description("Parameterize named values")]
4242
public string paramNamedValue { get; set; }
43+
[Description("Specify the loggerId for this api")]
44+
public string paramApiLoggerId { get; set; }
45+
[Description("Specify the resourceId for this logger")]
46+
public string paramLogResourceId { get; set; }
4347
public void Validate()
4448
{
4549
if (string.IsNullOrEmpty(sourceApimName)) throw new ArgumentException("Missing parameter <sourceApimName>.");
@@ -96,6 +100,8 @@ public class Extractor
96100
public serviceUrlProperty[] serviceUrlParameters { get; set; }
97101
public bool paramServiceUrl { get; private set; }
98102
public bool paramNamedValue { get; private set; }
103+
public bool paramApiLoggerId { get; private set; }
104+
public bool paramLogResourceId { get; private set; }
99105

100106
public Extractor(ExtractorConfig exc, string dirName)
101107
{
@@ -113,6 +119,8 @@ public Extractor(ExtractorConfig exc, string dirName)
113119
this.serviceUrlParameters = exc.serviceUrlParameters;
114120
this.paramServiceUrl = (exc.paramServiceUrl != null && exc.paramServiceUrl.Equals("true")) || exc.serviceUrlParameters != null;
115121
this.paramNamedValue = exc.paramNamedValue != null && exc.paramNamedValue.Equals("true");
122+
this.paramApiLoggerId = exc.paramApiLoggerId != null && exc.paramApiLoggerId.Equals("true");
123+
this.paramLogResourceId = exc.paramLogResourceId != null && exc.paramLogResourceId.Equals("true");
116124
}
117125

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

src/APIM_ARMTemplate/apimtemplate/Extractor/Utilities/ExtractorUtils.cs

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,17 @@ public static async Task GenerateTemplates(
6565
List<string> multipleApiNames = multipleAPINames;
6666
string linkedUrlQueryString = exc.linkedTemplatesUrlQueryString;
6767

68+
// Get all Apis that will be extracted
69+
List<string> apisToExtract = new List<string>();
70+
if (singleApiName != null) {
71+
apisToExtract.Add(singleApiName);
72+
} else if (multipleApiNames != null) {
73+
apisToExtract.AddRange(multipleApiNames);
74+
} else {
75+
List<string> allApis = await apiExtractor.GetAllAPINamesAsync(exc.sourceApimName, exc.resourceGroup);
76+
apisToExtract.AddRange(allApis);
77+
}
78+
6879
// extract templates from apim service
6980
Template globalServicePolicyTemplate = await policyExtractor.GenerateGlobalServicePolicyTemplateAsync(sourceApim, resourceGroup, policyXMLBaseUrl, policyXMLSasToken, dirName);
7081
if (apiTemplate == null)
@@ -83,7 +94,7 @@ public static async Task GenerateTemplates(
8394
Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, namedValueResources, policyXMLBaseUrl, policyXMLSasToken);
8495

8596
// create parameters file
86-
Template templateParameters = await masterTemplateExtractor.CreateMasterTemplateParameterValues(singleApiName, multipleApiNames, exc);
97+
Template templateParameters = await masterTemplateExtractor.CreateMasterTemplateParameterValues(apisToExtract, exc);
8798

8899
// write templates to output file location
89100
string apiFileName = fileNameGenerator.GenerateExtractorAPIFileName(singleApiName, sourceApim);
@@ -242,25 +253,12 @@ public static async Task GenerateSplitAPITemplates(ExtractorConfig exc, FileName
242253
}
243254
}
244255

245-
public static string GenValidApiParamName(string apiName)
256+
public static string GenValidParamName(string apiName, string prefix)
246257
{
247258
string validApiName = Regex.Replace(apiName, "[^a-zA-Z0-9]", "");
248259
if (Char.IsDigit(validApiName.First()))
249260
{
250-
return "Api" + validApiName;
251-
}
252-
else
253-
{
254-
return validApiName;
255-
}
256-
}
257-
258-
public static string GenValidPropertyParamName(string propertyName)
259-
{
260-
string validApiName = Regex.Replace(propertyName, "[^a-zA-Z0-9]", "");
261-
if (Char.IsDigit(validApiName.First()))
262-
{
263-
return "Property" + validApiName;
261+
return prefix + validApiName;
264262
}
265263
else
266264
{

0 commit comments

Comments
 (0)