public bool isSplitAPI(APIConfig apiConfig) { // the api needs to be split into multiple templates if the user has supplied a version or version set - deploying swagger related properties at the same time as api version related properties fails, so they must be written and deployed separately return(apiConfig.apiVersion != null || apiConfig.apiVersionSetId != null || (apiConfig.authenticationSettings != null && apiConfig.authenticationSettings.oAuth2 != null && apiConfig.authenticationSettings.oAuth2.authorizationServerId != null)); }
public async Task <APITemplateResource> CreateAPITemplateResourceAsync(APIConfig api, bool isSplit, bool isInitial) { // create api resource APITemplateResource apiTemplateResource = new APITemplateResource() { name = MakeResourceName(api), type = ResourceTypeConstants.API, apiVersion = GlobalConstants.APIVersion, properties = new APITemplateProperties(), dependsOn = new string[] { } }; // add properties depending on whether the template is the initial, subsequent, or unified if (!isSplit || !isInitial) { // add metadata properties for initial and unified templates apiTemplateResource.properties.apiVersion = api.apiVersion; apiTemplateResource.properties.serviceUrl = MakeServiceUrl(api); apiTemplateResource.properties.type = api.type; apiTemplateResource.properties.apiType = api.type; apiTemplateResource.properties.description = api.description; apiTemplateResource.properties.subscriptionRequired = api.subscriptionRequired; apiTemplateResource.properties.apiRevision = api.apiRevision; apiTemplateResource.properties.apiRevisionDescription = api.apiRevisionDescription; apiTemplateResource.properties.apiVersionDescription = api.apiVersionDescription; apiTemplateResource.properties.authenticationSettings = api.authenticationSettings; apiTemplateResource.properties.subscriptionKeyParameterNames = api.subscriptionKeyParameterNames; apiTemplateResource.properties.path = api.suffix; apiTemplateResource.properties.isCurrent = api.isCurrent; apiTemplateResource.properties.displayName = string.IsNullOrEmpty(api.displayName) ? api.name : api.displayName; apiTemplateResource.properties.protocols = this.CreateProtocols(api); // set the version set id if (api.apiVersionSetId != null) { // point to the supplied version set if the apiVersionSetId is provided apiTemplateResource.properties.apiVersionSetId = $"[resourceId('Microsoft.ApiManagement/service/apiVersionSets', parameters('{ParameterNames.ApimServiceName}'), '{api.apiVersionSetId}')]"; } // set the authorization server id if (api.authenticationSettings != null && api.authenticationSettings.oAuth2 != null && api.authenticationSettings.oAuth2.authorizationServerId != null && apiTemplateResource.properties.authenticationSettings != null && apiTemplateResource.properties.authenticationSettings.oAuth2 != null && apiTemplateResource.properties.authenticationSettings.oAuth2.authorizationServerId != null) { apiTemplateResource.properties.authenticationSettings.oAuth2.authorizationServerId = api.authenticationSettings.oAuth2.authorizationServerId; } // set the subscriptionKey Parameter Names if (api.subscriptionKeyParameterNames != null) { if (api.subscriptionKeyParameterNames.header != null) { apiTemplateResource.properties.subscriptionKeyParameterNames.header = api.subscriptionKeyParameterNames.header; } if (api.subscriptionKeyParameterNames.query != null) { apiTemplateResource.properties.subscriptionKeyParameterNames.query = api.subscriptionKeyParameterNames.query; } } } if (!isSplit || isInitial) { // add open api spec properties for subsequent and unified templates string format; string value; // determine if the open api spec is remote or local, yaml or json Uri uriResult; string fileContents = await this.fileReader.RetrieveFileContentsAsync(api.openApiSpec); bool isJSON = this.fileReader.isJSON(fileContents); bool isUrl = Uri.TryCreate(api.openApiSpec, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); value = isUrl ? api.openApiSpec : fileContents ; bool isVersionThree = false; if (isJSON == true) { // open api spec is remote json file, use swagger-link-json for v2 and openapi-link for v3 OpenAPISpecReader openAPISpecReader = new OpenAPISpecReader(); isVersionThree = await openAPISpecReader.isJSONOpenAPISpecVersionThreeAsync(api.openApiSpec); } format = isUrl ? (isJSON ? (isVersionThree ? "openapi-link" : "swagger-link-json") : "openapi-link") : (isJSON ? (isVersionThree ? "openapi+json" : "swagger-json") : "openapi") ; // if the title needs to be modified // we need to embed the OpenAPI definition if (!string.IsNullOrEmpty(api.displayName)) { format = (isJSON ? (isVersionThree ? "openapi+json" : "swagger-json") : "openapi"); // download definition if (isUrl) { using (var client = new WebClient()) value = client.DownloadString(value); } // update title value = new OpenApi(value, format) .SetTitle(api.displayName) .GetDefinition() ; } // set the version set id if (api.apiVersionSetId != null) { // point to the supplied version set if the apiVersionSetId is provided apiTemplateResource.properties.apiVersionSetId = $"[resourceId('Microsoft.ApiManagement/service/apiVersionSets', parameters('{ParameterNames.ApimServiceName}'), '{api.apiVersionSetId}')]"; } apiTemplateResource.properties.format = format; apiTemplateResource.properties.value = value; apiTemplateResource.properties.path = api.suffix; apiTemplateResource.properties.serviceUrl = MakeServiceUrl(api); } return(apiTemplateResource); }
public static string MakeResourceName(APIConfig api) { return($"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{api.name}')]"); }
public CreateCommand() { this.Name = GlobalConstants.CreateName; this.Description = GlobalConstants.CreateDescription; // list command options CommandOption configFile = this.Option("--configFile <configFile>", "Config YAML file location", CommandOptionType.SingleValue).IsRequired(); this.HelpOption(); this.OnExecute(async() => { // convert config file to CreatorConfig class FileReader fileReader = new FileReader(); CreatorConfig creatorConfig = await fileReader.ConvertConfigYAMLToCreatorConfigAsync(configFile.Value()); // validate creator config CreatorConfigurationValidator creatorConfigurationValidator = new CreatorConfigurationValidator(this); bool isValidCreatorConfig = creatorConfigurationValidator.ValidateCreatorConfig(creatorConfig); if (isValidCreatorConfig == true) { // required parameters have been supplied // initialize file helper classes FileWriter fileWriter = new FileWriter(); FileNameGenerator fileNameGenerator = new FileNameGenerator(); FileNames fileNames = fileNameGenerator.GenerateFileNames(creatorConfig.apimServiceName); // initialize template creator classes APIVersionSetTemplateCreator apiVersionSetTemplateCreator = new APIVersionSetTemplateCreator(); LoggerTemplateCreator loggerTemplateCreator = new LoggerTemplateCreator(); BackendTemplateCreator backendTemplateCreator = new BackendTemplateCreator(); AuthorizationServerTemplateCreator authorizationServerTemplateCreator = new AuthorizationServerTemplateCreator(); ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator(); PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(fileReader); DiagnosticTemplateCreator diagnosticTemplateCreator = new DiagnosticTemplateCreator(); ReleaseTemplateCreator releaseTemplateCreator = new ReleaseTemplateCreator(); ProductTemplateCreator productTemplateCreator = new ProductTemplateCreator(policyTemplateCreator); APITemplateCreator apiTemplateCreator = new APITemplateCreator(fileReader, policyTemplateCreator, productAPITemplateCreator, diagnosticTemplateCreator, releaseTemplateCreator); MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator(); // create templates from provided configuration Console.WriteLine("Creating API version set template"); Console.WriteLine("------------------------------------------"); Template apiVersionSetsTemplate = creatorConfig.apiVersionSets != null ? apiVersionSetTemplateCreator.CreateAPIVersionSetTemplate(creatorConfig) : null; Console.WriteLine("Creating product template"); Console.WriteLine("------------------------------------------"); Template productsTemplate = creatorConfig.products != null ? productTemplateCreator.CreateProductTemplate(creatorConfig) : null; Console.WriteLine("Creating logger template"); Console.WriteLine("------------------------------------------"); Template loggersTemplate = creatorConfig.loggers != null ? loggerTemplateCreator.CreateLoggerTemplate(creatorConfig) : null; Console.WriteLine("Creating backend template"); Console.WriteLine("------------------------------------------"); Template backendsTemplate = creatorConfig.backends != null ? backendTemplateCreator.CreateBackendTemplate(creatorConfig) : null; Console.WriteLine("Creating authorization server template"); Console.WriteLine("------------------------------------------"); Template authorizationServersTemplate = creatorConfig.authorizationServers != null ? authorizationServerTemplateCreator.CreateAuthorizationServerTemplate(creatorConfig) : null; // store name and whether the api will depend on the version set template each api necessary to build linked templates List <LinkedMasterTemplateAPIInformation> apiInformation = new List <LinkedMasterTemplateAPIInformation>(); List <Template> apiTemplates = new List <Template>(); Console.WriteLine("Creating API templates"); Console.WriteLine("------------------------------------------"); foreach (APIConfig api in creatorConfig.apis) { // create api templates from provided api config - if the api config contains a supplied apiVersion, split the templates into 2 for metadata and swagger content, otherwise create a unified template List <Template> apiTemplateSet = await apiTemplateCreator.CreateAPITemplatesAsync(api); apiTemplates.AddRange(apiTemplateSet); // create the relevant info that will be needed to properly link to the api template(s) from the master template apiInformation.Add(new LinkedMasterTemplateAPIInformation() { name = api.name, isSplit = apiTemplateCreator.isSplitAPI(api), dependsOnVersionSets = api.apiVersionSetId != null, dependsOnProducts = api.products != null, dependsOnLoggers = await masterTemplateCreator.DetermineIfAPIDependsOnLoggerAsync(api, fileReader), dependsOnAuthorizationServers = api.authenticationSettings != null && api.authenticationSettings.oAuth2 != null && api.authenticationSettings.oAuth2.authorizationServerId != null, dependsOnBackends = await masterTemplateCreator.DetermineIfAPIDependsOnBackendAsync(api, fileReader) }); } // create parameters file Template templateParameters = masterTemplateCreator.CreateMasterTemplateParameterValues(creatorConfig); // write templates to outputLocation if (creatorConfig.linked == true) { // create linked master template Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(apiVersionSetsTemplate, productsTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, apiInformation, fileNames, creatorConfig.apimServiceName, fileNameGenerator); fileWriter.WriteJSONToFile(masterTemplate, String.Concat(creatorConfig.outputLocation, fileNames.linkedMaster)); } foreach (Template apiTemplate in apiTemplates) { APITemplateResource apiResource = apiTemplate.resources.FirstOrDefault(resource => resource.type == ResourceTypeConstants.API) as APITemplateResource; APIConfig providedAPIConfiguration = creatorConfig.apis.FirstOrDefault(api => apiResource.name.Contains(api.name)); // if the api version is not null the api is split into multiple templates. If the template is split and the content value has been set, then the template is for a subsequent api string apiFileName = fileNameGenerator.GenerateCreatorAPIFileName(providedAPIConfiguration.name, apiTemplateCreator.isSplitAPI(providedAPIConfiguration), apiResource.properties.value == null, creatorConfig.apimServiceName); fileWriter.WriteJSONToFile(apiTemplate, String.Concat(creatorConfig.outputLocation, apiFileName)); } if (apiVersionSetsTemplate != null) { fileWriter.WriteJSONToFile(apiVersionSetsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.apiVersionSets)); } if (productsTemplate != null) { fileWriter.WriteJSONToFile(productsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.products)); } if (loggersTemplate != null) { fileWriter.WriteJSONToFile(loggersTemplate, String.Concat(creatorConfig.outputLocation, fileNames.loggers)); } if (backendsTemplate != null) { fileWriter.WriteJSONToFile(backendsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.backends)); } if (authorizationServersTemplate != null) { fileWriter.WriteJSONToFile(authorizationServersTemplate, String.Concat(creatorConfig.outputLocation, fileNames.authorizationServers)); } // write parameters to outputLocation fileWriter.WriteJSONToFile(templateParameters, String.Concat(creatorConfig.outputLocation, fileNames.parameters)); Console.WriteLine("Templates written to output location"); Console.WriteLine("Press any key to exit process:"); #if DEBUG Console.ReadKey(); #endif } return(0); }); }
public CreateCommand() { this.Name = GlobalConstants.CreateName; this.Description = GlobalConstants.CreateDescription; CommandOption appInsightsInstrumentationKey = this.Option("--appInsightsInstrumentationKey <appInsightsInstrumentationKey>", "AppInsights intrumentationkey", CommandOptionType.SingleValue); CommandOption appInsightsName = this.Option("--appInsightsName <appInsightsName>", "AppInsights Name", CommandOptionType.SingleValue); // Allow Named values to pass as parameters CommandOption namedValueKeys = this.Option("--namedValues <namedValues>", "Named Values", CommandOptionType.SingleValue); // apimNameValue values to pass as parameters CommandOption apimNameValue = this.Option("--apimNameValue <apimNameValue>", "Apim Name Value", CommandOptionType.SingleValue); // list command options CommandOption configFile = this.Option("--configFile <configFile>", "Config YAML file location", CommandOptionType.SingleValue).IsRequired(); // list command options CommandOption backendurlconfigFile = this.Option("--backendurlconfigFile <backendurlconfigFile>", "backend url json file location", CommandOptionType.SingleValue); // command options CommandOption preferredAPIsForDeployment = this.Option("--preferredAPIsForDeployment <preferredAPIsForDeployment>", "create ARM templates for the given APIs Name(comma separated) else leave this parameter blank then by default all api's will be considered", CommandOptionType.SingleValue); this.HelpOption(); this.OnExecute(async() => { // convert config file to CreatorConfig class FileReader fileReader = new FileReader(); bool considerAllApiForDeployments = true; string[] preferredApis = null; GlobalConstants.CommandStartDateTime = DateTime.Now.ToString("MMyyyydd hh mm ss"); CreatorConfig creatorConfig = await fileReader.ConvertConfigYAMLToCreatorConfigAsync(configFile.Value()); if (apimNameValue != null && !string.IsNullOrEmpty(apimNameValue.Value())) { creatorConfig.apimServiceName = apimNameValue.Value(); } AppInsightsUpdater appInsightsUpdater = new AppInsightsUpdater(); appInsightsUpdater.UpdateAppInsightNameAndInstrumentationKey(creatorConfig, appInsightsInstrumentationKey, appInsightsName); // Overwrite named values from build pipeline NamedValuesUpdater namedValuesUpdater = new NamedValuesUpdater(); namedValuesUpdater.UpdateNamedValueInstances(creatorConfig, namedValueKeys); // validate creator config CreatorConfigurationValidator creatorConfigurationValidator = new CreatorConfigurationValidator(this); //if preferredAPIsForDeployment passed as parameter if (preferredAPIsForDeployment != null && !string.IsNullOrEmpty(preferredAPIsForDeployment.Value())) { considerAllApiForDeployments = false; preferredApis = preferredAPIsForDeployment.Value().Split(","); } //if backendurlfile passed as parameter if (backendurlconfigFile != null && !string.IsNullOrEmpty(backendurlconfigFile.Value())) { CreatorApiBackendUrlUpdater creatorApiBackendUrlUpdater = new CreatorApiBackendUrlUpdater(); creatorConfig = creatorApiBackendUrlUpdater.UpdateBackendServiceUrl(backendurlconfigFile.Value(), creatorConfig); } bool isValidCreatorConfig = creatorConfigurationValidator.ValidateCreatorConfig(creatorConfig); if (isValidCreatorConfig == true) { // required parameters have been supplied // initialize file helper classes FileWriter fileWriter = new FileWriter(); FileNameGenerator fileNameGenerator = new FileNameGenerator(); FileNames fileNames = creatorConfig.baseFileName == null ? fileNameGenerator.GenerateFileNames(creatorConfig.apimServiceName) : fileNameGenerator.GenerateFileNames(creatorConfig.baseFileName); // initialize template creator classes APIVersionSetTemplateCreator apiVersionSetTemplateCreator = new APIVersionSetTemplateCreator(); LoggerTemplateCreator loggerTemplateCreator = new LoggerTemplateCreator(); BackendTemplateCreator backendTemplateCreator = new BackendTemplateCreator(); AuthorizationServerTemplateCreator authorizationServerTemplateCreator = new AuthorizationServerTemplateCreator(); ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator(); TagAPITemplateCreator tagAPITemplateCreator = new TagAPITemplateCreator(); PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(fileReader); ProductGroupTemplateCreator productGroupTemplateCreator = new ProductGroupTemplateCreator(); SubscriptionTemplateCreator productSubscriptionsTemplateCreator = new SubscriptionTemplateCreator(); DiagnosticTemplateCreator diagnosticTemplateCreator = new DiagnosticTemplateCreator(); ReleaseTemplateCreator releaseTemplateCreator = new ReleaseTemplateCreator(); ProductTemplateCreator productTemplateCreator = new ProductTemplateCreator(policyTemplateCreator, productGroupTemplateCreator, productSubscriptionsTemplateCreator); PropertyTemplateCreator propertyTemplateCreator = new PropertyTemplateCreator(); TagTemplateCreator tagTemplateCreator = new TagTemplateCreator(); APITemplateCreator apiTemplateCreator = new APITemplateCreator(fileReader, policyTemplateCreator, productAPITemplateCreator, tagAPITemplateCreator, diagnosticTemplateCreator, releaseTemplateCreator); MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator(); // create templates from provided configuration Console.WriteLine("Creating global service policy template"); Console.WriteLine("------------------------------------------"); Template globalServicePolicyTemplate = creatorConfig.policy != null ? policyTemplateCreator.CreateGlobalServicePolicyTemplate(creatorConfig) : null; Console.WriteLine("Creating API version set template"); Console.WriteLine("------------------------------------------"); Template apiVersionSetsTemplate = creatorConfig.apiVersionSets != null ? apiVersionSetTemplateCreator.CreateAPIVersionSetTemplate(creatorConfig) : null; Console.WriteLine("Creating product template"); Console.WriteLine("------------------------------------------"); Template productsTemplate = creatorConfig.products != null ? productTemplateCreator.CreateProductTemplate(creatorConfig) : null; Console.WriteLine("Creating product/APIs template"); Console.WriteLine("------------------------------------------"); Template productAPIsTemplate = (creatorConfig.products != null && creatorConfig.apis != null) ? productAPITemplateCreator.CreateProductAPITemplate(creatorConfig) : null; Console.WriteLine("Creating named values template"); Console.WriteLine("------------------------------------------"); Template propertyTemplate = creatorConfig.namedValues != null ? propertyTemplateCreator.CreatePropertyTemplate(creatorConfig) : null; Console.WriteLine("Creating logger template"); Console.WriteLine("------------------------------------------"); Template loggersTemplate = creatorConfig.loggers != null ? loggerTemplateCreator.CreateLoggerTemplate(creatorConfig) : null; Console.WriteLine("Creating backend template"); Console.WriteLine("------------------------------------------"); Template backendsTemplate = creatorConfig.backends != null ? backendTemplateCreator.CreateBackendTemplate(creatorConfig) : null; Console.WriteLine("Creating authorization server template"); Console.WriteLine("------------------------------------------"); Template authorizationServersTemplate = creatorConfig.authorizationServers != null ? authorizationServerTemplateCreator.CreateAuthorizationServerTemplate(creatorConfig) : null; // store name and whether the api will depend on the version set template each api necessary to build linked templates List <LinkedMasterTemplateAPIInformation> apiInformation = new List <LinkedMasterTemplateAPIInformation>(); List <Template> apiTemplates = new List <Template>(); Console.WriteLine("Creating API templates"); Console.WriteLine("------------------------------------------"); IDictionary <string, string[]> apiVersions = APITemplateCreator.GetApiVersionSets(creatorConfig); foreach (APIConfig api in creatorConfig.apis) { if (considerAllApiForDeployments || preferredApis.Contains(api.name)) { bool isServiceUrlParameterizeInYml = false; if (creatorConfig.serviceUrlParameters != null && creatorConfig.serviceUrlParameters.Count > 0) { isServiceUrlParameterizeInYml = creatorConfig.serviceUrlParameters.Any(s => s.apiName.Equals(api.name)); api.serviceUrl = isServiceUrlParameterizeInYml ? creatorConfig.serviceUrlParameters.Where(s => s.apiName.Equals(api.name)).FirstOrDefault().serviceUrl : api.serviceUrl; } // create api templates from provided api config - if the api config contains a supplied apiVersion, split the templates into 2 for metadata and swagger content, otherwise create a unified template List <Template> apiTemplateSet = await apiTemplateCreator.CreateAPITemplatesAsync(api); apiTemplates.AddRange(apiTemplateSet); // create the relevant info that will be needed to properly link to the api template(s) from the master template apiInformation.Add(new LinkedMasterTemplateAPIInformation() { name = api.name, isSplit = apiTemplateCreator.isSplitAPI(api), dependsOnGlobalServicePolicies = creatorConfig.policy != null, dependsOnVersionSets = api.apiVersionSetId != null, dependsOnVersion = masterTemplateCreator.GetDependsOnPreviousApiVersion(api, apiVersions), dependsOnProducts = api.products != null, dependsOnTags = api.tags != null, dependsOnLoggers = await masterTemplateCreator.DetermineIfAPIDependsOnLoggerAsync(api, fileReader), dependsOnAuthorizationServers = api.authenticationSettings != null && api.authenticationSettings.oAuth2 != null && api.authenticationSettings.oAuth2.authorizationServerId != null, dependsOnBackends = await masterTemplateCreator.DetermineIfAPIDependsOnBackendAsync(api, fileReader), isServiceUrlParameterize = isServiceUrlParameterizeInYml }); } } Console.WriteLine("Creating tag template"); Console.WriteLine("------------------------------------------"); Template tagTemplate = creatorConfig.tags != null ? tagTemplateCreator.CreateTagTemplate(creatorConfig) : null; // create parameters file Template templateParameters = masterTemplateCreator.CreateMasterTemplateParameterValues(creatorConfig); // write templates to outputLocation if (creatorConfig.linked == true) { // create linked master template Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, globalServicePolicyTemplate, apiVersionSetsTemplate, productsTemplate, productAPIsTemplate, propertyTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, tagTemplate, apiInformation, fileNames, creatorConfig.apimServiceName, fileNameGenerator); fileWriter.WriteJSONToFile(masterTemplate, String.Concat(creatorConfig.outputLocation, fileNames.linkedMaster)); } foreach (Template apiTemplate in apiTemplates) { APITemplateResource apiResource = apiTemplate.resources.FirstOrDefault(resource => resource.type == ResourceTypeConstants.API) as APITemplateResource; APIConfig providedAPIConfiguration = creatorConfig.apis.FirstOrDefault(api => string.Compare(apiResource.name, APITemplateCreator.MakeResourceName(api), true) == 0); // if the api version is not null the api is split into multiple templates. If the template is split and the content value has been set, then the template is for a subsequent api string apiFileName = fileNameGenerator.GenerateCreatorAPIFileName(providedAPIConfiguration.name, apiTemplateCreator.isSplitAPI(providedAPIConfiguration), apiResource.properties.value != null); fileWriter.WriteJSONToFile(apiTemplate, String.Concat(creatorConfig.outputLocation, apiFileName)); } if (globalServicePolicyTemplate != null) { fileWriter.WriteJSONToFile(globalServicePolicyTemplate, String.Concat(creatorConfig.outputLocation, fileNames.globalServicePolicy)); } if (apiVersionSetsTemplate != null) { fileWriter.WriteJSONToFile(apiVersionSetsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.apiVersionSets)); } if (productsTemplate != null) { fileWriter.WriteJSONToFile(productsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.products)); } if (productAPIsTemplate != null) { fileWriter.WriteJSONToFile(productAPIsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.productAPIs)); } if (propertyTemplate != null) { fileWriter.WriteJSONToFile(propertyTemplate, String.Concat(creatorConfig.outputLocation, fileNames.namedValues)); } if (loggersTemplate != null) { fileWriter.WriteJSONToFile(loggersTemplate, String.Concat(creatorConfig.outputLocation, fileNames.loggers)); } if (backendsTemplate != null) { fileWriter.WriteJSONToFile(backendsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.backends)); } if (authorizationServersTemplate != null) { fileWriter.WriteJSONToFile(authorizationServersTemplate, String.Concat(creatorConfig.outputLocation, fileNames.authorizationServers)); } if (tagTemplate != null) { fileWriter.WriteJSONToFile(tagTemplate, String.Concat(creatorConfig.outputLocation, fileNames.tags)); } // write parameters to outputLocation fileWriter.WriteJSONToFile(templateParameters, String.Concat(creatorConfig.outputLocation, fileNames.parameters)); Console.WriteLine("Templates written to output location"); } return(0); }); }
public async Task <APITemplateResource> CreateAPITemplateResourceAsync(APIConfig api, bool isSplit, bool isInitial) { // create api resource APITemplateResource apiTemplateResource = new APITemplateResource() { name = $"[concat(parameters('ApimServiceName'), '/{api.name}')]", type = ResourceTypeConstants.API, apiVersion = GlobalConstants.APIVersion, properties = new APITemplateProperties(), dependsOn = new string[] { } }; // add properties depending on whether the template is the initial, subsequent, or unified if (!isSplit || isInitial) { // add metadata properties for initial and unified templates apiTemplateResource.properties.apiVersion = api.apiVersion; apiTemplateResource.properties.serviceUrl = api.serviceUrl; apiTemplateResource.properties.type = api.type; apiTemplateResource.properties.apiType = api.type; apiTemplateResource.properties.description = api.description; apiTemplateResource.properties.subscriptionRequired = api.subscriptionRequired; apiTemplateResource.properties.apiRevision = api.apiRevision; apiTemplateResource.properties.apiRevisionDescription = api.apiRevisionDescription; apiTemplateResource.properties.apiVersionDescription = api.apiVersionDescription; apiTemplateResource.properties.authenticationSettings = api.authenticationSettings; apiTemplateResource.properties.path = api.suffix; apiTemplateResource.properties.isCurrent = api.isCurrent; apiTemplateResource.properties.displayName = api.displayName ?? api.name; apiTemplateResource.properties.protocols = this.CreateProtocols(api); if (api.subscriptionRequired) { apiTemplateResource.properties.subscriptionKeyParameterNames = new APITemplateSubscriptionKeyParameterNames { header = api.subscriptionKeyHeaderName, query = api.subscriptionKeyQueryName }; } // set the version set id if (api.apiVersionSetId != null) { // point to the supplied version set if the apiVersionSetId is provided apiTemplateResource.properties.apiVersionSetId = $"[resourceId('Microsoft.ApiManagement/service/apiVersionSets', parameters('ApimServiceName'), '{api.apiVersionSetId}')]"; } // set the authorization server id if (api.authenticationSettings != null && api.authenticationSettings.oAuth2 != null && api.authenticationSettings.oAuth2.authorizationServerId != null && apiTemplateResource.properties.authenticationSettings != null && apiTemplateResource.properties.authenticationSettings.oAuth2 != null && apiTemplateResource.properties.authenticationSettings.oAuth2.authorizationServerId != null) { apiTemplateResource.properties.authenticationSettings.oAuth2.authorizationServerId = api.authenticationSettings.oAuth2.authorizationServerId; } } if (!isSplit || !isInitial) { // add open api spec properties for subsequent and unified templates string format; string value; // determine if the open api spec is remote or local, yaml or json Uri uriResult; string fileContents = await this.fileReader.RetrieveFileContentsAsync(api.openApiSpec); bool isJSON = this.fileReader.isJSON(fileContents); bool isUrl = Uri.TryCreate(api.openApiSpec, UriKind.Absolute, out uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); if (isUrl == true) { value = api.openApiSpec; if (isJSON == true) { // open api spec is remote json file, use swagger-link-json for v2 and openapi-link for v3 OpenAPISpecReader openAPISpecReader = new OpenAPISpecReader(); bool isVersionThree = await openAPISpecReader.isJSONOpenAPISpecVersionThreeAsync(api.openApiSpec); format = isVersionThree == false ? "swagger-link-json" : "openapi-link"; } else { // open api spec is remote yaml file format = "openapi-link"; } } else { value = fileContents; if (isJSON == true) { // open api spec is local json file, use swagger-json for v2 and openapi+json for v3 OpenAPISpecReader openAPISpecReader = new OpenAPISpecReader(); bool isVersionThree = await openAPISpecReader.isJSONOpenAPISpecVersionThreeAsync(api.openApiSpec); format = isVersionThree == false ? "swagger-json" : "openapi+json"; } else { // open api spec is local yaml file format = "openapi"; } } apiTemplateResource.properties.format = format; apiTemplateResource.properties.value = value; apiTemplateResource.properties.path = api.suffix; } return(apiTemplateResource); }
public async Task <Template> CreateInitialAPITemplateAsync(CreatorConfig creatorConfig, APIConfig api) { // create empty template Template apiTemplate = this.templateCreator.CreateEmptyTemplate(); // add parameters apiTemplate.parameters = new Dictionary <string, TemplateParameterProperties> { { "ApimServiceName", new TemplateParameterProperties() { type = "string" } } }; List <TemplateResource> resources = new List <TemplateResource>(); // create api resource w/ metadata APITemplateResource initialAPITemplateResource = await this.CreateInitialAPITemplateResourceAsync(creatorConfig, api); resources.Add(initialAPITemplateResource); apiTemplate.resources = resources.ToArray(); return(apiTemplate); }
public async Task <APITemplateResource> CreateInitialAPITemplateResourceAsync(CreatorConfig creatorConfig, APIConfig api) { // protocols can be pulled by converting the OpenApiSpec into the OpenApiDocument class OpenAPISpecReader openAPISpecReader = new OpenAPISpecReader(); OpenApiDocument doc = await openAPISpecReader.ConvertOpenAPISpecToDoc(api.openApiSpec); // create api resource with properties APITemplateResource apiTemplateResource = new APITemplateResource() { name = $"[concat(parameters('ApimServiceName'), '/{api.name}')]", type = ResourceTypeConstants.API, apiVersion = "2018-06-01-preview", properties = new APITemplateProperties() { // supplied via optional arguments apiVersion = api.apiVersion, subscriptionRequired = api.subscriptionRequired, apiRevision = api.revision, apiRevisionDescription = api.revisionDescription, apiVersionDescription = api.apiVersionDescription, authenticationSettings = api.authenticationSettings, path = api.suffix, displayName = api.name, protocols = this.CreateProtocols(doc) }, // if the template is not linked the depends on for the apiVersionSet needs to be inlined here dependsOn = new string[] { } }; // set the version set id if (api.apiVersionSetId != null) { apiTemplateResource.properties.apiVersionSetId = $"[resourceId('Microsoft.ApiManagement/service/api-version-sets', parameters('ApimServiceName'), '{api.apiVersionSetId}')]"; } return(apiTemplateResource); }
private string MakeServiceUrl(APIConfig api) { return(api.serviceUrl ?? $"[parameters('{ParameterNames.ServiceUrl}').{ExtractorUtils.GenValidParamName(api.name, ParameterPrefix.Api)}]"); }
public CreateCommand() { Name = GlobalConstants.CreateName; Description = GlobalConstants.CreateDescription; // list command options CommandOption configFile = Option("--configFile <configFile>", "Config YAML file location", CommandOptionType.SingleValue).IsRequired(); CommandOption appInsightsInstrumentationKey = Option("--appInsightsInstrumentationKey <appInsightsInstrumentationKey>", "AppInsights intrumentationkey", CommandOptionType.SingleValue); CommandOption appInsightsName = Option("--appInsightsName <appInsightsName>", "AppInsights Name", CommandOptionType.SingleValue); // list command options CommandOption backendurlconfigFile = Option("--backendurlconfigFile <backendurlconfigFile>", "backend url json file location", CommandOptionType.SingleValue); var mergeApiTemplatesOption = Option("--mergeApiTemplates <mergeApiTemplates>", "Merge templates", CommandOptionType.SingleValue); this.HelpOption(); OnExecute(async() => { // convert config file to CreatorConfig class FileReader fileReader = new FileReader(); CreatorConfig creatorConfig = await fileReader.ConvertConfigYAMLToCreatorConfigAsync(configFile.Value()); var mergeApiTemplates = Convert.ToBoolean(mergeApiTemplatesOption.Value()); AppInsightsUpdater appInsightsUpdater = new AppInsightsUpdater(); appInsightsUpdater.UpdateAppInsightNameAndInstrumentationKey(creatorConfig, appInsightsInstrumentationKey, appInsightsName); // validate creator config CreatorConfigurationValidator creatorConfigurationValidator = new CreatorConfigurationValidator(this); //if backendurlfile passed as parameter if (backendurlconfigFile != null && !string.IsNullOrEmpty(backendurlconfigFile.Value())) { CreatorApiBackendUrlUpdater creatorApiBackendUrlUpdater = new CreatorApiBackendUrlUpdater(); creatorConfig = creatorApiBackendUrlUpdater.UpdateBackendServiceUrl(backendurlconfigFile.Value(), creatorConfig); } bool isValidCreatorConfig = creatorConfigurationValidator.ValidateCreatorConfig(creatorConfig); if (isValidCreatorConfig) { // required parameters have been supplied // initialize file helper classes FileWriter fileWriter = new FileWriter(); FileNameGenerator fileNameGenerator = new FileNameGenerator(); FileNames fileNames = creatorConfig.baseFileName == null ? fileNameGenerator.GenerateFileNames(creatorConfig.apimServiceName) : fileNameGenerator.GenerateFileNames(creatorConfig.baseFileName); // initialize template creator classes APIVersionSetTemplateCreator apiVersionSetTemplateCreator = new APIVersionSetTemplateCreator(); LoggerTemplateCreator loggerTemplateCreator = new LoggerTemplateCreator(); BackendTemplateCreator backendTemplateCreator = new BackendTemplateCreator(); AuthorizationServerTemplateCreator authorizationServerTemplateCreator = new AuthorizationServerTemplateCreator(); ProductAPITemplateCreator productAPITemplateCreator = new ProductAPITemplateCreator(); TagAPITemplateCreator tagAPITemplateCreator = new TagAPITemplateCreator(); PolicyTemplateCreator policyTemplateCreator = new PolicyTemplateCreator(fileReader); ProductGroupTemplateCreator productGroupTemplateCreator = new ProductGroupTemplateCreator(); DiagnosticTemplateCreator diagnosticTemplateCreator = new DiagnosticTemplateCreator(); ReleaseTemplateCreator releaseTemplateCreator = new ReleaseTemplateCreator(); ProductTemplateCreator productTemplateCreator = new ProductTemplateCreator(policyTemplateCreator, productGroupTemplateCreator); PropertyTemplateCreator propertyTemplateCreator = new PropertyTemplateCreator(); TagTemplateCreator tagTemplateCreator = new TagTemplateCreator(); APITemplateCreator apiTemplateCreator = new APITemplateCreator(fileReader, policyTemplateCreator, productAPITemplateCreator, tagAPITemplateCreator, diagnosticTemplateCreator, releaseTemplateCreator); MasterTemplateCreator masterTemplateCreator = new MasterTemplateCreator(); // create templates from provided configuration Console.WriteLine("Creating global service policy template"); Console.WriteLine("------------------------------------------"); Template globalServicePolicyTemplate = creatorConfig.policy != null ? policyTemplateCreator.CreateGlobalServicePolicyTemplate(creatorConfig) : null; Console.WriteLine("Creating API version set template"); Console.WriteLine("------------------------------------------"); Template apiVersionSetsTemplate = creatorConfig.apiVersionSets != null ? apiVersionSetTemplateCreator.CreateAPIVersionSetTemplate(creatorConfig) : null; Console.WriteLine("Creating product template"); Console.WriteLine("------------------------------------------"); Template productsTemplate = creatorConfig.products != null ? productTemplateCreator.CreateProductTemplate(creatorConfig) : null; Console.WriteLine("Creating named values template"); Console.WriteLine("------------------------------------------"); Template propertyTemplate = creatorConfig.namedValues != null ? propertyTemplateCreator.CreatePropertyTemplate(creatorConfig) : null; Console.WriteLine("Creating logger template"); Console.WriteLine("------------------------------------------"); Template loggersTemplate = creatorConfig.loggers != null ? loggerTemplateCreator.CreateLoggerTemplate(creatorConfig) : null; Console.WriteLine("Creating backend template"); Console.WriteLine("------------------------------------------"); Template backendsTemplate = creatorConfig.backends != null ? backendTemplateCreator.CreateBackendTemplate(creatorConfig) : null; Console.WriteLine("Creating authorization server template"); Console.WriteLine("------------------------------------------"); Template authorizationServersTemplate = creatorConfig.authorizationServers != null ? authorizationServerTemplateCreator.CreateAuthorizationServerTemplate(creatorConfig) : null; // store name and whether the api will depend on the version set template each api necessary to build linked templates List <LinkedMasterTemplateAPIInformation> apiInformation = new List <LinkedMasterTemplateAPIInformation>(); List <Template> apiTemplates = new List <Template>(); if (mergeApiTemplates) { var operations = apiTemplateCreator.CreateEmptyTemplate(); operations.resources = apiVersionSetsTemplate.resources; apiTemplates.Add(operations); // api operations template apiTemplates.Add(apiTemplateCreator.CreateEmptyTemplate()); // api properties template } Console.WriteLine("Creating API templates"); Console.WriteLine("------------------------------------------"); foreach (APIConfig api in creatorConfig.apis) { // create api templates from provided api config - if the api config contains a supplied apiVersion, split the templates into 2 for metadata and swagger content, otherwise create a unified template List <Template> apiTemplateSet = await apiTemplateCreator.CreateAPITemplatesAsync(api, mergeApiTemplates); if (!mergeApiTemplates) { apiTemplates.AddRange(apiTemplateSet); // create the relevant info that will be needed to properly link to the api template(s) from the master template apiInformation.Add(new LinkedMasterTemplateAPIInformation() { name = api.name, isSplit = apiTemplateCreator.isSplitAPI(api), dependsOnGlobalServicePolicies = creatorConfig.policy != null, dependsOnVersionSets = api.apiVersionSetId != null, dependsOnProducts = api.products != null, dependsOnTags = api.tags != null, dependsOnLoggers = await masterTemplateCreator.DetermineIfAPIDependsOnLoggerAsync(api, fileReader), dependsOnAuthorizationServers = api.authenticationSettings != null && api.authenticationSettings.oAuth2 != null && api.authenticationSettings.oAuth2.authorizationServerId != null, dependsOnBackends = await masterTemplateCreator.DetermineIfAPIDependsOnBackendAsync(api, fileReader) }); } else { await apiTemplateCreator.MergeApiTemplates(apiTemplateSet, apiTemplates); } } if (!mergeApiTemplates) { // create the relevant info that will be needed to properly link to the api template(s) from the master template apiInformation.Add(new LinkedMasterTemplateAPIInformation() { name = creatorConfig.baseFileName, isSplit = true, dependsOnGlobalServicePolicies = creatorConfig.policy != null, dependsOnVersionSets = false, dependsOnProducts = creatorConfig.products != null, dependsOnTags = creatorConfig.tags != null, dependsOnLoggers = creatorConfig.loggers != null, dependsOnAuthorizationServers = creatorConfig.authorizationServers != null && creatorConfig.authorizationServers.Count > 0, dependsOnBackends = creatorConfig.backends != null }); } Console.WriteLine("Creating tag template"); Console.WriteLine("------------------------------------------"); Template tagTemplate = creatorConfig.tags != null ? tagTemplateCreator.CreateTagTemplate(creatorConfig) : null; // create parameters file Template templateParameters = masterTemplateCreator.CreateMasterTemplateParameterValues(creatorConfig); // write templates to outputLocation if (creatorConfig.linked) { // create linked master template Template masterTemplate = masterTemplateCreator.CreateLinkedMasterTemplate(creatorConfig, globalServicePolicyTemplate, apiVersionSetsTemplate, productsTemplate, propertyTemplate, loggersTemplate, backendsTemplate, authorizationServersTemplate, tagTemplate, apiInformation, fileNames, creatorConfig.apimServiceName, fileNameGenerator); fileWriter.WriteJSONToFile(masterTemplate, String.Concat(creatorConfig.outputLocation, fileNames.linkedMaster)); } foreach (Template apiTemplate in apiTemplates) { APITemplateResource apiResource = apiTemplate.resources.FirstOrDefault(resource => resource.type == ResourceTypeConstants.API) as APITemplateResource; APIConfig providedAPIConfiguration = creatorConfig.apis.FirstOrDefault(api => string.Compare(apiResource.name, APITemplateCreator.MakeResourceName(api), true) == 0); // if the api version is not null the api is split into multiple templates. If the template is split and the content value has been set, then the template is for a subsequent api string apiFileName = fileNameGenerator.GenerateCreatorAPIFileName(mergeApiTemplates ? creatorConfig.baseFileName : providedAPIConfiguration.name, apiTemplateCreator.isSplitAPI(providedAPIConfiguration), apiResource.properties.value != null); fileWriter.WriteJSONToFile(apiTemplate, String.Concat(creatorConfig.outputLocation, apiFileName)); } if (globalServicePolicyTemplate != null) { fileWriter.WriteJSONToFile(globalServicePolicyTemplate, String.Concat(creatorConfig.outputLocation, fileNames.globalServicePolicy)); } if (apiVersionSetsTemplate != null && !mergeApiTemplates) { fileWriter.WriteJSONToFile(apiVersionSetsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.apiVersionSets)); } if (productsTemplate != null) { fileWriter.WriteJSONToFile(productsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.products)); } if (propertyTemplate != null) { fileWriter.WriteJSONToFile(propertyTemplate, String.Concat(creatorConfig.outputLocation, fileNames.namedValues)); } if (loggersTemplate != null) { fileWriter.WriteJSONToFile(loggersTemplate, String.Concat(creatorConfig.outputLocation, fileNames.loggers)); } if (backendsTemplate != null) { fileWriter.WriteJSONToFile(backendsTemplate, String.Concat(creatorConfig.outputLocation, fileNames.backends)); } if (authorizationServersTemplate != null) { fileWriter.WriteJSONToFile(authorizationServersTemplate, String.Concat(creatorConfig.outputLocation, fileNames.authorizationServers)); } if (tagTemplate != null) { fileWriter.WriteJSONToFile(tagTemplate, String.Concat(creatorConfig.outputLocation, fileNames.tags)); } // write parameters to outputLocation fileWriter.WriteJSONToFile(templateParameters, String.Concat(creatorConfig.outputLocation, fileNames.parameters)); Console.WriteLine("Templates written to output location"); } return(0); }); }