summaryrefslogtreecommitdiff
path: root/qa/qa/tools/delete_user_projects.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qa/qa/tools/delete_user_projects.rb')
-rw-r--r--qa/qa/tools/delete_user_projects.rb64
1 files changed, 64 insertions, 0 deletions
diff --git a/qa/qa/tools/delete_user_projects.rb b/qa/qa/tools/delete_user_projects.rb
new file mode 100644
index 00000000000..9c031e352b4
--- /dev/null
+++ b/qa/qa/tools/delete_user_projects.rb
@@ -0,0 +1,64 @@
+# frozen_string_literal: true
+
+# This script deletes all projects owned by a given USER_ID in their personal namespace
+# Required environment variables: USER_ID, GITLAB_QA_ACCESS_TOKEN and GITLAB_ADDRESS
+# Run `rake delete_user_projects`
+
+module QA
+ module Tools
+ class DeleteUserProjects
+ include Support::API
+ include Lib::Project
+
+ def initialize(delete_before: (Date.today - 1).to_s, dry_run: false)
+ unless ENV['GITLAB_ADDRESS']
+ raise ArgumentError, "Please provide GITLAB_ADDRESS environment variable"
+ end
+
+ unless ENV['GITLAB_QA_ACCESS_TOKEN']
+ raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN environment variable"
+ end
+
+ unless ENV['USER_ID']
+ raise ArgumentError, "Please provide USER_ID environment variable"
+ end
+
+ @delete_before = Date.parse(delete_before)
+ @dry_run = dry_run
+ @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'],
+ personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN'])
+ end
+
+ def run
+ $stdout.puts 'Running...'
+
+ projects_head_response = head Runtime::API::Request.new(@api_client, "/users/#{ENV['USER_ID']}/projects",
+ per_page: "100").url
+ total_project_pages = projects_head_response.headers[:x_total_pages]
+
+ $stdout.puts "Total project pages: #{total_project_pages}"
+
+ project_ids = fetch_project_ids(total_project_pages)
+
+ delete_projects(project_ids, @api_client, @dry_run) unless project_ids.empty?
+ $stdout.puts "\nDone"
+ end
+
+ private
+
+ def fetch_project_ids(total_project_pages)
+ projects_ids = []
+
+ total_project_pages.to_i.times do |page_no|
+ projects_response = get Runtime::API::Request.new(@api_client, "/users/#{ENV['USER_ID']}/projects",
+ page: (page_no + 1).to_s, per_page: "100").url
+ projects_ids.concat(JSON.parse(projects_response.body)
+ .select { |project| Date.parse(project["created_at"]) < @delete_before }
+ .map { |project| project["id"] })
+ end
+
+ projects_ids.uniq
+ end
+ end
+ end
+end