/// <summary>
        /// Generates an api dictionary with apiName/versionsetName (if exist one) as key, list of apiNames as value
        /// </summary>
        /// <returns></returns>
        async Task <Dictionary <string, List <string> > > GetAllAPIsDictionary(ExtractorParameters extractorParameters)
        {
            // pull all apis from service
            var apis = await this.apisClient.GetAllAsync(extractorParameters);

            // Generate folders based on all apiversionset
            var apiDictionary = new Dictionary <string, List <string> >();

            foreach (var api in apis)
            {
                string apiDisplayName = api.Properties.DisplayName;

                if (!apiDictionary.ContainsKey(apiDisplayName))
                {
                    var apiVersionSet = new List <string>();
                    apiVersionSet.Add(api.Name);
                    apiDictionary[apiDisplayName] = apiVersionSet;
                }
                else
                {
                    apiDictionary[apiDisplayName].Add(api.Name);
                }
            }

            return(apiDictionary);
        }
Example #2
0
        public static string GetPolicyContent(ExtractorParameters extractorParameters, PolicyTemplateResource policyTemplateResource)
        {
            // the backend is used in a policy if the xml contains a set-backend-service policy, which will reference the backend's url or id
            string policyContent = policyTemplateResource.Properties.PolicyContent;

            // check if this is a file or is it the raw policy content
            if (policyContent.Contains(".xml"))
            {
                var key = policyContent;
                //check cache
                if (PolicyCache.TryGetValue(key, out string content))
                {
                    return(content);
                }

                var filename     = policyContent.Split(',')[1].Replace("'", string.Empty).Trim();
                var policyFolder = $@"{extractorParameters.FilesGenerationRootDirectory}/policies";
                var filepath     = $@"{Directory.GetCurrentDirectory()}/{policyFolder}/{filename}";

                if (File.Exists(filepath))
                {
                    policyContent = File.ReadAllText(filepath);
                    PolicyCache.Set(key, policyContent);
                }
            }

            return(policyContent);
        }
Example #3
0
        public void ExtractorConfigValidate_NoPropertiesSet_MissingParameterException()
        {
            var defaultExtractorConfig = new ExtractorConsoleAppConfiguration
            {
                IncludeAllRevisions             = true.ToString(),
                ParamApiLoggerId                = true.ToString(),
                ParamBackend                    = true.ToString(),
                ParamLogResourceId              = true.ToString(),
                ParamNamedValue                 = true.ToString(),
                ParamNamedValuesKeyVaultSecrets = true.ToString(),
                ParamServiceUrl                 = true.ToString(),
                NotIncludeNamedValue            = true.ToString(),
                SplitAPIs       = true.ToString(),
                ExtractGateways = true.ToString()
            };

            var extractorParameters = new ExtractorParameters(defaultExtractorConfig);

            extractorParameters = extractorParameters.OverrideConfiguration(new ExtractorConsoleAppConfiguration());

            extractorParameters.IncludeAllRevisions.Should().BeTrue();
            extractorParameters.ParameterizeServiceUrl.Should().BeTrue();
            extractorParameters.ParameterizeNamedValue.Should().BeTrue();
            extractorParameters.ParameterizeApiLoggerId.Should().BeTrue();
            extractorParameters.ParameterizeLogResourceId.Should().BeTrue();
            extractorParameters.NotIncludeNamedValue.Should().BeTrue();
            extractorParameters.ParamNamedValuesKeyVaultSecrets.Should().BeTrue();
            extractorParameters.ParameterizeBackend.Should().BeTrue();
            extractorParameters.SplitApis.Should().BeTrue();
            extractorParameters.IncludeAllRevisions.Should().BeTrue();
            extractorParameters.ExtractGateways.Should().BeTrue();
        }
        public async Task <PolicyTemplateResource> GenerateApiOperationPolicyResourceAsync(
            string apiName,
            string operationName,
            string baseFilesGenerationDirectory,
            ExtractorParameters extractorParameters)
        {
            var apiOperationPolicy = await this.policyClient.GetPolicyLinkedToApiOperationAsync(apiName, operationName, extractorParameters);

            if (apiOperationPolicy is null)
            {
                this.logger.LogWarning("Policy for api '{0}' and operation '{1}' not found", apiName, operationName);
                return(apiOperationPolicy);
            }

            apiOperationPolicy.Name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiName}/{operationName}/policy')]";
            apiOperationPolicy.ApiVersion = GlobalConstants.ApiVersion;
            apiOperationPolicy.Scale      = null;
            apiOperationPolicy.DependsOn  = new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis/operations', parameters('{ParameterNames.ApimServiceName}'), '{apiName}', '{operationName}')]" };

            // write policy xml content to file and point to it if policyXMLBaseUrl is provided
            if (extractorParameters.PolicyXMLBaseUrl is not null)
            {
                var policyFileName = string.Format(ApiOperationPolicyFileNameFormat, apiName, operationName);
                await this.SavePolicyXmlAsync(apiOperationPolicy, baseFilesGenerationDirectory, policyFileName);

                this.SetPolicyTemplateResourcePolicyContentWithArmPresetValues(extractorParameters, apiOperationPolicy, policyFileName);
            }

            return(apiOperationPolicy);
        }
