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

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/graphql/types/ci/runner_type.rb')
-rw-r--r--app/graphql/types/ci/runner_type.rb36
1 files changed, 33 insertions, 3 deletions
diff --git a/app/graphql/types/ci/runner_type.rb b/app/graphql/types/ci/runner_type.rb
index 837d91ef765..9c5041b0860 100644
--- a/app/graphql/types/ci/runner_type.rb
+++ b/app/graphql/types/ci/runner_type.rb
@@ -6,6 +6,10 @@ module Types
graphql_name 'CiRunner'
authorize :read_runner
+ JOB_COUNT_LIMIT = 1000
+
+ alias_method :runner, :object
+
field :id, ::Types::GlobalIDType[::Ci::Runner], null: false,
description: 'ID of the runner.'
field :description, GraphQL::STRING_TYPE, null: true,
@@ -21,22 +25,48 @@ module Types
description: 'Indicates the runner is allowed to receive jobs.'
field :status, ::Types::Ci::RunnerStatusEnum, null: false,
description: 'Status of the runner.'
- field :version, GraphQL::STRING_TYPE, null: false,
+ field :version, GraphQL::STRING_TYPE, null: true,
description: 'Version of the runner.'
field :short_sha, GraphQL::STRING_TYPE, null: true,
description: %q(First eight characters of the runner's token used to authenticate new job requests. Used as the runner's unique ID.)
- field :revision, GraphQL::STRING_TYPE, null: false,
+ field :revision, GraphQL::STRING_TYPE, null: true,
description: 'Revision of the runner.'
field :locked, GraphQL::BOOLEAN_TYPE, null: true,
description: 'Indicates the runner is locked.'
field :run_untagged, GraphQL::BOOLEAN_TYPE, null: false,
description: 'Indicates the runner is able to run untagged jobs.'
- field :ip_address, GraphQL::STRING_TYPE, null: false,
+ field :ip_address, GraphQL::STRING_TYPE, null: true,
description: 'IP address of the runner.'
field :runner_type, ::Types::Ci::RunnerTypeEnum, null: false,
description: 'Type of the runner.'
field :tag_list, [GraphQL::STRING_TYPE], null: true,
description: 'Tags associated with the runner.'
+ field :project_count, GraphQL::INT_TYPE, null: true,
+ description: 'Number of projects that the runner is associated with.'
+ field :job_count, GraphQL::INT_TYPE, null: true,
+ description: "Number of jobs processed by the runner (limited to #{JOB_COUNT_LIMIT}, plus one to indicate that more items exist)."
+
+ def job_count
+ # We limit to 1 above the JOB_COUNT_LIMIT to indicate that more items exist after JOB_COUNT_LIMIT
+ runner.builds.limit(JOB_COUNT_LIMIT + 1).count
+ end
+
+ # rubocop: disable CodeReuse/ActiveRecord
+ def project_count
+ BatchLoader::GraphQL.for(runner.id).batch(key: :runner_project_count) do |ids, loader, args|
+ counts = ::Ci::Runner.project_type
+ .select(:id, 'COUNT(ci_runner_projects.id) as count')
+ .left_outer_joins(:runner_projects)
+ .where(id: ids)
+ .group(:id)
+ .index_by(&:id)
+
+ ids.each do |id|
+ loader.call(id, counts[id]&.count)
+ end
+ end
+ end
+ # rubocop: enable CodeReuse/ActiveRecord
end
end
end