Welcome to mirror list, hosted at ThFree Co, Russian Federation.

runners_finder.rb « ci « finders « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 66b16e875c128fa69d558cd7d3a31f7fa159156c (plain)
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