Example #5
0
        public async Task <Template <ApiVersionSetTemplateResources> > GenerateApiVersionSetTemplateAsync(
            string singleApiName,
            List <ApiTemplateResource> apiTemplateResources,
            ExtractorParameters extractorParameters)
        {
            var apiVersionSetTemplate = this.templateBuilder
                                        .GenerateTemplateWithApimServiceNameProperty()
                                        .Build <ApiVersionSetTemplateResources>();

            var apiVersionSets = await this.apiVersionSetClient.GetAllAsync(extractorParameters);

            foreach (var apiVersionSet in apiVersionSets)
            {
                // 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 (string.IsNullOrEmpty(singleApiName) || apiTemplateResources.SingleOrDefault(api =>
                                                                                                api.Properties.ApiVersionSetId != null &&
                                                                                                api.Properties.ApiVersionSetId.Contains(apiVersionSet.Name)) != null)
                {
                    this.logger.LogDebug("Found '{0}' api-version-set", apiVersionSet.Name);

                    apiVersionSet.Name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{apiVersionSet.Name}')]";
                    apiVersionSet.Type       = ResourceTypeConstants.ApiVersionSet;
                    apiVersionSet.ApiVersion = GlobalConstants.ApiVersion;

                    apiVersionSetTemplate.TypedResources.ApiVersionSets.Add(apiVersionSet);
                }
            }

            return(apiVersionSetTemplate);
        }
        public async Task <List <ProductApiTemplateResource> > GenerateSingleApiTemplateAsync(
            string singleApiName,
            ExtractorParameters extractorParameters,
            bool addDependsOnParameter = false)
        {
            try
            {
                var serviceApi = await this.apisClient.GetSingleAsync(singleApiName, extractorParameters);

                if (serviceApi is null)
                {
                    throw new ServiceApiNotFoundException($"ServiceApi with name '{singleApiName}' not found");
                }

                this.logger.LogInformation("{0} Product API found ...", singleApiName);
                var dependsOnParameter = addDependsOnParameter
                    ? new string[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{singleApiName}')]" }
                    : Array.Empty <string>();

                return(await this.GenerateProductApiTemplateResourcesAsync(singleApiName, extractorParameters, dependsOnParameter));
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, $"Exception occured while generating service api products template for {singleApiName}.");
                throw;
            }
        }
        public async Task <Template <ProductTemplateResources> > GenerateProductsTemplateAsync(
            string singleApiName,
            List <ProductApiTemplateResource> productApiTemplateResources,
            string baseFilesGenerationDirectory,
            ExtractorParameters extractorParameters)
        {
            var productsTemplate = this.templateBuilder
                                   .GenerateTemplateWithPresetProperties(extractorParameters)
                                   .Build <ProductTemplateResources>();

            var products = await this.productsClient.GetAllAsync(extractorParameters);

            foreach (var productTemplateResource in products)
            {
                var productOriginalName = productTemplateResource.Name;

                productTemplateResource.Name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{productOriginalName}')]";
                productTemplateResource.ApiVersion = GlobalConstants.ApiVersion;

                // 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 || productApiTemplateResources.SingleOrDefault(p => p.Name.Contains($"/{productOriginalName}/")) != null)
                {
                    this.logger.LogDebug("'{0}' product found", productOriginalName);
                    productsTemplate.TypedResources.Products.Add(productTemplateResource);

                    await this.AddProductPolicyToTemplateResources(extractorParameters, productOriginalName, productsTemplate.TypedResources, baseFilesGenerationDirectory);

                    await this.AddProductTagsToTemplateResources(extractorParameters, productOriginalName, productsTemplate.TypedResources);
                }
            }

            return(productsTemplate);
        }
        async Task AddProductTagsToTemplateResources(
            ExtractorParameters extractorParameters,
            string productName,
            ProductTemplateResources productTemplateResources)
        {
            try
            {
                var productTags = await this.tagClient.GetAllTagsLinkedToProductAsync(productName, extractorParameters);

                if (productTags.IsNullOrEmpty())
                {
                    this.logger.LogWarning($"No tags found for product {productName}");
                    return;
                }

                foreach (var productTag in productTags)
                {
                    string originalTagName = productTag.Name;
                    this.logger.LogDebug("'{0}' tag association found for {1} product", originalTagName, productName);

                    productTag.Name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{productName}/{originalTagName}')]";
                    productTag.Type       = ResourceTypeConstants.ProductTag;
                    productTag.ApiVersion = GlobalConstants.ApiVersion;
                    productTag.Scale      = null;
                    productTag.DependsOn  = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('{ParameterNames.ApimServiceName}'), '{productName}')]" };

                    productTemplateResources.Tags.Add(productTag);
                }
            }
            catch (Exception ex)
            {
                this.logger.LogError(ex, "Exception occured while product tags template generation");
                throw;
            }
        }
        public async Task <Template <ApiTemplateResources> > GenerateApiRevisionTemplateAsync(
            string currentRevision,
            List <string> revList,
            string baseFilesGenerationDirectory,
            ExtractorParameters extractorParameters)
        {
            var apiRevisionTemplate = this.templateBuilder
                                      .GenerateTemplateWithPresetProperties(extractorParameters)
                                      .Build <ApiTemplateResources>();

            foreach (string curApi in revList)
            {
                // should add current api to dependsOn to those revisions that are not "current"
                if (curApi.Equals(currentRevision))
                {
                    var apiResources = await this.apiExtractor.GenerateSingleApiTemplateResourcesAsync(currentRevision, baseFilesGenerationDirectory, extractorParameters);

                    apiRevisionTemplate.TypedResources.AddResourcesData(apiResources);
                }
                else
                {
                    var apiResources = await this.apiExtractor.GenerateSingleApiTemplateResourcesAsync(curApi, baseFilesGenerationDirectory, extractorParameters);

                    var apiResource = apiResources.Apis.FirstOrDefault();
                    apiResource.DependsOn = new[] { $"[resourceId('Microsoft.ApiManagement/service/apis', parameters('{ParameterNames.ApimServiceName}'), '{extractorParameters.SingleApiName}')]" };

                    apiRevisionTemplate.TypedResources.AddResourcesData(apiResources);
                }
            }

            return(apiRevisionTemplate);
        }
        public async Task <PolicyTemplateResource> GenerateProductPolicyTemplateAsync(
            ExtractorParameters extractorParameters,
            string productName,
            string[] productResourceId,
            string baseFilesGenerationDirectory)
        {
            var productPolicy = await this.policyClient.GetPolicyLinkedToProductAsync(productName, extractorParameters);

            if (productPolicy is null)
            {
                this.logger.LogWarning($"Policy not found for product '{productName}'");
                return(productPolicy);
            }

            this.logger.LogDebug($"Policy linked to {productName} product found successfuly");

            productPolicy.Name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{productName}/policy')]";
            productPolicy.ApiVersion = GlobalConstants.ApiVersion;
            productPolicy.Scale      = null;
            productPolicy.DependsOn  = productResourceId;

            // due to legacy reasons, providing empty `policyXmlBaseUrl = ""` is recognized as a boolean parameter
            // telling that it is needed to provide a policy Xml file
            if (extractorParameters.PolicyXMLBaseUrl is not null)
            {
                var policyFileName = string.Format(ProductPolicyFileNameFormat, productName);
                await this.SavePolicyXmlAsync(productPolicy, baseFilesGenerationDirectory, policyFileName);

                this.SetPolicyTemplateResourcePolicyContentWithArmPresetValues(extractorParameters, productPolicy, policyFileName);
            }

            return(productPolicy);
        }
