2020-10-24 23:57:45 +05:30
# frozen_string_literal: true
require 'spec_helper'
RSpec . describe API :: Ci :: Runner , :clean_gitlab_redis_shared_state do
describe '/api/v4/runners' do
describe 'POST /api/v4/runners' do
context 'when no token is provided' do
it 'returns 400 error' do
post api ( '/runners' )
expect ( response ) . to have_gitlab_http_status ( :bad_request )
end
end
context 'when invalid token is provided' do
it 'returns 403 error' do
2022-05-07 20:08:51 +05:30
allow_next_instance_of ( :: Ci :: Runners :: RegisterRunnerService ) do | service |
2022-03-02 08:16:31 +05:30
allow ( service ) . to receive ( :execute ) . and_return ( nil )
end
2020-10-24 23:57:45 +05:30
post api ( '/runners' ) , params : { token : 'invalid' }
expect ( response ) . to have_gitlab_http_status ( :forbidden )
end
end
2022-03-02 08:16:31 +05:30
context 'when valid parameters are provided' do
2021-04-17 20:07:23 +05:30
def request
2020-10-24 23:57:45 +05:30
post api ( '/runners' ) , params : {
2022-03-02 08:16:31 +05:30
token : 'valid token' ,
description : 'server.hostname' ,
2022-04-04 11:22:00 +05:30
maintenance_note : 'Some maintainer notes' ,
2022-03-02 08:16:31 +05:30
run_untagged : false ,
tag_list : 'tag1, tag2' ,
locked : true ,
2022-04-04 11:22:00 +05:30
paused : false ,
2022-03-02 08:16:31 +05:30
access_level : 'ref_protected' ,
maximum_timeout : 9000
}
end
let_it_be ( :new_runner ) { create ( :ci_runner ) }
before do
2022-05-07 20:08:51 +05:30
allow_next_instance_of ( :: Ci :: Runners :: RegisterRunnerService ) do | service |
2022-03-02 08:16:31 +05:30
expected_params = {
description : 'server.hostname' ,
2022-04-04 11:22:00 +05:30
maintenance_note : 'Some maintainer notes' ,
2022-03-02 08:16:31 +05:30
run_untagged : false ,
tag_list : %w( tag1 tag2 ) ,
locked : true ,
active : true ,
access_level : 'ref_protected' ,
maximum_timeout : 9000
} . stringify_keys
2022-04-04 11:22:00 +05:30
expect ( service ) . to receive ( :execute )
2022-03-02 08:16:31 +05:30
. once
. with ( 'valid token' , a_hash_including ( expected_params ) )
. and_return ( new_runner )
2020-10-24 23:57:45 +05:30
end
end
2022-04-04 11:22:00 +05:30
context 'when token_expires_at is nil' do
it 'creates runner' do
request
2020-10-24 23:57:45 +05:30
2022-04-04 11:22:00 +05:30
expect ( response ) . to have_gitlab_http_status ( :created )
expect ( json_response ) . to eq ( { 'id' = > new_runner . id , 'token' = > new_runner . token , 'token_expires_at' = > nil } )
end
end
context 'when token_expires_at is a valid date' do
before do
new_runner . token_expires_at = DateTime . new ( 2022 , 1 , 11 , 14 , 39 , 24 )
end
it 'creates runner' do
request
expect ( response ) . to have_gitlab_http_status ( :created )
expect ( json_response ) . to eq ( { 'id' = > new_runner . id , 'token' = > new_runner . token , 'token_expires_at' = > '2022-01-11T14:39:24.000Z' } )
end
2020-10-24 23:57:45 +05:30
end
2022-03-02 08:16:31 +05:30
it_behaves_like 'storing arguments in the application context for the API' do
subject { request }
2020-10-24 23:57:45 +05:30
2022-03-02 08:16:31 +05:30
let ( :expected_params ) { { client_id : " runner/ #{ new_runner . id } " } }
2020-10-24 23:57:45 +05:30
end
2022-03-02 08:16:31 +05:30
it_behaves_like 'not executing any extra queries for the application context' do
let ( :subject_proc ) { proc { request } }
2020-10-24 23:57:45 +05:30
end
end
2022-04-04 11:22:00 +05:30
context 'when deprecated maintainer_note field is provided' do
RSpec :: Matchers . define_negated_matcher :excluding , :include
def request
post api ( '/runners' ) , params : {
token : 'valid token' ,
maintainer_note : 'Some maintainer notes'
}
end
let ( :new_runner ) { create ( :ci_runner ) }
it 'converts to maintenance_note param' do
2022-05-07 20:08:51 +05:30
allow_next_instance_of ( :: Ci :: Runners :: RegisterRunnerService ) do | service |
2022-04-04 11:22:00 +05:30
expect ( service ) . to receive ( :execute )
. once
. with ( 'valid token' , a_hash_including ( 'maintenance_note' = > 'Some maintainer notes' )
. and ( excluding ( 'maintainter_note' = > anything ) ) )
. and_return ( new_runner )
end
request
expect ( response ) . to have_gitlab_http_status ( :created )
end
end
context 'when deprecated active parameter is provided' do
def request
post api ( '/runners' ) , params : {
token : 'valid token' ,
active : false
}
end
let_it_be ( :new_runner ) { build ( :ci_runner ) }
it 'uses active value in registration' do
2022-05-07 20:08:51 +05:30
expect_next_instance_of ( :: Ci :: Runners :: RegisterRunnerService ) do | service |
2022-04-04 11:22:00 +05:30
expected_params = { active : false } . stringify_keys
expect ( service ) . to receive ( :execute )
. once
. with ( 'valid token' , a_hash_including ( expected_params ) )
. and_return ( new_runner )
end
request
expect ( response ) . to have_gitlab_http_status ( :created )
end
end
2022-03-02 08:16:31 +05:30
context 'calling actual register service' do
include StubGitlabCalls
2020-10-24 23:57:45 +05:30
2022-03-02 08:16:31 +05:30
let ( :registration_token ) { 'abcdefg123456' }
2020-10-24 23:57:45 +05:30
2022-03-02 08:16:31 +05:30
before do
stub_gitlab_calls
stub_application_setting ( runners_registration_token : registration_token )
allow_any_instance_of ( :: Ci :: Runner ) . to receive ( :cache_attributes )
2020-10-24 23:57:45 +05:30
end
2022-03-02 08:16:31 +05:30
%w( name version revision platform architecture ) . each do | param |
context " when info parameter ' #{ param } ' info is present " do
let ( :value ) { " #{ param } _value " }
2020-10-24 23:57:45 +05:30
2022-03-02 08:16:31 +05:30
it " updates provided Runner's parameter " do
post api ( '/runners' ) , params : {
token : registration_token ,
info : { param = > value }
}
2020-10-24 23:57:45 +05:30
2022-03-02 08:16:31 +05:30
expect ( response ) . to have_gitlab_http_status ( :created )
expect ( :: Ci :: Runner . last . read_attribute ( param . to_sym ) ) . to eq ( value )
end
2020-10-24 23:57:45 +05:30
end
end
2022-03-02 08:16:31 +05:30
it " sets the runner's ip_address " do
post api ( '/runners' ) ,
params : { token : registration_token } ,
headers : { 'X-Forwarded-For' = > '123.111.123.111' }
2020-10-24 23:57:45 +05:30
2022-03-02 08:16:31 +05:30
expect ( response ) . to have_gitlab_http_status ( :created )
expect ( :: Ci :: Runner . last . ip_address ) . to eq ( '123.111.123.111' )
2020-10-24 23:57:45 +05:30
end
2022-04-01 21:47:47 +05:30
context 'when tags parameter is provided' do
def request
post api ( '/runners' ) , params : {
token : registration_token ,
tag_list : tag_list
}
end
context 'with number of tags above limit' do
let ( :tag_list ) { ( 1 .. :: Ci :: Runner :: TAG_LIST_MAX_LENGTH + 1 ) . map { | i | " tag #{ i } " } }
it 'uses tag_list value in registration and returns error' do
2022-05-07 20:08:51 +05:30
expect_next_instance_of ( :: Ci :: Runners :: RegisterRunnerService ) do | service |
2022-04-01 21:47:47 +05:30
expected_params = { tag_list : tag_list } . stringify_keys
expect ( service ) . to receive ( :execute )
. once
. with ( registration_token , a_hash_including ( expected_params ) )
. and_call_original
end
request
expect ( response ) . to have_gitlab_http_status ( :bad_request )
expect ( json_response . dig ( 'message' , 'tags_list' ) ) . to contain_exactly ( " Too many tags specified. Please limit the number of tags to #{ :: Ci :: Runner :: TAG_LIST_MAX_LENGTH } " )
end
end
context 'with number of tags below limit' do
let ( :tag_list ) { ( 1 .. 20 ) . map { | i | " tag #{ i } " } }
it 'uses tag_list value in registration and successfully creates runner' do
2022-05-07 20:08:51 +05:30
expect_next_instance_of ( :: Ci :: Runners :: RegisterRunnerService ) do | service |
2022-04-01 21:47:47 +05:30
expected_params = { tag_list : tag_list } . stringify_keys
expect ( service ) . to receive ( :execute )
. once
. with ( registration_token , a_hash_including ( expected_params ) )
. and_call_original
end
request
expect ( response ) . to have_gitlab_http_status ( :created )
end
end
end
2020-10-24 23:57:45 +05:30
end
end
end
end