示例#1
0
        public Template CreateProductTemplate(CreatorConfig creatorConfig)
        {
            // create empty template
            Template productTemplate = this.templateCreator.CreateEmptyTemplate();

            // add parameters
            productTemplate.parameters = new Dictionary <string, TemplateParameterProperties>
            {
                { "ApimServiceName", new TemplateParameterProperties()
                  {
                      type = "string"
                  } }
            };

            List <TemplateResource> resources = new List <TemplateResource>();

            foreach (ProductsTemplateProperties productTemplateProperties in creatorConfig.products)
            {
                // create product resource with properties
                ProductsTemplateResource productsTemplateResource = new ProductsTemplateResource()
                {
                    name       = $"[concat(parameters('ApimServiceName'), '/{productTemplateProperties.displayName}')]",
                    type       = ResourceTypeConstants.Product,
                    apiVersion = "2018-06-01-preview",
                    properties = productTemplateProperties,
                    dependsOn  = new string[] { }
                };
                resources.Add(productsTemplateResource);
            }

            productTemplate.resources = resources.ToArray();
            return(productTemplate);
        }
示例#2
0
        public async Task <Template> Create(DeploymentDefinition creatorConfig)
        {
            var template = EmptyTemplate;

            template.Parameters.Add(ApiServiceNameParameter.Key, ApiServiceNameParameter.Value);

            var resources = new List <TemplateResource>();

            foreach (var product in creatorConfig.Products)
            {
                // create product resource with properties
                var productsTemplateResource = new ProductsTemplateResource()
                {
                    Name       = $"[concat(parameters('ApimServiceName'), '/{product.Name}')]",
                    Properties = new ProductsProperties()
                    {
                        Description          = product.Description,
                        Terms                = product.Terms,
                        SubscriptionRequired = product.SubscriptionRequired,
                        ApprovalRequired     = product.SubscriptionRequired ? product.ApprovalRequired : null,
                        SubscriptionsLimit   = product.SubscriptionRequired ? product.SubscriptionsLimit : null,
                        State                = product.State,
                        DisplayName          = product.DisplayName
                    },
                    DependsOn = new string[] { }
                };

                resources.Add(productsTemplateResource);

                resources.AddRange(await CreateChildResourceTemplates(product));
            }

            template.Resources = resources.ToArray();
            return(await Task.FromResult(template));
        }
