public void GetToken_WhenTokenIsNotInCacheAndTokenProxyReturnsNull_ThrowsException()
        {
            //Arrange
            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <string>(Arg.Is("client-id"))
            .Returns((string)null);

            AzureBearerTokenOptions options = CreateOptions();

            IAzureBearerTokenProxy proxy = CreateTokenProxy();

            proxy
            .FetchToken(Arg.Any <AzureBearerTokenOptions>())
            .Returns((AzureBearerToken)null);

            AzureBearerTokenProvider tokenProvider = CreateTokenProvider(proxy, cacheProvider, options);

            //Act
            Func <Task> test = async() => await tokenProvider.GetToken();

            //Assert
            test
            .Should()
            .ThrowExactly <Exception>()
            .Which
            .Message
            .Should()
            .Be("Failed to refersh access token for url: http://test-token-url/");
        }
Пример #2
0
        public static IServiceCollection AddProfilingInterServiceClient(this IServiceCollection builder, IConfiguration config,
                                                                        TimeSpan[] retryTimeSpans = null, int numberOfExceptionsBeforeCircuitBreaker = 100, TimeSpan circuitBreakerFailurePeriod = default, TimeSpan handlerLifetime = default)
        {
            if (retryTimeSpans == null)
            {
                retryTimeSpans = new[] { TimeSpan.FromMilliseconds(500), TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5) };
            }

            if (circuitBreakerFailurePeriod == default)
            {
                circuitBreakerFailurePeriod = TimeSpan.FromMinutes(1);
            }

            var httpBuilder = builder.AddHttpClient(HttpClientKeys.Profiling,
                                                    (httpClient) =>
            {
                ApiOptions apiOptions = new ApiOptions();

                config.Bind(ClientName, apiOptions);

                ApiClientConfigurationOptions.SetDefaultApiClientConfigurationOptions(httpClient, apiOptions);
            })
                              .ConfigurePrimaryHttpMessageHandler(() => new ApiClientHandler())
                              .AddTransientHttpErrorPolicy(c => c.WaitAndRetryAsync(retryTimeSpans))
                              .AddTransientHttpErrorPolicy(c => c.CircuitBreakerAsync(numberOfExceptionsBeforeCircuitBreaker, circuitBreakerFailurePeriod))
                              .AddUserProfilerHeaderPropagation();

            // if a life time for the handler has been set then set it on the client builder
            if (handlerLifetime != default)
            {
                httpBuilder.SetHandlerLifetime(Timeout.InfiniteTimeSpan);
            }

            builder.AddSingleton <ICancellationTokenProvider, InactiveCancellationTokenProvider>();

            builder.AddSingleton <IAzureBearerTokenProxy, AzureBearerTokenProxy>();

            builder.AddSingleton <IProfilingApiClient>((ctx) =>
            {
                IHttpClientFactory httpClientFactory = ctx.GetService <IHttpClientFactory>();
                ILogger logger = ctx.GetService <ILogger>();
                ICancellationTokenProvider cancellationTokenProvider = ctx.GetService <ICancellationTokenProvider>();

                IAzureBearerTokenProxy azureBearerTokenProxy = ctx.GetService <IAzureBearerTokenProxy>();
                ICacheProvider cacheProvider = ctx.GetService <ICacheProvider>();

                AzureBearerTokenOptions azureBearerTokenOptions = new AzureBearerTokenOptions();
                config.Bind("providerProfilingAzureBearerTokenOptions", azureBearerTokenOptions);

                AzureBearerTokenProvider bearerTokenProvider = new AzureBearerTokenProvider(azureBearerTokenProxy, cacheProvider, azureBearerTokenOptions);

                return(new ProfilingApiClient(httpClientFactory, HttpClientKeys.Profiling, logger, bearerTokenProvider, cancellationTokenProvider));
            });

            return(builder);
        }
        public async Task GetToken_WhenTokenIsNotInCacheButReturnsFromProxy_SetsInCacheReturnsToken()
        {
            //Arrange
            AzureBearerToken azureBearerToken = new AzureBearerToken
            {
                AccessToken  = "this-is-a-token",
                ExpiryLength = 3600
            };

            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <string>(Arg.Is("client-id"))
            .Returns((string)null);

            AzureBearerTokenOptions options = CreateOptions();

            IAzureBearerTokenProxy proxy = CreateTokenProxy();

            proxy
            .FetchToken(Arg.Any <AzureBearerTokenOptions>())
            .Returns(azureBearerToken);

            AzureBearerTokenProvider tokenProvider = CreateTokenProvider(proxy, cacheProvider, options);

            //Act
            string token = await tokenProvider.GetToken();

            //Assert
            token
            .Should()
            .BeEquivalentTo(azureBearerToken.AccessToken);

            await
            cacheProvider
            .Received(1)
            .SetAsync <string>(Arg.Is("client-id"), Arg.Is("this-is-a-token"), Arg.Is(TimeSpan.FromSeconds(3240)), Arg.Is(false), null);
        }
        public async Task GetToken_WhenTokenIsInCache_ReturnsTokenFromCache()
        {
            //Arrange
            string cachedToken = "this-is-a-token";

            ICacheProvider cacheProvider = CreateCacheProvider();

            cacheProvider
            .GetAsync <string>(Arg.Is("client-id"))
            .Returns(cachedToken);

            AzureBearerTokenOptions options = CreateOptions();

            AzureBearerTokenProvider tokenProvider = CreateTokenProvider(null, cacheProvider, options);

            //Act
            string token = await tokenProvider.GetToken();

            //Assert
            token
            .Should()
            .BeEquivalentTo(cachedToken);
        }
