/// <summary>
 /// Allows to build ExtractorExecutor with only desired speficic extractors passed
 /// </summary>
 /// <returns>new ExtractorExecutor instance</returns>
 public static ExtractorExecutor BuildExtractorExecutor(
     ILogger <ExtractorExecutor> logger,
     IApisClient apisClient     = null,
     IApiExtractor apiExtractor = null,
     IApiVersionSetExtractor apiVersionSetExtractor             = null,
     IAuthorizationServerExtractor authorizationServerExtractor = null,
     IBackendExtractor backendExtractor = null,
     ILoggerExtractor loggerExtractor   = null,
     IMasterTemplateExtractor masterTemplateExtractor = null,
     IPolicyExtractor policyExtractor           = null,
     IProductApisExtractor productApisExtractor = null,
     IProductExtractor productExtractor         = null,
     IPropertyExtractor propertyExtractor       = null,
     ITagApiExtractor apiTagExtractor           = null,
     ITagExtractor tagExtractor                 = null,
     IGroupExtractor groupExtractor             = null,
     IApiRevisionExtractor apiRevisionExtractor = null)
 => new ExtractorExecutor(
     logger,
     apisClient,
     apiExtractor,
     apiVersionSetExtractor,
     authorizationServerExtractor,
     backendExtractor,
     loggerExtractor,
     masterTemplateExtractor,
     policyExtractor,
     productApisExtractor,
     productExtractor,
     propertyExtractor,
     apiTagExtractor,
     tagExtractor,
     groupExtractor,
     apiRevisionExtractor);
 public ExtractorExecutor(
     ILogger <ExtractorExecutor> logger,
     IApisClient apisClient,
     IApiExtractor apiExtractor,
     IApiVersionSetExtractor apiVersionSetExtractor,
     IAuthorizationServerExtractor authorizationServerExtractor,
     IBackendExtractor backendExtractor,
     ILoggerExtractor loggerExtractor,
     IMasterTemplateExtractor masterTemplateExtractor,
     IPolicyExtractor policyExtractor,
     IProductApisExtractor productApisExtractor,
     IProductExtractor productExtractor,
     IPropertyExtractor propertyExtractor,
     ITagApiExtractor apiTagExtractor,
     ITagExtractor tagExtractor,
     IGroupExtractor groupExtractor,
     IApiRevisionExtractor apiRevisionExtractor)
 {
     this.logger                       = logger;
     this.apisClient                   = apisClient;
     this.apiExtractor                 = apiExtractor;
     this.apiVersionSetExtractor       = apiVersionSetExtractor;
     this.authorizationServerExtractor = authorizationServerExtractor;
     this.backendExtractor             = backendExtractor;
     this.loggerExtractor              = loggerExtractor;
     this.masterTemplateExtractor      = masterTemplateExtractor;
     this.policyExtractor              = policyExtractor;
     this.productApisExtractor         = productApisExtractor;
     this.propertyExtractor            = propertyExtractor;
     this.productExtractor             = productExtractor;
     this.apiTagExtractor              = apiTagExtractor;
     this.tagExtractor                 = tagExtractor;
     this.groupExtractor               = groupExtractor;
     this.apiRevisionExtractor         = apiRevisionExtractor;
 }
        public NamedValuesExtractor(
            ILogger <NamedValuesExtractor> logger,
            ITemplateBuilder templateBuilder,
            INamedValuesClient namedValuesClient,
            IPolicyExtractor policyExtractor,
            IBackendExtractor backendExtractor)
        {
            this.logger          = logger;
            this.templateBuilder = templateBuilder;

            this.namedValuesClient = namedValuesClient;
            this.backendExtractor  = backendExtractor;
            this.policyExtractor   = policyExtractor;
        }
