From c32e78780370d3d1327850cef688e61fd76de1e9 Mon Sep 17 00:00:00 2001
From: Dylan Griffith <dyl.griffith@gmail.com>
Date: Tue, 13 Feb 2024 16:49:04 +1100
Subject: [PATCH] Make ::Keeps::DeleteOldFeatureFlags compatible with new API

This brings this keep up to date with the new housekeeper APIs.
---
 keeps/delete_old_feature_flags.rb | 43 ++++++++++++++++++++-----------
 keeps/helpers/groups.rb           | 13 ++++++++--
 2 files changed, 39 insertions(+), 17 deletions(-)

diff --git a/keeps/delete_old_feature_flags.rb b/keeps/delete_old_feature_flags.rb
index ddf74dd595289..928c861add0e7 100644
--- a/keeps/delete_old_feature_flags.rb
+++ b/keeps/delete_old_feature_flags.rb
@@ -4,6 +4,7 @@
 require 'cgi'
 require 'httparty'
 require 'json'
+require_relative './helpers/groups'
 
 module Keeps
   # This is an implementation of a ::Gitlab::Housekeeper::Keep. This keep will locate any featrure flag definition file
@@ -58,12 +59,13 @@ def each_change
         # TODO: Handle the different cases of default_enabled vs enabled/disabled on GitLab.com
 
         # # Finalize the migration
-        title = "Delete the `#{feature_flag.name}` feature flag introduced in #{feature_flag.milestone}"
+        change = ::Gitlab::Housekeeper::Change.new
+        change.title = "Delete the `#{feature_flag.name}` feature flag introduced in #{feature_flag.milestone}"
 
-        identifiers = [self.class.name.demodulize, feature_flag.name]
+        change.identifiers = [self.class.name.demodulize, feature_flag.name]
 
         # rubocop:disable Gitlab/DocUrl -- Not running inside rails application
-        description = <<~MARKDOWN
+        change.description = <<~MARKDOWN
         This feature flag was introduced more than #{CUTOFF_MILESTONE_OLD} milestones ago.
 
         As part of our process we want to ensure [feature flags don't stay too long in the codebase](https://docs.gitlab.com/ee/development/feature_flags/#types-of-feature-flags).
@@ -76,21 +78,31 @@ def each_change
 
         </details>
 
-        Labels to set (not yet automated): ~"#{feature_flag.group}"
-
         This merge request was created using the
         [gitlab-housekeeper](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/139492)
         gem.
-        #{assign_command(feature_flag.rollout_issue_url)}
         MARKDOWN
         # rubocop:enable Gitlab/DocUrl
 
         FileUtils.rm(feature_flag_yaml_file)
 
-        changed_files = [feature_flag_yaml_file]
+        change.changed_files = [feature_flag_yaml_file]
+
+        change.labels = [
+          'maintenance::refactor',
+          feature_flag.group
+        ]
+
+        change.reviewers = assignees(feature_flag.rollout_issue_url)
+
+        if change.reviewers.empty?
+          group_data = groups_helper.group_for_group_label(feature_flag.group)
+          if group_data
+            change.reviewers = groups_helper.pick_reviewer(group_data, change.identifiers)
+          end
+        end
 
-        to_create = ::Gitlab::Housekeeper::Change.new(identifiers, title, description, changed_files)
-        yield(to_create)
+        yield(change)
       end
     end
 
@@ -135,15 +147,12 @@ def milestone_ago(milestone, num_milestones)
       [older_major, older_minor].join(".")
     end
 
-    def assign_command(rollout_issue_url)
+    def assignees(rollout_issue_url)
       rollout_issue = get_rollout_issue(rollout_issue_url)
-      return unless rollout_issue
 
-      "/assign #{assignees(rollout_issue)}"
-    end
+      return unless rollout_issue && rollout_issue[:assignees]
 
-    def assignees(rollout_issue)
-      rollout_issue[:assignees].map { |assignee| "@#{assignee[:username]}" }.join(' ')
+      rollout_issue[:assignees]
     end
 
     def get_rollout_issue(rollout_issue_url)
@@ -171,6 +180,10 @@ def each_feature_flag
     def all_feature_flag_files
       Dir.glob("{,ee/}config/feature_flags/{development,gitlab_com_derisk}/*.yml")
     end
+
+    def groups_helper
+      @groups_helper ||= ::Keeps::Helpers::Groups.new
+    end
   end
 end
 # rubocop:enable Gitlab/Json
diff --git a/keeps/helpers/groups.rb b/keeps/helpers/groups.rb
index c66597fabdf8c..362dc9ddd064b 100644
--- a/keeps/helpers/groups.rb
+++ b/keeps/helpers/groups.rb
@@ -6,12 +6,17 @@ class Groups
       Error = Class.new(StandardError)
 
       def group_for_feature_category(category)
-        @groups ||= {}
-        @groups[category] ||= fetch_groups.find do |_, group|
+        groups.find do |_, group|
           group['categories'].present? && group['categories'].include?(category)
         end&.last
       end
 
+      def group_for_group_label(group_label)
+        groups.find do |_, group|
+          group['label'] == group_label
+        end&.last
+      end
+
       def pick_reviewer(group, identifiers)
         random_engineer = Digest::SHA256.hexdigest(identifiers.join).to_i(16) % group['backend_engineers'].size
 
@@ -20,6 +25,10 @@ def pick_reviewer(group, identifiers)
 
       private
 
+      def groups
+        @groups ||= fetch_groups
+      end
+
       def fetch_groups
         @groups_json ||= begin
           response = Gitlab::HTTP.get('https://about.gitlab.com/groups.json')
-- 
GitLab