Example #11
0
        public async Task <Template <TagApiTemplateResources> > GenerateApiTagsTemplateAsync(
            string singleApiName,
            List <string> multipleApiNames,
            ExtractorParameters extractorParameters)
        {
            var tagApiTemplate = this.templateBuilder
                                 .GenerateTemplateWithApimServiceNameProperty()
                                 .Build <TagApiTemplateResources>();

            if (!string.IsNullOrEmpty(singleApiName))
            {
                tagApiTemplate.TypedResources = await this.GenerateSingleApiTagResourceAsync(singleApiName, extractorParameters, Array.Empty <string>());
            }
            else if (!multipleApiNames.IsNullOrEmpty())
            {
                tagApiTemplate.TypedResources = await this.GenerateMultipleApisTemplateAsync(multipleApiNames, extractorParameters);
            }
            else
            {
                var serviceApis = await this.apisClient.GetAllAsync(extractorParameters);

                this.logger.LogDebug("{0} APIs found ...", serviceApis.Count);

                var serviceApiNames = serviceApis.Select(api => api.Name).ToList();
                tagApiTemplate.TypedResources = await this.GenerateMultipleApisTemplateAsync(serviceApiNames, extractorParameters);
            }

            return(tagApiTemplate);
        }
Example #12
0
        public async Task <Template <GatewayApiTemplateResources> > GenerateGatewayApiTemplateAsync(
            string singleApiName,
            List <string> multipleApiNames,
            ExtractorParameters extractorParameters)
        {
            var gatewayApiTemplate = this.templateBuilder
                                     .GenerateTemplateWithApimServiceNameProperty()
                                     .Build <GatewayApiTemplateResources>();

            var gateways = await this.gatewayClient.GetAllAsync(extractorParameters);

            if (gateways.IsNullOrEmpty())
            {
                this.logger.LogWarning("No Gateways data was found for {0}", extractorParameters.SourceApimName);
                return(gatewayApiTemplate);
            }

            var multipleApiNamesSet = multipleApiNames?.ToHashSet();

            foreach (var gateway in gateways)
            {
                var gatewayApis = await this.apisClient.GetAllLinkedToGatewayAsync(gateway.Name, extractorParameters);

                if (gatewayApis.IsNullOrEmpty())
                {
                    this.logger.LogWarning("No gateway apis were found for gateway '{0}'", gateway.Name);
                    continue;
                }

                if (!string.IsNullOrEmpty(singleApiName))
                {
                    // inluding only apis with singleApiName
                    var apis = gatewayApis.Where(x => x.Name == singleApiName);
                    if (!apis.IsNullOrEmpty())
                    {
                        var gatewayApiResources = this.GenerateGatewayApiTemplateResources(gateway.Name, apis);
                        gatewayApiTemplate.TypedResources.GatewayApis.AddRange(gatewayApiResources);
                    }
                }
                else if (!multipleApiNames.IsNullOrEmpty())
                {
                    // including only apis existing in multipleApiNames
                    var apis = gatewayApis.Where(x => multipleApiNamesSet.Contains(x.Name));
                    if (!apis.IsNullOrEmpty())
                    {
                        var gatewayApiResources = this.GenerateGatewayApiTemplateResources(gateway.Name, apis);
                        gatewayApiTemplate.TypedResources.GatewayApis.AddRange(gatewayApiResources);
                    }
                }
                else
                {
                    // including every api in response
                    var gatewayApiResources = this.GenerateGatewayApiTemplateResources(gateway.Name, gatewayApis);
                    gatewayApiTemplate.TypedResources.GatewayApis.AddRange(gatewayApiResources);
                }
            }

            return(gatewayApiTemplate);
        }
        public async Task <PolicyTemplateResource> GetGlobalServicePolicyAsync(ExtractorParameters extractorParameters)
        {
            var(azToken, azSubId) = await this.Auth.GetAccessToken();

            string requestUrl = string.Format(GetGlobalServicePolicyRequest,
                                              this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, GlobalConstants.ApiVersion);

            return(await this.CallApiManagementAsync <PolicyTemplateResource>(azToken, requestUrl));
        }
        public void SetExtractorParameters(ExtractorConsoleAppConfiguration extractorConfiguration)
        {
            this.extractorParameters = new ExtractorParameters(extractorConfiguration);

            if (!string.IsNullOrEmpty(extractorConfiguration.ServiceBaseUrl))
            {
                GlobalConstants.BaseManagementAzureUrl = extractorConfiguration.ServiceBaseUrl;
            }
        }
        public void SetExtractorParameters(ExtractorConsoleAppConfiguration extractorConfiguration)
        {
            this.extractorParameters = new ExtractorParameters(extractorConfiguration);

            if (!string.IsNullOrEmpty(extractorConfiguration.ServiceBaseUrl))
            {
                EntityExtractorBase.BaseUrl = extractorConfiguration.ServiceBaseUrl;
            }
        }