示例#3
0
        public void ShouldCreateProductFromCreatorConfig()
        {
            // arrange
            ProductTemplateCreator productTemplateCreator = ProductTemplateCreatorFactory.GenerateProductTemplateCreator();
            CreatorConfig          creatorConfig          = new CreatorConfig()
            {
                products = new List <ProductConfig>()
            };
            ProductConfig product = new ProductConfig()
            {
                displayName          = "displayName",
                description          = "description",
                terms                = "terms",
                subscriptionRequired = true,
                approvalRequired     = true,
                subscriptionsLimit   = 1,
                state                = "state"
            };

            creatorConfig.products.Add(product);

            // act
            Template productTemplate = productTemplateCreator.CreateProductTemplate(creatorConfig);
            ProductsTemplateResource productsTemplateResource = (ProductsTemplateResource)productTemplate.resources[0];

            // assert
            Assert.Equal($"[concat(parameters('ApimServiceName'), '/{product.displayName}')]", productsTemplateResource.name);
            Assert.Equal(product.displayName, productsTemplateResource.properties.displayName);
            Assert.Equal(product.description, productsTemplateResource.properties.description);
            Assert.Equal(product.terms, productsTemplateResource.properties.terms);
            Assert.Equal(product.subscriptionsLimit, productsTemplateResource.properties.subscriptionsLimit);
            Assert.Equal(product.subscriptionRequired, productsTemplateResource.properties.subscriptionRequired);
            Assert.Equal(product.approvalRequired, productsTemplateResource.properties.approvalRequired);
            Assert.Equal(product.state, productsTemplateResource.properties.state);
        }
        public void ShouldNotCreateApprovalRequiredOrSubscriptionsLimitIfSubscriptionRequiredIsFalse()
        {
            // arrange
            ProductTemplateCreator productTemplateCreator = ProductTemplateCreatorFactory.GenerateProductTemplateCreator();
            CreatorConfig          creatorConfig          = new CreatorConfig()
            {
                products = new List <ProductConfig>()
            };
            ProductConfig product = new ProductConfig()
            {
                DisplayName          = "displayName",
                Description          = "description",
                Terms                = "terms",
                SubscriptionRequired = false,
                ApprovalRequired     = true,
                SubscriptionsLimit   = 1,
                State                = "state"
            };

            creatorConfig.products.Add(product);

            // act
            var productTemplate = productTemplateCreator.CreateProductTemplate(creatorConfig);
            ProductsTemplateResource productsTemplateResource = (ProductsTemplateResource)productTemplate.Resources[0];

            // assert
            Assert.Equal($"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{product.Name}')]", productsTemplateResource.Name);
            Assert.Equal(product.DisplayName, productsTemplateResource.Properties.DisplayName);
            Assert.Equal(product.Description, productsTemplateResource.Properties.Description);
            Assert.Equal(product.Terms, productsTemplateResource.Properties.Terms);
            Assert.Equal(product.SubscriptionRequired, productsTemplateResource.Properties.SubscriptionRequired);
            Assert.Null(productsTemplateResource.Properties.SubscriptionsLimit);
            Assert.Null(productsTemplateResource.Properties.ApprovalRequired);
            Assert.Equal(product.State, productsTemplateResource.Properties.State);
        }
示例#5
0
        public Template CreateProductTemplate(CreatorConfig creatorConfig)
        {
            // create empty template
            Template productTemplate = CreateEmptyTemplate();

            // add parameters
            productTemplate.parameters = new Dictionary <string, TemplateParameterProperties>
            {
                { ParameterNames.ApimServiceName, new TemplateParameterProperties()
                  {
                      type = "string"
                  } }
            };

            List <TemplateResource> resources = new List <TemplateResource>();

            foreach (ProductConfig product in creatorConfig.products)
            {
                // create product resource with properties
                ProductsTemplateResource productsTemplateResource = new ProductsTemplateResource()
                {
                    name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{product.displayName}')]",
                    type       = ResourceTypeConstants.Product,
                    apiVersion = GlobalConstants.APIVersion,
                    properties = new ProductsTemplateProperties()
                    {
                        description          = product.description,
                        terms                = product.terms,
                        subscriptionRequired = product.subscriptionRequired,
                        approvalRequired     = product.subscriptionRequired ? product.approvalRequired : null,
                        subscriptionsLimit   = product.subscriptionRequired ? product.subscriptionsLimit : null,
                        state                = product.state,
                        displayName          = product.displayName
                    },
                    dependsOn = new string[] { }
                };
                resources.Add(productsTemplateResource);

                // create product policy resource that depends on the product, if provided
                if (product.policy != null)
                {
                    string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('{ParameterNames.ApimServiceName}'), '{product.displayName}')]" };
                    PolicyTemplateResource productPolicy = this.policyTemplateCreator.CreateProductPolicyTemplateResource(product, dependsOn);
                    resources.Add(productPolicy);
                }

                // create product group resources if provided
                if (product.groups != null)
                {
                    string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('{ParameterNames.ApimServiceName}'), '{product.displayName}')]" };
                    List <ProductGroupsValue> productGroups = this.productGroupTemplateCreator.CreateProductGroupTemplateResources(product, dependsOn);
                    resources.AddRange(productGroups);
                }
            }

            productTemplate.resources = resources.ToArray();
            return(productTemplate);
        }
示例#6
0
        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");
        }
