/// <inheritdoc/>
        public Task SetPolicyAsync(ScalingGroupId groupId, PolicyId policyId, PolicyConfiguration configuration, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }
            if (policyId == null)
            {
                throw new ArgumentNullException("policyId");
            }
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            UriTemplate template   = new UriTemplate("/groups/{groupId}/policies/{policyId}");
            var         parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }, { "policyId", policyId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.PUT, template, parameters, configuration);

            Func <Task <HttpWebRequest>, Task <string> > requestResource =
                GetResponseAsyncFunc(cancellationToken);

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource));
        }
예제 #2
0
        public PrimeController(
            IMapper mapper,
            IMediator mediator,
            ILinksService linksService,
            ILoggingManager loggingManager,
            PolicyConfiguration policyConfiguration)
        {
            _mapper              = mapper;
            _mediator            = mediator;
            _linksService        = linksService;
            _loggingManager      = loggingManager;
            _policyConfiguration = policyConfiguration;

            _circuitBreakerPolicy = Policy
                                    .Handle <TaskCanceledException>()
                                    .CircuitBreakerAsync(policyConfiguration.CircuitBreakerAllowedExceptions, TimeSpan.FromMinutes(_policyConfiguration.CircuitBreakerShutdownDurationInMinutes),
                                                         (ex, t) =>
            {
                _loggingManager.LogFatal("Circuit broken!");
            },
                                                         () =>
            {
                _loggingManager.LogInformation("Circuit Reset!");
            });
        }
        public static PolicyConfiguration FromPolicyStorage(PolicyStorage policyStorage)
        {
            PolicyConfiguration policyConfiguration = new PolicyConfiguration(policyStorage.OrganizationalUnitRoot.ObjectGuid, policyStorage.Id.ObjectGuid);

            UnifiedPolicyStorageFactory.CopyPropertiesFromStorage <PolicyConfiguration>(policyConfiguration, new TenantSettingFacade <PolicyStorage>(policyStorage));
            return(policyConfiguration);
        }
예제 #4
0
        public async Task <PolicyConfiguration> AddBuildPolicy(string projectName, string repositoryName, string pipelineName)
        {
            PolicyConfiguration config = new PolicyConfiguration
            {
                IsBlocking = true,
                IsEnabled  = true
            };

            List <PolicyType> types = await Policy.GetPolicyTypesAsync(projectName);

            config.Type = types.First(pt => pt.DisplayName == "Build");

            GitRepository repo = await Git.GetRepositoryAsync(projectName, repositoryName);

            BuildPolicySettings settings = new BuildPolicySettings("build policy");

            BuildDefinition definition = await GetPipeline(projectName, pipelineName);

            settings.BuildDefinitionId = definition.Id;

            settings.FilenamePatterns.Add("/*");
            settings.FilenamePatterns.Add("!**/*.md");
            settings.Scope.Add(new BuildPolicySettings.ScopeEntry()
            {
                RefName      = "refs/heads/master",
                MatchKind    = "Exact",
                RepositoryID = repo.Id.ToString()
            });
            config.Settings = (JObject)JToken.FromObject(settings);

            return(await Policy.CreatePolicyConfigurationAsync(config, projectName));
        }