Example #16
0
        public void ExtractorConfigValidate_NoPropertiesSet_MissingParameterException()
        {
            var extractorConfig     = new ExtractorConsoleAppConfiguration();
            var extractorParameters = new ExtractorParameters(extractorConfig);

            var expectedException = Assert.Throws <ArgumentException>(() => extractorParameters.Validate());

            Assert.Contains("Missing parameter", expectedException.Message);
        }
        public async Task GenerateProductApisTemplates_ProperlyLaysTheInformation()
        {
            // arrange
            var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GenerateProductApisTemplates_ProperlyLaysTheInformation));

            var extractorConfig = this.GetMockedExtractorConsoleAppConfiguration(
                splitApis: false,
                apiVersionSetName: string.Empty,
                multipleApiNames: string.Empty,
                includeAllRevisions: false);
            var extractorParameters = new ExtractorParameters(extractorConfig);

            var mockedServiceApisApiClient         = MockApisClient.GetMockedApiClientWithDefaultValues();
            var mockedServiceApisProductsApiClient = MockProductsClient.GetMockedApiClientWithDefaultValues();

            var productApisExtractor = new ProductApisExtractor(
                this.GetTestLogger <ProductApisExtractor>(),
                mockedServiceApisProductsApiClient,
                mockedServiceApisApiClient,
                new TemplateBuilder());

            var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
                this.GetTestLogger <ExtractorExecutor>(),
                productApisExtractor: productApisExtractor);

            extractorExecutor.SetExtractorParameters(extractorParameters);

            // act
            var productApisTemplate = await extractorExecutor.GenerateProductApisTemplateAsync(
                singleApiName : It.IsAny <string>(),
                multipleApiNames : It.IsAny <List <string> >(),
                currentTestDirectory);

            // assert
            File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.ProductAPIs)).Should().BeTrue();

            productApisTemplate.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);
            productApisTemplate.TypedResources.ProductApis.Count().Should().Be(2);
            productApisTemplate.Resources.Count().Should().Be(2);

            var productApi1 = productApisTemplate.TypedResources.ProductApis.First();

            productApi1.ApiVersion.Should().Be(GlobalConstants.ApiVersion);
            productApi1.Name.Should().NotBeNullOrEmpty();
            productApi1.Type.Should().Be(ResourceTypeConstants.ProductApi);
            productApi1.Properties.DisplayName.Should().NotBeNullOrEmpty();
            productApi1.Properties.Description.Should().NotBeNullOrEmpty();

            var productApi2 = productApisTemplate.TypedResources.ProductApis.Last();

            productApi2.ApiVersion.Should().Be(GlobalConstants.ApiVersion);
            productApi2.Name.Should().NotBeNullOrEmpty();
            productApi2.Type.Should().Be(ResourceTypeConstants.ProductApi);
            productApi2.Properties.DisplayName.Should().NotBeNullOrEmpty();
            productApi2.Properties.Description.Should().NotBeNullOrEmpty();
            productApi2.DependsOn.Should().NotBeNullOrEmpty();
        }
