Skip to content

Commit 0eb3de9

Browse files
authored
Adjusts the configuration provider to no longer check top level for feature flags (#261)
* Adjusts the configuration provider to no longer check top level for feature flags * Adding missing using and removes unused else * Remove unused string * Add null check to constructor
1 parent ca73348 commit 0eb3de9

File tree

4 files changed

+43
-12
lines changed

4 files changed

+43
-12
lines changed

src/Microsoft.FeatureManagement/ConfigurationFeatureDefinitionProvider.cs

Lines changed: 14 additions & 10 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,17 @@ 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+
public ConfigurationFeatureDefinitionProvider(IConfiguration configuration, ILoggerFactory loggerFactory)
3235
{
3336
_configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
37+
_logger = loggerFactory?.CreateLogger<ConfigurationFeatureDefinitionProvider>() ?? throw new ArgumentNullException(nameof(loggerFactory));
3438
_definitions = new ConcurrentDictionary<string, FeatureDefinition>();
3539

3640
_changeSubscription = ChangeToken.OnChange(
@@ -199,18 +203,18 @@ We support
199203

200204
private IEnumerable<IConfigurationSection> GetFeatureDefinitionSections()
201205
{
202-
const string FeatureManagementSectionName = "FeatureManagement";
206+
//
207+
// Look for feature definitions under the "FeatureManagement" section
208+
IConfigurationSection featureManagementConfigurationSection = _configuration.GetSection(FeatureManagementSectionName);
203209

204-
if (_configuration.GetChildren().Any(s => s.Key.Equals(FeatureManagementSectionName, StringComparison.OrdinalIgnoreCase)))
210+
if (featureManagementConfigurationSection.Exists())
205211
{
206-
//
207-
// Look for feature definitions under the "FeatureManagement" section
208-
return _configuration.GetSection(FeatureManagementSectionName).GetChildren();
209-
}
210-
else
211-
{
212-
return _configuration.GetChildren();
212+
return featureManagementConfigurationSection.GetChildren();
213213
}
214+
215+
_logger.LogDebug($"No configuration section named '{FeatureManagementSectionName}' was found.");
216+
217+
return Enumerable.Empty<IConfigurationSection>();
214218
}
215219
}
216220
}

src/Microsoft.FeatureManagement/ServiceCollectionExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Microsoft.Extensions.Configuration;
55
using Microsoft.Extensions.DependencyInjection;
66
using Microsoft.Extensions.DependencyInjection.Extensions;
7+
using Microsoft.Extensions.Logging;
78
using System;
89

910
namespace Microsoft.FeatureManagement
@@ -48,7 +49,7 @@ public static IFeatureManagementBuilder AddFeatureManagement(this IServiceCollec
4849
throw new ArgumentNullException(nameof(configuration));
4950
}
5051

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

5354
return services.AddFeatureManagement();
5455
}

tests/Tests.FeatureManagement/FeatureManagement.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
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+
using System.Text;
1820
using System.Threading.Tasks;
1921
using Xunit;
2022

@@ -71,6 +73,30 @@ public async Task ReadsConfiguration()
7173
Assert.True(called);
7274
}
7375

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

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)