diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-06 09:09:36 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2020-05-06 09:09:36 +0300 |
commit | 0c4b9cacd575b3e71e41a13f042062b3adcb4caf (patch) | |
tree | fd06e55f276c1fa42327a41860e328b46a8cb8ee /qa | |
parent | 6c005ae9783ad6752e3082d05e1053d20d8da92a (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'qa')
-rw-r--r-- | qa/Rakefile | 12 | ||||
-rw-r--r-- | qa/qa/tools/delete_test_ssh_keys.rb | 65 |
2 files changed, 51 insertions, 26 deletions
diff --git a/qa/Rakefile b/qa/Rakefile index 9a960a60e56..9f547b92bb8 100644 --- a/qa/Rakefile +++ b/qa/Rakefile @@ -41,7 +41,13 @@ end desc "Generate data and run load tests" task generate_data_and_run_load_test: [:generate_perf_testdata, :run_artillery_load_tests] -desc "Deletes test ssh keys for a provided user" -task :delete_test_ssh_keys do - QA::Tools::DeleteTestSSHKeys.new.run +desc "Deletes test ssh keys a user" +task :delete_test_ssh_keys, [:title_portion, :delete_before] do |t, args| + QA::Tools::DeleteTestSSHKeys.new(args).run +end + +desc "Dry run of deleting test ssh keys for a user. Lists keys to be deleted" +task :delete_test_ssh_keys_dry_run, [:title_portion, :delete_before] do |t, args| + args.with_defaults(dry_run: true) + QA::Tools::DeleteTestSSHKeys.new(args).run end diff --git a/qa/qa/tools/delete_test_ssh_keys.rb b/qa/qa/tools/delete_test_ssh_keys.rb index f502542b529..953e9fc63d1 100644 --- a/qa/qa/tools/delete_test_ssh_keys.rb +++ b/qa/qa/tools/delete_test_ssh_keys.rb @@ -2,59 +2,78 @@ require_relative '../../qa' -# This script deletes all test ssh keys (with titles including 'key for ssh tests' or 'key for audit event test') of a user specified by ENV['GITLAB_USERNAME'] -# Required environment variables: GITLAB_QA_ACCESS_TOKEN, GITLAB_ADDRESS and GITLAB_USERNAME +# This script deletes all selected test ssh keys for a specific user +# Keys can be selected by a string matching part of the key's title and by created date +# - Specify `title_portion` to delete only keys that include the string provided +# - Specify `delete_before` to delete only keys that were created before the given date +# +# If `dry_run` is true the script will list the keys by title and indicate whether each will be deleted +# +# Required environment variables: GITLAB_QA_ACCESS_TOKEN and GITLAB_ADDRESS +# - GITLAB_QA_ACCESS_TOKEN should have API access and belong to the user whose keys will be deleted module QA module Tools class DeleteTestSSHKeys include Support::Api - def initialize + ITEMS_PER_PAGE = '100' + + def initialize(title_portion: 'E2E test key:', delete_before: Date.today.to_s, dry_run: false) raise ArgumentError, "Please provide GITLAB_ADDRESS" unless ENV['GITLAB_ADDRESS'] raise ArgumentError, "Please provide GITLAB_QA_ACCESS_TOKEN" unless ENV['GITLAB_QA_ACCESS_TOKEN'] - raise ArgumentError, "Please provide GITLAB_USERNAME" unless ENV['GITLAB_USERNAME'] @api_client = Runtime::API::Client.new(ENV['GITLAB_ADDRESS'], personal_access_token: ENV['GITLAB_QA_ACCESS_TOKEN']) - @username = ENV['GITLAB_USERNAME'] + @title_portion = title_portion + @delete_before = Date.parse(delete_before) + @dry_run = dry_run end def run STDOUT.puts 'Running...' - user_id = fetch_user_id - test_ssh_key_ids = fetch_test_ssh_key_ids(user_id) + keys_head_response = head Runtime::API::Request.new(@api_client, "/user/keys", per_page: ITEMS_PER_PAGE).url + total_pages = keys_head_response.headers[:x_total_pages] + + test_ssh_key_ids = fetch_test_ssh_key_ids(total_pages) STDOUT.puts "Number of test ssh keys to be deleted: #{test_ssh_key_ids.length}" - delete_ssh_keys(user_id, test_ssh_key_ids) unless test_ssh_key_ids.empty? + return if dry_run? + + delete_ssh_keys(test_ssh_key_ids) unless test_ssh_key_ids.empty? STDOUT.puts "\nDone" end private - def fetch_user_id - get_user_response = get Runtime::API::Request.new(@api_client, "/users?username=#{@username}").url - user = JSON.parse(get_user_response.body).first - raise "Unexpected user found. Expected #{@username}, found #{user['username']}" unless user['username'] == @username - - user["id"] - end + attr_reader :dry_run + alias_method :dry_run?, :dry_run - def delete_ssh_keys(user_id, ssh_key_ids) + def delete_ssh_keys(ssh_key_ids) STDOUT.puts "Deleting #{ssh_key_ids.length} ssh keys..." ssh_key_ids.each do |key_id| - delete_response = delete Runtime::API::Request.new(@api_client, "/users/#{user_id}/keys/#{key_id}").url + delete_response = delete Runtime::API::Request.new(@api_client, "/user/keys/#{key_id}").url dot_or_f = delete_response.code == 204 ? "\e[32m.\e[0m" : "\e[31mF\e[0m" print dot_or_f end end - def fetch_test_ssh_key_ids(user_id) - get_keys_response = get Runtime::API::Request.new(@api_client, "/users/#{user_id}/keys").url - JSON.parse(get_keys_response.body) - .select { |key| (key["title"].include?('key for ssh tests') || key["title"].include?('key for audit event test')) } - .map { |key| key['id'] } - .uniq + def fetch_test_ssh_key_ids(pages) + key_ids = [] + + pages.to_i.times do |page_no| + get_keys_response = get Runtime::API::Request.new(@api_client, "/user/keys", page: (page_no + 1).to_s, per_page: ITEMS_PER_PAGE).url + keys = JSON.parse(get_keys_response.body).select do |key| + to_delete = key['title'].include?(@title_portion) && Date.parse(key['created_at']) < @delete_before + + puts "Key title: #{key['title']}\tcreated_at: #{key['created_at']}\tdelete? #{to_delete}" if dry_run? + + to_delete + end + key_ids.concat(keys.map { |key| key['id'] }) + end + + key_ids.uniq end end end |