예제 #5
0
        public async Task <PolicyConfiguration> AddRequiredReviewersPolicy(string projectName, string repositoryName, List <Guid> reviewers)
        {
            PolicyConfiguration config = new PolicyConfiguration
            {
                IsBlocking = true,
                IsEnabled  = true
            };

            List <PolicyType> types = await Policy.GetPolicyTypesAsync(projectName);

            config.Type = types.First(pt => pt.DisplayName == "Required reviewers");

            GitRepository repo = await Git.GetRepositoryAsync(projectName, repositoryName);

            RequiredReviewersPolicySettings settings = new RequiredReviewersPolicySettings();

            settings.RequiredReviewerIds.AddRange(reviewers);

            settings.Scope.Add(new RequiredReviewersPolicySettings.ScopeEntry()
            {
                RefName      = "refs/heads/master",
                MatchKind    = "Exact",
                RepositoryID = repo.Id.ToString()
            });
            config.Settings = (JObject)JToken.FromObject(settings);

            return(await Policy.CreatePolicyConfigurationAsync(config, projectName));
        }
        public void Invoke(int projectId, Policy policy, PolicyConfiguration policyConfiguration)
        {
            var project = projectRepository.GetById(projectId);

            if (project == null)
            {
                throw new ArgumentNullException($"Cannot find project with id: {projectId}.");
            }

            var projectPolicy = project.ProjectPolicies.FirstOrDefault(m => m.Policy == policy);

            if (projectPolicy != null)
            {
                project.ProjectPolicies.Remove(projectPolicy);
                project.ProjectPolicies.Add(new ProjectPolicies
                {
                    Policy = policy,
                    SerializedProjectPolicySetting = jsonConvertService.Serialize(policyConfiguration)
                });
            }
            else
            {
                project.ProjectPolicies.Add(new ProjectPolicies
                {
                    Policy = policy,
                    SerializedProjectPolicySetting = jsonConvertService.Serialize(policyConfiguration)
                });
            }
            projectRepository.Edit(project);
            eventBus.Publish(new PolicySaved(projectId, policy));
        }
 /// <summary>
 /// Updates a policy in Azure DevOps.
 /// </summary>
 /// <param name="policyClient">Policy client</param>
 /// <param name="types">Types</param>
 /// <param name="projectId">Team project id</param>
 /// <param name="repository">Git repository</param>
 /// <param name="currentPolicy">Branch policy</param>
 /// <param name="policy">Policy</param>
 /// <param name="serverPolicy">Azure DevOps policy</param>
 /// <returns>Task</returns>
 protected abstract Task UpdatePolicy(
     PolicyHttpClient policyClient,
     IEnumerable <PolicyType> types,
     Guid projectId,
     GitRepository repository,
     BranchPolicies currentPolicy,
     Policy policy,
     PolicyConfiguration serverPolicy);
예제 #8
0
        public void RequestRefresh(string policyId)
        {
            PolicyConfiguration policyConfiguration = null;

            if (_policyConfigurations.TryGetValue(policyId, out policyConfiguration))
            {
                RequestRefresh(policyConfiguration);
            }
        }
        /// <summary>
        /// Returns the repository id from the settings.
        /// </summary>
        /// <param name="configuration">Policy configuration</param>
        /// <param name="policy">Policy</param>
        /// <returns>bool</returns>
        public static bool DoesSubTypeMatch(this PolicyConfiguration configuration, Policy policy)
        {
            if (!policy.HasSubType)
            {
                return(true);
            }

            return(configuration.Settings.Value <string>(policy.SubTypePropertyName) == policy.SubTypePropertyValue);
        }
        public static PolicyStorage ToPolicyStorage(PolicyConfiguration policy)
        {
            PolicyStorage policyStorage = new PolicyStorage();

            policyStorage[ADObjectSchema.OrganizationalUnitRoot] = new ADObjectId(policy.TenantId);
            policyStorage.Name = policy.Name;
            policyStorage.SetId((ADObjectId)DalHelper.ConvertFromStoreObject(policy.ObjectId, typeof(ADObjectId)));
            UnifiedPolicyStorageFactory.CopyPropertiesToStorage <PolicyConfiguration>(new TenantSettingFacade <PolicyStorage>(policyStorage), policy);
            return(policyStorage);
        }
        /// <summary>
        /// Returns the repository id from the settings.
        /// </summary>
        /// <param name="configuration">Policy configuration</param>
        /// <returns>repository id</returns>
        public static MatchKind?GetMatchKind(this PolicyConfiguration configuration)
        {
            var value = GetValueFromScopeElement(configuration, "matchKind");

            if (string.IsNullOrEmpty(value))
            {
                return(null);
            }

            return(Enum.Parse <MatchKind>(value, true));
        }
예제 #12
0
        public async Task <OpenIdConnectConfiguration> GetConfigurationByPolicyAsync(CancellationToken cancel, string policyId)
        {
            PolicyConfiguration policyConfiguration = null;

            if (!_policyConfigurations.TryGetValue(policyId, out policyConfiguration))
            {
                return(null);
            }

            return(await GetConfigurationByPolicyAsync(policyConfiguration, cancel));
        }
        #pragma warning restore 1998

        /// <summary>
        /// Logs the change.
        /// </summary>
        /// <param name="policyClient">Policy client</param>
        /// <param name="types">Types</param>
        /// <param name="projectId">Team project id</param>
        /// <param name="repository">Git repository</param>
        /// <param name="currentPolicy">Branch policy</param>
        /// <param name="policy">Policy</param>
        /// <param name="serverPolicy">Server policy</param>
        /// <returns>Task</returns>
        #pragma warning disable 1998
        protected override async Task UpdatePolicy(
            PolicyHttpClient policyClient,
            IEnumerable <PolicyType> types,
            Guid projectId,
            GitRepository repository,
            BranchPolicies currentPolicy,
            Policy policy,
            PolicyConfiguration serverPolicy)
        {
            this.Logger.Info($"Policy found, would be updated in Azure DevOps. (Repository: {repository.Name}, Branch: {currentPolicy.Branch}, Type: {policy.TypeString})");
            this.Logger.Debug($"Settings is: {policy.PrepareSettingsWithScopeAndSubType(repository.Id, policy)}");
        }