示例#7
0
        public async Task <Template> GenerateProductsARMTemplate(string apimname, string resourceGroup, string singleApiName, List <TemplateResource> apiTemplateResources)
        {
            Console.WriteLine("------------------------------------------");
            Console.WriteLine("Extracting products from service");
            Template armTemplate = GenerateEmptyTemplateWithParameters();

            // isolate product api associations in the case of a single api extraction
            var productAPIResources = apiTemplateResources.Where(resource => resource.type == ResourceTypeConstants.ProductAPI);

            List <TemplateResource> templateResources = new List <TemplateResource>();

            // pull all products for service
            string products = await GetProducts(apimname, resourceGroup);

            JObject oProducts = JObject.Parse(products);

            foreach (var item in oProducts["value"])
            {
                string productName    = ((JValue)item["name"]).Value.ToString();
                string productDetails = await GetProductDetails(apimname, resourceGroup, productName);

                // convert returned product to template resource class
                JsonSerializerSettings settings = new JsonSerializerSettings
                {
                    NullValueHandling     = NullValueHandling.Ignore,
                    MissingMemberHandling = MissingMemberHandling.Ignore
                };
                ProductsTemplateResource productsTemplateResource = JsonConvert.DeserializeObject <ProductsTemplateResource>(productDetails, settings);
                productsTemplateResource.name       = $"[concat(parameters('ApimServiceName'), '/{productName}')]";
                productsTemplateResource.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 || productAPIResources.SingleOrDefault(p => p.name.Contains(productName)) != null)
                {
                    Console.WriteLine("'{0}' Product found", productName);
                    templateResources.Add(productsTemplateResource);
                }
            }

            armTemplate.resources = templateResources.ToArray();
            return(armTemplate);
        }