Example #18
0
        public async Task <bool> IsNamedValueUsedInBackends(
            string singleApiName,
            List <PolicyTemplateResource> apiPolicies,
            string propertyName,
            string propertyDisplayName,
            ExtractorParameters extractorParameters,
            string baseFilesGenerationDirectory)
        {
            var backends = await this.backendClient.GetAllAsync(extractorParameters);

            if (backends.IsNullOrEmpty())
            {
                this.logger.LogWarning("No backends found for apim instance '{0}'", extractorParameters.SourceApimName);
                return(false);
            }

            foreach (var backendResource in backends)
            {
                var backendContent = backendResource.Serialize();

                // check if backend references the named value, credentials for example
                if (backendContent.Contains(string.Concat("{{", propertyName, "}}")) ||
                    backendContent.Contains(string.Concat("{{", propertyDisplayName, "}}")))
                {
                    //only true if this is a full extraction, or in the case of a single api, if it is referenced by one of the API policies
                    if (string.IsNullOrEmpty(singleApiName))
                    {
                        return(true);
                    }
                    else
                    {
                        // is this backend related to the single api?
                        // is backend used in the extracted policies for this API
                        // if backend id is referenced in policy
                        // or a named value is referenced in policy to a backend, we have already checked the policy for named value.

                        // check if this backend is used by any of the policies extracted
                        var backendName = backendResource.Name;

                        // we have already checked if the named value is used in a policy, we just need to confirm if the backend is referenced by this single api within the policy file
                        // this is why an empty named values must be passed to this method for validation
                        foreach (var policyTemplateResource in apiPolicies)
                        {
                            var policyContent = this.policyExtractor.GetCachedPolicyContent(policyTemplateResource, baseFilesGenerationDirectory);
                            if (this.DoesPolicyReferenceBackend(policyContent, Array.Empty <NamedValueTemplateResource>(), backendName, backendResource))
                            {
                                // don't need to go through all policies and backends if the named values has already been found
                                return(true);
                            }
                        }
                    }
                }
            }

            return(false);
        }
