diff --git a/src/Ocelot/Configuration/Creator/FileInternalConfigurationCreator.cs b/src/Ocelot/Configuration/Creator/FileInternalConfigurationCreator.cs index 46590f67..fa77402b 100644 --- a/src/Ocelot/Configuration/Creator/FileInternalConfigurationCreator.cs +++ b/src/Ocelot/Configuration/Creator/FileInternalConfigurationCreator.cs @@ -18,7 +18,6 @@ namespace Ocelot.Configuration.Creator /// public class FileInternalConfigurationCreator : IInternalConfigurationCreator { - private readonly IOptions _options; private readonly IConfigurationValidator _configurationValidator; private readonly IOcelotLogger _logger; private readonly IClaimsToThingCreator _claimsToThingCreator; @@ -36,7 +35,6 @@ namespace Ocelot.Configuration.Creator private readonly IDownstreamAddressesCreator _downstreamAddressesCreator; public FileInternalConfigurationCreator( - IOptions options, IConfigurationValidator configurationValidator, IOcelotLoggerFactory loggerFactory, IClaimsToThingCreator claimsToThingCreator, @@ -62,7 +60,6 @@ namespace Ocelot.Configuration.Creator _requestIdKeyCreator = requestIdKeyCreator; _upstreamTemplatePatternCreator = upstreamTemplatePatternCreator; _authOptionsCreator = authOptionsCreator; - _options = options; _configurationValidator = configurationValidator; _logger = loggerFactory.CreateLogger(); _claimsToThingCreator = claimsToThingCreator; diff --git a/src/Ocelot/DependencyInjection/ConfigurationBuilderExtensions.cs b/src/Ocelot/DependencyInjection/ConfigurationBuilderExtensions.cs index c5c5ee4d..807ba0f3 100644 --- a/src/Ocelot/DependencyInjection/ConfigurationBuilderExtensions.cs +++ b/src/Ocelot/DependencyInjection/ConfigurationBuilderExtensions.cs @@ -18,5 +18,14 @@ namespace Ocelot.DependencyInjection builder.Add(memorySource); return builder; } + + public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder) + { + //var load all files with ocelot*.json + //merge these files into one + //save it as ocelot.json + builder.AddJsonFile("ocelot.json"); + return builder; + } } } diff --git a/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs b/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs index 9581d348..5ff5e165 100644 --- a/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs +++ b/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs @@ -1,22 +1,18 @@ -using System.Collections.Generic; -using Castle.Components.DictionaryAdapter; -using Microsoft.Extensions.Options; -using Moq; -using Ocelot.Cache; -using Ocelot.Configuration; -using Ocelot.Configuration.Builder; -using Ocelot.Configuration.Creator; -using Ocelot.Configuration.File; -using Ocelot.Configuration.Validator; -using Ocelot.Logging; -using Ocelot.Responses; -using Shouldly; -using TestStack.BDDfy; -using Xunit; - -namespace Ocelot.UnitTests.Configuration +namespace Ocelot.UnitTests.Configuration { - using System; + using System.Collections.Generic; + using Moq; + using Ocelot.Cache; + using Ocelot.Configuration; + using Ocelot.Configuration.Builder; + using Ocelot.Configuration.Creator; + using Ocelot.Configuration.File; + using Ocelot.Configuration.Validator; + using Ocelot.Logging; + using Ocelot.Responses; + using Shouldly; + using TestStack.BDDfy; + using Xunit; using Ocelot.DependencyInjection; using Ocelot.Errors; using Ocelot.UnitTests.TestData; @@ -24,23 +20,22 @@ namespace Ocelot.UnitTests.Configuration public class FileConfigurationCreatorTests { - private readonly Mock> _fileConfig; private readonly Mock _validator; private Response _config; private FileConfiguration _fileConfiguration; private readonly Mock _logger; private readonly FileInternalConfigurationCreator _internalConfigurationCreator; - private Mock _claimsToThingCreator; - private Mock _authOptionsCreator; - private Mock _upstreamTemplatePatternCreator; - private Mock _requestIdKeyCreator; - private Mock _serviceProviderConfigCreator; - private Mock _qosOptionsCreator; - private Mock _fileReRouteOptionsCreator; - private Mock _rateLimitOptions; - private Mock _regionCreator; - private Mock _httpHandlerOptionsCreator; - private Mock _adminPath; + private readonly Mock _claimsToThingCreator; + private readonly Mock _authOptionsCreator; + private readonly Mock _upstreamTemplatePatternCreator; + private readonly Mock _requestIdKeyCreator; + private readonly Mock _serviceProviderConfigCreator; + private readonly Mock _qosOptionsCreator; + private readonly Mock _fileReRouteOptionsCreator; + private readonly Mock _rateLimitOptions; + private readonly Mock _regionCreator; + private readonly Mock _httpHandlerOptionsCreator; + private readonly Mock _adminPath; private readonly Mock _headerFindAndReplaceCreator; private readonly Mock _downstreamAddressesCreator; @@ -48,7 +43,6 @@ namespace Ocelot.UnitTests.Configuration { _logger = new Mock(); _validator = new Mock(); - _fileConfig = new Mock>(); _claimsToThingCreator = new Mock(); _authOptionsCreator = new Mock(); _upstreamTemplatePatternCreator = new Mock(); @@ -64,7 +58,6 @@ namespace Ocelot.UnitTests.Configuration _downstreamAddressesCreator = new Mock(); _internalConfigurationCreator = new FileInternalConfigurationCreator( - _fileConfig.Object, _validator.Object, _logger.Object, _claimsToThingCreator.Object, @@ -262,7 +255,7 @@ namespace Ocelot.UnitTests.Configuration .And(x => x.GivenTheConfigIsValid()) .And(x => x.GivenTheFollowingRegionIsReturned("region")) .When(x => x.WhenICreateTheConfig()) - .Then(x => x.ThenTheRegionCreatorIsCalledCorrectly("region")) + .Then(x => x.ThenTheRegionCreatorIsCalledCorrectly()) .And(x => x.ThenTheHeaderFindAndReplaceCreatorIsCalledCorrectly()) .BDDfy(); } @@ -800,9 +793,6 @@ namespace Ocelot.UnitTests.Configuration private void GivenTheConfigIs(FileConfiguration fileConfiguration) { _fileConfiguration = fileConfiguration; - _fileConfig - .Setup(x => x.Value) - .Returns(_fileConfiguration); } private void WhenICreateTheConfig() @@ -927,7 +917,7 @@ namespace Ocelot.UnitTests.Configuration .Returns(region); } - private void ThenTheRegionCreatorIsCalledCorrectly(string expected) + private void ThenTheRegionCreatorIsCalledCorrectly() { _regionCreator .Verify(x => x.Create(_fileConfiguration.ReRoutes[0]), Times.Once); diff --git a/test/Ocelot.UnitTests/DependencyInjection/ConfigurationBuilderExtensionsTests.cs b/test/Ocelot.UnitTests/DependencyInjection/ConfigurationBuilderExtensionsTests.cs index 5d32b1ed..ab20c941 100644 --- a/test/Ocelot.UnitTests/DependencyInjection/ConfigurationBuilderExtensionsTests.cs +++ b/test/Ocelot.UnitTests/DependencyInjection/ConfigurationBuilderExtensionsTests.cs @@ -6,6 +6,11 @@ using Xunit; namespace Ocelot.UnitTests.DependencyInjection { + using System.Collections.Generic; + using System.IO; + using Newtonsoft.Json; + using Ocelot.Configuration.File; + public class ConfigurationBuilderExtensionsTests { private IConfigurationRoot _configuration; @@ -20,6 +25,61 @@ namespace Ocelot.UnitTests.DependencyInjection .BDDfy(); } + [Fact] + public void should_merge_files() + { + var globalConfig = new FileConfiguration + { + GlobalConfiguration = new FileGlobalConfiguration + { + BaseUrl = "BaseUrl", + RateLimitOptions = new FileRateLimitOptions + { + HttpStatusCode = 500, + ClientIdHeader = "ClientIdHeader", + DisableRateLimitHeaders = true, + QuotaExceededMessage = "QuotaExceededMessage", + RateLimitCounterPrefix = "RateLimitCounterPrefix" + } + } + }; + + var reRoute = new FileConfiguration + { + ReRoutes = new List + { + new FileReRoute + { + DownstreamScheme = "DownstreamScheme", + Key = "Key", + UpstreamHost = "UpstreamHost", + UpstreamHttpMethod = new List + { + "UpstreamHttpMethod" + }, + DownstreamHostAndPorts = new List + { + new FileHostAndPort + { + Host = "Host", + Port = 80 + } + } + } + } + }; + + var globalJson = JsonConvert.SerializeObject(globalConfig); + //File.WriteAllText("ocelot.global.json", globalJson); + + var reRouteJson = JsonConvert.SerializeObject(reRoute); + //File.WriteAllText("ocelot.reRoute.json", reRouteJson); + + IConfigurationBuilder builder = new ConfigurationBuilder(); + //builder.AddOcelot(); + + } + private void GivenTheBaseUrl(string baseUrl) { #pragma warning disable CS0618