示例#8
0
        public async Task <Template> GenerateProductsARMTemplateAsync(string apimname, string resourceGroup, string singleApiName, List <TemplateResource> apiTemplateResources, string policyXMLBaseUrl, string fileFolder)
        {
            Console.WriteLine("------------------------------------------");
            Console.WriteLine("Extracting products from service");
            Template armTemplate = GenerateEmptyTemplateWithParameters(policyXMLBaseUrl);

            // isolate product api associations in the case of a single api extraction
            var productAPIResources = apiTemplateResources.Where(resource => resource.type == ResourceTypeConstants.ProductAPI);

            List <TemplateResource> templateResources = new List <TemplateResource>();

            // pull all products for service
            string products = await GetProductsAsync(apimname, resourceGroup);

            JObject oProducts = JObject.Parse(products);

            foreach (var item in oProducts["value"])
            {
                string productName    = ((JValue)item["name"]).Value.ToString();
                string productDetails = await GetProductDetailsAsync(apimname, resourceGroup, productName);

                // convert returned product to template resource class
                JsonSerializerSettings settings = new JsonSerializerSettings
                {
                    NullValueHandling     = NullValueHandling.Ignore,
                    MissingMemberHandling = MissingMemberHandling.Ignore
                };
                ProductsTemplateResource productsTemplateResource = JsonConvert.DeserializeObject <ProductsTemplateResource>(productDetails, settings);
                productsTemplateResource.name       = $"[concat(parameters('ApimServiceName'), '/{productName}')]";
                productsTemplateResource.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 || productAPIResources.SingleOrDefault(p => p.name.Contains(productName)) != null)
                {
                    Console.WriteLine("'{0}' Product found", productName);
                    templateResources.Add(productsTemplateResource);

                    // add product policy resource to template
                    try
                    {
                        string productPolicy = await GetProductPolicyAsync(apimname, resourceGroup, productName);

                        Console.WriteLine($" - Product policy found for {productName} product");
                        PolicyTemplateResource productPolicyResource = JsonConvert.DeserializeObject <PolicyTemplateResource>(productPolicy);
                        productPolicyResource.name       = $"[concat(parameters('ApimServiceName'), '/{productName}/policy')]";
                        productPolicyResource.apiVersion = GlobalConstants.APIVersion;
                        productPolicyResource.scale      = null;
                        productPolicyResource.dependsOn  = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('ApimServiceName'), '{productName}')]" };

                        // write policy xml content to file and point to it if policyXMLBaseUrl is provided
                        if (policyXMLBaseUrl != null)
                        {
                            string policyXMLContent      = productPolicyResource.properties.value;
                            string policyFolder          = String.Concat(fileFolder, $@"/policies");
                            string productPolicyFileName = $@"/{productName}-productPolicy.xml";
                            this.fileWriter.CreateFolderIfNotExists(policyFolder);
                            this.fileWriter.WriteXMLToFile(policyXMLContent, String.Concat(policyFolder, productPolicyFileName));
                            productPolicyResource.properties.format = "rawxml-link";
                            productPolicyResource.properties.value  = $"[concat(parameters('PolicyXMLBaseUrl'), '{productPolicyFileName}')]";
                        }

                        templateResources.Add(productPolicyResource);
                    }
                    catch (Exception) { }
                }
            }

            armTemplate.resources = templateResources.ToArray();
            return(armTemplate);
        }
        public Template CreateProductTemplate(CreatorConfig creatorConfig)
        {
            // create empty template
            Template productTemplate = this.templateBuilder.GenerateEmptyTemplate().Build();

            // add parameters
            productTemplate.Parameters = new Dictionary <string, TemplateParameterProperties>
            {
                { ParameterNames.ApimServiceName, new TemplateParameterProperties()
                  {
                      Type = "string"
                  } }
            };

            List <TemplateResource> resources = new List <TemplateResource>();

            foreach (ProductConfig product in creatorConfig.products)
            {
                if (string.IsNullOrEmpty(product.Name))
                {
                    product.Name = product.DisplayName;
                }
                // create product resource with properties
                ProductsTemplateResource productsTemplateResource = new ProductsTemplateResource()
                {
                    Name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{product.Name}')]",
                    Type       = ResourceTypeConstants.Product,
                    ApiVersion = GlobalConstants.ApiVersion,
                    Properties = new ProductsProperties()
                    {
                        Description          = product.Description,
                        Terms                = product.Terms,
                        SubscriptionRequired = product.SubscriptionRequired,
                        ApprovalRequired     = product.SubscriptionRequired ? product.ApprovalRequired : null,
                        SubscriptionsLimit   = product.SubscriptionRequired ? product.SubscriptionsLimit : null,
                        State                = product.State,
                        DisplayName          = product.DisplayName
                    },
                    DependsOn = new string[] { }
                };
                resources.Add(productsTemplateResource);

                // create product policy resource that depends on the product, if provided
                if (product.policy != null)
                {
                    string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('{ParameterNames.ApimServiceName}'), '{product.Name}')]" };
                    PolicyTemplateResource productPolicy = this.policyTemplateCreator.CreateProductPolicyTemplateResource(product, dependsOn);
                    resources.Add(productPolicy);
                }

                // create product group resources if provided
                if (product.groups != null)
                {
                    string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('{ParameterNames.ApimServiceName}'), '{product.Name}')]" };
                    List <GroupTemplateResource> productGroups = this.productGroupTemplateCreator.CreateProductGroupTemplateResources(product, dependsOn);
                    resources.AddRange(productGroups);
                }

                // create product subscriptions if provided
                if (product.subscriptions != null)
                {
                    string[] dependsOn = new string[] { $"[resourceId('Microsoft.ApiManagement/service/products', parameters('{ParameterNames.ApimServiceName}'), '{product.Name}')]" };
                    List <SubscriptionsTemplateResource> subscriptions = this.subscriptionTemplateCreator.CreateSubscriptionsTemplateResources(product, dependsOn);
                    resources.AddRange(subscriptions);
                }
            }

            productTemplate.Resources = resources.ToArray();
            return(productTemplate);
        }