summaryrefslogtreecommitdiff
path: root/app/finders/ci
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-03-14 00:09:30 +0000
committerGitLab Bot <gitlab-bot@gitlab.com>2020-03-14 00:09:30 +0000
commit8957ace3159e5369a700a77614493ed6a8a98f93 (patch)
tree98ff5be0caa30cfebb4e0cd0ae2ceaf21ce92eb4 /app/finders/ci
parent232e0a31f1e5d5b3a788dfc3dba8f8d41df36bf9 (diff)
downloadgitlab-ce-8957ace3159e5369a700a77614493ed6a8a98f93.tar.gz
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app/finders/ci')
-rw-r--r--app/finders/ci/jobs_finder.rb53
-rw-r--r--app/finders/ci/pipeline_schedules_finder.rb28
-rw-r--r--app/finders/ci/pipelines_finder.rb158
-rw-r--r--app/finders/ci/runner_jobs_finder.rb45
4 files changed, 284 insertions, 0 deletions
diff --git a/app/finders/ci/jobs_finder.rb b/app/finders/ci/jobs_finder.rb
new file mode 100644
index 00000000000..2169bf8c53e
--- /dev/null
+++ b/app/finders/ci/jobs_finder.rb
@@ -0,0 +1,53 @@
+# frozen_string_literal: true
+
+module Ci
+ class JobsFinder
+ include Gitlab::Allowable
+
+ def initialize(current_user:, project: nil, params: {})
+ @current_user = current_user
+ @project = project
+ @params = params
+ end
+
+ def execute
+ builds = init_collection.order_id_desc
+ filter_by_scope(builds)
+ rescue Gitlab::Access::AccessDeniedError
+ Ci::Build.none
+ end
+
+ private
+
+ attr_reader :current_user, :project, :params
+
+ def init_collection
+ project ? project_builds : all_builds
+ end
+
+ def all_builds
+ raise Gitlab::Access::AccessDeniedError unless current_user&.admin?
+
+ Ci::Build.all
+ end
+
+ def project_builds
+ raise Gitlab::Access::AccessDeniedError unless can?(current_user, :read_build, project)
+
+ project.builds.relevant
+ end
+
+ def filter_by_scope(builds)
+ case params[:scope]
+ when 'pending'
+ builds.pending.reverse_order
+ when 'running'
+ builds.running.reverse_order
+ when 'finished'
+ builds.finished
+ else
+ builds
+ end
+ end
+ end
+end
diff --git a/app/finders/ci/pipeline_schedules_finder.rb b/app/finders/ci/pipeline_schedules_finder.rb
new file mode 100644
index 00000000000..2544c8c3254
--- /dev/null
+++ b/app/finders/ci/pipeline_schedules_finder.rb
@@ -0,0 +1,28 @@
+# frozen_string_literal: true
+
+module Ci
+ class PipelineSchedulesFinder
+ attr_reader :project, :pipeline_schedules
+
+ def initialize(project)
+ @project = project
+ @pipeline_schedules = project.pipeline_schedules
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def execute(scope: nil)
+ scoped_schedules =
+ case scope
+ when 'active'
+ pipeline_schedules.active
+ when 'inactive'
+ pipeline_schedules.inactive
+ else
+ pipeline_schedules
+ end
+
+ scoped_schedules.order(id: :desc)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/finders/ci/pipelines_finder.rb b/app/finders/ci/pipelines_finder.rb
new file mode 100644
index 00000000000..9e71e92b456
--- /dev/null
+++ b/app/finders/ci/pipelines_finder.rb
@@ -0,0 +1,158 @@
+# frozen_string_literal: true
+
+module Ci
+ class PipelinesFinder
+ attr_reader :project, :pipelines, :params, :current_user
+
+ ALLOWED_INDEXED_COLUMNS = %w[id status ref updated_at user_id].freeze
+
+ def initialize(project, current_user, params = {})
+ @project = project
+ @current_user = current_user
+ @pipelines = project.all_pipelines
+ @params = params
+ end
+
+ def execute
+ unless Ability.allowed?(current_user, :read_pipeline, project)
+ return Ci::Pipeline.none
+ end
+
+ items = pipelines.no_child
+ items = by_scope(items)
+ items = by_status(items)
+ items = by_ref(items)
+ items = by_sha(items)
+ items = by_name(items)
+ items = by_username(items)
+ items = by_yaml_errors(items)
+ items = by_updated_at(items)
+ sort_items(items)
+ end
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def ids_for_ref(refs)
+ pipelines.where(ref: refs).group(:ref).select('max(id)')
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def from_ids(ids)
+ pipelines.unscoped.where(project_id: project.id, id: ids)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def branches
+ project.repository.branch_names
+ end
+
+ def tags
+ project.repository.tag_names
+ end
+
+ def by_scope(items)
+ case params[:scope]
+ when 'running'
+ items.running
+ when 'pending'
+ items.pending
+ when 'finished'
+ items.finished
+ when 'branches'
+ from_ids(ids_for_ref(branches))
+ when 'tags'
+ from_ids(ids_for_ref(tags))
+ else
+ items
+ end
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_status(items)
+ return items unless HasStatus::AVAILABLE_STATUSES.include?(params[:status])
+
+ items.where(status: params[:status])
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_ref(items)
+ if params[:ref].present?
+ items.where(ref: params[:ref])
+ else
+ items
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_sha(items)
+ if params[:sha].present?
+ items.where(sha: params[:sha])
+ else
+ items
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_name(items)
+ if params[:name].present?
+ items.joins(:user).where(users: { name: params[:name] })
+ else
+ items
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_username(items)
+ if params[:username].present?
+ items.joins(:user).where(users: { username: params[:username] })
+ else
+ items
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_yaml_errors(items)
+ case Gitlab::Utils.to_boolean(params[:yaml_errors])
+ when true
+ items.where("yaml_errors IS NOT NULL")
+ when false
+ items.where("yaml_errors IS NULL")
+ else
+ items
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ def by_updated_at(items)
+ items = items.updated_before(params[:updated_before]) if params[:updated_before].present?
+ items = items.updated_after(params[:updated_after]) if params[:updated_after].present?
+
+ items
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def sort_items(items)
+ order_by = if ALLOWED_INDEXED_COLUMNS.include?(params[:order_by])
+ params[:order_by]
+ else
+ :id
+ end
+
+ sort = if params[:sort] =~ /\A(ASC|DESC)\z/i
+ params[:sort]
+ else
+ :desc
+ end
+
+ items.order(order_by => sort)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end
diff --git a/app/finders/ci/runner_jobs_finder.rb b/app/finders/ci/runner_jobs_finder.rb
new file mode 100644
index 00000000000..ffcdb407e7e
--- /dev/null
+++ b/app/finders/ci/runner_jobs_finder.rb
@@ -0,0 +1,45 @@
+# frozen_string_literal: true
+
+module Ci
+ class RunnerJobsFinder
+ attr_reader :runner, :params
+
+ ALLOWED_INDEXED_COLUMNS = %w[id].freeze
+
+ def initialize(runner, params = {})
+ @runner = runner
+ @params = params
+ end
+
+ def execute
+ items = @runner.builds
+ items = by_status(items)
+ sort_items(items)
+ end
+
+ private
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def by_status(items)
+ return items unless HasStatus::AVAILABLE_STATUSES.include?(params[:status])
+
+ items.where(status: params[:status])
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def sort_items(items)
+ return items unless ALLOWED_INDEXED_COLUMNS.include?(params[:order_by])
+
+ order_by = params[:order_by]
+ sort = if /\A(ASC|DESC)\z/i.match?(params[:sort])
+ params[:sort]
+ else
+ :desc
+ end
+
+ items.order(order_by => sort)
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
+ end
+end