예제 #14
0
        private void RequestRefresh(PolicyConfiguration policyConfiguration)
        {
            if (policyConfiguration == null)
            {
                throw new ArgumentNullException(nameof(policyConfiguration));
            }

            DateTimeOffset now = DateTimeOffset.UtcNow;

            if (now >= policyConfiguration.LastRefresh.UtcDateTime.Add(RefreshInterval))
            {
                policyConfiguration.SyncAfter = now;
            }
        }
예제 #15
0
        private static void BuildPolicy(IExceptionPolicyBuilder builder, PolicyConfiguration config, IDictionary <string, IExceptionFilter> filters)
        {
            foreach (var it in config.PreHandlers)
            {
                var handlerConfig    = GetHandlerConfiguration(it.HandlerType);
                var filterableConfig = it as FilterableHandlerConfiguration;
                if (null == filterableConfig)
                {
                    builder.Pre(handlerBuilder => handlerConfig.Use(handlerBuilder, _ => true, it.Arguments.ToDictionary(item => item.Name, item => item.Value)));
                }
                else
                {
                    builder.Pre(handlerBuilder => handlerConfig.Use(handlerBuilder, context => filters[filterableConfig.Filter].Match(context), it.Arguments.ToDictionary(item => item.Name, item => item.Value)));
                }
            }

            foreach (var it in config.PostHandlers)
            {
                var handlerConfig    = GetHandlerConfiguration(it.HandlerType);
                var filterableConfig = it as FilterableHandlerConfiguration;
                if (null == filterableConfig)
                {
                    builder.Post(handlerBuilder => handlerConfig.Use(handlerBuilder, _ => true, it.Arguments.ToDictionary(item => item.Name, item => item.Value)));
                }
                else
                {
                    builder.Post(handlerBuilder => handlerConfig.Use(handlerBuilder, context => filters[filterableConfig.Filter].Match(context), it.Arguments.ToDictionary(item => item.Name, item => item.Value)));
                }
            }

            foreach (var entry in config.PolicyEntries)
            {
                builder.For(entry.ExceptionType, entry.PostHandlingAction, handlerBuilder => {
                    foreach (var it in entry.Handlers)
                    {
                        var handlerConfig    = GetHandlerConfiguration(it.HandlerType);
                        var filterableConfig = it as FilterableHandlerConfiguration;
                        if (null == filterableConfig)
                        {
                            handlerConfig.Use(handlerBuilder, _ => true, it.Arguments.ToDictionary(item => item.Name, item => item.Value));
                        }
                        else
                        {
                            handlerConfig.Use(handlerBuilder, context => filters[filterableConfig.Filter].Match(context), it.Arguments.ToDictionary(item => item.Name, item => item.Value));
                        }
                    }
                });
            }
        }
        /// <summary>
        /// Updates a policy in Azure DevOps.
        /// </summary>
        /// <param name="policyClient">Policy client</param>
        /// <param name="types">Types</param>
        /// <param name="projectId">Team project id</param>
        /// <param name="repository">Git repository</param>
        /// <param name="currentPolicy">Branch policy</param>
        /// <param name="policy">Policy</param>
        /// <param name="serverPolicy">Azure DevOps policy</param>
        /// <returns>Task</returns>
        protected override async Task UpdatePolicy(
            PolicyHttpClient policyClient,
            IEnumerable <PolicyType> types,
            Guid projectId,
            GitRepository repository,
            BranchPolicies currentPolicy,
            Policy policy,
            PolicyConfiguration serverPolicy)
        {
            var policyConfiguration = this.GetPolicyConfiguration(types, repository, policy);
            var update = await policyClient.UpdatePolicyConfigurationAsync(policyConfiguration, projectId, serverPolicy.Id).ConfigureAwait(false);

            this.Logger.Debug(this.Serializer.Serialize(update));
            this.Logger.Info($"Policy updated. (Repository: {repository.Name}, Branch: {currentPolicy.Branch}, Type: {policy.TypeString})");
        }
        /// <inheritdoc/>
        public Task <Policy> CreatePolicyAsync(ScalingGroupId groupId, PolicyConfiguration configuration, CancellationToken cancellationToken)
        {
            if (groupId == null)
            {
                throw new ArgumentNullException("groupId");
            }
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            UriTemplate template   = new UriTemplate("/groups/{groupId}/policies");
            var         parameters = new Dictionary <string, string> {
                { "groupId", groupId.Value }
            };

            Func <Task <Tuple <IdentityToken, Uri> >, Task <HttpWebRequest> > prepareRequest =
                PrepareRequestAsyncFunc(HttpMethod.POST, template, parameters, new[] { configuration });

            Func <Task <HttpWebRequest>, Task <JObject> > requestResource =
                GetResponseAsyncFunc <JObject>(cancellationToken);

            Func <Task <JObject>, Policy> resultSelector =
                task =>
            {
                JObject result = task.Result;
                if (result == null)
                {
                    return(null);
                }

                JToken valueToken = result["policies"];
                if (valueToken == null)
                {
                    return(null);
                }

                Policy[] policies = valueToken.ToObject <Policy[]>();
                return(policies[0]);
            };

            return(AuthenticateServiceAsync(cancellationToken)
                   .Then(prepareRequest)
                   .Then(requestResource)
                   .Select(resultSelector));
        }
        public void GivenPolicyConfigurationExistsForClaimGroupWithBehaviourAs(string ReconciliationAllocationGroupName, string claimTypeName, Table tblClaimGroupSettings)
        {
            TableRow row = tblClaimGroupSettings.Rows[0];

            _policyConfiguration = new PolicyConfiguration()
            {
                ClaimGroupSettings = new List <ReconciliationAllocationGroupClaimTypeBehaviour>()
                {
                    new ReconciliationAllocationGroupClaimTypeBehaviour()
                    {
                        ReconciliationAllocationGroupName = ReconciliationAllocationGroupName,
                        ClaimTypeName            = claimTypeName,
                        OverDeliveryDeminimis    = Convert.ToDecimal(row["OverDeliveryDeminimis"]),
                        UnderDeliveryDeminimis   = Convert.ToDecimal(row["UnderDeliveryDeminimis"]),
                        ReconcileIfOverDelivery  = GetBooleanValue(row["ReconcileOverDelivery"]),
                        ReconcileIfUnderDelivery = GetBooleanValue(row["ReconcileUnderDelivery"])
                    }
                }
            };
        }
        public void GivenDeliverableGroupExistsAsFollows(string deliverableGroupName, Table tblDeliverableGroupSettings)
        {
            TableRow row =
                tblDeliverableGroupSettings.Rows[0];

            if (_policyConfiguration == null)
            {
                _policyConfiguration = new PolicyConfiguration();
            }


            if (_policyConfiguration.DeliverableGroupSettings == null)
            {
                _policyConfiguration.DeliverableGroupSettings = new List <DeliverableGroupBehaviour>();
            }

            DeliverableGroupBehaviour groupBehaviour = new DeliverableGroupBehaviour
            {
                DeliverableGroupName          = deliverableGroupName,
                IsClaimToProfileCappingNeeded = GetBooleanValue(row["IsClaimToProfileCappingNeeded"])
            };

            _policyConfiguration.DeliverableGroupSettings.Add(groupBehaviour);
        }
 public PolicyConfigurationProvider()
 {
     this.policyConfig = ConfigurationManager.GetSection("throttlePolicy") as PolicyConfiguration;
 }
 /// <summary>
 /// Returns the repository id from the settings.
 /// </summary>
 /// <param name="configuration">Policy configuration</param>
 /// <returns>repository id</returns>
 public static string GetBranch(this PolicyConfiguration configuration)
 {
     return(GetValueFromScopeElement(configuration, "refName")?.Replace("refs/heads/", string.Empty));
 }
 /// <summary>
 /// Deletes a policy in Azure DevOps.
 /// </summary>
 /// <param name="policyClient">Policy client</param>
 /// <param name="projectId">Team project id</param>
 /// <param name="policy">Policy</param>
 protected abstract void DeletePolicy(PolicyHttpClient policyClient, Guid projectId, PolicyConfiguration policy);
