diff options
-rw-r--r-- | qa/Gemfile.lock | 2 | ||||
-rw-r--r-- | qa/Rakefile | 6 | ||||
-rw-r--r-- | qa/qa/support/api.rb | 18 | ||||
-rw-r--r-- | qa/qa/tools/delete_subgroups.rb | 66 |
4 files changed, 91 insertions, 1 deletions
diff --git a/qa/Gemfile.lock b/qa/Gemfile.lock index 419cacdb2af..9f84bdc3828 100644 --- a/qa/Gemfile.lock +++ b/qa/Gemfile.lock @@ -97,7 +97,7 @@ DEPENDENCIES airborne (~> 0.2.13) capybara (~> 2.16.1) capybara-screenshot (~> 1.0.18) - nokogiri (~> 1.10.0) + nokogiri (~> 1.10.1) pry-byebug (~> 3.5.1) rake (~> 12.3.0) rspec (~> 3.7) diff --git a/qa/Rakefile b/qa/Rakefile index 8df1cfdc174..9a7b9c6bb35 100644 --- a/qa/Rakefile +++ b/qa/Rakefile @@ -1,6 +1,12 @@ require_relative 'qa/tools/revoke_all_personal_access_tokens' +require_relative 'qa/tools/delete_subgroups' desc "Revokes all personal access tokens" task :revoke_personal_access_tokens do QA::Tools::RevokeAllPersonalAccessTokens.new.run end + +desc "Deletes subgroups within a provided group" +task :delete_subgroups do + QA::Tools::DeleteSubgroups.new.run +end diff --git a/qa/qa/support/api.rb b/qa/qa/support/api.rb index 1107d43161e..8aa7d6812ac 100644 --- a/qa/qa/support/api.rb +++ b/qa/qa/support/api.rb @@ -20,6 +20,24 @@ module QA e.response end + def delete(url) + RestClient::Request.execute( + method: :delete, + url: url, + verify_ssl: false) + rescue RestClient::ExceptionWithResponse => e + e.response + end + + def head(url) + RestClient::Request.execute( + method: :head, + url: url, + verify_ssl: false) + rescue RestClient::ExceptionWithResponse => e + e.response + end + def parse_body(response) JSON.parse(response.body, symbolize_names: true) end diff --git a/qa/qa/tools/delete_subgroups.rb b/qa/qa/tools/delete_subgroups.rb new file mode 100644 index 00000000000..c5c48e77ade --- /dev/null +++ b/qa/qa/tools/delete_subgroups.rb @@ -0,0 +1,66 @@ +# frozen_string_literal: true + +require_relative '../../qa' + +# This script deletes all subgroups of a group specified by ENV['GROUP_NAME_OR_PATH'] +# Required environment variables: PERSONAL_ACCESS_TOKEN and GITLAB_ADDRESS +# Optional environment variable: GROUP_NAME_OR_PATH (defaults to 'gitlab-qa-sandbox-group') +# Run `rake delete_subgroups` + +module QA + module Tools + class DeleteSubgroups + include Support::Api + + def initialize + raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS'] + raise ArgumentError, "Please provide PERSONAL_ACCESS_TOKEN" unless ENV['PERSONAL_ACCESS_TOKEN'] + + @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'], personal_access_token: ENV['PERSONAL_ACCESS_TOKEN']) + end + + def run + STDOUT.puts 'Running...' + + # Fetch group's id + group_id = fetch_group_id + + sub_groups_head_response = head Runtime::API::Request.new(@api_client, "/groups/#{group_id}/subgroups", per_page: "100").url + total_sub_groups = sub_groups_head_response.headers[:x_total] + total_sub_group_pages = sub_groups_head_response.headers[:x_total_pages] + + STDOUT.puts "total_sub_groups: #{total_sub_groups}" + STDOUT.puts "total_sub_group_pages: #{total_sub_group_pages}" + + total_sub_group_pages.to_i.times do |page_no| + # Fetch all subgroups for the top level group + sub_groups_response = get Runtime::API::Request.new(@api_client, "/groups/#{group_id}/subgroups", per_page: "100").url + + sub_group_ids = JSON.parse(sub_groups_response.body).map { |subgroup| subgroup["id"] } + + if sub_group_ids.any? + STDOUT.puts "\n==== Current Page: #{page_no + 1} ====\n" + + delete_subgroups(sub_group_ids) + end + end + STDOUT.puts "\nDone" + end + + private + + def delete_subgroups(sub_group_ids) + sub_group_ids.each do |subgroup_id| + delete_response = delete Runtime::API::Request.new(@api_client, "/groups/#{subgroup_id}").url + dot_or_f = delete_response.code == 202 ? "\e[32m.\e[0m" : "\e[31mF\e[0m" + print dot_or_f + end + end + + def fetch_group_id + group_search_response = get Runtime::API::Request.new(@api_client, "/groups", search: ENV['GROUP_NAME_OR_PATH'] || 'gitlab-qa-sandbox-group').url + JSON.parse(group_search_response.body).first["id"] + end + end + end +end |