Пример #5
0
        private static IServiceProvider Register(IServiceCollection builder, IConfigurationRoot config)
        {
            builder.AddSingleton <OnCreateAllocationLineResultStatusUpdates>();
            builder.AddSingleton <OnCreateAllocationLineResultStatusUpdatesFailure>();
            builder.AddSingleton <OnCreateInstructAllocationLineResultStatusUpdates>();
            builder.AddSingleton <OnCreateInstructAllocationLineResultStatusUpdatesFailure>();
            builder.AddSingleton <OnFetchProviderProfileEvent>();
            builder.AddSingleton <OnFetchProviderProfileFailure>();
            builder.AddSingleton <OnMigrateFeedIndexIdEvent>();
            builder.AddSingleton <OnMigrateResultVersionsEvent>();
            builder.AddSingleton <OnProviderResultsPublishedEvent>();
            builder.AddSingleton <OnProviderResultsPublishedFailure>();
            builder.AddSingleton <OnProviderResultsSpecificationCleanup>();
            builder.AddSingleton <OnReIndexAllocationNotificationFeeds>();
            builder.AddSingleton <OnReIndexCalculationResults>();
            builder.AddSingleton <OnCalculationResultsCsvGeneration>();
            builder.AddSingleton <OnCalculationResultsCsvGenerationTimer>();
            builder.AddSingleton <ICalculationResultsRepository, CalculationResultsRepository>();
            builder.AddSingleton <IResultsService, ResultsService>();
            builder.AddSingleton <IPublishedResultsService, PublishedResultsService>();
            builder.AddSingleton <IResultsSearchService, ResultsSearchService>();
            builder.AddSingleton <ICalculationProviderResultsSearchService, CalculationProviderResultsSearchService>();
            builder.AddSingleton <IProviderImportMappingService, ProviderImportMappingService>();
            builder.AddSingleton <IAllocationNotificationsFeedsSearchService, AllocationNotificationsFeedsSearchService>();
            builder.AddSingleton <ICalculationsRepository, CalculationsRepository>();
            builder.AddSingleton <IValidator <MasterProviderModel>, MasterProviderModelValidator>();
            builder.AddSingleton <IProviderVariationAssemblerService, ProviderVariationAssemblerService>();
            builder.AddSingleton <IProviderVariationsService, ProviderVariationsService>();
            builder.AddSingleton <IProviderService, ProviderService>();
            builder.AddSingleton <IJobHelperService, JobHelperService>();
            builder.AddSingleton <IProviderCalculationResultsReIndexerService, ProviderCalculationResultsReIndexerService>();

            builder.AddSingleton <IProviderVariationsStorageRepository, ProviderVariationsStorageRepository>((ctx) =>
            {
                BlobStorageOptions blobStorageOptions = new BlobStorageOptions();

                config.Bind("CommonStorageSettings", blobStorageOptions);

                blobStorageOptions.ContainerName = "providervariations";

                return(new ProviderVariationsStorageRepository(blobStorageOptions));
            });

            MapperConfiguration resultsConfig = new MapperConfiguration(c =>
            {
                c.AddProfile <DatasetsMappingProfile>();
                c.AddProfile <ResultServiceMappingProfile>();
                c.AddProfile <ProviderMappingProfile>();
            });

            builder
            .AddSingleton(resultsConfig.CreateMapper());

            builder.AddCaching(config);

            builder.AddSingleton <ICalculationResultsRepository, CalculationResultsRepository>((ctx) =>
            {
                CosmosDbSettings calssDbSettings = new CosmosDbSettings();

                config.Bind("CosmosDbSettings", calssDbSettings);

                calssDbSettings.CollectionName = "calculationresults";

                CosmosRepository calcsCosmosRepostory = new CosmosRepository(calssDbSettings);

                return(new CalculationResultsRepository(calcsCosmosRepostory));
            });

            builder.AddSingleton <IProviderSourceDatasetRepository, ProviderSourceDatasetRepository>((ctx) =>
            {
                CosmosDbSettings provDbSettings = new CosmosDbSettings();

                config.Bind("CosmosDbSettings", provDbSettings);

                provDbSettings.CollectionName = "providerdatasets";

                CosmosRepository calcsCosmosRepostory = new CosmosRepository(provDbSettings);

                return(new ProviderSourceDatasetRepository(calcsCosmosRepostory));
            });

            builder.AddSingleton <IPublishedProviderResultsRepository, PublishedProviderResultsRepository>((ctx) =>
            {
                CosmosDbSettings resultsDbSettings = new CosmosDbSettings();

                config.Bind("CosmosDbSettings", resultsDbSettings);

                resultsDbSettings.CollectionName = "publishedproviderresults";

                CosmosRepository resultsRepostory = new CosmosRepository(resultsDbSettings);

                return(new PublishedProviderResultsRepository(resultsRepostory));
            });

            builder.AddSingleton <IProviderChangesRepository, ProviderChangesRepository>((ctx) =>
            {
                CosmosDbSettings cosmosSettings = new CosmosDbSettings();

                config.Bind("CosmosDbSettings", cosmosSettings);

                cosmosSettings.CollectionName = "publishedproviderchanges";

                CosmosRepository resultsRepostory = new CosmosRepository(cosmosSettings);

                ILogger logger = ctx.GetService <ILogger>();

                return(new ProviderChangesRepository(resultsRepostory, logger));
            });

            builder
            .AddSingleton <ISpecificationsRepository, SpecificationsRepository>();

            builder
            .AddSingleton <IPublishedProviderResultsAssemblerService, PublishedProviderResultsAssemblerService>();

            builder.AddSingleton <IPublishedProviderResultsSettings, PublishedProviderResultsSettings>((ctx) =>
            {
                PublishedProviderResultsSettings settings = new PublishedProviderResultsSettings();

                config.Bind("PublishedProviderResultsSettings", settings);

                return(settings);
            });

            builder.AddSingleton <IVersionRepository <PublishedAllocationLineResultVersion>, VersionRepository <PublishedAllocationLineResultVersion> >((ctx) =>
            {
                CosmosDbSettings versioningDbSettings = new CosmosDbSettings();

                config.Bind("CosmosDbSettings", versioningDbSettings);

                versioningDbSettings.CollectionName = "publishedproviderresults";

                CosmosRepository resultsRepostory = new CosmosRepository(versioningDbSettings);

                return(new VersionRepository <PublishedAllocationLineResultVersion>(resultsRepostory));
            });

            builder
            .AddSingleton <IBlobClient, AzureStorage.BlobClient>((ctx) =>
            {
                AzureStorageSettings storageSettings = new AzureStorageSettings();

                config.Bind("AzureStorageSettings", storageSettings);

                storageSettings.ContainerName = "calculationresultscsv";

                return(new AzureStorage.BlobClient(storageSettings));
            });


            builder.AddSearch(config);

            builder.AddServiceBus(config);

            builder.AddCaching(config);

            builder.AddApplicationInsights(config, "CalculateFunding.Functions.Results");
            builder.AddApplicationInsightsTelemetryClient(config, "CalculateFunding.Functions.Results");
            builder.AddLogging("CalculateFunding.Functions.Results");
            builder.AddTelemetry();

            builder.AddCalcsInterServiceClient(config);
            builder.AddSpecificationsInterServiceClient(config);
            builder.AddJobsInterServiceClient(config);
            builder.AddResultsInterServiceClient(config);

            builder.AddFeatureToggling(config);

            builder.AddSingleton <IPublishedAllocationLineLogicalResultVersionService, PublishedAllocationLineLogicalResultVersionService>();

            builder.AddSingleton <ICancellationTokenProvider, InactiveCancellationTokenProvider>();

            builder.AddSingleton <IAzureBearerTokenProxy, AzureBearerTokenProxy>();

            builder.AddHttpClient(HttpClientKeys.Profiling,
                                  c =>
            {
                ApiClientConfigurationOptions opts = new ApiClientConfigurationOptions();
                config.Bind("providerProfilingClient", opts);

                SetDefaultApiClientConfigurationOptions(c, opts, builder);
            })
            .ConfigurePrimaryHttpMessageHandler(() => new ApiClientHandler())
            .AddTransientHttpErrorPolicy(c => c.WaitAndRetryAsync(retryTimeSpans))
            .AddTransientHttpErrorPolicy(c => c.CircuitBreakerAsync(numberOfExceptionsBeforeCircuitBreaker, circuitBreakerFailurePeriod));

            builder.AddSingleton <IProfilingApiClient>((ctx) =>
            {
                IFeatureToggle featureToggle = ctx.GetService <IFeatureToggle>();

                bool enableMockProvider = featureToggle.IsProviderProfilingServiceDisabled();

                if (enableMockProvider)
                {
                    return(new MockProviderProfilingRepository());
                }
                else
                {
                    IHttpClientFactory httpClientFactory = ctx.GetService <IHttpClientFactory>();
                    ILogger logger = ctx.GetService <ILogger>();
                    ICancellationTokenProvider cancellationTokenProvider = ctx.GetService <ICancellationTokenProvider>();

                    IAzureBearerTokenProxy azureBearerTokenProxy = ctx.GetService <IAzureBearerTokenProxy>();
                    ICacheProvider cacheProvider = ctx.GetService <ICacheProvider>();

                    AzureBearerTokenOptions azureBearerTokenOptions = new AzureBearerTokenOptions();
                    config.Bind("providerProfilingAzureBearerTokenOptions", azureBearerTokenOptions);

                    AzureBearerTokenProvider bearerTokenProvider = new AzureBearerTokenProvider(azureBearerTokenProxy, cacheProvider, azureBearerTokenOptions);

                    return(new ProfilingApiClient(httpClientFactory, HttpClientKeys.Profiling, logger, bearerTokenProvider, cancellationTokenProvider));
                }
            });

            PolicySettings     policySettings            = builder.GetPolicySettings(config);
            ResiliencePolicies resultsResiliencePolicies = CreateResiliencePolicies(policySettings);

            builder.AddSingleton <IResultsResiliencePolicies>(resultsResiliencePolicies);
            builder.AddSingleton <IJobHelperResiliencePolicies>(resultsResiliencePolicies);

            return(builder.BuildServiceProvider());
        }