Skip to content

Commit b91bc3e

Browse files
committed
Adjusts the configuration provider to no longer check top level for feature flags
1 parent ca73348 commit b91bc3e

File tree

4 files changed

+47
-9
lines changed

4 files changed

+47
-9
lines changed

src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT license.
33
//
44
using Microsoft.Extensions.Configuration;
5+
using Microsoft.Extensions.Logging;
56
using Microsoft.Extensions.Primitives;
67
using System;
78
using System.Collections.Concurrent;
@@ -23,14 +24,19 @@ sealed class ConfigurationFeatureDefinitionProvider : IFeatureDefinitionProvider
2324

2425
private const string FeatureFiltersSectionName = "EnabledFor";
2526
private const string RequirementTypeKeyword = "RequirementType";
27+
private const string FeatureManagementSectionName = "FeatureManagement";
2628
private readonly IConfiguration _configuration;
2729
private readonly ConcurrentDictionary<string, FeatureDefinition> _definitions;
2830
private IDisposable _changeSubscription;
31+
private readonly ILogger _logger;
2932
private int _stale = 0;
3033

31-
public ConfigurationFeatureDefinitionProvider(IConfiguration configuration)
34+
const string ParseValueErrorString = "Invalid setting '{0}' with value '{1}' for feature '{2}'.";
35+
36+
public ConfigurationFeatureDefinitionProvider(IConfiguration configuration, ILoggerFactory loggerFactory)
3237
{
3338
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
39+
_logger = loggerFactory.CreateLogger<ConfigurationFeatureDefinitionProvider>();
3440
_definitions = new ConcurrentDictionary<string, FeatureDefinition>();
3541

3642
_changeSubscription = ChangeToken.OnChange(
@@ -199,17 +205,19 @@ We support
199205

200206
private IEnumerable<IConfigurationSection> GetFeatureDefinitionSections()
201207
{
202-
const string FeatureManagementSectionName = "FeatureManagement";
208+
//
209+
// Look for feature definitions under the "FeatureManagement" section
210+
IConfigurationSection featureManagementConfigurationSection = _configuration.GetSection(FeatureManagementSectionName);
203211

204-
if (_configuration.GetChildren().Any(s => s.Key.Equals(FeatureManagementSectionName, StringComparison.OrdinalIgnoreCase)))
212+
if (featureManagementConfigurationSection.Exists())
205213
{
206-
//
207-
// Look for feature definitions under the "FeatureManagement" section
208-
return _configuration.GetSection(FeatureManagementSectionName).GetChildren();
214+
return featureManagementConfigurationSection.GetChildren();
209215
}
210216
else
211217
{
212-
return _configuration.GetChildren();
218+
_logger.LogWarning($"No configuration section named '{FeatureManagementSectionName}' was found.");
219+
220+
return Enumerable.Empty<IConfigurationSection>();
213221
}
214222
}
215223
}

src/Microsoft.FeatureManagement/ServiceCollectionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static IFeatureManagementBuilder AddFeatureManagement(this IServiceCollec
4848
throw new ArgumentNullException(nameof(configuration));
4949
}
5050

51-
services.AddSingleton<IFeatureDefinitionProvider>(new ConfigurationFeatureDefinitionProvider(configuration));
51+
services.AddSingleton<IFeatureDefinitionProvider>(sp => new ConfigurationFeatureDefinitionProvider(configuration, sp.GetRequiredService<ILoggerFactory>()));
5252

5353
return services.AddFeatureManagement();
5454
}

tests/Tests.FeatureManagement/FeatureManagement.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,15 @@
1212
using Microsoft.FeatureManagement.FeatureFilters;
1313
using System;
1414
using System.Collections.Generic;
15+
using System.IO;
1516
using System.Linq;
1617
using System.Net;
1718
using System.Net.Http;
19+
<<<<<<< HEAD
20+
=======
21+
using System.Threading;
22+
using System.Text;
23+
>>>>>>> 65e8330 (Adjusts the configuration provider to no longer check top level for feature flags)
1824
using System.Threading.Tasks;
1925
using Xunit;
2026

@@ -71,6 +77,30 @@ public async Task ReadsConfiguration()
7177
Assert.True(called);
7278
}
7379

80+
[Fact]
81+
public async Task ReadsOnlyFeatureManagementSection()
82+
{
83+
MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes("{\"AllowedHosts\": \"*\"}"));
84+
IConfiguration config = new ConfigurationBuilder().AddJsonStream(stream).Build();
85+
86+
var services = new ServiceCollection();
87+
88+
services
89+
.AddSingleton(config)
90+
.AddFeatureManagement()
91+
.AddFeatureFilter<TestFilter>();
92+
93+
ServiceProvider serviceProvider = services.BuildServiceProvider();
94+
95+
IFeatureManager featureManager = serviceProvider.GetRequiredService<IFeatureManager>();
96+
97+
await foreach (string featureName in featureManager.GetFeatureNamesAsync())
98+
{
99+
// Fail, as no features should be found
100+
Assert.True(false);
101+
}
102+
}
103+
74104
[Fact]
75105
public async Task Integrates()
76106
{

tests/Tests.FeatureManagement/Tests.FeatureManagement.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp2.1'">
1717
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
1818
<PackageReference Include="Microsoft.AspNetCore" Version="2.1.7" />
19-
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.1.1" />
19+
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.32" />
2020
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="2.1.1" />
2121
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.3" />
2222
</ItemGroup>

0 commit comments

Comments
 (0)