summaryrefslogtreecommitdiff
path: root/config/initializers/0_inject_feature_flags.rb
blob: 74470a6cbfc95c171587d140d07bebfc85dc6028 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# This needs to be loaded after
# config/initializers/0_inject_enterprise_edition_module.rb

Feature.register_feature_groups
Feature.register_definitions
Feature.register_hot_reloader unless Rails.configuration.cache_classes

# This disallows usage of licensed feature names with the same name
# as feature flags. This naming collision creates confusion and it was
# decided to be removed in favor of explicit check.
# https://gitlab.com/gitlab-org/gitlab/-/issues/259611
if Gitlab.ee? && Gitlab.dev_or_test_env?
  # These are the names of feature flags that do violate the constraint of
  # being unique to licensed names. These feature flags should be reworked to
  # be "development" with explicit check
  IGNORED_FEATURE_FLAGS = %i[
    swimlanes
  ].to_set

  # First, we validate a list of overrides to ensure that these overrides
  # are removed if feature flag is gone
  missing_feature_flags = IGNORED_FEATURE_FLAGS.reject do |feature_flag|
    Feature::Definition.definitions[feature_flag]
  end

  if missing_feature_flags.any?
    raise "The following feature flags were added as an override for discovering licensed features. " \
          "Since these feature flags seems to be gone, ensure to remove them from \`IGNORED_FEATURE_FLAGS\` " \
          "in \`#{__FILE__}'`: #{missing_feature_flags.join(", ")}"
  end

  # Second, we validate that there's no feature flag under the name as licensed feature
  # flag, to ensure that the name used, is unique
  licensed_features = License::PLANS_BY_FEATURE.keys.select do |licensed_feature_name|
    IGNORED_FEATURE_FLAGS.exclude?(licensed_feature_name) &&
      Feature::Definition.definitions[licensed_feature_name]
  end

  if licensed_features.any?
    raise "The following feature flags do use a licensed feature. " \
          "To avoid the confusion between their usage it is disallowed to use feature flag " \
          "with exact the same name as licensed feature name. Use a different name to create " \
          "a distinction: #{licensed_features.join(", ")}"
  end
end