From ab1a28bde02bfe732d82c71be2ee99a530cd2dbe Mon Sep 17 00:00:00 2001 From: Jimmy Campbell Date: Tue, 7 Jun 2022 17:23:52 -0700 Subject: [PATCH] Throw exception if feature management schemas are mixed to avoid unintentionally hiding feature flags. --- .../ConfigurationDynamicFeatureDefinitionProvider.cs | 2 +- .../ConfigurationFeatureFlagDefinitionProvider.cs | 12 ++++++++++++ .../FeatureManagementError.cs | 7 ++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs b/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs index 82794ef6..4c50702e 100644 --- a/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs +++ b/src/Microsoft.FeatureManagement/ConfigurationDynamicFeatureDefinitionProvider.cs @@ -19,8 +19,8 @@ namespace Microsoft.FeatureManagement /// sealed class ConfigurationDynamicFeatureDefinitionProvider : IDynamicFeatureDefinitionProvider, IDisposable { + public const string DynamicFeatureDefinitionsSectionName = "DynamicFeatures"; private const string FeatureManagementSectionName = "FeatureManagement"; - private const string DynamicFeatureDefinitionsSectionName= "DynamicFeatures"; private const string FeatureVariantsSectionName = "Variants"; private readonly IConfiguration _configuration; private readonly ConcurrentDictionary _dynamicFeatureDefinitions; diff --git a/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs b/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs index d302cff2..e3aea38d 100644 --- a/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs +++ b/src/Microsoft.FeatureManagement/ConfigurationFeatureFlagDefinitionProvider.cs @@ -186,6 +186,18 @@ private IEnumerable GetFeatureFlagDefinitionSections() IConfigurationSection featureFlagsSection = featureManagementChildren.FirstOrDefault(s => s.Key == FeatureFlagDefinitionsSectionName); + // + // Check for mixed schema to avoid confusing scenario where feature flags defined in separate sources with different schemas don't mix. + if (featureFlagsSection != null && + featureManagementChildren.Any(section => + !section.Key.Equals(FeatureFlagDefinitionsSectionName) && + !section.Key.Equals(ConfigurationDynamicFeatureDefinitionProvider.DynamicFeatureDefinitionsSectionName))) + { + throw new FeatureManagementException( + FeatureManagementError.InvalidConfiguration, + "Detected feature flags defined using different feature management schemas."); + } + // // Support backward compatability where feature flag definitions were directly under the feature management section return featureFlagsSection == null ? diff --git a/src/Microsoft.FeatureManagement/FeatureManagementError.cs b/src/Microsoft.FeatureManagement/FeatureManagementError.cs index 8eb6208a..a8deb232 100644 --- a/src/Microsoft.FeatureManagement/FeatureManagementError.cs +++ b/src/Microsoft.FeatureManagement/FeatureManagementError.cs @@ -61,6 +61,11 @@ public enum FeatureManagementError /// /// A dynamic feature does not have a default feature variant configured. /// - MissingDefaultFeatureVariant + MissingDefaultFeatureVariant, + + /// + /// A configuration error is present in the feature management system. + /// + InvalidConfiguration } }