예제 #23
0
        /// <summary>
        /// Replace the configuration for a scaling policy.
        /// </summary>
        /// <remarks>
        /// This method can be used to replace the behavior associated with webhooks which
        /// have already in use by applications.
        /// </remarks>
        /// <param name="service">The Auto Scale service instance.</param>
        /// <param name="groupId">The ID of the scaling group. This is obtained from <see cref="ScalingGroup.Id">ScalingGroup.Id</see>.</param>
        /// <param name="policyId">The ID of the scaling policy. This is obtained from <see cref="Policy.Id">Policy.Id</see>.</param>
        /// <param name="configuration">A <see cref="PolicyConfiguration"/> object describing the new scaling policy configuration.</param>
        /// <exception cref="ArgumentNullException">If <paramref name="service"/> is <see langword="null"/>.</exception>
        /// <exception cref="ArgumentNullException">
        /// If <paramref name="groupId"/> is <see langword="null"/>.
        /// <para>-or-</para>
        /// <para>If <paramref name="policyId"/> is <see langword="null"/>.</para>
        /// <para>-or-</para>
        /// <para>If <paramref name="configuration"/> is <see langword="null"/>.</para>
        /// </exception>
        /// <exception cref="WebException">If the REST request does not return successfully.</exception>
        /// <seealso href="http://docs.rackspace.com/cas/api/v1.0/autoscale-devguide/content/PUT_putPolicy_v1.0__tenantId__groups__groupId__policies__policyId__autoscale-policies.html">Replace policy (Rackspace Auto Scale Developer Guide - API v1.0)</seealso>
        public static void SetPolicy(this IAutoScaleService service, ScalingGroupId groupId, PolicyId policyId, PolicyConfiguration configuration)
        {
            if (service == null)
            {
                throw new ArgumentNullException("service");
            }

            try
            {
                service.SetPolicyAsync(groupId, policyId, configuration, CancellationToken.None).Wait();
            }
            catch (AggregateException ex)
            {
                ReadOnlyCollection <Exception> innerExceptions = ex.Flatten().InnerExceptions;
                if (innerExceptions.Count == 1)
                {
                    throw innerExceptions[0];
                }

                throw;
            }
        }