Example #19
0
        public async Task GenerateBackendTemplates_ProperlyLaysTheInformation()
        {
            // arrange
            var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GenerateBackendTemplates_ProperlyLaysTheInformation));

            var extractorConfig = this.GetMockedExtractorConsoleAppConfiguration(
                splitApis: false,
                apiVersionSetName: string.Empty,
                multipleApiNames: string.Empty,
                includeAllRevisions: false);
            var extractorParameters = new ExtractorParameters(extractorConfig);

            var mockPolicyExtractor = new Mock <IPolicyExtractor>(MockBehavior.Strict);

            mockPolicyExtractor
            .Setup(x => x.GetCachedPolicyContent(It.IsAny <PolicyTemplateResource>(), It.IsAny <string>()))
            .Returns((PolicyTemplateResource policy, string _) => $"mock-response-from-policy-{policy.Name}");

            var mockBackendClient = MockBackendClient.GetMockedApiClientWithDefaultValues();
            var backendExtractor  = new BackendExtractor(
                this.GetTestLogger <BackendExtractor>(),
                new TemplateBuilder(),
                mockPolicyExtractor.Object,
                mockBackendClient);

            var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
                this.GetTestLogger <ExtractorExecutor>(),
                backendExtractor: backendExtractor);

            extractorExecutor.SetExtractorParameters(extractorParameters);

            // act
            var backendTemplate = await extractorExecutor.GenerateBackendTemplateAsync(
                singleApiName : null,
                new List <PolicyTemplateResource>(),
                new List <NamedValueTemplateResource>(),
                currentTestDirectory);

            // assert
            File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.Backends)).Should().BeTrue();

            backendTemplate.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);
            backendTemplate.Parameters.Should().ContainKey(ParameterNames.BackendSettings);

            backendTemplate.TypedResources.Backends.Should().HaveCount(1);
            backendTemplate.Resources.Should().HaveCount(1);

            backendTemplate.TypedResources.Backends.First().Type.Should().Be(ResourceTypeConstants.Backend);
            backendTemplate.TypedResources.Backends.First().Name.Should().Contain(MockBackendClient.BackendName);

            var backendProperties = backendTemplate.TypedResources.Backends.First().Properties;

            backendProperties.Should().NotBeNull();
            backendProperties.Url.Should().Contain(ParameterNames.BackendSettings);
            backendProperties.Protocol.Should().Contain(ParameterNames.BackendSettings);
        }
        string GenerateLinkedTemplateUri(string fileName, ExtractorParameters extractorParameters)
        {
            var linkedTemplateUri = !string.IsNullOrEmpty(extractorParameters.LinkedTemplatesSasToken)
                ? $"parameters('{ParameterNames.LinkedTemplatesBaseUrl}'), '{fileName}', parameters('{ParameterNames.LinkedTemplatesSasToken}')"
                : $"parameters('{ParameterNames.LinkedTemplatesBaseUrl}'), '{fileName}'";

            return(!string.IsNullOrEmpty(extractorParameters.LinkedTemplatesUrlQueryString)
                ? $"[concat({linkedTemplateUri}, parameters('{ParameterNames.LinkedTemplatesUrlQueryString}'))]"
                : $"[concat({linkedTemplateUri})]");
        }
        public async Task GenerateApiVersionSetTemplates_ProperlyLaysTheInformation()
        {
            // arrange
            var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GenerateApiVersionSetTemplates_ProperlyLaysTheInformation));

            var extractorConfig = this.GetMockedExtractorConsoleAppConfiguration(
                splitApis: false,
                apiVersionSetName: string.Empty,
                multipleApiNames: string.Empty,
                includeAllRevisions: false);
            var extractorParameters = new ExtractorParameters(extractorConfig);

            var mockedApiVersionSetClient = MockApiVersionSetClient.GetMockedApiClientWithDefaultValues();
            var apiVersionSetExtractor    = new ApiVersionSetExtractor(
                this.GetTestLogger <ApiVersionSetExtractor>(),
                new TemplateBuilder(),
                mockedApiVersionSetClient);

            var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
                this.GetTestLogger <ExtractorExecutor>(),
                apiVersionSetExtractor: apiVersionSetExtractor);

            extractorExecutor.SetExtractorParameters(extractorParameters);

            // act
            var apiVersionSetTemplate = await extractorExecutor.GenerateApiVersionSetTemplateAsync(
                singleApiName : It.IsAny <string>(),
                currentTestDirectory,
                apiTemplateResources : It.IsAny <List <ApiTemplateResource> >());

            // assert
            File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.ApiVersionSets)).Should().BeTrue();

            apiVersionSetTemplate.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);

            apiVersionSetTemplate.TypedResources.ApiVersionSets.Count().Should().Be(2);
            apiVersionSetTemplate.Resources.Count().Should().Be(2);

            (apiVersionSetTemplate.Resources[0].Name.Contains(MockApiVersionSetClient.ApiVersionSetName1) ||
             apiVersionSetTemplate.Resources[1].Name.Contains(MockApiVersionSetClient.ApiVersionSetName1)).Should().BeTrue();
            (apiVersionSetTemplate.Resources[0].Name.Contains(MockApiVersionSetClient.ApiVersionSetName2) ||
             apiVersionSetTemplate.Resources[1].Name.Contains(MockApiVersionSetClient.ApiVersionSetName2)).Should().BeTrue();

            foreach (var templateResource in apiVersionSetTemplate.TypedResources.ApiVersionSets)
            {
                templateResource.Type.Should().Be(ResourceTypeConstants.ApiVersionSet);
                templateResource.Properties.Should().NotBeNull();

                templateResource.Properties.DisplayName.Should().NotBeNullOrEmpty();
                templateResource.Properties.Description.Should().NotBeNullOrEmpty();
                templateResource.Properties.VersionHeaderName.Should().NotBeNullOrEmpty();
                templateResource.Properties.VersioningScheme.Should().NotBeNullOrEmpty();
                templateResource.Properties.VersionQueryName.Should().NotBeNullOrEmpty();
            }
        }
        public async Task <List <TagTemplateResource> > GetAllAsync(ExtractorParameters extractorParameters, int skipAmountOfRecords = 0)
        {
            var(azToken, azSubId) = await this.Auth.GetAccessToken();

            var requestUrl = string.Format(GetAllTagsRequest,
                                           this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, skipAmountOfRecords, GlobalConstants.ApiVersion);

            var response = await this.CallApiManagementAsync <GetTagsResponse>(azToken, requestUrl);

            return(response.Tags);
        }
        public async Task <List <DiagnosticTemplateResource> > GetAllAsync(ExtractorParameters extractorParameters)
        {
            var(azToken, azSubId) = await this.Auth.GetAccessToken();

            var requestUrl = string.Format(GetAllDiagnosticsRequest,
                                           this.BaseUrl, azSubId, extractorParameters.ResourceGroup, extractorParameters.SourceApimName, GlobalConstants.ApiVersion);

            var response = await this.CallApiManagementAsync <GetDiagnosticsResponse>(azToken, requestUrl);

            return(response.Diagnostics);
        }
