private List <TemplateResource> GenerateSchemasARMTemplate(string apimServiceName, string apiName, string resourceGroup, string fileFolder) { Console.WriteLine("------------------------------------------"); Console.WriteLine("Getting operation schemas from service"); APIExtractor apiExtractor = new APIExtractor(); List <TemplateResource> templateResources = new List <TemplateResource>(); string schemas = apiExtractor.GetApiSchemas(apimServiceName, resourceGroup, apiName).Result; JObject oSchemas = JObject.Parse(schemas); foreach (var item in oSchemas["value"]) { string schemaName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine("'{0}' Schema found", schemaName); string schemaDetails = apiExtractor.GetApiSchemaDetails(apimServiceName, resourceGroup, apiName, schemaName).Result; // pull returned document and convert to correct format RESTReturnedSchemaTemplate restReturnedSchemaTemplate = JsonConvert.DeserializeObject <RESTReturnedSchemaTemplate>(schemaDetails); SchemaTemplateResource schemaDetailsResource = JsonConvert.DeserializeObject <SchemaTemplateResource>(schemaDetails); schemaDetailsResource.properties.document.value = JsonConvert.SerializeObject(restReturnedSchemaTemplate.properties.document); schemaDetailsResource.name = $"[concat(parameters('ApimServiceName'), '/{apiName}/{schemaName}')]"; schemaDetailsResource.apiVersion = "2018-06-01-preview"; schemaDetailsResource.dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('ApimServiceName'), '{apiName}')]" }; templateResources.Add(schemaDetailsResource); } return(templateResources); }
private void GenerateProductsARMTemplate(string apimname, string resourceGroup, string fileFolder) { APIExtractor apiExtractor = new APIExtractor(); Template armTemplate = GenerateEmptyTemplateWithParameters(); List <TemplateResource> templateResources = new List <TemplateResource>(); string products = apiExtractor.GetProducts(apimname, resourceGroup).Result; JObject oProducts = JObject.Parse(products); foreach (var item in oProducts["value"]) { string productName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine("'{0}' Product found", productName); string productDetails = apiExtractor.GetProductDetails(apimname, resourceGroup, productName).Result; ProductsDetailsTemplateResource productsDetailsResource = JsonConvert.DeserializeObject <ProductsDetailsTemplateResource>(productDetails); productsDetailsResource.name = $"[concat(parameters('ApimServiceName'), '/{productName}')]"; productsDetailsResource.apiVersion = "2018-06-01-preview"; templateResources.Add(productsDetailsResource); } armTemplate.resources = templateResources.ToArray(); FileWriter fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-products.json"); }
// this function will generate an api dictionary with apiName/versionsetName (if exist one) as key, list of apiNames as value public static async Task <Dictionary <string, List <string> > > GetAllAPIsDictionary(string sourceApim, string resourceGroup, FileWriter fileWriter) { APIExtractor apiExtractor = new APIExtractor(fileWriter); // pull all apis from service string apis = await apiExtractor.GetAPIsAsync(sourceApim, resourceGroup); JObject oApi = JObject.Parse(apis); // Generate folders based on all apiversionset var apiDictionary = new Dictionary <string, List <string> >(); for (int i = 0; i < ((JContainer)oApi["value"]).Count; i++) { string apiDisplayName = ((JValue)oApi["value"][i]["properties"]["displayName"]).Value.ToString(); if (!apiDictionary.ContainsKey(apiDisplayName)) { List <string> apiVersionSet = new List <string>(); apiVersionSet.Add(((JValue)oApi["value"][i]["name"]).Value.ToString()); apiDictionary[apiDisplayName] = apiVersionSet; } else { apiDictionary[apiDisplayName].Add(((JValue)oApi["value"][i]["name"]).Value.ToString()); } } return(apiDictionary); }
public async Task <string> GetPropertiesAsync(string ApiManagementName, string ResourceGroupName, string singleApiName = null) { (string azToken, string azSubId) = await auth.GetAccessToken(); if (singleApiName == null) { string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/properties?api-version={4}", baseUrl, azSubId, ResourceGroupName, ApiManagementName, GlobalConstants.APIVersion); return(await CallApiManagementAsync(azToken, requestUrl)); } else { JArray policies = new JArray(); // Get API Extractor for reading policies FileWriter fw = new FileWriter(); var apiExtractor = new APIExtractor(fw); // Add API policy policies.Add(await apiExtractor.GetAPIPolicyAsync(ApiManagementName, ResourceGroupName, singleApiName)); // Get all operations of a specific API var operations = await apiExtractor.GetAllOperationNames(ApiManagementName, ResourceGroupName, singleApiName); // Add Operation policies foreach (var operation in operations) { policies.Add(await apiExtractor.GetOperationPolicyAsync(ApiManagementName, ResourceGroupName, singleApiName, operation)); } // Extract DisplayNames JArray nvDisplayNames = new JArray(); var propertyRegex = new Regex("{{(.*?)}}"); foreach (var policy in policies) { var matches = propertyRegex.Matches(policy?.ToString()); foreach (Match match in matches) { nvDisplayNames.Add(match.Groups[1].Value); } } // Get named value ids from displayNames var namedValues = new JObject(); namedValues["value"] = new JArray(); foreach (var displayName in nvDisplayNames) { var nv = await GetPropertyByDisplayName(ApiManagementName, ResourceGroupName, displayName?.ToString()); var nvO = JObject.Parse(nv); ((JArray)namedValues["value"]).Add(nvO["value"][0]); } namedValues["count"] = ((JArray)namedValues["value"]).Count; return(namedValues.ToString()); } }
private void GenerateProductsARMTemplate(string apimname, string resourceGroup, string fileFolder) { APIExtractor apiExtractor = new APIExtractor(); 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 = { } }; List <TemplateResource> templateResources = new List <TemplateResource>(); string products = apiExtractor.GetProducts(apimname, resourceGroup).Result; JObject oProducts = JObject.Parse(products); foreach (var item in oProducts["value"]) { string productName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine("'{0}' Product found", productName); string productDetails = apiExtractor.GetProductDetails(apimname, resourceGroup, productName).Result; ProductsDetailsTemplateResource productsDetailsResource = JsonConvert.DeserializeObject <ProductsDetailsTemplateResource>(productDetails); productsDetailsResource.name = $"[concat(parameters('ApimServiceName'), '/{productName}')]"; productsDetailsResource.apiVersion = "2018-06-01-preview"; templateResources.Add(productsDetailsResource); } armTemplate.resources = templateResources.ToArray(); FileWriter fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-products.json"); }
private void GenerateProductsARMTemplate(string apimname, string resourceGroup, string fileFolder, string singleApiName, List <TemplateResource> armTemplateResources) { APIExtractor apiExtractor = new APIExtractor(); Template armTemplate = GenerateEmptyTemplateWithParameters(); // isolate product api associations in the case of a single api extraction var productAPIResources = armTemplateResources.Where(resource => resource.type == ResourceTypeConstants.ProductAPI); List <TemplateResource> templateResources = new List <TemplateResource>(); string products = apiExtractor.GetProducts(apimname, resourceGroup).Result; JObject oProducts = JObject.Parse(products); foreach (var item in oProducts["value"]) { string productName = ((JValue)item["name"]).Value.ToString(); Console.WriteLine("'{0}' Product found", productName); string productDetails = apiExtractor.GetProductDetails(apimname, resourceGroup, productName).Result; var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, MissingMemberHandling = MissingMemberHandling.Ignore }; ProductsTemplateResource productsTemplateResource = JsonConvert.DeserializeObject <ProductsTemplateResource>(productDetails, settings); productsTemplateResource.name = $"[concat(parameters('ApimServiceName'), '/{productName}')]"; productsTemplateResource.apiVersion = "2018-06-01-preview"; // only extract the product if this is a full extraction, or in the case of a single api, if it is found in products associated with the api if (singleApiName == null || productAPIResources.SingleOrDefault(p => p.name.Contains(productName)) != null) { templateResources.Add(productsTemplateResource); } } armTemplate.resources = templateResources.ToArray(); FileWriter fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-products.json"); }
public static async Task GenerateSingleAPIWithRevisionsTemplates(ExtractorConfig exc, string apiName, FileNameGenerator fileNameGenerator, FileWriter fileWriter, FileNames fileNames) { Console.WriteLine("Extracting singleAPI {0} with revisions", apiName); APIExtractor apiExtractor = new APIExtractor(fileWriter); // Get all revisions for this api string revisions = await apiExtractor.GetAPIRevisionsAsync(exc.sourceApimName, exc.resourceGroup, apiName); JObject revs = JObject.Parse(revisions); string currentRevision = null; List <string> revList = new List <string>(); // Generate seperate folder for each API revision for (int i = 0; i < ((JContainer)revs["value"]).Count; i++) { string apiID = ((JValue)revs["value"][i]["apiId"]).Value.ToString(); string singleApiName = apiID.Split("/")[2]; if (((JValue)revs["value"][i]["isCurrent"]).Value.ToString().Equals("True")) { currentRevision = singleApiName; } string revFileFolder = String.Concat(@exc.fileFolder, $@"/{singleApiName}"); System.IO.Directory.CreateDirectory(revFileFolder); await GenerateTemplates(new Extractor(exc, revFileFolder), singleApiName, null, fileNameGenerator, fileNames, fileWriter, null); revList.Add(singleApiName); } if (currentRevision == null) { throw new Exception($"Revision {apiName} doesn't exist, something went wrong!"); } // generate revisions master folder string revMasterFolder = String.Concat(@exc.fileFolder, fileNames.revisionMasterFolder); System.IO.Directory.CreateDirectory(revMasterFolder); Extractor revExc = new Extractor(exc, revMasterFolder); Template apiRevisionTemplate = await apiExtractor.GenerateAPIRevisionTemplateAsync(currentRevision, revList, apiName, revExc); await GenerateTemplates(revExc, null, null, fileNameGenerator, fileNames, fileWriter, apiRevisionTemplate); }
// this function generate all reference loggers in all extracted apis public static async Task <Dictionary <string, object> > GetAllReferencedLoggers(List <string> apisToExtract, Extractor exc) { Dictionary <string, object> ApiLoggerId = new Dictionary <string, object>(); APIExtractor apiExc = new APIExtractor(new FileWriter()); string serviceDiagnostics = await apiExc.GetServiceDiagnosticsAsync(exc.sourceApimName, exc.resourceGroup); JObject oServiceDiagnostics = JObject.Parse(serviceDiagnostics); Dictionary <string, string> serviceloggerIds = new Dictionary <string, string>(); foreach (var serviceDiagnostic in oServiceDiagnostics["value"]) { string diagnosticName = ((JValue)serviceDiagnostic["name"]).Value.ToString(); string loggerId = ((JValue)serviceDiagnostic["properties"]["loggerId"]).Value.ToString(); ApiLoggerId.Add(ExtractorUtils.GenValidParamName(diagnosticName, ParameterPrefix.Diagnostic), loggerId); } foreach (string curApiName in apisToExtract) { Dictionary <string, string> loggerIds = new Dictionary <string, string>(); string diagnostics = await apiExc.GetAPIDiagnosticsAsync(exc.sourceApimName, exc.resourceGroup, curApiName); JObject oDiagnostics = JObject.Parse(diagnostics); foreach (var diagnostic in oDiagnostics["value"]) { string diagnosticName = ((JValue)diagnostic["name"]).Value.ToString(); string loggerId = ((JValue)diagnostic["properties"]["loggerId"]).Value.ToString(); loggerIds.Add(ExtractorUtils.GenValidParamName(diagnosticName, ParameterPrefix.Diagnostic), loggerId); } if (loggerIds.Count != 0) { ApiLoggerId.Add(ExtractorUtils.GenValidParamName(curApiName, ParameterPrefix.Api), loggerIds); } } return(ApiLoggerId); }
private void GenerateVersionSetARMTemplate(string apimname, string resourceGroup, string versionSetName, string fileFolder) { APIExtractor apiExtractor = new APIExtractor(); Template armTemplate = GenerateEmptyTemplateWithParameters(); List <TemplateResource> templateResources = new List <TemplateResource>(); string versionSet = apiExtractor.GetAPIVersionSet(apimname, resourceGroup, versionSetName).Result; APIVersionSetTemplateResource versionSetResource = JsonConvert.DeserializeObject <APIVersionSetTemplateResource>(versionSet); string filePath = fileFolder + Path.DirectorySeparatorChar + string.Format(versionSetResource.name, "/", "-") + ".json"; versionSetResource.name = $"[concat(parameters('ApimServiceName'), '/{versionSetResource.name}')]"; versionSetResource.apiVersion = "2018-06-01-preview"; templateResources.Add(versionSetResource); armTemplate.resources = templateResources.ToArray(); FileWriter fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, filePath); }
private void GenerateVersionSetARMTemplate(string apimname, string resourceGroup, string versionSetName, string fileFolder) { APIExtractor apiExtractor = new APIExtractor(); 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 = { } }; List <TemplateResource> templateResources = new List <TemplateResource>(); string versionSet = apiExtractor.GetAPIVersionSet(apimname, resourceGroup, versionSetName).Result; APIVersionSetTemplateResource versionSetResource = JsonConvert.DeserializeObject <APIVersionSetTemplateResource>(versionSet); string filePath = fileFolder + Path.DirectorySeparatorChar + string.Format(versionSetResource.name, "/", "-") + ".json"; versionSetResource.name = $"[concat(parameters('ApimServiceName'), '/{versionSetResource.name}')]"; versionSetResource.apiVersion = "2018-06-01-preview"; templateResources.Add(versionSetResource); armTemplate.resources = templateResources.ToArray(); FileWriter fileWriter = new FileWriter(); fileWriter.WriteJSONToFile(armTemplate, filePath); }
/* three condistions to use this function: * 1. singleApiName is null, then generate one master template for the multipleAPIs in multipleApiNams * 2. multipleApiNams is null, then generate separate folder and master template for each API * 3. when both singleApiName and multipleApiNams is null, then generate one master template to link all apis in the sourceapim */ public static async Task GenerateTemplates( Extractor exc, string singleApiName, List <string> multipleAPINames, FileNameGenerator fileNameGenerator, FileNames fileNames, FileWriter fileWriter, Template apiTemplate) { if (singleApiName != null && multipleAPINames != null) { throw new Exception("can't specify single API and multiple APIs to extract at the same time"); } // initialize entity extractor classes APIExtractor apiExtractor = new APIExtractor(fileWriter); APIVersionSetExtractor apiVersionSetExtractor = new APIVersionSetExtractor(); AuthorizationServerExtractor authorizationServerExtractor = new AuthorizationServerExtractor(); BackendExtractor backendExtractor = new BackendExtractor(); LoggerExtractor loggerExtractor = new LoggerExtractor(); PolicyExtractor policyExtractor = new PolicyExtractor(fileWriter); PropertyExtractor propertyExtractor = new PropertyExtractor(); TagExtractor tagExtractor = new TagExtractor(); ProductExtractor productExtractor = new ProductExtractor(fileWriter); MasterTemplateExtractor masterTemplateExtractor = new MasterTemplateExtractor(); // read parameters string sourceApim = exc.sourceApimName; string resourceGroup = exc.resourceGroup; string destinationApim = exc.destinationApimName; string linkedBaseUrl = exc.linkedTemplatesBaseUrl; string policyXMLBaseUrl = exc.policyXMLBaseUrl; string dirName = exc.fileFolder; List <string> multipleApiNames = multipleAPINames; string linkedUrlQueryString = exc.linkedTemplatesUrlQueryString; // extract templates from apim service Template globalServicePolicyTemplate = await policyExtractor.GenerateGlobalServicePolicyTemplateAsync(sourceApim, resourceGroup, policyXMLBaseUrl, dirName); if (apiTemplate == null) { apiTemplate = await apiExtractor.GenerateAPIsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, multipleApiNames, policyXMLBaseUrl, dirName); } List <TemplateResource> apiTemplateResources = apiTemplate.resources.ToList(); Template apiVersionSetTemplate = await apiVersionSetExtractor.GenerateAPIVersionSetsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); Template authorizationServerTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); Template productTemplate = await productExtractor.GenerateProductsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl, dirName); List <TemplateResource> productTemplateResources = productTemplate.resources.ToList(); Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); Template tagTemplate = await tagExtractor.GenerateTagsTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, productTemplateResources, policyXMLBaseUrl); List <TemplateResource> namedValueResources = namedValueTemplate.resources.ToList(); Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, namedValueResources, policyXMLBaseUrl); // create parameters file Template templateParameters = masterTemplateExtractor.CreateMasterTemplateParameterValues(destinationApim, linkedBaseUrl, linkedUrlQueryString, policyXMLBaseUrl); // write templates to output file location string apiFileName = fileNameGenerator.GenerateExtractorAPIFileName(singleApiName, sourceApim); fileWriter.WriteJSONToFile(apiTemplate, String.Concat(@dirName, apiFileName)); // won't generate template when there is no resources if (apiVersionSetTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(@dirName, fileNames.apiVersionSets)); } if (backendTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(backendTemplate, String.Concat(@dirName, fileNames.backends)); } if (authorizationServerTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(authorizationServerTemplate, String.Concat(@dirName, fileNames.authorizationServers)); } if (productTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(productTemplate, String.Concat(@dirName, fileNames.products)); } if (tagTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(tagTemplate, String.Concat(@dirName, fileNames.tags)); } if (namedValueTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(namedValueTemplate, String.Concat(@dirName, fileNames.namedValues)); } if (globalServicePolicyTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(globalServicePolicyTemplate, String.Concat(@dirName, fileNames.globalServicePolicy)); } if (linkedBaseUrl != null) { // create a master template that links to all other templates Template masterTemplate = masterTemplateExtractor.GenerateLinkedMasterTemplate( apiTemplate, globalServicePolicyTemplate, apiVersionSetTemplate, productTemplate, loggerTemplate, backendTemplate, authorizationServerTemplate, namedValueTemplate, tagTemplate, fileNames, apiFileName, linkedUrlQueryString, policyXMLBaseUrl); fileWriter.WriteJSONToFile(masterTemplate, String.Concat(@dirName, fileNames.linkedMaster)); } // write parameters to outputLocation fileWriter.WriteJSONToFile(templateParameters, String.Concat(dirName, fileNames.parameters)); }
public ExtractCommand() { this.Name = GlobalConstants.ExtractName; this.Description = GlobalConstants.ExtractDescription; var sourceApimName = this.Option("--sourceApimName <sourceApimName>", "Source API Management name", CommandOptionType.SingleValue); var destinationAPIManagementName = this.Option("--destinationApimName <destinationApimName>", "Destination API Management name", CommandOptionType.SingleValue); var resourceGroupName = this.Option("--resourceGroup <resourceGroup>", "Resource Group name", CommandOptionType.SingleValue); var fileFolderName = this.Option("--fileFolder <filefolder>", "ARM Template files folder", CommandOptionType.SingleValue); var apiName = this.Option("--apiName <apiName>", "API name", CommandOptionType.SingleValue); var linkedTemplatesBaseUrlName = this.Option("--linkedTemplatesBaseUrl <linkedTemplatesBaseUrl>", "Creates a master template with links", CommandOptionType.SingleValue); var policyXMLBaseUrlName = this.Option("--policyXMLBaseUrl <policyXMLBaseUrl>", "Writes policies to local XML files that require deployment to remote folder", CommandOptionType.SingleValue); this.HelpOption(); this.OnExecute(async() => { try { if (!sourceApimName.HasValue()) { throw new Exception("Missing parameter <sourceApimName>."); } if (!destinationAPIManagementName.HasValue()) { throw new Exception("Missing parameter <destinationApimName>."); } if (!resourceGroupName.HasValue()) { throw new Exception("Missing parameter <resourceGroup>."); } if (!fileFolderName.HasValue()) { throw new Exception("Missing parameter <filefolder>."); } // isolate cli parameters string resourceGroup = resourceGroupName.Values[0].ToString(); string sourceApim = sourceApimName.Values[0].ToString(); string destinationApim = destinationAPIManagementName.Values[0].ToString(); string fileFolder = fileFolderName.Values[0].ToString(); string linkedBaseUrl = linkedTemplatesBaseUrlName.HasValue() ? linkedTemplatesBaseUrlName.Value().ToString() : null; string policyXMLBaseUrl = policyXMLBaseUrlName.HasValue() ? policyXMLBaseUrlName.Value().ToString() : null; string singleApiName = null; if (apiName.Values.Count > 0) { singleApiName = apiName.Values[0].ToString(); } Console.WriteLine("API Management Template"); Console.WriteLine(); Console.WriteLine("Connecting to {0} API Management Service on {1} Resource Group ...", sourceApim, resourceGroup); if (singleApiName != null) { Console.WriteLine("Executing extraction for {0} API ...", singleApiName); } else { Console.WriteLine("Executing full extraction ...", singleApiName); } // initialize file helper classes FileWriter fileWriter = new FileWriter(); FileNameGenerator fileNameGenerator = new FileNameGenerator(); FileNames fileNames = fileNameGenerator.GenerateFileNames(sourceApim); // initialize entity extractor classes APIExtractor apiExtractor = new APIExtractor(fileWriter); APIVersionSetExtractor apiVersionSetExtractor = new APIVersionSetExtractor(); AuthorizationServerExtractor authorizationServerExtractor = new AuthorizationServerExtractor(); BackendExtractor backendExtractor = new BackendExtractor(); LoggerExtractor loggerExtractor = new LoggerExtractor(); PropertyExtractor propertyExtractor = new PropertyExtractor(); ProductExtractor productExtractor = new ProductExtractor(fileWriter); MasterTemplateExtractor masterTemplateExtractor = new MasterTemplateExtractor(); // extract templates from apim service Template apiTemplate = await apiExtractor.GenerateAPIsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, policyXMLBaseUrl, fileFolder); List <TemplateResource> apiTemplateResources = apiTemplate.resources.ToList(); Template apiVersionSetTemplate = await apiVersionSetExtractor.GenerateAPIVersionSetsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); Template authorizationServerTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); Template productTemplate = await productExtractor.GenerateProductsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl, fileFolder); Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, policyXMLBaseUrl); List <TemplateResource> namedValueResources = namedValueTemplate.resources.ToList(); Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, namedValueResources, policyXMLBaseUrl); // create parameters file Template templateParameters = masterTemplateExtractor.CreateMasterTemplateParameterValues(destinationApim, linkedBaseUrl, policyXMLBaseUrl); // write templates to output file location string apiFileName = fileNameGenerator.GenerateExtractorAPIFileName(singleApiName, sourceApim); fileWriter.WriteJSONToFile(apiTemplate, String.Concat(@fileFolder, apiFileName)); fileWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(@fileFolder, fileNames.apiVersionSets)); fileWriter.WriteJSONToFile(authorizationServerTemplate, String.Concat(@fileFolder, fileNames.authorizationServers)); fileWriter.WriteJSONToFile(backendTemplate, String.Concat(@fileFolder, fileNames.backends)); fileWriter.WriteJSONToFile(loggerTemplate, String.Concat(@fileFolder, fileNames.loggers)); fileWriter.WriteJSONToFile(namedValueTemplate, String.Concat(@fileFolder, fileNames.namedValues)); fileWriter.WriteJSONToFile(productTemplate, String.Concat(@fileFolder, fileNames.products)); if (linkedBaseUrl != null) { // create a master template that links to all other templates Template masterTemplate = masterTemplateExtractor.GenerateLinkedMasterTemplate(apiTemplate, apiVersionSetTemplate, productTemplate, loggerTemplate, backendTemplate, authorizationServerTemplate, namedValueTemplate, fileNames, apiFileName, policyXMLBaseUrl); fileWriter.WriteJSONToFile(masterTemplate, String.Concat(@fileFolder, fileNames.linkedMaster)); } // write parameters to outputLocation fileWriter.WriteJSONToFile(templateParameters, String.Concat(fileFolder, fileNames.parameters)); Console.WriteLine("Templates written to output location"); Console.WriteLine("Press any key to exit process:"); #if DEBUG Console.ReadKey(); #endif } catch (Exception ex) { Console.WriteLine("Error occured: " + ex.Message); throw; } }); }
public async Task <Template> CreateMasterTemplateParameterValues(string singleApiName, List <string> multipleApiNames, Extractor exc) { // used to create the parameter values for use in parameters file // create empty template Template masterTemplate = GenerateEmptyTemplate(); // add parameters with value property Dictionary <string, TemplateParameterProperties> parameters = new Dictionary <string, TemplateParameterProperties>(); TemplateParameterProperties apimServiceNameProperties = new TemplateParameterProperties() { value = exc.destinationApimName }; parameters.Add("ApimServiceName", apimServiceNameProperties); if (exc.linkedTemplatesBaseUrl != null) { TemplateParameterProperties linkedTemplatesBaseUrlProperties = new TemplateParameterProperties() { value = exc.linkedTemplatesBaseUrl }; parameters.Add("LinkedTemplatesBaseUrl", linkedTemplatesBaseUrlProperties); // add linkedTemplatesSasToken parameter if provided and if the user has provided a linkedTemplatesBaseUrl if (exc.linkedTemplatesSasToken != null) { TemplateParameterProperties linkedTemplatesSasTokenProperties = new TemplateParameterProperties() { value = exc.linkedTemplatesSasToken }; parameters.Add("LinkedTemplatesSasToken", linkedTemplatesSasTokenProperties); } // add linkedTemplatesUrlQueryString parameter if provided and if the user has provided a linkedTemplatesBaseUrl if (exc.linkedTemplatesUrlQueryString != null) { TemplateParameterProperties linkedTemplatesUrlQueryStringProperties = new TemplateParameterProperties() { value = exc.linkedTemplatesUrlQueryString }; parameters.Add("LinkedTemplatesUrlQueryString", linkedTemplatesUrlQueryStringProperties); } } if (exc.policyXMLBaseUrl != null) { TemplateParameterProperties policyTemplateBaseUrlProperties = new TemplateParameterProperties() { value = exc.policyXMLBaseUrl }; parameters.Add("PolicyXMLBaseUrl", policyTemplateBaseUrlProperties); // add policyXMLSasToken parameter if provided and if the user has provided a policyXMLBaseUrl if (exc.policyXMLSasToken != null) { TemplateParameterProperties policyTemplateSasTokenProperties = new TemplateParameterProperties() { value = exc.policyXMLSasToken }; parameters.Add("PolicyXMLSasToken", policyTemplateSasTokenProperties); } } if (exc.paramServiceUrl) { Dictionary <string, string> serviceUrls = new Dictionary <string, string>(); APIExtractor apiExc = new APIExtractor(new FileWriter()); if (singleApiName != null) { string validApiName = ExtractorUtils.GenValidApiParamName(singleApiName); string serviceUrl = GetApiServiceUrlFromParameters(singleApiName, exc.serviceUrlParameters); if (serviceUrl == null) { serviceUrl = await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, singleApiName); } serviceUrls.Add(validApiName, serviceUrl); } else if (multipleApiNames != null) { foreach (string apiName in multipleApiNames) { string validApiName = ExtractorUtils.GenValidApiParamName(apiName); string serviceUrl = GetApiServiceUrlFromParameters(apiName, exc.serviceUrlParameters); if (serviceUrl == null) { serviceUrl = await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, apiName); } serviceUrls.Add(validApiName, serviceUrl); } } else { JToken[] oApis = await apiExc.GetAllAPIObjsAsync(exc.sourceApimName, exc.resourceGroup); foreach (JToken oApi in oApis) { string apiName = ((JValue)oApi["name"]).Value.ToString(); string validApiName = ExtractorUtils.GenValidApiParamName(apiName); string serviceUrl = GetApiServiceUrlFromParameters(apiName, exc.serviceUrlParameters); if (serviceUrl == null) { serviceUrl = await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, apiName); } serviceUrls.Add(validApiName, serviceUrl); } } TemplateServiceUrlProperties serviceUrlProperties = new TemplateServiceUrlProperties() { value = serviceUrls }; parameters.Add("serviceUrl", serviceUrlProperties); } masterTemplate.parameters = parameters; return(masterTemplate); }
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 }
public async Task <string> GetBackendsAsync(string ApiManagementName, string ResourceGroupName, string singleApiName) { (string azToken, string azSubId) = await auth.GetAccessToken(); if (string.IsNullOrEmpty(singleApiName)) { string requestUrl = string.Format("{0}/subscriptions/{1}/resourceGroups/{2}/providers/Microsoft.ApiManagement/service/{3}/backends?api-version={4}", baseUrl, azSubId, ResourceGroupName, ApiManagementName, GlobalConstants.APIVersion); return(await CallApiManagementAsync(azToken, requestUrl)); } else { JArray policies = new JArray(); // Get API Extractor for reading policies FileWriter fw = new FileWriter(); var apiExtractor = new APIExtractor(fw); // Add API policy policies.Add(await apiExtractor.GetAPIPolicyAsync(ApiManagementName, ResourceGroupName, singleApiName)); // Get all operations of a specific API var operations = await apiExtractor.GetAllOperationNames(ApiManagementName, ResourceGroupName, singleApiName); // Add Operation policies foreach (var operation in operations) { policies.Add(await apiExtractor.GetOperationPolicyAsync(ApiManagementName, ResourceGroupName, singleApiName, operation)); } // Extract DisplayNames JArray backendIds = new JArray(); var propertyRegex = new Regex("backend-id=\"({{(.*?)}}|.*?)\""); foreach (var policy in policies) { var policyO = JObject.Parse(policy?.ToString()); var policyString = policyO["properties"]["value"]?.ToString(); var matches = propertyRegex.Matches(policyString); foreach (Match match in matches) { string value = match.Groups[1].Value; // Handle Named Value if (value.StartsWith("{{")) { var nvExtractor = new PropertyExtractor(); // Get NamedValue without braces value = match.Groups[2].Value; var property = await nvExtractor.GetPropertyByDisplayName(ApiManagementName, ResourceGroupName, value); var propertyO = JObject.Parse(property); var backendId = propertyO["value"][0]["properties"]["value"]?.ToString(); backendIds.Add(backendId); } else { backendIds.Add(value); } } } var backends = new JObject(); backends["value"] = new JArray(); foreach (var backendId in backendIds) { var backend = await GetBackendDetailsAsync(ApiManagementName, ResourceGroupName, backendId?.ToString()); var backendO = JObject.Parse(backend); ((JArray)backends["value"]).Add(backendO); } backends["count"] = ((JArray)backends["value"]).Count; return(backends.ToString()); } }
public ExtractCommand() { this.Name = GlobalConstants.ExtractName; this.Description = GlobalConstants.ExtractDescription; var apiManagementName = this.Option("--name <apimname>", "API Management name", CommandOptionType.SingleValue); var resourceGroupName = this.Option("--resourceGroup <resourceGroup>", "Resource Group name", CommandOptionType.SingleValue); var fileFolderName = this.Option("--fileFolder <filefolder>", "ARM Template files folder", CommandOptionType.SingleValue); var apiName = this.Option("--apiName <apiName>", "API name", CommandOptionType.SingleValue); this.HelpOption(); this.OnExecute(async() => { if (!apiManagementName.HasValue()) { throw new Exception("Missing parameter <apimname>."); } if (!resourceGroupName.HasValue()) { throw new Exception("Missing parameter <resourceGroup>."); } if (!fileFolderName.HasValue()) { throw new Exception("Missing parameter <filefolder>."); } // isolate cli parameters string resourceGroup = resourceGroupName.Values[0].ToString(); string apimname = apiManagementName.Values[0].ToString(); string fileFolder = fileFolderName.Values[0].ToString(); string singleApiName = null; if (apiName.Values.Count > 0) { singleApiName = apiName.Values[0].ToString(); } Console.WriteLine("API Management Template"); Console.WriteLine(); Console.WriteLine("Connecting to {0} API Management Service on {1} Resource Group ...", apimname, resourceGroup); if (singleApiName != null) { Console.WriteLine("Executing extraction for {0} API ...", singleApiName); } else { Console.WriteLine("Executing full extraction ...", singleApiName); } // initialize entity extractor classes FileWriter fileWriter = new FileWriter(); APIExtractor apiExtractor = new APIExtractor(); APIVersionSetExtractor apiVersionSetExtractor = new APIVersionSetExtractor(); AuthorizationServerExtractor authorizationServerExtractor = new AuthorizationServerExtractor(); BackendExtractor backendExtractor = new BackendExtractor(); LoggerExtractor loggerExtractor = new LoggerExtractor(); PropertyExtractor propertyExtractor = new PropertyExtractor(); ProductExtractor productExtractor = new ProductExtractor(); // extract templates from apim service Template apiTemplate = await apiExtractor.GenerateAPIsARMTemplate(apimname, resourceGroup, fileFolder, singleApiName); List <TemplateResource> apiTemplateResources = apiTemplate.resources.ToList(); Template apiVersionSetTemplate = await apiVersionSetExtractor.GenerateAPIVersionSetsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources); Template authorizationTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources); Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources); Template productTemplate = await productExtractor.GenerateProductsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources); Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources); List <TemplateResource> namedValueResources = namedValueTemplate.resources.ToList(); Template backendTemplate = await backendExtractor.GenerateBackendsARMTemplate(apimname, resourceGroup, singleApiName, apiTemplateResources, namedValueResources); // write templates to output file location string apiFileName = singleApiName == null ? @fileFolder + Path.DirectorySeparatorChar + apimname + "-apis-template.json" : @fileFolder + Path.DirectorySeparatorChar + apimname + "-" + singleApiName + "-api-template.json"; fileWriter.WriteJSONToFile(apiTemplate, apiFileName); fileWriter.WriteJSONToFile(apiVersionSetTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-apiVersionSets.json"); fileWriter.WriteJSONToFile(authorizationTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-authorizationServers.json"); fileWriter.WriteJSONToFile(backendTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-backends.json"); fileWriter.WriteJSONToFile(loggerTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-loggers.json"); fileWriter.WriteJSONToFile(namedValueTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-namedValues.json"); fileWriter.WriteJSONToFile(productTemplate, @fileFolder + Path.DirectorySeparatorChar + apimname + "-products.json"); Console.WriteLine("Templates written to output location"); Console.WriteLine("Press any key to exit process:"); #if DEBUG Console.ReadKey(); #endif }); }
public async Task <Template> CreateMasterTemplateParameterValues(List <string> apisToExtract, Extractor exc, Dictionary <string, Dictionary <string, string> > apiLoggerId, Dictionary <string, string> loggerResourceIds) { // used to create the parameter values for use in parameters file // create empty template Template masterTemplate = GenerateEmptyTemplate(); // add parameters with value property Dictionary <string, TemplateParameterProperties> parameters = new Dictionary <string, TemplateParameterProperties>(); TemplateParameterProperties apimServiceNameProperties = new TemplateParameterProperties() { value = exc.destinationApimName }; parameters.Add(ParameterNames.ApimServiceName, apimServiceNameProperties); if (exc.linkedTemplatesBaseUrl != null) { TemplateParameterProperties linkedTemplatesBaseUrlProperties = new TemplateParameterProperties() { value = exc.linkedTemplatesBaseUrl }; parameters.Add(ParameterNames.LinkedTemplatesBaseUrl, linkedTemplatesBaseUrlProperties); // add linkedTemplatesSasToken parameter if provided and if the user has provided a linkedTemplatesBaseUrl if (exc.linkedTemplatesSasToken != null) { TemplateParameterProperties linkedTemplatesSasTokenProperties = new TemplateParameterProperties() { value = exc.linkedTemplatesSasToken }; parameters.Add(ParameterNames.LinkedTemplatesSasToken, linkedTemplatesSasTokenProperties); } // add linkedTemplatesUrlQueryString parameter if provided and if the user has provided a linkedTemplatesBaseUrl if (exc.linkedTemplatesUrlQueryString != null) { TemplateParameterProperties linkedTemplatesUrlQueryStringProperties = new TemplateParameterProperties() { value = exc.linkedTemplatesUrlQueryString }; parameters.Add(ParameterNames.LinkedTemplatesUrlQueryString, linkedTemplatesUrlQueryStringProperties); } } if (exc.policyXMLBaseUrl != null) { TemplateParameterProperties policyTemplateBaseUrlProperties = new TemplateParameterProperties() { value = exc.policyXMLBaseUrl }; parameters.Add(ParameterNames.PolicyXMLBaseUrl, policyTemplateBaseUrlProperties); // add policyXMLSasToken parameter if provided and if the user has provided a policyXMLBaseUrl if (exc.policyXMLSasToken != null) { TemplateParameterProperties policyTemplateSasTokenProperties = new TemplateParameterProperties() { value = exc.policyXMLSasToken }; parameters.Add(ParameterNames.PolicyXMLSasToken, policyTemplateSasTokenProperties); } } if (exc.paramServiceUrl) { Dictionary <string, string> serviceUrls = new Dictionary <string, string>(); APIExtractor apiExc = new APIExtractor(new FileWriter()); foreach (string apiName in apisToExtract) { string validApiName = ExtractorUtils.GenValidParamName(apiName, ParameterPrefix.Api); string serviceUrl = exc.serviceUrlParameters != null?GetApiServiceUrlFromParameters(apiName, exc.serviceUrlParameters) : await apiExc.GetAPIServiceUrl(exc.sourceApimName, exc.resourceGroup, apiName); serviceUrls.Add(validApiName, serviceUrl); } TemplateObjectParameterProperties serviceUrlProperties = new TemplateObjectParameterProperties() { value = serviceUrls }; parameters.Add(ParameterNames.ServiceUrl, serviceUrlProperties); } if (exc.paramNamedValue) { Dictionary <string, string> namedValues = new Dictionary <string, string>(); PropertyExtractor pExc = new PropertyExtractor(); string[] properties = await pExc.GetPropertiesAsync(exc.sourceApimName, exc.resourceGroup); foreach (var extractedProperty in properties) { JToken oProperty = JObject.Parse(extractedProperty); string propertyName = ((JValue)oProperty["name"]).Value.ToString(); string fullPropertyResource = await pExc.GetPropertyDetailsAsync(exc.sourceApimName, exc.resourceGroup, propertyName); PropertyTemplateResource propertyTemplateResource = JsonConvert.DeserializeObject <PropertyTemplateResource>(fullPropertyResource); string propertyValue = propertyTemplateResource.properties.value; string validPName = ExtractorUtils.GenValidParamName(propertyName, ParameterPrefix.Property); namedValues.Add(validPName, propertyValue); } TemplateObjectParameterProperties namedValueProperties = new TemplateObjectParameterProperties() { value = namedValues }; parameters.Add(ParameterNames.NamedValues, namedValueProperties); } if (exc.paramApiLoggerId) { TemplateObjectParameterProperties loggerIdProperties = new TemplateObjectParameterProperties() { value = apiLoggerId }; parameters.Add(ParameterNames.ApiLoggerId, loggerIdProperties); } if (exc.paramLogResourceId) { TemplateObjectParameterProperties loggerResourceIdProperties = new TemplateObjectParameterProperties() { value = loggerResourceIds }; parameters.Add(ParameterNames.LoggerResourceId, loggerResourceIdProperties); } masterTemplate.parameters = parameters; return(masterTemplate); }
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 }
/* three condistions to use this function: * 1. singleApiName is null, then generate one master template for the multipleAPIs in multipleApiNams * 2. multipleApiNams is null, then generate separate folder and master template for each API * 3. when both singleApiName and multipleApiNams is null, then generate one master template to link all apis in the sourceapim */ public static async Task GenerateTemplates( Extractor exc, string singleApiName, List <string> multipleAPINames, FileNameGenerator fileNameGenerator, FileNames fileNames, FileWriter fileWriter, Template apiTemplate) { if (singleApiName != null && multipleAPINames != null) { throw new Exception("can't specify single API and multiple APIs to extract at the same time"); } // initialize entity extractor classes APIExtractor apiExtractor = new APIExtractor(fileWriter); APIVersionSetExtractor apiVersionSetExtractor = new APIVersionSetExtractor(); AuthorizationServerExtractor authorizationServerExtractor = new AuthorizationServerExtractor(); BackendExtractor backendExtractor = new BackendExtractor(); LoggerExtractor loggerExtractor = new LoggerExtractor(); PolicyExtractor policyExtractor = new PolicyExtractor(fileWriter); PropertyExtractor propertyExtractor = new PropertyExtractor(); TagExtractor tagExtractor = new TagExtractor(); ProductAPIExtractor productAPIExtractor = new ProductAPIExtractor(fileWriter); APITagExtractor apiTagExtractor = new APITagExtractor(fileWriter); ProductExtractor productExtractor = new ProductExtractor(fileWriter); MasterTemplateExtractor masterTemplateExtractor = new MasterTemplateExtractor(); // read parameters string sourceApim = exc.sourceApimName; string resourceGroup = exc.resourceGroup; string destinationApim = exc.destinationApimName; string linkedBaseUrl = exc.linkedTemplatesBaseUrl; string linkedSasToken = exc.linkedTemplatesSasToken; string policyXMLBaseUrl = exc.policyXMLBaseUrl; string policyXMLSasToken = exc.policyXMLSasToken; string dirName = exc.fileFolder; List <string> multipleApiNames = multipleAPINames; string linkedUrlQueryString = exc.linkedTemplatesUrlQueryString; // Get all Apis that will be extracted List <string> apisToExtract = new List <string>(); if (singleApiName != null) { apisToExtract.Add(singleApiName); } else if (multipleApiNames != null) { apisToExtract.AddRange(multipleApiNames); } else { List <string> allApis = await apiExtractor.GetAllAPINamesAsync(exc.sourceApimName, exc.resourceGroup); apisToExtract.AddRange(allApis); } Dictionary <string, object> apiLoggerId = null; if (exc.paramApiLoggerId) { apiLoggerId = await GetAllReferencedLoggers(apisToExtract, exc); } // extract templates from apim service Template globalServicePolicyTemplate = await policyExtractor.GenerateGlobalServicePolicyTemplateAsync(sourceApim, resourceGroup, policyXMLBaseUrl, policyXMLSasToken, dirName); if (apiTemplate == null) { apiTemplate = await apiExtractor.GenerateAPIsARMTemplateAsync(singleApiName, multipleApiNames, exc); } List <TemplateResource> apiTemplateResources = apiTemplate.resources.ToList(); Template apiVersionSetTemplate = await apiVersionSetExtractor.GenerateAPIVersionSetsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources); Template authorizationServerTemplate = await authorizationServerExtractor.GenerateAuthorizationServersARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources); Template loggerTemplate = await loggerExtractor.GenerateLoggerTemplateAsync(exc, singleApiName, apiTemplateResources, apiLoggerId); Template productTemplate = await productExtractor.GenerateProductsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, dirName, exc); Template productAPITemplate = await productAPIExtractor.GenerateAPIProductsARMTemplateAsync(singleApiName, multipleApiNames, exc); Template apiTagTemplate = await apiTagExtractor.GenerateAPITagsARMTemplateAsync(singleApiName, multipleApiNames, exc); List <TemplateResource> productTemplateResources = productTemplate.resources.ToList(); List <TemplateResource> loggerResources = loggerTemplate.resources.ToList(); Template namedValueTemplate = await propertyExtractor.GenerateNamedValuesTemplateAsync(singleApiName, apiTemplateResources, exc, backendExtractor, loggerResources); Template tagTemplate = await tagExtractor.GenerateTagsTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, productTemplateResources, policyXMLBaseUrl, policyXMLSasToken); List <TemplateResource> namedValueResources = namedValueTemplate.resources.ToList(); Tuple <Template, Dictionary <string, BackendApiParameters> > backendResult = await backendExtractor.GenerateBackendsARMTemplateAsync(sourceApim, resourceGroup, singleApiName, apiTemplateResources, namedValueResources, exc); Dictionary <string, string> loggerResourceIds = null; if (exc.paramLogResourceId) { loggerResourceIds = loggerExtractor.GetAllLoggerResourceIds(loggerResources); loggerTemplate = loggerExtractor.SetLoggerResourceId(loggerTemplate); } // create parameters file Template templateParameters = await masterTemplateExtractor.CreateMasterTemplateParameterValues(apisToExtract, exc, apiLoggerId, loggerResourceIds, backendResult.Item2, namedValueResources); // write templates to output file location string apiFileName = fileNameGenerator.GenerateExtractorAPIFileName(singleApiName, fileNames.baseFileName); fileWriter.WriteJSONToFile(apiTemplate, String.Concat(@dirName, apiFileName)); // won't generate template when there is no resources if (apiVersionSetTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(apiVersionSetTemplate, String.Concat(@dirName, fileNames.apiVersionSets)); } if (backendResult.Item1.resources.Count() != 0) { fileWriter.WriteJSONToFile(backendResult.Item1, String.Concat(@dirName, fileNames.backends)); } if (loggerTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(loggerTemplate, String.Concat(@dirName, fileNames.loggers)); } if (authorizationServerTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(authorizationServerTemplate, String.Concat(@dirName, fileNames.authorizationServers)); } if (productTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(productTemplate, String.Concat(@dirName, fileNames.products)); } if (productAPITemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(productAPITemplate, String.Concat(@dirName, fileNames.productAPIs)); } if (apiTagTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(apiTagTemplate, String.Concat(@dirName, fileNames.apiTags)); } if (tagTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(tagTemplate, String.Concat(@dirName, fileNames.tags)); } if (namedValueTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(namedValueTemplate, String.Concat(@dirName, fileNames.namedValues)); } if (globalServicePolicyTemplate.resources.Count() != 0) { fileWriter.WriteJSONToFile(globalServicePolicyTemplate, String.Concat(@dirName, fileNames.globalServicePolicy)); } if (linkedBaseUrl != null) { // create a master template that links to all other templates Template masterTemplate = masterTemplateExtractor.GenerateLinkedMasterTemplate( apiTemplate, globalServicePolicyTemplate, apiVersionSetTemplate, productTemplate, productAPITemplate, apiTagTemplate, loggerTemplate, backendResult.Item1, authorizationServerTemplate, namedValueTemplate, tagTemplate, fileNames, apiFileName, exc); fileWriter.WriteJSONToFile(masterTemplate, String.Concat(@dirName, fileNames.linkedMaster)); } // write parameters to outputLocation fileWriter.WriteJSONToFile(templateParameters, String.Concat(dirName, fileNames.parameters)); }