1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state, feature_category: :runner do
include StubGitlabCalls
include RedisHelpers
include WorkhorseHelpers
let(:registration_token) { 'abcdefg123456' }
before do
stub_feature_flags(ci_enable_live_trace: true)
stub_gitlab_calls
stub_application_setting(runners_registration_token: registration_token)
allow_any_instance_of(::Ci::Runner).to receive(:cache_attributes)
end
describe '/api/v4/runners' do
describe 'POST /api/v4/runners/verify' do
let_it_be_with_reload(:runner) { create(:ci_runner, token_expires_at: 3.days.from_now) }
let(:params) {}
subject(:verify) { post api('/runners/verify'), params: params }
context 'when no token is provided' do
it 'returns 400 error' do
post api('/runners/verify')
expect(response).to have_gitlab_http_status :bad_request
end
end
context 'when invalid token is provided' do
let(:params) { { token: 'invalid-token' } }
it 'returns 403 error' do
verify
expect(response).to have_gitlab_http_status(:forbidden)
end
end
context 'when valid token is provided' do
let(:params) { { token: runner.token } }
context 'with create_runner_machine FF enabled' do
before do
stub_feature_flags(create_runner_machine: true)
end
it 'verifies Runner credentials' do
verify
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq({
'id' => runner.id,
'token' => runner.token,
'token_expires_at' => runner.token_expires_at.iso8601(3)
})
end
context 'with non-expiring runner token' do
before do
runner.update!(token_expires_at: nil)
end
it 'verifies Runner credentials' do
verify
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq({
'id' => runner.id,
'token' => runner.token,
'token_expires_at' => nil
})
end
end
it_behaves_like 'storing arguments in the application context for the API' do
let(:expected_params) { { client_id: "runner/#{runner.id}" } }
end
context 'when system_id is provided' do
let(:params) { { token: runner.token, system_id: 's_some_system_id' } }
it 'creates a runner_machine' do
expect { verify }.to change { Ci::RunnerMachine.count }.by(1)
end
end
end
context 'with create_runner_machine FF disabled' do
before do
stub_feature_flags(create_runner_machine: false)
end
it 'verifies Runner credentials' do
verify
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq({
'id' => runner.id,
'token' => runner.token,
'token_expires_at' => runner.token_expires_at.iso8601(3)
})
end
context 'when system_id is provided' do
let(:params) { { token: runner.token, system_id: 's_some_system_id' } }
it 'does not create a runner_machine', :aggregate_failures do
expect { verify }.not_to change { Ci::RunnerMachine.count }
expect(response).to have_gitlab_http_status(:ok)
end
end
end
end
context 'when non-expired token is provided' do
let(:params) { { token: runner.token } }
it 'verifies Runner credentials' do
runner["token_expires_at"] = 10.days.from_now
runner.save!
verify
expect(response).to have_gitlab_http_status(:ok)
expect(json_response).to eq({
'id' => runner.id,
'token' => runner.token,
'token_expires_at' => runner.token_expires_at.iso8601(3)
})
end
end
context 'when expired token is provided' do
let(:params) { { token: runner.token } }
it 'does not verify Runner credentials' do
runner["token_expires_at"] = 10.days.ago
runner.save!
verify
expect(response).to have_gitlab_http_status(:forbidden)
end
end
end
end
end
|