Example #24
0
        public async Task GenerateAuthorizationServerTemplates_ProperlyLaysTheInformation()
        {
            // arrange
            var currentTestDirectory = Path.Combine(this.OutputDirectory, nameof(GenerateAuthorizationServerTemplates_ProperlyLaysTheInformation));

            var extractorConfig = this.GetMockedExtractorConsoleAppConfiguration(
                splitApis: false,
                apiVersionSetName: string.Empty,
                multipleApiNames: string.Empty,
                includeAllRevisions: false);
            var extractorParameters = new ExtractorParameters(extractorConfig);

            var mockedAuthorizationServerClient = MockAuthorizationServerClient.GetMockedApiClientWithDefaultValues();
            var authorizationServerExtractor    = new AuthorizationServerExtractor(
                this.GetTestLogger <AuthorizationServerExtractor>(),
                new TemplateBuilder(),
                mockedAuthorizationServerClient);

            var extractorExecutor = ExtractorExecutor.BuildExtractorExecutor(
                this.GetTestLogger <ExtractorExecutor>(),
                authorizationServerExtractor: authorizationServerExtractor);

            extractorExecutor.SetExtractorParameters(extractorParameters);

            // act
            var authorizationServerTemplate = await extractorExecutor.GenerateAuthorizationServerTemplateAsync(
                singleApiName : It.IsAny <string>(),
                currentTestDirectory,
                apiTemplateResources : It.IsAny <List <ApiTemplateResource> >());

            // assert
            File.Exists(Path.Combine(currentTestDirectory, extractorParameters.FileNames.AuthorizationServers)).Should().BeTrue();

            authorizationServerTemplate.Parameters.Should().ContainKey(ParameterNames.ApimServiceName);
            authorizationServerTemplate.TypedResources.AuthorizationServers.Count().Should().Be(1);
            authorizationServerTemplate.Resources.Count().Should().Be(1);

            var authorizationResource = authorizationServerTemplate.TypedResources.AuthorizationServers.First();

            authorizationResource.Name.Should().Contain(MockAuthorizationServerClient.AuthorizationServerName1);
            authorizationResource.Type.Should().Contain(ResourceTypeConstants.AuthorizationServer);
            authorizationResource.Properties.Should().NotBeNull();

            authorizationResource.Properties.AuthorizationMethods.Any(x => x.Contains(MockAuthorizationServerClient.AuthorizationServerName1)).Should().BeTrue();
            authorizationResource.Properties.ClientAuthenticationMethod.Any(x => x.Contains(MockAuthorizationServerClient.AuthorizationServerName1)).Should().BeTrue();
            authorizationResource.Properties.DisplayName.Should().Contain(MockAuthorizationServerClient.AuthorizationServerName1);
            authorizationResource.Properties.TokenBodyParameters.Should().NotBeNull();
            authorizationResource.Properties.TokenEndpoint.Should().NotBeNull();
            authorizationResource.Properties.ClientRegistrationEndpoint.Should().NotBeNull();
            authorizationResource.Properties.AuthorizationEndpoint.Should().NotBeNull();
            authorizationResource.Properties.GrantTypes.Should().NotBeNullOrEmpty();
            authorizationResource.Properties.ClientId.Should().NotBeNullOrEmpty();
        }
        public void ExtractorConfigValidate_MultipleApisNoStringPassed_DoesntThrowAnyException()
        {
            // arrange
            var defaultExtractorConfig = this.GetMockedExtractorConsoleAppConfiguration();

            defaultExtractorConfig.MultipleAPIs = string.Empty;

            // act
            Action createExtractorParameters = () => { _ = new ExtractorParameters(defaultExtractorConfig); };

            createExtractorParameters.Should().NotThrow();
        }
