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
153
154
155
156
157
158
159
160
161
162
163
|
# frozen_string_literal: true
module Ci
class RunnersFinder < UnionFinder
include Gitlab::Allowable
DEFAULT_SORT = 'created_at_desc'
def initialize(current_user:, params:)
@params = params
@group = params.delete(:group)
@project = params.delete(:project)
@current_user = current_user
end
def execute
items = if @project
project_runners
elsif @group
group_runners
else
all_runners
end
items = search(items)
items = by_active(items)
items = by_status(items)
items = by_upgrade_status(items)
items = by_runner_type(items)
items = by_tag_list(items)
items = by_creator_id(items)
items = by_creator_username(items)
items = by_version_prefix(items)
items = request_tag_list(items)
sort(items)
end
def sort_key
allowed_sorts.include?(@params[:sort]) ? @params[:sort] : DEFAULT_SORT
end
private
attr_reader :group, :project
def allowed_sorts
%w[contacted_asc contacted_desc created_at_asc created_at_desc created_date token_expires_at_asc token_expires_at_desc]
end
def all_runners
raise Gitlab::Access::AccessDeniedError unless @current_user&.can_admin_all_resources?
Ci::Runner.all
end
def group_runners
raise Gitlab::Access::AccessDeniedError unless can?(@current_user, :read_group_runners, @group)
case @params[:membership]
when :direct
Ci::Runner.belonging_to_group(@group.id)
when :descendants, nil
Ci::Runner.belonging_to_group_or_project_descendants(@group.id)
when :all_available
unless can?(@current_user, :read_group_all_available_runners, @group)
raise Gitlab::Access::AccessDeniedError
end
Ci::Runner.usable_from_scope(@group)
else
raise ArgumentError, 'Invalid membership filter'
end
end
def project_runners
raise Gitlab::Access::AccessDeniedError unless can?(@current_user, :read_project_runners, @project)
::Ci::Runner.owned_or_instance_wide(@project.id)
end
def search(items)
return items unless @params[:search].present?
items.search(@params[:search])
end
def by_active(items)
return items if @params.exclude?(:active)
items.active(@params[:active])
end
def by_status(items)
status = @params[:status_status].presence
return items unless status
items.with_status(status)
end
def by_upgrade_status(items)
upgrade_status = @params[:upgrade_status]
return items unless upgrade_status
unless Ci::RunnerVersion.statuses.key?(upgrade_status)
raise ArgumentError, "Invalid upgrade status value '#{upgrade_status}'"
end
items.with_upgrade_status(upgrade_status)
end
def by_runner_type(items)
runner_type = @params[:type_type].presence
return items unless runner_type
items.with_runner_type(runner_type)
end
def by_tag_list(items)
tag_list = @params[:tag_name].presence
return items unless tag_list
items.tagged_with(tag_list)
end
def by_creator_id(items)
creator_id = @params[:creator_id].presence
return items unless creator_id
items.with_creator_id(creator_id)
end
def by_creator_username(items)
creator_username = @params[:creator_username].presence
return items unless creator_username
creator_id = User.find_by_username(creator_username)&.id
return Ci::Runner.none unless creator_id
items.with_creator_id(creator_id)
end
def by_version_prefix(items)
sanitized_prefix = @params.fetch(:version_prefix, '')[/^[\d+.]+/]
return items unless sanitized_prefix
items.with_version_prefix(sanitized_prefix)
end
def sort(items)
items.order_by(sort_key)
end
def request_tag_list(items)
return items if @params.include?(:preload) && !@params.dig(:preload, :tag_name) # Backward-compatible behavior
items.with_tags
end
end
end
Ci::RunnersFinder.prepend_mod
|