Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'qa/qa/tools/ci/ff_changes.rb')
-rw-r--r--qa/qa/tools/ci/ff_changes.rb66
1 files changed, 66 insertions, 0 deletions
diff --git a/qa/qa/tools/ci/ff_changes.rb b/qa/qa/tools/ci/ff_changes.rb
new file mode 100644
index 00000000000..67e52633833
--- /dev/null
+++ b/qa/qa/tools/ci/ff_changes.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+require "yaml"
+
+module QA
+ module Tools
+ module Ci
+ class FfChanges
+ include Helpers
+
+ def initialize(mr_diff)
+ @mr_diff = mr_diff
+ end
+
+ # Return list of feature flags changed in mr with inverse or deleted state
+ #
+ # @return [String]
+ def fetch
+ logger.info("Detecting feature flag changes")
+ ff_toggles = mr_diff.map do |change|
+ ff_yaml = ff_yaml_for_file(change)
+ next unless ff_yaml
+
+ state = if ff_yaml[:deleted]
+ "deleted"
+ else
+ ff_yaml[:default_enabled] ? 'disabled' : 'enabled'
+ end
+
+ logger.info(" found changes in feature flag '#{ff_yaml[:name]}'")
+ "#{ff_yaml[:name]}=#{state}"
+ end.compact
+
+ if ff_toggles.empty?
+ logger.info(" no changes to feature flags detected, skipping!")
+ return
+ end
+
+ logger.info(" constructed feature flag states: '#{ff_toggles}'")
+ ff_toggles.join(",")
+ end
+
+ private
+
+ attr_reader :mr_diff
+
+ # Loads the YAML feature flag definition based on changed files in merge requests.
+ # The definition is loaded from the definition file itself.
+ #
+ # @param [Hash] change mr file change
+ # @return [Hash] a hash containing the YAML data for the feature flag definition
+ def ff_yaml_for_file(change)
+ return unless change[:path] =~ %r{/feature_flags/(development|ops)/.*\.yml}
+ if change[:deleted_file]
+ return { name: change[:path].split("/").last.gsub(/\.(yml|yaml)/, ""), deleted: true }
+ end
+
+ YAML.safe_load(
+ File.read(File.expand_path("../#{change[:path]}", QA::Runtime::Path.qa_root)),
+ symbolize_names: true
+ )
+ end
+ end
+ end
+ end
+end