Example #26
0
        async Task LoadAllReferencedLoggers(
            List <string> apisToExtract,
            ExtractorParameters extractorParameters)
        {
            var serviceDiagnostics = await this.diagnosticClient.GetAllAsync(extractorParameters);

            foreach (var serviceDiagnostic in serviceDiagnostics)
            {
                string loggerId = serviceDiagnostic.Properties.LoggerId;

                var serviceDiagnosticsKey = ParameterNamingHelper.GenerateValidParameterName(serviceDiagnostic.Name, ParameterPrefix.Diagnostic);

                if (!this.Cache.ServiceLevelDiagnosticLoggerBindings.ContainsKey(serviceDiagnosticsKey))
                {
                    this.Cache.ServiceLevelDiagnosticLoggerBindings.Add(serviceDiagnosticsKey, loggerId);
                }
            }

            if (apisToExtract.IsNullOrEmpty())
            {
                this.logger.LogWarning("No apis to extract are passed to {0}", nameof(LoggerExtractor));
                return;
            }

            foreach (string curApiName in apisToExtract)
            {
                var diagnostics = await this.diagnosticClient.GetApiDiagnosticsAsync(curApiName, extractorParameters);

                if (diagnostics.IsNullOrEmpty())
                {
                    this.logger.LogWarning("No diagnostics found for '{0}' api", curApiName);
                    continue;
                }

                var diagnosticLoggerBindings = new HashSet <DiagnosticLoggerBinding>();
                foreach (var diagnostic in diagnostics)
                {
                    diagnosticLoggerBindings.Add(new DiagnosticLoggerBinding
                    {
                        DiagnosticName = ParameterNamingHelper.GenerateValidParameterName(diagnostic.Name, ParameterPrefix.Diagnostic),
                        LoggerId       = diagnostic.Properties.LoggerId
                    });
                }

                if (!diagnosticLoggerBindings.IsNullOrEmpty())
                {
                    this.Cache.ApiDiagnosticLoggerBindings.Add(
                        ParameterNamingHelper.GenerateValidParameterName(curApiName, ParameterPrefix.Api),
                        diagnosticLoggerBindings);
                }
            }
        }
Example #27
0
        public TemplateBuilder AddParameterizeBackendProperty(ExtractorParameters extractorParameters)
        {
            if (extractorParameters.ParameterizeBackend)
            {
                TemplateParameterProperties extractBackendParametersProperties = new TemplateParameterProperties()
                {
                    Type = "object"
                };
                this.template.Parameters.Add(ParameterNames.BackendSettings, extractBackendParametersProperties);
            }

            return(this);
        }
Example #28
0
        public void ExtractorConfigValidate_MinimumPropertiesSet_IsValid()
        {
            var extractorConfig = new ExtractorConsoleAppConfiguration
            {
                SourceApimName      = "source-apim",
                DestinationApimName = "destination-apim",
                ResourceGroup       = "resource-group",
                FileFolder          = "c:/my/folder"
            };
            var extractorParameters = new ExtractorParameters(extractorConfig);

            extractorParameters.Validate();
        }
        public TemplateBuilder AddParameterizeServiceUrlProperty(ExtractorParameters extractorParameters)
        {
            if (extractorParameters.ParameterizeServiceUrl || extractorParameters.ServiceUrlParameters != null && extractorParameters.ServiceUrlParameters.Length > 0)
            {
                TemplateParameterProperties serviceUrlParamProperty = new TemplateParameterProperties()
                {
                    type = "object"
                };
                this.template.Parameters.Add(ParameterNames.ServiceUrl, serviceUrlParamProperty);
            }

            return(this);
        }
        public TemplateBuilder AddParameterizeApiLoggerIdProperty(ExtractorParameters extractorParameters)
        {
            if (extractorParameters.ParameterizeApiLoggerId)
            {
                TemplateParameterProperties apiLoggerProperty = new TemplateParameterProperties()
                {
                    type = "object"
                };
                this.template.Parameters.Add(ParameterNames.ApiLoggerId, apiLoggerProperty);
            }

            return(this);
        }