예제 #24
0
        private async Task <OpenIdConnectConfiguration> GetConfigurationByPolicyAsync(PolicyConfiguration policyConfiguration, CancellationToken cancel)
        {
            DateTimeOffset now = DateTimeOffset.UtcNow;

            DateTimeOffset             sync   = policyConfiguration.SyncAfter;
            OpenIdConnectConfiguration config = policyConfiguration.Configuration;

            if (config != null && sync > now)
            {
                return(config);
            }

            await _refreshLock.WaitAsync(cancel);

            try
            {
                Exception retrieveEx = null;
                if (sync <= now)
                {
                    try
                    {
                        config = await OpenIdConnectConfigurationRetriever.GetAsync(policyConfiguration.MetadataAddress, cancel);

                        policyConfiguration.Configuration = config;
                        Contract.Assert(policyConfiguration.Configuration != null);
                        policyConfiguration.LastRefresh = now;
                        policyConfiguration.SyncAfter   = now.UtcDateTime.Add(_automaticRefreshInterval);
                    }
                    catch (Exception ex)
                    {
                        retrieveEx = ex;
                        policyConfiguration.SyncAfter = now.UtcDateTime.Add(_automaticRefreshInterval < _refreshInterval ? _automaticRefreshInterval : _refreshInterval);
                    }
                }

                if (config == null)
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, ErrorMessages.IDX10803, policyConfiguration.MetadataAddress ?? "null"), retrieveEx);
                }

                return(config);
            }
            finally
            {
                _refreshLock.Release();
            }
        }
