public DiagnosticTemplateResource CreateAPIDiagnosticTemplateResource(APIConfig api, string[] dependsOn) { // create diagnostic resource with properties DiagnosticTemplateResource diagnosticTemplateResource = new DiagnosticTemplateResource() { name = $"[concat(parameters('ApimServiceName'), '/{api.name}/{api.diagnostic.name}')]", type = ResourceTypeConstants.APIDiagnostic, apiVersion = GlobalConstants.APIVersion, properties = new DiagnosticTemplateProperties() { alwaysLog = api.diagnostic.alwaysLog, sampling = api.diagnostic.sampling, frontend = api.diagnostic.frontend, backend = api.diagnostic.backend, enableHttpCorrelationHeaders = api.diagnostic.enableHttpCorrelationHeaders }, dependsOn = dependsOn }; // reference the provided logger if loggerId is provided if (api.diagnostic.loggerId != null) { diagnosticTemplateResource.properties.loggerId = $"[resourceId('Microsoft.ApiManagement/service/loggers', parameters('ApimServiceName'), '{api.diagnostic.loggerId}')]"; } return(diagnosticTemplateResource); }
public DiagnosticTemplateResource CreateAPIDiagnosticTemplateResource(APIConfig api, string[] dependsOn) { // create diagnostic resource with properties DiagnosticTemplateResource diagnosticTemplateResource = new DiagnosticTemplateResource() { Name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{api.name}/{api.diagnostic.name}')]", Type = ResourceTypeConstants.APIDiagnostic, ApiVersion = GlobalConstants.ApiVersion, Properties = new DiagnosticTemplateProperties() { AlwaysLog = api.diagnostic.AlwaysLog, Sampling = api.diagnostic.Sampling, Frontend = api.diagnostic.Frontend, Backend = api.diagnostic.Backend, EnableHttpCorrelationHeaders = api.diagnostic.EnableHttpCorrelationHeaders }, DependsOn = dependsOn }; // reference the provided logger if loggerId is provided if (api.diagnostic.LoggerId != null) { diagnosticTemplateResource.Properties.LoggerId = $"[resourceId('Microsoft.ApiManagement/service/loggers', parameters('{ParameterNames.ApimServiceName}'), '{api.diagnostic.LoggerId}')]"; } return(diagnosticTemplateResource); }
public List <TemplateResource> CreateChildResourceTemplates(APIConfig api) { List <TemplateResource> resources = new List <TemplateResource>(); // all child resources will depend on the api string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{api.name}')]" }; PolicyTemplateResource apiPolicyResource = api.policy != null?this.policyTemplateCreator.CreateAPIPolicyTemplateResource(api, dependsOn) : null; List <PolicyTemplateResource> operationPolicyResources = api.operations != null?this.policyTemplateCreator.CreateOperationPolicyTemplateResources(api, dependsOn) : null; List <ProductAPITemplateResource> productAPIResources = api.products != null?this.productAPITemplateCreator.CreateProductAPITemplateResources(api, dependsOn) : null; DiagnosticTemplateResource diagnosticTemplateResource = api.diagnostic != null?this.diagnosticTemplateCreator.CreateAPIDiagnosticTemplateResource(api, dependsOn) : null; // add resources if not null if (apiPolicyResource != null) { resources.Add(apiPolicyResource); } if (operationPolicyResources != null) { resources.AddRange(operationPolicyResources); } if (productAPIResources != null) { resources.AddRange(productAPIResources); } if (diagnosticTemplateResource != null) { resources.Add(diagnosticTemplateResource); } return(resources); }
public Template CreateSubsequentAPITemplate(CreatorConfig creatorConfig) { // create empty template Template apiTemplate = this.templateCreator.CreateEmptyTemplate(); // add parameters apiTemplate.parameters = new Dictionary <string, TemplateParameterProperties> { { "ApimServiceName", new TemplateParameterProperties() { type = "string" } } }; string apiName = creatorConfig.api.name; string[] dependsOnSubsequentAPI = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; List <TemplateResource> resources = new List <TemplateResource>(); // create api resource w/ swagger content and policies APITemplateResource subsequentAPITemplateResource = this.CreateSubsequentAPITemplateResource(creatorConfig); PolicyTemplateResource apiPolicyResource = creatorConfig.api.policy != null?this.policyTemplateCreator.CreateAPIPolicyTemplateResource(creatorConfig, dependsOnSubsequentAPI) : null; List <PolicyTemplateResource> operationPolicyResources = creatorConfig.api.operations != null?this.policyTemplateCreator.CreateOperationPolicyTemplateResources(creatorConfig, dependsOnSubsequentAPI) : null; List <ProductAPITemplateResource> productAPIResources = creatorConfig.api.products != null?this.productAPITemplateCreator.CreateProductAPITemplateResources(creatorConfig, dependsOnSubsequentAPI) : null; DiagnosticTemplateResource diagnosticTemplateResource = creatorConfig.api.diagnostic != null?this.diagnosticTemplateCreator.CreateAPIDiagnosticTemplateResource(creatorConfig, dependsOnSubsequentAPI) : null; resources.Add(subsequentAPITemplateResource); // add resources if not null if (apiPolicyResource != null) { resources.Add(apiPolicyResource); } if (operationPolicyResources != null) { resources.AddRange(operationPolicyResources); } if (productAPIResources != null) { resources.AddRange(productAPIResources); } if (diagnosticTemplateResource != null) { resources.Add(diagnosticTemplateResource); } apiTemplate.resources = resources.ToArray(); return(apiTemplate); }
public DiagnosticTemplateResource CreateAPIDiagnosticTemplateResource(CreatorConfig creatorConfig, string[] dependsOn) { // create diagnostic resource with properties DiagnosticTemplateResource diagnosticTemplateResource = new DiagnosticTemplateResource() { name = $"[concat(parameters('ApimServiceName'), '/{creatorConfig.api.name}/diagnostic')]", type = "Microsoft.ApiManagement/service/apis/diagnostics", apiVersion = "2018-01-01", properties = creatorConfig.diagnostic, dependsOn = dependsOn }; return(diagnosticTemplateResource); }
public List <TemplateResource> CreateChildResourceTemplates(APIConfig api) { List <TemplateResource> resources = new List <TemplateResource>(); // all child resources will depend on the api string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{api.name}')]" }; PolicyTemplateResource apiPolicyResource = api.policy != null?this.policyTemplateCreator.CreateAPIPolicyTemplateResource(api, dependsOn) : null; List <PolicyTemplateResource> operationPolicyResources = api.operations != null?this.policyTemplateCreator.CreateOperationPolicyTemplateResources(api, dependsOn) : null; List <ProductAPITemplateResource> productAPIResources = api.products != null?this.productAPITemplateCreator.CreateProductAPITemplateResources(api, dependsOn) : null; List <TagAPITemplateResource> tagAPIResources = api.tags != null?this.tagAPITemplateCreator.CreateTagAPITemplateResources(api, dependsOn) : null; DiagnosticTemplateResource diagnosticTemplateResource = api.diagnostic != null?this.diagnosticTemplateCreator.CreateAPIDiagnosticTemplateResource(api, dependsOn) : null; // add release resource if the name has been appended with ;rev{revisionNumber} ReleaseTemplateResource releaseTemplateResource = api.name.Contains(";rev") == true?this.releaseTemplateCreator.CreateAPIReleaseTemplateResource(api, dependsOn) : null; // add resources if not null if (apiPolicyResource != null) { resources.Add(apiPolicyResource); } if (operationPolicyResources != null) { resources.AddRange(operationPolicyResources); } if (productAPIResources != null) { resources.AddRange(productAPIResources); } if (tagAPIResources != null) { resources.AddRange(tagAPIResources); } if (diagnosticTemplateResource != null) { resources.Add(diagnosticTemplateResource); } if (releaseTemplateResource != null) { resources.Add(releaseTemplateResource); } return(resources); }
public DiagnosticTemplateResource CreateAPIDiagnosticTemplateResource(CreatorConfig creatorConfig, string[] dependsOn) { // create diagnostic resource with properties DiagnosticTemplateResource diagnosticTemplateResource = new DiagnosticTemplateResource() { name = $"[concat(parameters('ApimServiceName'), '/{creatorConfig.api.name}/{creatorConfig.api.diagnostic.name}')]", type = "Microsoft.ApiManagement/service/apis/diagnostics", apiVersion = "2018-06-01-preview", properties = new DiagnosticTemplateProperties() { alwaysLog = creatorConfig.api.diagnostic.alwaysLog, loggerId = creatorConfig.api.diagnostic.loggerId, sampling = creatorConfig.api.diagnostic.sampling, frontend = creatorConfig.api.diagnostic.frontend, backend = creatorConfig.api.diagnostic.backend, enableHttpCorrelationHeaders = creatorConfig.api.diagnostic.enableHttpCorrelationHeaders }, dependsOn = dependsOn }; return(diagnosticTemplateResource); }
/// <summary> /// Gets the "All API" level diagnostic resources, these are common to all APIs. /// </summary> /// <param name="exc">The extractor.</param> /// <returns>a list of DiagnosticTemplateResources</returns> private async Task <IEnumerable <TemplateResource> > GetServiceDiagnosticsTemplateResourcesAsync(Extractor exc) { List <TemplateResource> templateResources = new List <TemplateResource>(); string apimname = exc.sourceApimName, resourceGroup = exc.resourceGroup; string serviceDiagnostics = await GetServiceDiagnosticsAsync(apimname, resourceGroup); JObject oServiceDiagnostics = JObject.Parse(serviceDiagnostics); foreach (var serviceDiagnostic in oServiceDiagnostics["value"]) { string serviceDiagnosticName = ((JValue)serviceDiagnostic["name"]).Value.ToString(); Console.WriteLine("'{0}' Diagnostic found", serviceDiagnosticName); // convert returned diagnostic to template resource class DiagnosticTemplateResource serviceDiagnosticResource = serviceDiagnostic.ToObject <DiagnosticTemplateResource>(); serviceDiagnosticResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{serviceDiagnosticName}')]"; serviceDiagnosticResource.type = ResourceTypeConstants.APIServiceDiagnostic; serviceDiagnosticResource.apiVersion = GlobalConstants.APIVersion; serviceDiagnosticResource.scale = null; serviceDiagnosticResource.dependsOn = new string[] { }; if (exc.paramApiLoggerId) { serviceDiagnosticResource.properties.loggerId = $"[parameters('{ParameterNames.ApiLoggerId}').{ExtractorUtils.GenValidParamName(serviceDiagnosticName, ParameterPrefix.Diagnostic)}]"; } if (!serviceDiagnosticName.Contains("applicationinsights")) { // enableHttpCorrelationHeaders only works for application insights, causes errors otherwise //TODO: Check this settings still valid? serviceDiagnosticResource.properties.enableHttpCorrelationHeaders = null; } templateResources.Add(serviceDiagnosticResource); } return(templateResources.ToArray()); }
public DiagnosticTemplateResource CreateAPIDiagnosticTemplateResource(ApiDeploymentDefinition api, string[] dependsOn) { // create diagnostic resource with properties DiagnosticTemplateResource diagnosticTemplateResource = new DiagnosticTemplateResource() { Name = $"[concat(parameters('ApimServiceName'), '/{api.Name}/{api.Diagnostic.Name}')]", Properties = new DiagnosticTemplateProperties() { AlwaysLog = api.Diagnostic.AlwaysLog, Sampling = api.Diagnostic.Sampling, Frontend = api.Diagnostic.Frontend, Backend = api.Diagnostic.Backend, EnableHttpCorrelationHeaders = api.Diagnostic.EnableHttpCorrelationHeaders }, DependsOn = dependsOn }; // reference the provided logger if loggerId is provided if (api.Diagnostic.LoggerId != null) { diagnosticTemplateResource.Properties.LoggerId = $"[resourceId('{ResourceType.Logger}', parameters('ApimServiceName'), '{api.Diagnostic.LoggerId}')]"; } return(diagnosticTemplateResource); }
// this function will get the current revision of this api and will remove "isCurrent" paramter public async Task <List <TemplateResource> > GenerateCurrentRevisionAPIResourceAsync(string apiName, string apimname, string resourceGroup, string fileFolder, string policyXMLBaseUrl, string policyXMLSasToken) { List <TemplateResource> templateResources = new List <TemplateResource>(); string apiDetails = await GetAPIDetailsAsync(apimname, resourceGroup, apiName); Console.WriteLine("------------------------------------------"); Console.WriteLine("Extracting resources from {0} API:", apiName); // convert returned api to template resource class JObject oApiDetails = JObject.Parse(apiDetails); APITemplateResource apiResource = JsonConvert.DeserializeObject <APITemplateResource>(apiDetails); apiResource.type = ((JValue)oApiDetails["type"]).Value.ToString(); apiResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}')]"; apiResource.apiVersion = GlobalConstants.APIVersion; apiResource.scale = null; apiResource.properties.isCurrent = null; if (apiResource.properties.apiVersionSetId != null) { apiResource.dependsOn = new string[] { }; string versionSetName = apiResource.properties.apiVersionSetId; int versionSetPosition = versionSetName.IndexOf("apiVersionSets/"); versionSetName = versionSetName.Substring(versionSetPosition, (versionSetName.Length - versionSetPosition)); apiResource.properties.apiVersionSetId = $"[concat(resourceId('Microsoft.ApiManagement/service', parameters('ApimServiceName')), '/{versionSetName}')]"; } else { apiResource.dependsOn = new string[] { }; } templateResources.Add(apiResource); #region Schemas // add schema resources to api template List <TemplateResource> schemaResources = await GenerateSchemasARMTemplate(apimname, apiName, resourceGroup, fileFolder); templateResources.AddRange(schemaResources); #endregion #region Operations // pull api operations for service string[] operationNames = await GetAllOperationNames(apimname, resourceGroup, apiName); foreach (string operationName in operationNames) { string operationDetails = await GetAPIOperationDetailsAsync(apimname, resourceGroup, apiName, operationName); Console.WriteLine("'{0}' Operation found", operationName); // convert returned operation to template resource class OperationTemplateResource operationResource = JsonConvert.DeserializeObject <OperationTemplateResource>(operationDetails); string operationResourceName = operationResource.name; operationResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{operationResourceName}')]"; operationResource.apiVersion = GlobalConstants.APIVersion; operationResource.scale = null; // add operation dependencies and fix sample value if necessary List <string> operationDependsOn = new List <string>() { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationResource.properties.request.representations) { AddSchemaDependencyToOperationIfNecessary(apiName, operationDependsOn, operationTemplateRepresentation); ArmEscapeSampleValueIfNecessary(operationTemplateRepresentation); } foreach (OperationsTemplateResponse operationTemplateResponse in operationResource.properties.responses) { foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationTemplateResponse.representations) { AddSchemaDependencyToOperationIfNecessary(apiName, operationDependsOn, operationTemplateRepresentation); ArmEscapeSampleValueIfNecessary(operationTemplateRepresentation); } } operationResource.dependsOn = operationDependsOn.ToArray(); templateResources.Add(operationResource); // add operation policy resource to api template try { string operationPolicy = await GetOperationPolicyAsync(apimname, resourceGroup, apiName, operationName); Console.WriteLine($" - Operation policy found for {operationName} operation"); PolicyTemplateResource operationPolicyResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(operationPolicy); operationPolicyResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{operationResourceName}/policy')]"; operationPolicyResource.apiVersion = GlobalConstants.APIVersion; operationPolicyResource.scale = null; operationPolicyResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('ApimServiceName'), '{apiName}', '{operationResourceName}')]" }; // write policy xml content to file and point to it if policyXMLBaseUrl is provided if (policyXMLBaseUrl != null) { string policyXMLContent = operationPolicyResource.properties.value; string policyFolder = String.Concat(fileFolder, $@"/policies"); string operationPolicyFileName = $@"/{operationName}-operationPolicy.xml"; this.fileWriter.CreateFolderIfNotExists(policyFolder); this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, operationPolicyFileName)); operationPolicyResource.properties.format = "rawxml-link"; if (policyXMLSasToken != null) { operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}', parameters('PolicyXMLSasToken'))]"; } else { operationPolicyResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{operationPolicyFileName}')]"; } } templateResources.Add(operationPolicyResource); } catch (Exception) { } // add tags associated with the operation to template try { // pull tags associated with the operation string apiOperationTags = await GetOperationTagsAsync(apimname, resourceGroup, apiName, operationName); JObject oApiOperationTags = JObject.Parse(apiOperationTags); foreach (var tag in oApiOperationTags["value"]) { string apiOperationTagName = ((JValue)tag["name"]).Value.ToString(); Console.WriteLine(" - '{0}' Tag association found for {1} operation", apiOperationTagName, operationResourceName); // convert operation tag association to template resource class TagTemplateResource operationTagResource = JsonConvert.DeserializeObject <TagTemplateResource>(tag.ToString()); operationTagResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{operationResourceName}/{apiOperationTagName}')]"; operationTagResource.apiVersion = GlobalConstants.APIVersion; operationTagResource.scale = null; operationTagResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('ApimServiceName'), '{apiName}', '{operationResourceName}')]" }; templateResources.Add(operationTagResource); } } catch (Exception) { } } #endregion #region API Policies // add api policy resource to api template try { string apiPolicies = await GetAPIPolicyAsync(apimname, resourceGroup, apiName); Console.WriteLine("API policy found"); PolicyTemplateResource apiPoliciesResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(apiPolicies); apiPoliciesResource.apiVersion = GlobalConstants.APIVersion; apiPoliciesResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{apiPoliciesResource.name}')]"; apiPoliciesResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; // write policy xml content to file and point to it if policyXMLBaseUrl is provided if (policyXMLBaseUrl != null) { string policyXMLContent = apiPoliciesResource.properties.value; string policyFolder = String.Concat(fileFolder, $@"/policies"); string apiPolicyFileName = $@"/{apiName}-apiPolicy.xml"; this.fileWriter.CreateFolderIfNotExists(policyFolder); this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, apiPolicyFileName)); apiPoliciesResource.properties.format = "rawxml-link"; if (policyXMLSasToken != null) { apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}', parameters('PolicyXMLSasToken'))]"; } else { apiPoliciesResource.properties.value = $"[concat(parameters('PolicyXMLBaseUrl'), '{apiPolicyFileName}')]"; } } templateResources.Add(apiPoliciesResource); } catch (Exception) { } #endregion // add tags associated with the api to template try { // pull tags associated with the api string apiTags = await GetAPITagsAsync(apimname, resourceGroup, apiName); JObject oApiTags = JObject.Parse(apiTags); foreach (var tag in oApiTags["value"]) { string apiTagName = ((JValue)tag["name"]).Value.ToString(); Console.WriteLine("'{0}' Tag association found", apiTagName); // convert associations between api and tags to template resource class TagTemplateResource apiTagResource = JsonConvert.DeserializeObject <TagTemplateResource>(tag.ToString()); apiTagResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{apiTagName}')]"; apiTagResource.apiVersion = GlobalConstants.APIVersion; apiTagResource.scale = null; apiTagResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; templateResources.Add(apiTagResource); } } catch (Exception) { } // add product api associations to template #region API Products try { // pull product api associations string apiProducts = await GetAPIProductsAsync(apimname, resourceGroup, apiName); JObject oApiProducts = JObject.Parse(apiProducts); foreach (var item in oApiProducts["value"]) { string apiProductName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine("'{0}' Product association found", apiProductName); // convert returned api product associations to template resource class ProductAPITemplateResource productAPIResource = JsonConvert.DeserializeObject <ProductAPITemplateResource>(item.ToString()); productAPIResource.type = ResourceTypeConstants.ProductAPI; productAPIResource.name = $"[concat(parameters('ApimServiceName'), '/{apiProductName}/{apiName}')]"; productAPIResource.apiVersion = GlobalConstants.APIVersion; productAPIResource.scale = null; productAPIResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; templateResources.Add(productAPIResource); } } catch (Exception) { } #endregion #region Diagnostics // add diagnostics to template // pull diagnostics for api string diagnostics = await GetAPIDiagnosticsAsync(apimname, resourceGroup, apiName); JObject oDiagnostics = JObject.Parse(diagnostics); foreach (var diagnostic in oDiagnostics["value"]) { string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString(); Console.WriteLine("'{0}' Diagnostic found", diagnosticName); // convert returned diagnostic to template resource class DiagnosticTemplateResource diagnosticResource = diagnostic.ToObject <DiagnosticTemplateResource>(); diagnosticResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{diagnosticName}')]"; diagnosticResource.type = ResourceTypeConstants.APIDiagnostic; diagnosticResource.apiVersion = GlobalConstants.APIVersion; diagnosticResource.scale = null; diagnosticResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; if (!diagnosticName.Contains("applicationinsights")) { // enableHttpCorrelationHeaders only works for application insights, causes errors otherwise diagnosticResource.properties.enableHttpCorrelationHeaders = null; } templateResources.Add(diagnosticResource); } #endregion return(templateResources); }
public async Task <Template> GenerateAPIsARMTemplate(string apimname, string resourceGroup, string fileFolder, string singleApiName) { // pull all apis from service string apis = await GetAPIs(apimname, resourceGroup); // initialize arm template Template armTemplate = GenerateEmptyTemplateWithParameters(); JObject oApi = JObject.Parse(apis); oApi = FormatoApi(singleApiName, oApi); Console.WriteLine("{0} API's found ...", ((JContainer)oApi["value"]).Count.ToString()); List <TemplateResource> templateResources = new List <TemplateResource>(); for (int i = 0; i < ((JContainer)oApi["value"]).Count; i++) { string apiName = ((JValue)oApi["value"][i]["name"]).Value.ToString(); string apiDetails = await GetAPIDetails(apimname, resourceGroup, apiName); Console.WriteLine("------------------------------------------"); Console.WriteLine("Extracting resources from {0} API:", apiName); // convert returned api to template resource class JObject oApiDetails = JObject.Parse(apiDetails); APITemplateResource apiResource = JsonConvert.DeserializeObject <APITemplateResource>(apiDetails); string oApiName = ((JValue)oApiDetails["name"]).Value.ToString(); apiResource.type = ((JValue)oApiDetails["type"]).Value.ToString(); apiResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}')]"; apiResource.apiVersion = GlobalConstants.APIVersion; apiResource.scale = null; if (apiResource.properties.apiVersionSetId != null) { apiResource.dependsOn = new string[] { }; string versionSetName = apiResource.properties.apiVersionSetId; int versionSetPosition = versionSetName.IndexOf("apiVersionSets/"); versionSetName = versionSetName.Substring(versionSetPosition, (versionSetName.Length - versionSetPosition)); apiResource.properties.apiVersionSetId = $"[concat(resourceId('Microsoft.ApiManagement/service', parameters('ApimServiceName')), '/{versionSetName}')]"; } else { apiResource.dependsOn = new string[] { }; } templateResources.Add(apiResource); #region Schemas // add schema resources to api template List <TemplateResource> schemaResources = await GenerateSchemasARMTemplate(apimname, apiName, resourceGroup, fileFolder); templateResources.AddRange(schemaResources); #endregion #region Operations // pull api operations for service string operations = await GetAPIOperations(apimname, resourceGroup, apiName); JObject oOperations = JObject.Parse(operations); foreach (var item in oOperations["value"]) { string operationName = ((JValue)item["name"]).Value.ToString(); string operationDetails = await GetAPIOperationDetail(apimname, resourceGroup, apiName, operationName); Console.WriteLine("'{0}' Operation found", operationName); // convert returned operation to template resource class OperationTemplateResource operationResource = JsonConvert.DeserializeObject <OperationTemplateResource>(operationDetails); string operationResourceName = operationResource.name; operationResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}')]"; operationResource.apiVersion = GlobalConstants.APIVersion; operationResource.scale = null; // add api and schemas to operation dependsOn, if necessary List <string> operationDependsOn = new List <string>() { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationResource.properties.request.representations) { if (operationTemplateRepresentation.schemaId != null) { string dependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/schemas', parameters('ApimServiceName'), '{oApiName}', '{operationTemplateRepresentation.schemaId}')]"; // add value to list if schema has not already been added if (!operationDependsOn.Exists(o => o == dependsOn)) { operationDependsOn.Add(dependsOn); } } } foreach (OperationsTemplateResponse operationTemplateResponse in operationResource.properties.responses) { foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationTemplateResponse.representations) { if (operationTemplateRepresentation.schemaId != null) { string dependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/schemas', parameters('ApimServiceName'), '{oApiName}', '{operationTemplateRepresentation.schemaId}')]"; // add value to list if schema has not already been added if (!operationDependsOn.Exists(o => o == dependsOn)) { operationDependsOn.Add(dependsOn); } } } } operationResource.dependsOn = operationDependsOn.ToArray(); templateResources.Add(operationResource); // add operation policy resource to api template try { string operationPolicy = await GetOperationPolicy(apimname, resourceGroup, oApiName, operationName); Console.WriteLine($" - Operation policy found for {operationName} operation"); PolicyTemplateResource operationPolicyResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(operationPolicy); operationPolicyResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}/policy')]"; operationPolicyResource.apiVersion = GlobalConstants.APIVersion; operationPolicyResource.scale = null; operationPolicyResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('ApimServiceName'), '{oApiName}', '{operationResourceName}')]" }; templateResources.Add(operationPolicyResource); } catch (Exception) { } } #endregion #region API Policies // add api policy resource to api template try { string apiPolicies = await GetAPIPolicies(apimname, resourceGroup, apiName); Console.WriteLine("API policy found"); PolicyTemplateResource apiPoliciesResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(apiPolicies); apiPoliciesResource.apiVersion = GlobalConstants.APIVersion; apiPoliciesResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{apiPoliciesResource.name}')]"; apiPoliciesResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; templateResources.Add(apiPoliciesResource); } catch (Exception) { } #endregion // add product api associations to template #region API Products try { // pull product api associations string apiProducts = await GetAPIProducts(apimname, resourceGroup, apiName); JObject oApiProducts = JObject.Parse(apiProducts); foreach (var item in oApiProducts["value"]) { string apiProductName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine("'{0}' Product association found", apiProductName); // convert returned api product associations to template resource class ProductAPITemplateResource productAPIResource = JsonConvert.DeserializeObject <ProductAPITemplateResource>(apiProducts); productAPIResource.type = ResourceTypeConstants.ProductAPI; productAPIResource.name = $"[concat(parameters('ApimServiceName'), '/{apiProductName}/{oApiName}')]"; productAPIResource.apiVersion = GlobalConstants.APIVersion; productAPIResource.scale = null; productAPIResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; templateResources.Add(productAPIResource); } } catch (Exception) { } #endregion #region Diagnostics // add diagnostics to template // pull diagnostics for api string diagnostics = await GetAPIDiagnostics(apimname, resourceGroup, apiName); JObject oDiagnostics = JObject.Parse(diagnostics); foreach (var diagnostic in oDiagnostics["value"]) { string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString(); Console.WriteLine("'{0}' Diagnostic found", diagnosticName); // convert returned diagnostic to template resource class DiagnosticTemplateResource diagnosticResource = diagnostic.ToObject <DiagnosticTemplateResource>(); diagnosticResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{diagnosticName}')]"; diagnosticResource.type = ResourceTypeConstants.APIDiagnostic; diagnosticResource.apiVersion = GlobalConstants.APIVersion; diagnosticResource.scale = null; diagnosticResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; if (!diagnosticName.Contains("applicationinsights")) { // enableHttpCorrelationHeaders only works for application insights, causes errors otherwise diagnosticResource.properties.enableHttpCorrelationHeaders = null; } templateResources.Add(diagnosticResource); } #endregion } armTemplate.resources = templateResources.ToArray(); return(armTemplate); }
public void ShouldCreateDiagnosticTemplateResourceFromCreatorConfig() { // arrange DiagnosticTemplateCreator diagnosticTemplateCreator = new DiagnosticTemplateCreator(); CreatorConfig creatorConfig = new CreatorConfig() { apis = new List <APIConfig>() }; APIConfig api = new APIConfig() { diagnostic = new DiagnosticConfig() { name = "applicationinsights", alwaysLog = "alwaysLog", loggerId = "loggerId", sampling = new DiagnosticTemplateSampling() { samplingType = "samplingType", percentage = 100 }, frontend = new DiagnosticTemplateFrontendBackend() { request = new DiagnosticTemplateRequestResponse() { headers = new string[] { "frontendrequestheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } }, response = new DiagnosticTemplateRequestResponse() { headers = new string[] { "frontendresponseheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } } }, backend = new DiagnosticTemplateFrontendBackend() { request = new DiagnosticTemplateRequestResponse() { headers = new string[] { "backendrequestheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } }, response = new DiagnosticTemplateRequestResponse() { headers = new string[] { "backendresponseheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } } }, enableHttpCorrelationHeaders = true } }; creatorConfig.apis.Add(api); // act string[] dependsOn = new string[] { "dependsOn" }; DiagnosticTemplateResource diagnosticTemplateResource = diagnosticTemplateCreator.CreateAPIDiagnosticTemplateResource(api, dependsOn); // assert Assert.Equal($"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{api.name}/{api.diagnostic.name}')]", diagnosticTemplateResource.Name); Assert.Equal(dependsOn, diagnosticTemplateResource.DependsOn); Assert.Equal(api.diagnostic.alwaysLog, diagnosticTemplateResource.Properties.alwaysLog); Assert.Equal($"[resourceId('Microsoft.ApiManagement/service/loggers', parameters('{ParameterNames.ApimServiceName}'), '{api.diagnostic.loggerId}')]", diagnosticTemplateResource.Properties.loggerId); Assert.Equal(api.diagnostic.enableHttpCorrelationHeaders, diagnosticTemplateResource.Properties.enableHttpCorrelationHeaders); Assert.Equal(api.diagnostic.sampling.samplingType, diagnosticTemplateResource.Properties.sampling.samplingType); Assert.Equal(api.diagnostic.sampling.percentage, diagnosticTemplateResource.Properties.sampling.percentage); Assert.Equal(api.diagnostic.frontend.request.headers, diagnosticTemplateResource.Properties.frontend.request.headers); Assert.Equal(api.diagnostic.frontend.request.body.bytes, diagnosticTemplateResource.Properties.frontend.request.body.bytes); Assert.Equal(api.diagnostic.frontend.response.headers, diagnosticTemplateResource.Properties.frontend.response.headers); Assert.Equal(api.diagnostic.frontend.response.body.bytes, diagnosticTemplateResource.Properties.frontend.response.body.bytes); Assert.Equal(api.diagnostic.backend.request.headers, diagnosticTemplateResource.Properties.backend.request.headers); Assert.Equal(api.diagnostic.backend.request.body.bytes, diagnosticTemplateResource.Properties.backend.request.body.bytes); Assert.Equal(api.diagnostic.backend.response.headers, diagnosticTemplateResource.Properties.backend.response.headers); Assert.Equal(api.diagnostic.backend.response.body.bytes, diagnosticTemplateResource.Properties.backend.response.body.bytes); }
/// <summary> /// Adds related API Template resources like schemas, operations, products, tags etc. /// </summary> /// <param name="apiName">The name of the API.</param> /// <param name="exc">The extractor.</param> /// <returns></returns> private async Task <IEnumerable <TemplateResource> > GetRelatedTemplateResourcesAsync(string apiName, Extractor exc) { List <TemplateResource> templateResources = new List <TemplateResource>(); string apimname = exc.sourceApimName, resourceGroup = exc.resourceGroup, fileFolder = exc.fileFolder, policyXMLBaseUrl = exc.policyXMLBaseUrl, policyXMLSasToken = exc.policyXMLSasToken; #region Schemas // add schema resources to api template List <TemplateResource> schemaResources = await GenerateSchemasARMTemplate(apimname, apiName, resourceGroup, fileFolder); templateResources.AddRange(schemaResources); #endregion #region Operations // pull api operations for service string[] operationNames = await GetAllOperationNames(apimname, resourceGroup, apiName); int numBatches = 0; // create empty array for the batch operation owners List <string> batchOwners = new List <string>(); // if a batch size is specified if (exc.operationBatchSize > 0) { // store the number of batches required based on exc.operationBatchSize numBatches = (int)Math.Ceiling((double)operationNames.Length / (double)exc.operationBatchSize); //Console.WriteLine ("Number of batches: {0}", numBatches); } foreach (string operationName in operationNames) { int opIndex = Array.IndexOf(operationNames, operationName); //add batch owners into array // ensure each owner is linked to the one before if (exc.operationBatchSize > 0 && opIndex < numBatches) { batchOwners.Add(operationName); //Console.WriteLine("Adding operation {0} to owner list", operationName); } string operationDetails = await GetAPIOperationDetailsAsync(apimname, resourceGroup, apiName, operationName); Console.WriteLine("'{0}' Operation found", operationName); // convert returned operation to template resource class OperationTemplateResource operationResource = JsonConvert.DeserializeObject <OperationTemplateResource>(operationDetails); string operationResourceName = operationResource.name; operationResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiName}/{operationResourceName}')]"; operationResource.apiVersion = GlobalConstants.APIVersion; operationResource.scale = null; // add operation dependencies and fix sample value if necessary List <string> operationDependsOn = new List <string>() { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{apiName}')]" }; foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationResource.properties.request.representations) { AddSchemaDependencyToOperationIfNecessary(apiName, operationDependsOn, operationTemplateRepresentation); ArmEscapeSampleValueIfNecessary(operationTemplateRepresentation); } foreach (OperationsTemplateResponse operationTemplateResponse in operationResource.properties.responses) { foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationTemplateResponse.representations) { AddSchemaDependencyToOperationIfNecessary(apiName, operationDependsOn, operationTemplateRepresentation); ArmEscapeSampleValueIfNecessary(operationTemplateRepresentation); } } // add to batch if flagged string batchdependsOn; if (exc.operationBatchSize > 0 && opIndex > 0) { if (opIndex >= 1 && opIndex <= numBatches - 1) { // chain the owners to each other batchdependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('{ParameterNames.ApimServiceName}'), '{apiName}', '{batchOwners[opIndex - 1]}')]"; //Console.WriteLine("Owner chaining: this request {0} to previous {1}", operationName, batchOwners[opIndex-1]); } else { // chain the operation to respective owner int ownerIndex = (int)Math.Floor((opIndex - numBatches) / ((double)exc.operationBatchSize - 1)); batchdependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('{ParameterNames.ApimServiceName}'), '{apiName}', '{batchOwners[ownerIndex]}')]"; //Console.WriteLine("Operation {0} chained to owner {1}", operationName, batchOwners[ownerIndex]); } operationDependsOn.Add(batchdependsOn); } operationResource.dependsOn = operationDependsOn.ToArray(); templateResources.Add(operationResource); // add operation policy resource to api template try { string operationPolicy = await GetOperationPolicyAsync(apimname, resourceGroup, apiName, operationName); Console.WriteLine($" - Operation policy found for {operationName} operation"); PolicyTemplateResource operationPolicyResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(operationPolicy); operationPolicyResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiName}/{operationResourceName}/policy')]"; operationPolicyResource.apiVersion = GlobalConstants.APIVersion; operationPolicyResource.scale = null; operationPolicyResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('{ParameterNames.ApimServiceName}'), '{apiName}', '{operationResourceName}')]" }; // write policy xml content to file and point to it if policyXMLBaseUrl is provided if (policyXMLBaseUrl != null) { string policyXMLContent = operationPolicyResource.properties.value; string policyFolder = String.Concat(fileFolder, $@"/policies"); string operationPolicyFileName = $@"/{apiName}-{operationName}-operationPolicy.xml"; this.fileWriter.CreateFolderIfNotExists(policyFolder); this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, operationPolicyFileName)); operationPolicyResource.properties.format = "rawxml-link"; if (policyXMLSasToken != null) { operationPolicyResource.properties.value = $"[concat(parameters('{ParameterNames.PolicyXMLBaseUrl}'), '{operationPolicyFileName}', parameters('{ParameterNames.PolicyXMLSasToken}'))]"; } else { operationPolicyResource.properties.value = $"[concat(parameters('{ParameterNames.PolicyXMLBaseUrl}'), '{operationPolicyFileName}')]"; } } templateResources.Add(operationPolicyResource); } catch (Exception) { } // add tags associated with the operation to template try { // pull tags associated with the operation string apiOperationTags = await GetOperationTagsAsync(apimname, resourceGroup, apiName, operationName); JObject oApiOperationTags = JObject.Parse(apiOperationTags); foreach (var tag in oApiOperationTags["value"]) { string apiOperationTagName = ((JValue)tag["name"]).Value.ToString(); Console.WriteLine(" - '{0}' Tag association found for {1} operation", apiOperationTagName, operationResourceName); // convert operation tag association to template resource class TagTemplateResource operationTagResource = JsonConvert.DeserializeObject <TagTemplateResource>(tag.ToString()); operationTagResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiName}/{operationResourceName}/{apiOperationTagName}')]"; operationTagResource.apiVersion = GlobalConstants.APIVersion; operationTagResource.scale = null; operationTagResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('{ParameterNames.ApimServiceName}'), '{apiName}', '{operationResourceName}')]" }; templateResources.Add(operationTagResource); } } catch (Exception) { } } #endregion #region API Policies // add api policy resource to api template try { string apiPolicies = await GetAPIPolicyAsync(apimname, resourceGroup, apiName); Console.WriteLine("API policy found"); PolicyTemplateResource apiPoliciesResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(apiPolicies); apiPoliciesResource.apiVersion = GlobalConstants.APIVersion; apiPoliciesResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiName}/{apiPoliciesResource.name}')]"; apiPoliciesResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{apiName}')]" }; // write policy xml content to file and point to it if policyXMLBaseUrl is provided if (policyXMLBaseUrl != null) { string policyXMLContent = apiPoliciesResource.properties.value; string policyFolder = String.Concat(fileFolder, $@"/policies"); string apiPolicyFileName = $@"/{apiName}-apiPolicy.xml"; this.fileWriter.CreateFolderIfNotExists(policyFolder); this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, apiPolicyFileName)); apiPoliciesResource.properties.format = "rawxml-link"; if (policyXMLSasToken != null) { apiPoliciesResource.properties.value = $"[concat(parameters('{ParameterNames.PolicyXMLBaseUrl}'), '{apiPolicyFileName}', parameters('{ParameterNames.PolicyXMLSasToken}'))]"; } else { apiPoliciesResource.properties.value = $"[concat(parameters('{ParameterNames.PolicyXMLBaseUrl}'), '{apiPolicyFileName}')]"; } } templateResources.Add(apiPoliciesResource); } catch (Exception) { } #endregion #region API Tags // add tags associated with the api to template try { // pull tags associated with the api string apiTags = await GetAPITagsAsync(apimname, resourceGroup, apiName); JObject oApiTags = JObject.Parse(apiTags); foreach (var tag in oApiTags["value"]) { string apiTagName = ((JValue)tag["name"]).Value.ToString(); Console.WriteLine("'{0}' Tag association found", apiTagName); // convert associations between api and tags to template resource class TagTemplateResource apiTagResource = JsonConvert.DeserializeObject <TagTemplateResource>(tag.ToString()); apiTagResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiName}/{apiTagName}')]"; apiTagResource.apiVersion = GlobalConstants.APIVersion; apiTagResource.scale = null; apiTagResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{apiName}')]" }; templateResources.Add(apiTagResource); } } catch (Exception) { } #endregion // add product api associations to template #region API Products try { // pull product api associations string apiProducts = await GetAPIProductsAsync(apimname, resourceGroup, apiName); JObject oApiProducts = JObject.Parse(apiProducts); foreach (var item in oApiProducts["value"]) { string apiProductName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine("'{0}' Product association found", apiProductName); // convert returned api product associations to template resource class ProductAPITemplateResource productAPIResource = JsonConvert.DeserializeObject <ProductAPITemplateResource>(item.ToString()); productAPIResource.type = ResourceTypeConstants.ProductAPI; productAPIResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiProductName}/{apiName}')]"; productAPIResource.apiVersion = GlobalConstants.APIVersion; productAPIResource.scale = null; productAPIResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{apiName}')]" }; templateResources.Add(productAPIResource); } } catch (Exception) { } #endregion #region Diagnostics // add diagnostics to template // pull diagnostics for api string diagnostics = await GetAPIDiagnosticsAsync(apimname, resourceGroup, apiName); JObject oDiagnostics = JObject.Parse(diagnostics); foreach (var diagnostic in oDiagnostics["value"]) { string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString(); Console.WriteLine("'{0}' Diagnostic found", diagnosticName); // convert returned diagnostic to template resource class DiagnosticTemplateResource diagnosticResource = diagnostic.ToObject <DiagnosticTemplateResource>(); diagnosticResource.name = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiName}/{diagnosticName}')]"; diagnosticResource.type = ResourceTypeConstants.APIDiagnostic; diagnosticResource.apiVersion = GlobalConstants.APIVersion; diagnosticResource.scale = null; diagnosticResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{apiName}')]" }; if (exc.paramApiLoggerId) { diagnosticResource.properties.loggerId = $"[parameters('{ParameterNames.ApiLoggerId}').{ExtractorUtils.GenValidParamName(apiName, ParameterPrefix.Api)}.{ExtractorUtils.GenValidParamName(diagnosticName, ParameterPrefix.Diagnostic)}]"; } if (!diagnosticName.Contains("applicationinsights")) { // enableHttpCorrelationHeaders only works for application insights, causes errors otherwise diagnosticResource.properties.enableHttpCorrelationHeaders = null; } templateResources.Add(diagnosticResource); } #endregion return(templateResources); }
private void GenerateARMTemplate(string apimname, string resourceGroup, string fileFolder, string singleApiName) { #region API's FileWriter fileWriter; APIExtractor apiExtractor = new APIExtractor(); string apis = apiExtractor.GetAPIs(apimname, resourceGroup).Result; Template armTemplate = GenerateEmptyTemplateWithParameters(); JObject oApi = JObject.Parse(apis); oApi = FormatoApi(singleApiName, oApi); Console.WriteLine("{0} API's found ...", ((JContainer)oApi["value"]).Count.ToString()); List <TemplateResource> templateResources = new List <TemplateResource>(); for (int i = 0; i < ((JContainer)oApi["value"]).Count; i++) { string apiName = ((JValue)oApi["value"][i]["name"]).Value.ToString(); string apiDetails = apiExtractor.GetAPIDetails(apimname, resourceGroup, apiName).Result; Console.WriteLine("------------------------------------------"); Console.WriteLine("Getting operations from {0} API:", apiName); JObject oApiDetails = JObject.Parse(apiDetails); APITemplateResource apiResource = JsonConvert.DeserializeObject <APITemplateResource>(apiDetails); string oApiName = ((JValue)oApiDetails["name"]).Value.ToString(); apiResource.type = ((JValue)oApiDetails["type"]).Value.ToString(); apiResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}')]"; apiResource.apiVersion = "2018-06-01-preview"; apiResource.scale = null; if (apiResource.properties.apiVersionSetId != null) { apiResource.dependsOn = new string[] { }; string versionSetName = apiResource.properties.apiVersionSetId; int versionSetPosition = versionSetName.IndexOf("api-version-sets/"); versionSetName = versionSetName.Substring(versionSetPosition, (versionSetName.Length - versionSetPosition)); apiResource.properties.apiVersionSetId = $"[concat(resourceId('Microsoft.ApiManagement/service', parameters('ApimServiceName')), '/{versionSetName}')]"; GenerateVersionSetARMTemplate(apimname, resourceGroup, versionSetName, fileFolder); } else { apiResource.dependsOn = new string[] { }; } templateResources.Add(apiResource); #region Schemas List <TemplateResource> schemaResources = GenerateSchemasARMTemplate(apimname, apiName, resourceGroup, fileFolder); templateResources.AddRange(schemaResources); #endregion #region Operations string operations = apiExtractor.GetAPIOperations(apimname, resourceGroup, apiName).Result; JObject oOperations = JObject.Parse(operations); foreach (var item in oOperations["value"]) { string operationName = ((JValue)item["name"]).Value.ToString(); string operationDetails = apiExtractor.GetAPIOperationDetail(apimname, resourceGroup, apiName, operationName).Result; Console.WriteLine("'{0}' Operation found", operationName); OperationTemplateResource operationResource = JsonConvert.DeserializeObject <OperationTemplateResource>(operationDetails); string operationResourceName = operationResource.name; operationResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}')]"; operationResource.apiVersion = "2018-06-01-preview"; operationResource.scale = null; // depend on api and schemas if necessary List <string> operationDependsOn = new List <string>() { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationResource.properties.request.representations) { if (operationTemplateRepresentation.schemaId != null) { string dependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/schemas', parameters('ApimServiceName'), '{oApiName}', '{operationTemplateRepresentation.schemaId}')]"; // add value to list if schema has not already been added if (!operationDependsOn.Exists(o => o == dependsOn)) { operationDependsOn.Add(dependsOn); } } } foreach (OperationsTemplateResponse operationTemplateResponse in operationResource.properties.responses) { foreach (OperationTemplateRepresentation operationTemplateRepresentation in operationTemplateResponse.representations) { if (operationTemplateRepresentation.schemaId != null) { string dependsOn = $"[resourceId('Microsoft.ApiManagement/service/apis/schemas', parameters('ApimServiceName'), '{oApiName}', '{operationTemplateRepresentation.schemaId}')]"; // add value to list if schema has not already been added if (!operationDependsOn.Exists(o => o == dependsOn)) { operationDependsOn.Add(dependsOn); } } } } operationResource.dependsOn = operationDependsOn.ToArray(); templateResources.Add(operationResource); try { string operationPolicy = apiExtractor.GetOperationPolicy(apimname, resourceGroup, oApiName, operationName).Result; Console.WriteLine($" - Policy found to {operationName} operation"); PolicyTemplateResource operationPolicyResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(operationPolicy); operationPolicyResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}/policy')]"; operationPolicyResource.apiVersion = "2018-06-01-preview"; operationPolicyResource.scale = null; operationPolicyResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('ApimServiceName'), '{oApiName}', '{operationResourceName}')]" }; templateResources.Add(operationPolicyResource); } catch (Exception) { Console.WriteLine($" - No policy found for {operationName} operation"); } } #endregion #region API Policies try { Console.WriteLine("Getting API Policy from {0} API: ", apiName); string apiPolicies = apiExtractor.GetAPIPolicies(apimname, resourceGroup, apiName).Result; Console.WriteLine("API Policy found!"); PolicyTemplateResource apiPoliciesResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(apiPolicies); apiPoliciesResource.apiVersion = "2018-06-01-preview"; apiPoliciesResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{apiPoliciesResource.name}')]"; apiPoliciesResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; templateResources.Add(apiPoliciesResource); } catch (Exception) { Console.WriteLine("No API policy!"); } #endregion #region API Products try { Console.WriteLine("Getting API Products from {0} API: ", apiName); string apiProducts = apiExtractor.GetApiProducts(apimname, resourceGroup, apiName).Result; JObject oApiProducts = JObject.Parse(apiProducts); foreach (var item in oApiProducts["value"]) { string apiProductName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine($" -- {apiProductName} Product found to {oApiName} API"); ProductAPITemplateResource productAPIResource = JsonConvert.DeserializeObject <ProductAPITemplateResource>(apiProducts); productAPIResource.type = ResourceTypeConstants.ProductAPI; productAPIResource.name = $"[concat(parameters('ApimServiceName'), '/{apiProductName}/{oApiName}')]"; productAPIResource.apiVersion = "2018-06-01-preview"; productAPIResource.scale = null; productAPIResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; templateResources.Add(productAPIResource); } } catch (Exception) { Console.WriteLine("No API products!"); } #endregion #region Diagnostics Console.WriteLine("------------------------------------------"); Console.WriteLine("Getting diagnostics from {0} API:", apiName); string diagnostics = apiExtractor.GetAPIDiagnostics(apimname, resourceGroup, apiName).Result; JObject oDiagnostics = JObject.Parse(diagnostics); foreach (var diagnostic in oDiagnostics["value"]) { string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString(); Console.WriteLine("'{0}' Diagnostic found", diagnosticName); DiagnosticTemplateResource diagnosticResource = diagnostic.ToObject <DiagnosticTemplateResource>(); diagnosticResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{diagnosticName}')]"; diagnosticResource.type = ResourceTypeConstants.APIDiagnostic; diagnosticResource.apiVersion = "2018-06-01-preview"; diagnosticResource.scale = null; diagnosticResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; if (!diagnosticName.Contains("applicationinsights")) { // enableHttpCorrelationHeaders only works for application insights, causes errors otherwise diagnosticResource.properties.enableHttpCorrelationHeaders = null; } templateResources.Add(diagnosticResource); } #endregion armTemplate.resources = templateResources.ToArray(); if (singleApiName != null) { fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-" + oApiName + "-template.json"); } } // extract resources that do not fall under api. Pass in the single api name and associated resources for the single api case GenerateProductsARMTemplate(apimname, resourceGroup, fileFolder, singleApiName, templateResources); GenerateNamedValuesTemplate(resourceGroup, apimname, fileFolder, singleApiName, templateResources); GenerateLoggerTemplate(resourceGroup, apimname, fileFolder, singleApiName, templateResources); if (singleApiName == null) { fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-apis-template.json"); } #endregion }
public void ShouldCreateDiagnosticTemplateResourceFromCreatorConfig() { // arrange DiagnosticTemplateCreator diagnosticTemplateCreator = new DiagnosticTemplateCreator(); CreatorConfig creatorConfig = new CreatorConfig() { api = new APIConfig() { name = "name" }, diagnostic = new DiagnosticTemplateProperties() { alwaysLog = "alwaysLog", loggerId = "loggerId", sampling = new DiagnosticTemplateSampling() { samplingType = "samplingType", percentage = 100 }, frontend = new DiagnosticTemplateFrontendBackend() { request = new DiagnosticTemplateRequestResponse() { headers = new string[] { "frontendrequestheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } }, response = new DiagnosticTemplateRequestResponse() { headers = new string[] { "frontendresponseheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } } }, backend = new DiagnosticTemplateFrontendBackend() { request = new DiagnosticTemplateRequestResponse() { headers = new string[] { "backendrequestheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } }, response = new DiagnosticTemplateRequestResponse() { headers = new string[] { "backendresponseheader" }, body = new DiagnosticTemplateRequestResponseBody() { bytes = 512 } } }, enableHttpCorrelationHeaders = true } }; // act string[] dependsOn = new string[] { "dependsOn" }; DiagnosticTemplateResource diagnosticTemplateResource = diagnosticTemplateCreator.CreateAPIDiagnosticTemplateResource(creatorConfig, dependsOn); // assert Assert.Equal($"[concat(parameters('ApimServiceName'), '/{creatorConfig.api.name}/diagnostic')]", diagnosticTemplateResource.name); Assert.Equal(dependsOn, diagnosticTemplateResource.dependsOn); Assert.Equal(creatorConfig.diagnostic.alwaysLog, diagnosticTemplateResource.properties.alwaysLog); Assert.Equal(creatorConfig.diagnostic.loggerId, diagnosticTemplateResource.properties.loggerId); Assert.Equal(creatorConfig.diagnostic.enableHttpCorrelationHeaders, diagnosticTemplateResource.properties.enableHttpCorrelationHeaders); Assert.Equal(creatorConfig.diagnostic.sampling.samplingType, diagnosticTemplateResource.properties.sampling.samplingType); Assert.Equal(creatorConfig.diagnostic.sampling.percentage, diagnosticTemplateResource.properties.sampling.percentage); Assert.Equal(creatorConfig.diagnostic.frontend.request.headers, diagnosticTemplateResource.properties.frontend.request.headers); Assert.Equal(creatorConfig.diagnostic.frontend.request.body.bytes, diagnosticTemplateResource.properties.frontend.request.body.bytes); Assert.Equal(creatorConfig.diagnostic.frontend.response.headers, diagnosticTemplateResource.properties.frontend.response.headers); Assert.Equal(creatorConfig.diagnostic.frontend.response.body.bytes, diagnosticTemplateResource.properties.frontend.response.body.bytes); Assert.Equal(creatorConfig.diagnostic.backend.request.headers, diagnosticTemplateResource.properties.backend.request.headers); Assert.Equal(creatorConfig.diagnostic.backend.request.body.bytes, diagnosticTemplateResource.properties.backend.request.body.bytes); Assert.Equal(creatorConfig.diagnostic.backend.response.headers, diagnosticTemplateResource.properties.backend.response.headers); Assert.Equal(creatorConfig.diagnostic.backend.response.body.bytes, diagnosticTemplateResource.properties.backend.response.body.bytes); }
private void GenerateARMTemplate(string apimname, string resourceGroup, string fileFolder, string singleApiName) { #region API's FileWriter fileWriter; APIExtractor apiExtractor = new APIExtractor(); string apis = apiExtractor.GetAPIs(apimname, resourceGroup).Result; Template armTemplate = new Template() { schema = "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", contentVersion = "1.0.0.0", parameters = new Dictionary <string, TemplateParameterProperties> { { "ApimServiceName", new TemplateParameterProperties() { type = "string" } } }, variables = { }, resources = { }, outputs = { } }; JObject oApi = JObject.Parse(apis); oApi = FormatoApi(singleApiName, oApi); Console.WriteLine("{0} API's found ...", ((JContainer)oApi["value"]).Count.ToString()); if (singleApiName == null) { GenerateLoggerTemplate(resourceGroup, apimname, fileFolder); } List <TemplateResource> templateResources = new List <TemplateResource>(); for (int i = 0; i < ((JContainer)oApi["value"]).Count; i++) { string apiName = ((JValue)oApi["value"][i]["name"]).Value.ToString(); string apiDetails = apiExtractor.GetAPIDetails(apimname, resourceGroup, apiName).Result; Console.WriteLine("------------------------------------------"); Console.WriteLine("Geting operations from {0} API:", apiName); JObject oApiDetails = JObject.Parse(apiDetails); APITemplateResource apiResource = JsonConvert.DeserializeObject <APITemplateResource>(apiDetails); string oApiName = ((JValue)oApiDetails["name"]).Value.ToString(); apiResource.type = ((JValue)oApiDetails["type"]).Value.ToString(); apiResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}')]"; apiResource.apiVersion = "2018-06-01-preview"; apiResource.scale = null; if (apiResource.properties.apiVersionSetId != null) { apiResource.dependsOn = new string[] { }; string versionSetName = apiResource.properties.apiVersionSetId; int versionSetPosition = versionSetName.IndexOf("api-version-sets/"); versionSetName = versionSetName.Substring(versionSetPosition, (versionSetName.Length - versionSetPosition)); apiResource.properties.apiVersionSetId = $"[concat(resourceId('Microsoft.ApiManagement/service', parameters('ApimServiceName')), '/{versionSetName}')]"; GenerateVersionSetARMTemplate(apimname, resourceGroup, versionSetName, fileFolder); } else { apiResource.dependsOn = new string[] { }; } templateResources.Add(apiResource); #region Operations string operations = apiExtractor.GetAPIOperations(apimname, resourceGroup, apiName).Result; JObject oOperations = JObject.Parse(operations); foreach (var item in oOperations["value"]) { string operationName = ((JValue)item["name"]).Value.ToString(); string operationDetails = apiExtractor.GetAPIOperationDetail(apimname, resourceGroup, apiName, operationName).Result; Console.WriteLine("'{0}' Operation found", operationName); OperationTemplateResource operationResource = JsonConvert.DeserializeObject <OperationTemplateResource>(operationDetails); string operationResourceName = operationResource.name; operationResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}')]"; operationResource.apiVersion = "2018-06-01-preview"; operationResource.scale = null; operationResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; templateResources.Add(operationResource); try { string operationPolicy = apiExtractor.GetOperationPolicy(apimname, resourceGroup, oApiName, operationName).Result; Console.WriteLine($" - Policy found to {operationName} operation"); PolicyTemplateResource operationPolicyResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(operationPolicy); operationPolicyResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{operationResourceName}/policy')]"; operationPolicyResource.apiVersion = "2018-06-01-preview"; operationPolicyResource.scale = null; operationPolicyResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('ApimServiceName'), '{oApiName}', '{operationResourceName}')]" }; templateResources.Add(operationPolicyResource); } catch (Exception) { Console.WriteLine($" - No policy found for {operationName} operation"); } } #endregion #region API Policies try { Console.WriteLine("Geting API Policy from {0} API: ", apiName); string apiPolicies = apiExtractor.GetAPIPolicies(apimname, resourceGroup, apiName).Result; Console.WriteLine("API Policy found!"); PolicyTemplateResource apiPoliciesResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(apiPolicies); apiPoliciesResource.apiVersion = "2018-06-01-preview"; apiPoliciesResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{apiPoliciesResource.name}')]"; apiPoliciesResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; templateResources.Add(apiPoliciesResource); } catch (Exception) { Console.WriteLine("No API policy!"); } #endregion #region API Products try { Console.WriteLine("Geting API Products from {0} API: ", apiName); string apiProducts = apiExtractor.GetApiProducts(apimname, resourceGroup, apiName).Result; JObject oApiProducts = JObject.Parse(apiProducts); foreach (var item in oApiProducts["value"]) { string apiProductName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine($" -- {apiProductName} Product found to {oApiName} API"); ApiProductsTemplateResource apiProductsResource = JsonConvert.DeserializeObject <ApiProductsTemplateResource>(apiProducts); apiProductsResource.type = "Microsoft.ApiManagement/service/products/apis"; apiProductsResource.name = $"[concat(parameters('ApimServiceName'), '/{apiProductName}/{oApiName}')]"; apiProductsResource.apiVersion = "2018-06-01-preview"; apiProductsResource.scale = null; apiProductsResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; templateResources.Add(apiProductsResource); } } catch (Exception) { Console.WriteLine("No API products!"); } #endregion #region Diagnostics Console.WriteLine("------------------------------------------"); Console.WriteLine("Geting diagnostics from {0} API:", apiName); string diagnostics = apiExtractor.GetAPIDiagnostics(apimname, resourceGroup, apiName).Result; JObject oDiagnostics = JObject.Parse(diagnostics); foreach (var diagnostic in oDiagnostics["value"]) { string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString(); Console.WriteLine("'{0}' Diagnostic found", diagnosticName); DiagnosticTemplateResource diagnosticResource = diagnostic.ToObject <DiagnosticTemplateResource>(); diagnosticResource.name = $"[concat(parameters('ApimServiceName'), '/{oApiName}/{diagnosticName}')]"; diagnosticResource.type = "Microsoft.ApiManagement/service/apis/diagnostics"; diagnosticResource.apiVersion = "2018-06-01-preview"; diagnosticResource.scale = null; diagnosticResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{oApiName}')]" }; if (!diagnosticName.Contains("applicationinsights")) { // enableHttpCorrelationHeaders only works for application insights, causes errors otherwise diagnosticResource.properties.enableHttpCorrelationHeaders = null; } templateResources.Add(diagnosticResource); } #endregion armTemplate.resources = templateResources.ToArray(); if (singleApiName != null) { fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-" + oApiName + "-template.json"); templateResources = new List <TemplateResource>(); } } if (singleApiName == null) { fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-apis-template.json"); } #endregion }