Esempio n. 4
0
        public async Task <Template> GenerateNamedValuesTemplateAsync(string singleApiName, List <TemplateResource> apiTemplateResources, ExtractorParameters extractorParameters, IBackendExtractor backendExtractor, List <TemplateResource> loggerTemplateResources)
        {
            Template armTemplate = this.templateBuilder.GenerateTemplateWithApimServiceNameProperty().Build();

            if (extractorParameters.ParameterizeNamedValue)
            {
                TemplateParameterProperties namedValueParameterProperties = new TemplateParameterProperties()
                {
                    type = "object"
                };
                armTemplate.Parameters.Add(ParameterNames.NamedValues, namedValueParameterProperties);
            }
            if (extractorParameters.ParamNamedValuesKeyVaultSecrets)
            {
                TemplateParameterProperties keyVaultNamedValueParameterProperties = new TemplateParameterProperties()
                {
                    type = "object"
                };
                armTemplate.Parameters.Add(ParameterNames.NamedValueKeyVaultSecrets, keyVaultNamedValueParameterProperties);
            }
            if (extractorParameters.NotIncludeNamedValue == true)
            {
                Console.WriteLine("------------------------------------------");
                Console.WriteLine("Skipping extracting named values from service");
                return(armTemplate);
            }

            Console.WriteLine("------------------------------------------");
            Console.WriteLine("Extracting named values from service");

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

            // pull all named values (properties) for service
            string[] properties = await this.GetPropertiesAsync(extractorParameters.SourceApimName, extractorParameters.ResourceGroup);

            // isolate api and operation policy resources in the case of a single api extraction, as they may reference named value
            var policyResources = apiTemplateResources.Where(resource => resource.Type == ResourceTypeConstants.APIPolicy || resource.Type == ResourceTypeConstants.APIOperationPolicy || resource.Type == ResourceTypeConstants.ProductPolicy);

            foreach (var extractedProperty in properties)
            {
                JToken oProperty            = JObject.Parse(extractedProperty);
                string propertyName         = ((JValue)oProperty["name"]).Value.ToString();
                string fullPropertyResource = await this.GetPropertyDetailsAsync(extractorParameters.SourceApimName, extractorParameters.ResourceGroup, propertyName);

                // convert returned named value to template resource class
                PropertyTemplateResource propertyTemplateResource = fullPropertyResource.Deserialize <PropertyTemplateResource>();
                propertyTemplateResource.Name       = $"[concat(parameters('{ParameterNames.ApimServiceName}'), '/{propertyName}')]";
                propertyTemplateResource.Type       = ResourceTypeConstants.Property;
                propertyTemplateResource.ApiVersion = GlobalConstants.ApiVersion;
                propertyTemplateResource.Scale      = null;

                if (extractorParameters.ParameterizeNamedValue)
                {
                    propertyTemplateResource.Properties.value = $"[parameters('{ParameterNames.NamedValues}').{ParameterNamingHelper.GenerateValidParameterName(propertyName, ParameterPrefix.Property)}]";
                }

                //Hide the value field if it is a keyvault named value
                if (propertyTemplateResource.Properties.keyVault != null)
                {
                    propertyTemplateResource.Properties.value = null;
                }

                if (propertyTemplateResource.Properties.keyVault != null && extractorParameters.ParamNamedValuesKeyVaultSecrets)
                {
                    propertyTemplateResource.Properties.keyVault.secretIdentifier = $"[parameters('{ParameterNames.NamedValueKeyVaultSecrets}').{ParameterNamingHelper.GenerateValidParameterName(propertyName, ParameterPrefix.Property)}]";
                }

                if (singleApiName == null)
                {
                    // if the user is executing a full extraction, extract all the loggers
                    Console.WriteLine("'{0}' Named value found", propertyName);
                    templateResources.Add(propertyTemplateResource);
                }
                else
                {
                    // if the user is executing a single api, extract all the named values used in the template resources
                    bool foundInPolicy  = this.DoesPolicyReferenceNamedValue(extractorParameters, policyResources, propertyName, propertyTemplateResource);
                    bool foundInBackEnd = await backendExtractor.IsNamedValueUsedInBackends(extractorParameters.SourceApimName, extractorParameters.ResourceGroup, singleApiName, apiTemplateResources, extractorParameters, propertyName, propertyTemplateResource.Properties.displayName);

                    bool foundInLogger = this.DoesLoggerReferenceNamedValue(loggerTemplateResources, propertyName, propertyTemplateResource);

                    // check if named value is referenced in a backend
                    if (foundInPolicy || foundInBackEnd || foundInLogger)
                    {
                        // named value was used in policy, extract it
                        Console.WriteLine("'{0}' Named value found", propertyName);
                        templateResources.Add(propertyTemplateResource);
                    }
                }
            }

            armTemplate.Resources = templateResources.ToArray();
            return(armTemplate);
        }