debian-mirror-gitlab/spec/features/admin/admin_runners_spec.rb

538 lines
16 KiB
Ruby
Raw Normal View History

2019-10-12 21:52:04 +05:30
# frozen_string_literal: true
2015-09-25 12:07:36 +05:30
require 'spec_helper'
2020-06-23 00:09:42 +05:30
RSpec.describe "Admin Runners" do
2017-08-17 22:00:37 +05:30
include StubENV
2015-09-25 12:07:36 +05:30
before do
2017-08-17 22:00:37 +05:30
stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
2021-02-22 17:27:13 +05:30
admin = create(:admin)
sign_in(admin)
gitlab_enable_admin_mode_sign_in(admin)
2015-09-25 12:07:36 +05:30
end
2021-09-30 23:02:18 +05:30
describe "Runners page", :js do
let_it_be(:user) { create(:user) }
let_it_be(:group) { create(:group) }
let_it_be(:namespace) { create(:namespace) }
let_it_be(:project) { create(:project, namespace: namespace, creator: user) }
2021-09-04 01:27:46 +05:30
2017-09-10 17:25:29 +05:30
context "when there are runners" do
2018-12-05 23:21:45 +05:30
it 'has all necessary texts' do
2021-09-30 23:02:18 +05:30
create(:ci_runner, :instance, contacted_at: Time.now)
2017-09-10 17:25:29 +05:30
visit admin_runners_path
2021-12-11 22:18:48 +05:30
expect(page).to have_text "Register an instance runner"
2018-11-20 20:47:30 +05:30
expect(page).to have_text "Runners currently online: 1"
2017-09-10 17:25:29 +05:30
end
2021-12-11 22:18:48 +05:30
it 'with an instance runner shows an instance badge' do
2021-09-30 23:02:18 +05:30
runner = create(:ci_runner, :instance)
visit admin_runners_path
within "[data-testid='runner-row-#{runner.id}']" do
expect(page).to have_selector '.badge', text: 'shared'
end
end
2021-12-11 22:18:48 +05:30
it 'with a group runner shows a group badge' do
2021-09-30 23:02:18 +05:30
runner = create(:ci_runner, :group, groups: [group])
visit admin_runners_path
within "[data-testid='runner-row-#{runner.id}']" do
expect(page).to have_selector '.badge', text: 'group'
end
end
2021-12-11 22:18:48 +05:30
it 'with a project runner shows a project badge' do
2021-09-30 23:02:18 +05:30
runner = create(:ci_runner, :project, projects: [project])
visit admin_runners_path
within "[data-testid='runner-row-#{runner.id}']" do
expect(page).to have_selector '.badge', text: 'specific'
end
end
describe 'search' do
2017-09-10 17:25:29 +05:30
before do
2021-09-30 23:02:18 +05:30
create(:ci_runner, :instance, description: 'runner-foo')
create(:ci_runner, :instance, description: 'runner-bar')
2018-12-05 23:21:45 +05:30
visit admin_runners_path
2017-09-10 17:25:29 +05:30
end
2021-12-11 22:18:48 +05:30
it 'runner types tabs have total counts and can be selected' do
expect(page).to have_link('All 2')
expect(page).to have_link('Instance 2')
expect(page).to have_link('Group 0')
expect(page).to have_link('Project 0')
end
2021-09-30 23:02:18 +05:30
it 'shows runners' do
expect(page).to have_content("runner-foo")
expect(page).to have_content("runner-bar")
end
2017-09-10 17:25:29 +05:30
it 'shows correct runner when description matches' do
2018-12-05 23:21:45 +05:30
input_filtered_search_keys('runner-foo')
2015-09-25 12:07:36 +05:30
2017-09-10 17:25:29 +05:30
expect(page).to have_content("runner-foo")
expect(page).not_to have_content("runner-bar")
end
it 'shows no runner when description does not match' do
2018-12-05 23:21:45 +05:30
input_filtered_search_keys('runner-baz')
expect(page).to have_text 'No runners found'
end
end
2021-09-30 23:02:18 +05:30
describe 'filter by status' do
2018-12-05 23:21:45 +05:30
it 'shows correct runner when status matches' do
2021-09-30 23:02:18 +05:30
create(:ci_runner, :instance, description: 'runner-active', active: true)
create(:ci_runner, :instance, description: 'runner-paused', active: false)
2018-12-05 23:21:45 +05:30
visit admin_runners_path
expect(page).to have_content 'runner-active'
expect(page).to have_content 'runner-paused'
2021-09-30 23:02:18 +05:30
input_filtered_search_filter_is_only('Status', 'Active')
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-active'
expect(page).not_to have_content 'runner-paused'
end
it 'shows no runner when status does not match' do
2021-09-30 23:02:18 +05:30
create(:ci_runner, :instance, description: 'runner-active', active: true)
create(:ci_runner, :instance, description: 'runner-paused', active: false)
2018-12-05 23:21:45 +05:30
visit admin_runners_path
2021-09-30 23:02:18 +05:30
input_filtered_search_filter_is_only('Status', 'Online')
2018-12-05 23:21:45 +05:30
expect(page).not_to have_content 'runner-active'
expect(page).not_to have_content 'runner-paused'
expect(page).to have_text 'No runners found'
end
it 'shows correct runner when status is selected and search term is entered' do
2021-09-30 23:02:18 +05:30
create(:ci_runner, :instance, description: 'runner-a-1', active: true)
create(:ci_runner, :instance, description: 'runner-a-2', active: false)
create(:ci_runner, :instance, description: 'runner-b-1', active: true)
2018-12-05 23:21:45 +05:30
visit admin_runners_path
2021-09-30 23:02:18 +05:30
input_filtered_search_filter_is_only('Status', 'Active')
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-a-1'
expect(page).to have_content 'runner-b-1'
expect(page).not_to have_content 'runner-a-2'
2021-09-30 23:02:18 +05:30
input_filtered_search_keys('runner-a')
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-a-1'
expect(page).not_to have_content 'runner-b-1'
expect(page).not_to have_content 'runner-a-2'
end
2021-12-11 22:18:48 +05:30
it 'shows correct runner when type is selected and search term is entered' do
create(:ci_runner, :instance, description: 'runner-connected', contacted_at: Time.now)
create(:ci_runner, :instance, description: 'runner-not-connected', contacted_at: nil)
visit admin_runners_path
# use the string "Not" to avoid using space and trigger an early selection
input_filtered_search_filter_is_only('Status', 'Not')
expect(page).not_to have_content 'runner-connected'
expect(page).to have_content 'runner-not-connected'
end
2018-12-05 23:21:45 +05:30
end
2021-09-30 23:02:18 +05:30
describe 'filter by type' do
before do
create(:ci_runner, :project, description: 'runner-project', projects: [project])
create(:ci_runner, :group, description: 'runner-group', groups: [group])
end
2018-12-05 23:21:45 +05:30
2021-12-11 22:18:48 +05:30
it '"All" tab is selected by default' do
visit admin_runners_path
page.within('[data-testid="runner-type-tabs"]') do
expect(page).to have_link('All', class: 'active')
end
end
2021-09-30 23:02:18 +05:30
it 'shows correct runner when type matches' do
2018-12-05 23:21:45 +05:30
visit admin_runners_path
expect(page).to have_content 'runner-project'
expect(page).to have_content 'runner-group'
2021-12-11 22:18:48 +05:30
page.within('[data-testid="runner-type-tabs"]') do
click_on('Project')
expect(page).to have_link('Project', class: 'active')
end
2021-09-30 23:02:18 +05:30
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-project'
expect(page).not_to have_content 'runner-group'
end
it 'shows no runner when type does not match' do
visit admin_runners_path
2021-12-11 22:18:48 +05:30
page.within('[data-testid="runner-type-tabs"]') do
click_on 'Instance'
expect(page).to have_link('Instance', class: 'active')
end
2018-12-05 23:21:45 +05:30
expect(page).not_to have_content 'runner-project'
expect(page).not_to have_content 'runner-group'
2017-09-10 17:25:29 +05:30
expect(page).to have_text 'No runners found'
end
2018-12-05 23:21:45 +05:30
it 'shows correct runner when type is selected and search term is entered' do
2021-09-30 23:02:18 +05:30
create(:ci_runner, :project, description: 'runner-2-project', projects: [project])
2018-12-05 23:21:45 +05:30
visit admin_runners_path
2021-12-11 22:18:48 +05:30
page.within('[data-testid="runner-type-tabs"]') do
click_on 'Project'
end
2018-12-05 23:21:45 +05:30
2021-09-30 23:02:18 +05:30
expect(page).to have_content 'runner-project'
expect(page).to have_content 'runner-2-project'
expect(page).not_to have_content 'runner-group'
input_filtered_search_keys('runner-project')
expect(page).to have_content 'runner-project'
expect(page).not_to have_content 'runner-2-project'
expect(page).not_to have_content 'runner-group'
2018-12-05 23:21:45 +05:30
end
2021-12-11 22:18:48 +05:30
it 'maintains the same filter when switching between runner types' do
create(:ci_runner, :project, description: 'runner-paused-project', active: false, projects: [project])
visit admin_runners_path
input_filtered_search_filter_is_only('Status', 'Active')
expect(page).to have_content 'runner-project'
expect(page).to have_content 'runner-group'
expect(page).not_to have_content 'runner-paused-project'
page.within('[data-testid="runner-type-tabs"]') do
click_on 'Project'
end
expect(page).to have_content 'runner-project'
expect(page).not_to have_content 'runner-group'
expect(page).not_to have_content 'runner-paused-project'
end
2018-12-05 23:21:45 +05:30
end
2021-09-30 23:02:18 +05:30
describe 'filter by tag' do
before do
create(:ci_runner, :instance, description: 'runner-blue', tag_list: ['blue'])
create(:ci_runner, :instance, description: 'runner-red', tag_list: ['red'])
end
2019-07-07 11:18:12 +05:30
2021-09-30 23:02:18 +05:30
it 'shows correct runner when tag matches' do
2019-07-07 11:18:12 +05:30
visit admin_runners_path
expect(page).to have_content 'runner-blue'
expect(page).to have_content 'runner-red'
2021-09-30 23:02:18 +05:30
input_filtered_search_filter_is_only('Tags', 'blue')
2019-07-07 11:18:12 +05:30
expect(page).to have_content 'runner-blue'
expect(page).not_to have_content 'runner-red'
end
it 'shows no runner when tag does not match' do
visit admin_runners_path
2021-09-30 23:02:18 +05:30
input_filtered_search_filter_is_only('Tags', 'green')
2019-07-07 11:18:12 +05:30
expect(page).not_to have_content 'runner-blue'
expect(page).to have_text 'No runners found'
end
it 'shows correct runner when tag is selected and search term is entered' do
2021-09-30 23:02:18 +05:30
create(:ci_runner, :instance, description: 'runner-2-blue', tag_list: ['blue'])
2019-07-07 11:18:12 +05:30
visit admin_runners_path
2021-09-30 23:02:18 +05:30
input_filtered_search_filter_is_only('Tags', 'blue')
2019-07-07 11:18:12 +05:30
2021-09-30 23:02:18 +05:30
expect(page).to have_content 'runner-blue'
expect(page).to have_content 'runner-2-blue'
expect(page).not_to have_content 'runner-red'
2019-07-07 11:18:12 +05:30
2021-09-30 23:02:18 +05:30
input_filtered_search_keys('runner-2-blue')
2019-07-07 11:18:12 +05:30
2021-09-30 23:02:18 +05:30
expect(page).to have_content 'runner-2-blue'
expect(page).not_to have_content 'runner-blue'
expect(page).not_to have_content 'runner-red'
2019-07-07 11:18:12 +05:30
end
end
2021-09-30 23:02:18 +05:30
it 'sorts by last contact date' do
create(:ci_runner, :instance, description: 'runner-1', created_at: '2018-07-12 15:37', contacted_at: '2018-07-12 15:37')
create(:ci_runner, :instance, description: 'runner-2', created_at: '2018-07-12 16:37', contacted_at: '2018-07-12 16:37')
2018-12-05 23:21:45 +05:30
visit admin_runners_path
2021-09-30 23:02:18 +05:30
within '[data-testid="runner-list"] tbody tr:nth-child(1)' do
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-2'
end
2021-09-30 23:02:18 +05:30
within '[data-testid="runner-list"] tbody tr:nth-child(2)' do
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-1'
end
2021-09-30 23:02:18 +05:30
click_on 'Created date' # Open "sort by" dropdown
click_on 'Last contact'
click_on 'Sort direction: Descending'
2018-12-05 23:21:45 +05:30
2021-09-30 23:02:18 +05:30
within '[data-testid="runner-list"] tbody tr:nth-child(1)' do
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-1'
end
2021-09-30 23:02:18 +05:30
within '[data-testid="runner-list"] tbody tr:nth-child(2)' do
2018-12-05 23:21:45 +05:30
expect(page).to have_content 'runner-2'
end
2017-09-10 17:25:29 +05:30
end
2017-08-17 22:00:37 +05:30
end
2015-09-25 12:07:36 +05:30
2017-09-10 17:25:29 +05:30
context "when there are no runners" do
2015-09-25 12:07:36 +05:30
before do
2017-09-10 17:25:29 +05:30
visit admin_runners_path
2015-09-25 12:07:36 +05:30
end
2017-09-10 17:25:29 +05:30
it 'has all necessary texts including no runner message' do
2021-12-11 22:18:48 +05:30
expect(page).to have_text "Register an instance runner"
2018-11-20 20:47:30 +05:30
expect(page).to have_text "Runners currently online: 0"
2017-09-10 17:25:29 +05:30
expect(page).to have_text 'No runners found'
2017-08-17 22:00:37 +05:30
end
2015-09-25 12:07:36 +05:30
end
2018-10-15 14:42:47 +05:30
2021-12-11 22:18:48 +05:30
describe 'runners registration' do
2021-09-04 01:27:46 +05:30
let!(:token) { Gitlab::CurrentSettings.runners_registration_token }
before do
visit admin_runners_path
2021-12-11 22:18:48 +05:30
click_on 'Register an instance runner'
end
describe 'show registration instructions' do
before do
click_on 'Show runner installation and registration instructions'
wait_for_requests
end
it 'opens runner installation modal' do
expect(page).to have_text "Install a runner"
expect(page).to have_text "Environment"
expect(page).to have_text "Architecture"
expect(page).to have_text "Download and install binary"
end
it 'dismisses runner installation modal' do
page.within('[role="dialog"]') do
click_button('Close', match: :first)
end
expect(page).not_to have_text "Install a runner"
end
2021-09-04 01:27:46 +05:30
end
it 'has a registration token' do
2021-09-30 23:02:18 +05:30
click_on 'Click to reveal'
2021-12-11 22:18:48 +05:30
expect(page.find('[data-testid="token-value"]')).to have_content(token)
2021-09-04 01:27:46 +05:30
end
describe 'reset registration token' do
2021-12-11 22:18:48 +05:30
let(:page_token) { find('[data-testid="token-value"]').text }
2021-09-04 01:27:46 +05:30
before do
2021-12-11 22:18:48 +05:30
click_on 'Reset registration token'
2021-09-30 23:02:18 +05:30
page.accept_alert
wait_for_requests
2021-09-04 01:27:46 +05:30
end
it 'changes registration token' do
2021-12-11 22:18:48 +05:30
click_on 'Register an instance runner'
2021-09-30 23:02:18 +05:30
click_on 'Click to reveal'
2021-09-04 01:27:46 +05:30
expect(page_token).not_to eq token
end
end
end
2015-09-25 12:07:36 +05:30
end
describe "Runner show page" do
2018-12-05 23:21:45 +05:30
let(:runner) { create(:ci_runner) }
2015-09-25 12:07:36 +05:30
before do
2018-12-05 23:21:45 +05:30
@project1 = create(:project)
@project2 = create(:project)
2015-12-23 02:04:40 +05:30
visit admin_runner_path(runner)
2015-09-25 12:07:36 +05:30
end
2021-02-22 17:27:13 +05:30
describe 'runner page breadcrumbs' do
2021-04-29 21:17:54 +05:30
it 'contains the current runner token' do
page.within '[data-testid="breadcrumb-links"]' do
expect(page.find('h2')).to have_content(runner.short_sha)
end
end
end
describe 'runner page title', :js do
it 'contains the runner id' do
expect(find('.page-title')).to have_content("Runner ##{runner.id}")
2021-02-22 17:27:13 +05:30
end
end
2015-09-25 12:07:36 +05:30
describe 'projects' do
2017-08-17 22:00:37 +05:30
it 'contains project names' do
2018-03-27 19:54:05 +05:30
expect(page).to have_content(@project1.full_name)
expect(page).to have_content(@project2.full_name)
2017-08-17 22:00:37 +05:30
end
2015-09-25 12:07:36 +05:30
end
describe 'search' do
before do
search_form = find('#runner-projects-search')
2015-12-23 02:04:40 +05:30
search_form.fill_in 'search', with: @project1.name
2015-09-25 12:07:36 +05:30
search_form.click_button 'Search'
end
2017-08-17 22:00:37 +05:30
it 'contains name of correct project' do
2018-03-27 19:54:05 +05:30
expect(page).to have_content(@project1.full_name)
expect(page).not_to have_content(@project2.full_name)
2017-08-17 22:00:37 +05:30
end
2015-09-25 12:07:36 +05:30
end
2016-06-22 15:30:34 +05:30
describe 'enable/create' do
2016-08-24 12:49:21 +05:30
shared_examples 'assignable runner' do
it 'enables a runner for a project' do
2021-04-29 21:17:54 +05:30
within '[data-testid="unassigned-projects"]' do
2016-08-24 12:49:21 +05:30
click_on 'Enable'
end
2021-04-29 21:17:54 +05:30
assigned_project = page.find('[data-testid="assigned-projects"]')
2016-08-24 12:49:21 +05:30
2021-11-11 11:23:49 +05:30
expect(page).to have_content('Runner assigned to project.')
2016-08-24 12:49:21 +05:30
expect(assigned_project).to have_content(@project2.path)
end
2016-06-22 15:30:34 +05:30
end
2016-08-24 12:49:21 +05:30
context 'with specific runner' do
2018-11-08 19:23:39 +05:30
let(:runner) { create(:ci_runner, :project, projects: [@project1]) }
2016-08-24 12:49:21 +05:30
before do
visit admin_runner_path(runner)
2016-06-22 15:30:34 +05:30
end
2016-08-24 12:49:21 +05:30
it_behaves_like 'assignable runner'
end
context 'with locked runner' do
2018-11-08 19:23:39 +05:30
let(:runner) { create(:ci_runner, :project, projects: [@project1], locked: true) }
2016-08-24 12:49:21 +05:30
before do
visit admin_runner_path(runner)
end
it_behaves_like 'assignable runner'
end
context 'with shared runner' do
2018-11-08 19:23:39 +05:30
let(:runner) { create(:ci_runner, :instance) }
2016-08-24 12:49:21 +05:30
before do
2021-04-29 21:17:54 +05:30
@project1.destroy!
2016-08-24 12:49:21 +05:30
visit admin_runner_path(runner)
end
2016-06-22 15:30:34 +05:30
2016-08-24 12:49:21 +05:30
it_behaves_like 'assignable runner'
2016-06-22 15:30:34 +05:30
end
end
describe 'disable/destroy' do
2018-11-08 19:23:39 +05:30
let(:runner) { create(:ci_runner, :project, projects: [@project1]) }
2016-06-22 15:30:34 +05:30
before do
visit admin_runner_path(runner)
end
2021-11-11 11:23:49 +05:30
it 'removed specific runner from project' do
2021-04-29 21:17:54 +05:30
within '[data-testid="assigned-projects"]' do
2016-06-22 15:30:34 +05:30
click_on 'Disable'
end
2021-04-29 21:17:54 +05:30
new_runner_project = page.find('[data-testid="unassigned-projects"]')
2016-06-22 15:30:34 +05:30
2021-11-11 11:23:49 +05:30
expect(page).to have_content('Runner unassigned from project.')
2016-06-22 15:30:34 +05:30
expect(new_runner_project).to have_content(@project1.path)
end
end
2015-09-25 12:07:36 +05:30
end
2021-09-30 23:02:18 +05:30
private
def search_bar_selector
'[data-testid="runners-filtered-search"]'
end
# The filters must be clicked first to be able to receive events
# See: https://gitlab.com/gitlab-org/gitlab-ui/-/issues/1493
def focus_filtered_search
page.within(search_bar_selector) do
page.find('.gl-filtered-search-term-token').click
end
end
def input_filtered_search_keys(search_term)
focus_filtered_search
page.within(search_bar_selector) do
page.find('input').send_keys(search_term)
click_on 'Search'
end
end
def input_filtered_search_filter_is_only(filter, value)
focus_filtered_search
page.within(search_bar_selector) do
click_on filter
# For OPERATOR_IS_ONLY, clicking the filter
# immediately preselects "=" operator
page.find('input').send_keys(value)
page.find('input').send_keys(:enter)
click_on 'Search'
end
end
2015-09-25 12:07:36 +05:30
end