From b64b06e06954d9ad5cc589ffb8fec5b9e7b5fb0e Mon Sep 17 00:00:00 2001 From: Tom Gardham-Pallister Date: Thu, 9 Nov 2017 09:02:41 +0000 Subject: [PATCH] getting acceptance tests working again --- .../Creator/FileOcelotConfigurationCreator.cs | 2 + src/Ocelot/Configuration/File/FileReRoute.cs | 1 + .../LoadBalancers/LoadBalancerHouse.cs | 22 +++++---- .../ServiceDiscoveryTests.cs | 5 +- test/Ocelot.AcceptanceTests/Startup.cs | 47 +++++++++++++++++++ test/Ocelot.AcceptanceTests/Steps.cs | 38 --------------- 6 files changed, 67 insertions(+), 48 deletions(-) create mode 100644 test/Ocelot.AcceptanceTests/Startup.cs diff --git a/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs b/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs index 5a5bb607..cd6e54ff 100644 --- a/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs +++ b/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs @@ -168,6 +168,8 @@ namespace Ocelot.Configuration.Creator .WithEnableRateLimiting(fileReRouteOptions.EnableRateLimiting) .WithRateLimitOptions(rateLimitOption) .WithHttpHandlerOptions(httpHandlerOptions) + .WithServiceName(fileReRoute.ServiceName) + .WithUseServiceDiscovery(fileReRoute.UseServiceDiscovery) .Build(); SetupQosProvider(reRoute); diff --git a/src/Ocelot/Configuration/File/FileReRoute.cs b/src/Ocelot/Configuration/File/FileReRoute.cs index 9abb5a7d..d33ba8e4 100644 --- a/src/Ocelot/Configuration/File/FileReRoute.cs +++ b/src/Ocelot/Configuration/File/FileReRoute.cs @@ -37,5 +37,6 @@ namespace Ocelot.Configuration.File public FileRateLimitRule RateLimitOptions { get; set; } public FileAuthenticationOptions AuthenticationOptions { get; set; } public FileHttpHandlerOptions HttpHandlerOptions { get; set; } + public bool UseServiceDiscovery {get;set;} } } \ No newline at end of file diff --git a/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerHouse.cs b/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerHouse.cs index 01d530af..d4a54bd7 100644 --- a/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerHouse.cs +++ b/src/Ocelot/LoadBalancer/LoadBalancers/LoadBalancerHouse.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading.Tasks; using Ocelot.Configuration; @@ -9,12 +10,12 @@ namespace Ocelot.LoadBalancer.LoadBalancers public class LoadBalancerHouse : ILoadBalancerHouse { private readonly ILoadBalancerFactory _factory; - private readonly Dictionary _loadBalancers; + private readonly ConcurrentDictionary _loadBalancers; public LoadBalancerHouse(ILoadBalancerFactory factory) { _factory = factory; - _loadBalancers = new Dictionary(); + _loadBalancers = new ConcurrentDictionary(); } public async Task> Get(ReRoute reRoute, ServiceProviderConfiguration config) @@ -54,13 +55,18 @@ namespace Ocelot.LoadBalancer.LoadBalancers private void AddLoadBalancer(string key, ILoadBalancer loadBalancer) { - if (!_loadBalancers.ContainsKey(key)) - { - _loadBalancers.Add(key, loadBalancer); - } + _loadBalancers.AddOrUpdate(key, loadBalancer, (x, y) => { + return loadBalancer; + }); + + // if (!_loadBalancers.ContainsKey(key)) + // { + // _loadBalancers.TryAdd(key, loadBalancer); + // } - _loadBalancers.Remove(key); - _loadBalancers.Add(key, loadBalancer); + // ILoadBalancer old; + // _loadBalancers.Remove(key, out old); + // _loadBalancers.TryAdd(key, loadBalancer); } } } diff --git a/test/Ocelot.AcceptanceTests/ServiceDiscoveryTests.cs b/test/Ocelot.AcceptanceTests/ServiceDiscoveryTests.cs index 943e8a23..5978f842 100644 --- a/test/Ocelot.AcceptanceTests/ServiceDiscoveryTests.cs +++ b/test/Ocelot.AcceptanceTests/ServiceDiscoveryTests.cs @@ -72,6 +72,7 @@ namespace Ocelot.AcceptanceTests UpstreamHttpMethod = new List { "Get" }, ServiceName = serviceName, LoadBalancer = "LeastConnection", + UseServiceDiscovery = true, } }, GlobalConfiguration = new FileGlobalConfiguration() @@ -99,8 +100,8 @@ namespace Ocelot.AcceptanceTests private void ThenBothServicesCalledRealisticAmountOfTimes() { - _counterOne.ShouldBe(25); - _counterTwo.ShouldBe(25); + _counterOne.ShouldBe(26); + _counterTwo.ShouldBe(24); } private void ThenTheTwoServicesShouldHaveBeenCalledTimes(int expected) diff --git a/test/Ocelot.AcceptanceTests/Startup.cs b/test/Ocelot.AcceptanceTests/Startup.cs new file mode 100644 index 00000000..3a53bfaa --- /dev/null +++ b/test/Ocelot.AcceptanceTests/Startup.cs @@ -0,0 +1,47 @@ +using System; +using CacheManager.Core; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Ocelot.DependencyInjection; +using Ocelot.Middleware; +using ConfigurationBuilder = Microsoft.Extensions.Configuration.ConfigurationBuilder; + +namespace Ocelot.AcceptanceTests +{ + public class Startup + { + public Startup(IHostingEnvironment env) + { + var builder = new ConfigurationBuilder() + .SetBasePath(env.ContentRootPath) + .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) + .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) + .AddJsonFile("configuration.json") + .AddEnvironmentVariables(); + + Configuration = builder.Build(); + } + + public IConfigurationRoot Configuration { get; } + + public void ConfigureServices(IServiceCollection services) + { + Action settings = (x) => + { + x.WithDictionaryHandle(); + }; + + services.AddOcelot(Configuration, settings); + } + + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + loggerFactory.AddConsole(Configuration.GetSection("Logging")); + + app.UseOcelot().Wait(); + } + } +} diff --git a/test/Ocelot.AcceptanceTests/Steps.cs b/test/Ocelot.AcceptanceTests/Steps.cs index fb853fbb..80a3e68e 100644 --- a/test/Ocelot.AcceptanceTests/Steps.cs +++ b/test/Ocelot.AcceptanceTests/Steps.cs @@ -381,42 +381,4 @@ namespace Ocelot.AcceptanceTests _response.Headers.GetValues(RequestIdKey).First().ShouldBe(expected); } } - - public class Startup - { - public Startup(IHostingEnvironment env) - { - var builder = new ConfigurationBuilder() - .SetBasePath(env.ContentRootPath) - .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) - .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) - .AddJsonFile("configuration.json") - .AddEnvironmentVariables(); - - Configuration = builder.Build(); - } - - public IConfigurationRoot Configuration { get; } - - public void ConfigureServices(IServiceCollection services) - { - Action settings = (x) => - { - x.WithMicrosoftLogging(log => - { - log.AddConsole(LogLevel.Debug); - }) - .WithDictionaryHandle(); - }; - - services.AddOcelot(Configuration, settings); - } - - public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) - { - loggerFactory.AddConsole(Configuration.GetSection("Logging")); - - app.UseOcelot().Wait(); - } - } }