예제 #25
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddPolicy(name: AllowAllPolicy,
                                  builder =>
                {
                    builder.AllowAnyOrigin();
                    builder.AllowAnyMethod();
                    builder.AllowAnyHeader();
                });
            });

            services.AddResponseCaching();

            services.AddControllers();

            services.AddMediatR(typeof(Startup));

            services.AddScoped <ICalculationRepository, CalculationRepository>();
            services.AddScoped <IPrimeLinkRepository, PrimeLinkRepository>();
            services.AddScoped <ILoggingManager, LoggingManager>();

            services.AddSingleton <IBackgroundTaskQueue, BackgroundTaskQueue>();
            services.AddHostedService <QueuedHostedService>();

            var connectionStrings = new ConnectionStrings();

            Configuration.Bind("ConnectionStrings", connectionStrings);

            var policyConfigurations = new PolicyConfiguration();

            Configuration.Bind("PolicyConfiguration", policyConfigurations);

            services.AddSingleton(connectionStrings);
            services.AddSingleton(policyConfigurations);


            var connectionString = string.Format(Configuration["ConnectionStrings:DatabaseConnection"]);

            services.AddEntityFrameworkNpgsql()
            .AddDbContext <PrimeDbContext>(options => options
                                           .UseNpgsql(connectionString, options =>
            {
                options.MigrationsAssembly(typeof(PrimeDbContext).Assembly.FullName);
            }));

            services.AddAutoMapper(configuration =>
            {
                configuration.AddProfile(new CalculationProfile());
                configuration.AddProfile(new PrimeLinkProfile());
            });

            services.AddHealthChecks()
            .AddCheck <ScienceHealthCheck>("Science service host connection")
            .AddCheck <DatabaseHealthChecks>("Database service host connection");

            services.AddLinks(configure =>
            {
                configure.AddPolicy <LinkDto>("GetCalculationStatePolicy", policy =>
                {
                    policy
                    .RequireSelfLink()
                    .RequireRoutedLink("location", nameof(PrimeController.GetCalculationState), x => new { number = x.Id });
                });
                configure.AddPolicy <LinkDto>("GetPrimeLinkStatePolicy", policy =>
                {
                    policy
                    .RequireSelfLink()
                    .RequireRoutedLink("location", nameof(PrimeController.GetPrimeLink), x => new { number = x.Id });
                });
            });

            services.AddOpenApiDocument(settings =>
            {
                settings.Title        = "Prime API";
                settings.DocumentName = "v1";
                settings.Version      = "v1";
            });
        }
예제 #26
0
        /// <summary>
        /// Configure Json HttpClient.
        /// </summary>
        /// <param name="services"></param>
        /// <param name="serviceConfiguration"></param>
        /// <param name="policyConfiguration"></param>
        /// <typeparam name="TClient"></typeparam>
        /// <typeparam name="TImplementation"></typeparam>
        /// <returns>Configured IHttpClientBuilder</returns>
        public static IHttpClientBuilder ConfigureJsonHttpClient <TClient, TImplementation>(this IServiceCollection services, HttpServiceConfiguration serviceConfiguration, PolicyConfiguration policyConfiguration = default)
            where TClient : class
            where TImplementation : class, TClient
        {
            if (serviceConfiguration is null)
            {
                throw new ArgumentNullException(nameof(serviceConfiguration));
            }

            if (policyConfiguration is null)
            {
                throw new ArgumentNullException(nameof(policyConfiguration));
            }

            return(services.AddHttpClient <TClient, TImplementation>(client => ConfigureBaseJsonHttpClient(client, serviceConfiguration))
                   .SetupHandlersAndPolicies(policyConfiguration));
        }
예제 #27
0
        private static IHttpClientBuilder SetupHandlersAndPolicies(this IHttpClientBuilder clientBuilder, PolicyConfiguration policyConfiguration)
        {
            clientBuilder
            //.ConfigurePrimaryHttpMessageHandler(x => new HttpClientHandler(x.GetRequiredService<ISOAPMessageLogger>()))
            .SetHandlerLifetime(policyConfiguration.HttpClientRenewalInterval)
            .AddPolicyHandler(
                RetryPolicyHandler.WaitAndRetry(policyConfiguration.HttpRetry)
                )
            .AddPolicyHandler(
                CircuitBreakerPolicyHandler.Break(policyConfiguration.HttpCircuitBreaker)
                );

            return(clientBuilder);
        }
 /// <summary>
 /// Returns the branch from the settings.
 /// </summary>
 /// <param name="configuration">Policy configuration</param>
 /// <returns>branch</returns>
 public static string GetRepositoryId(this PolicyConfiguration configuration)
 {
     return(GetValueFromScopeElement(configuration, "repositoryId"));
 }
        /// <summary>
        /// Deletes a policy in Azure DevOps.
        /// </summary>
        /// <param name="policyClient">Policy client</param>
        /// <param name="projectId">Team project id</param>
        /// <param name="policy">Policy</param>
        protected override async void DeletePolicy(PolicyHttpClient policyClient, Guid projectId, PolicyConfiguration policy)
        {
            await policyClient.DeletePolicyConfigurationAsync(projectId, policy.Id).ConfigureAwait(false);

            this.Logger.Info($"Policy removed. (Repository: {policy.GetRepositoryId()}, Branch: {policy.GetBranch()}, Type: {policy.Type.DisplayName})");
        }
 private static string GetValueFromScopeElement(PolicyConfiguration configuration, string property)
 {
     return(configuration.Settings["scope"].First.Value <string>(property));
 }