diff options
Diffstat (limited to 'app/finders/ci/runners_finder.rb')
-rw-r--r-- | app/finders/ci/runners_finder.rb | 149 |
1 files changed, 75 insertions, 74 deletions
diff --git a/app/finders/ci/runners_finder.rb b/app/finders/ci/runners_finder.rb index 945d332ff47..18be2aec2e2 100644 --- a/app/finders/ci/runners_finder.rb +++ b/app/finders/ci/runners_finder.rb @@ -14,18 +14,25 @@ module Ci end def execute - search! - filter_by_active! - filter_by_status! - filter_by_upgrade_status! - filter_by_runner_type! - filter_by_tag_list! - filter_by_creator_id! - filter_by_version_prefix! - sort! - request_tag_list! - - @runners + 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_version_prefix(items) + items = request_tag_list(items) + + sort(items) end def sort_key @@ -40,110 +47,104 @@ module Ci %w[contacted_asc contacted_desc created_at_asc created_at_desc created_date token_expires_at_asc token_expires_at_desc] end - def search! - if @project - project_runners - elsif @group - group_runners - else - all_runners - end - - @runners = @runners.search(@params[:search]) if @params[:search].present? - end - def all_runners raise Gitlab::Access::AccessDeniedError unless @current_user&.can_admin_all_resources? - @runners = Ci::Runner.all + Ci::Runner.all end def group_runners raise Gitlab::Access::AccessDeniedError unless can?(@current_user, :read_group_runners, @group) - @runners = 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 + 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) - @runners = ::Ci::Runner.owned_or_instance_wide(@project.id) + ::Ci::Runner.owned_or_instance_wide(@project.id) + end + + def search(items) + return items unless @params[:search].present? + + items.search(@params[:search]) end - def filter_by_active! - @runners = @runners.active(@params[:active]) if @params.include?(:active) + def by_active(items) + return items if @params.exclude?(:active) + + items.active(@params[:active]) end - def filter_by_status! - filter_by!(:status_status, Ci::Runner::AVAILABLE_STATUSES) + def by_status(items) + status = @params[:status_status].presence + return items unless status + + items.with_status(status) end - def filter_by_upgrade_status! + def by_upgrade_status(items) upgrade_status = @params[:upgrade_status] - return unless upgrade_status + return items unless upgrade_status unless Ci::RunnerVersion.statuses.key?(upgrade_status) raise ArgumentError, "Invalid upgrade status value '#{upgrade_status}'" end - @runners = @runners.with_upgrade_status(upgrade_status) + items.with_upgrade_status(upgrade_status) end - def filter_by_runner_type! - filter_by!(:type_type, Ci::Runner::AVAILABLE_TYPES) + def by_runner_type(items) + runner_type = @params[:type_type].presence + return items unless runner_type + + items.with_runner_type(runner_type) end - def filter_by_tag_list! + def by_tag_list(items) tag_list = @params[:tag_name].presence + return items unless tag_list - if tag_list - @runners = @runners.tagged_with(tag_list) - end + items.tagged_with(tag_list) end - def filter_by_creator_id! - creator_id = @params[:creator_id] - @runners = @runners.with_creator_id(creator_id) if creator_id.present? - end + def by_creator_id(items) + creator_id = @params[:creator_id].presence + return items unless creator_id - def filter_by_version_prefix! - return @runners unless @params[:version_prefix] - - sanitized_prefix = @params[:version_prefix][/^[\d+.]+/] - - return @runners unless sanitized_prefix - - @runners = @runners.with_version_prefix(sanitized_prefix) + items.with_creator_id(creator_id) end - def sort! - @runners = @runners.order_by(sort_key) + 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 request_tag_list! - @runners = @runners.with_tags if !@params[:preload].present? || @params.dig(:preload, :tag_name) + def sort(items) + items.order_by(sort_key) end - def filter_by!(scope_name, available_scopes) - scope = @params[scope_name] + def request_tag_list(items) + return items if @params.include?(:preload) && !@params.dig(:preload, :tag_name) # Backward-compatible behavior - if scope.present? && available_scopes.include?(scope) - @runners = @runners.public_send(scope) # rubocop:disable GitlabSecurity/PublicSend - end + items.with_tags end end end |