diff options
Diffstat (limited to 'app/graphql/resolvers/ci')
5 files changed, 98 insertions, 14 deletions
diff --git a/app/graphql/resolvers/ci/project_runners_resolver.rb b/app/graphql/resolvers/ci/project_runners_resolver.rb new file mode 100644 index 00000000000..378fa73c065 --- /dev/null +++ b/app/graphql/resolvers/ci/project_runners_resolver.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +module Resolvers + module Ci + class ProjectRunnersResolver < RunnersResolver + type Types::Ci::RunnerType.connection_type, null: true + + def parent_param + raise 'Expected project missing' unless parent.is_a?(Project) + + { project: parent } + end + end + end +end diff --git a/app/graphql/resolvers/ci/runner_groups_resolver.rb b/app/graphql/resolvers/ci/runner_groups_resolver.rb new file mode 100644 index 00000000000..3360e820bd2 --- /dev/null +++ b/app/graphql/resolvers/ci/runner_groups_resolver.rb @@ -0,0 +1,45 @@ +# frozen_string_literal: true + +module Resolvers + module Ci + class RunnerGroupsResolver < BaseResolver + include Gitlab::Graphql::Authorize::AuthorizeResource + include ResolvesGroups + + type Types::GroupConnection, null: true + + authorize :read_runner + authorizes_object! + + alias_method :runner, :object + + def resolve_with_lookahead(**args) + return unless runner.group_type? + + BatchLoader::GraphQL.for(runner.id).batch(key: :runner_namespaces) do |runner_ids, loader| + plucked_runner_and_namespace_ids = + ::Ci::RunnerNamespace + .for_runner(runner_ids) + .select(:runner_id, :namespace_id) + .pluck(:runner_id, :namespace_id) # rubocop: disable CodeReuse/ActiveRecord) + + namespace_ids = plucked_runner_and_namespace_ids.collect(&:last).uniq + groups = apply_lookahead(::Group.id_in(namespace_ids)) + Preloaders::GroupPolicyPreloader.new(groups, current_user).execute + groups_by_id = groups.index_by(&:id) + + runner_group_ids_by_runner_id = + plucked_runner_and_namespace_ids + .group_by { |runner_id, _namespace_id| runner_id } + .transform_values { |values| values.filter_map { |_runner_id, namespace_id| groups_by_id[namespace_id] } } + + runner_ids.each do |runner_id| + runner_namespaces = runner_group_ids_by_runner_id[runner_id] || [] + + loader.call(runner_id, runner_namespaces) + end + end + end + end + end +end diff --git a/app/graphql/resolvers/ci/runner_jobs_resolver.rb b/app/graphql/resolvers/ci/runner_jobs_resolver.rb index de00aadaea8..b818be3f018 100644 --- a/app/graphql/resolvers/ci/runner_jobs_resolver.rb +++ b/app/graphql/resolvers/ci/runner_jobs_resolver.rb @@ -27,9 +27,17 @@ module Resolvers def preloads { - previous_stage_jobs_and_needs: [:needs, :pipeline], + previous_stage_jobs_or_needs: [:needs, :pipeline], artifacts: [:job_artifacts], - pipeline: [:user] + pipeline: [:user], + detailed_status: [ + :metadata, + { pipeline: [:merge_request] }, + { project: [:route, { namespace: :route }] } + ], + commit_path: [:pipeline, { project: [:route, { namespace: [:route] }] }], + short_sha: [:pipeline], + tags: [:tags] } end end diff --git a/app/graphql/resolvers/ci/runner_owner_project_resolver.rb b/app/graphql/resolvers/ci/runner_owner_project_resolver.rb index da8fab93619..f4e044b81c9 100644 --- a/app/graphql/resolvers/ci/runner_owner_project_resolver.rb +++ b/app/graphql/resolvers/ci/runner_owner_project_resolver.rb @@ -13,20 +13,22 @@ module Resolvers resolve_owner end - def preloads - { - full_path: [:route] - } - end - private - def filtered_preloads - selection = lookahead + def node_selection(selection = lookahead) + # There are no nodes or edges selections in RunnerOwnerProjectResolver, but rather a project directly + selection + end + + def unconditional_includes + [:project_feature] + end - preloads.each.flat_map do |name, requirements| - selection&.selects?(name) ? requirements : [] - end + def preloads + { + full_path: [:route, { namespace: [:route] }], + web_url: [:route, { namespace: [:route] }] + } end def resolve_owner @@ -48,7 +50,7 @@ module Resolvers .transform_values { |runner_projects| runner_projects.first.project_id } project_ids = owner_project_id_by_runner_id.values.uniq - projects = Project.where(id: project_ids) + projects = apply_lookahead(Project.id_in(project_ids)) Preloaders::ProjectPolicyPreloader.new(projects, current_user).execute projects_by_id = projects.index_by(&:id) diff --git a/app/graphql/resolvers/ci/runner_projects_resolver.rb b/app/graphql/resolvers/ci/runner_projects_resolver.rb index af9a67acfda..2a2d63f85de 100644 --- a/app/graphql/resolvers/ci/runner_projects_resolver.rb +++ b/app/graphql/resolvers/ci/runner_projects_resolver.rb @@ -40,6 +40,7 @@ module Resolvers params: project_finder_params(args), project_ids_relation: project_ids) .execute + projects = apply_lookahead(projects) Preloaders::ProjectPolicyPreloader.new(projects, current_user).execute projects_by_id = projects.index_by(&:id) @@ -58,6 +59,19 @@ module Resolvers end # rubocop:enable CodeReuse/ActiveRecord end + + private + + def unconditional_includes + [:project_feature] + end + + def preloads + super.merge({ + full_path: [:route, { namespace: [:route] }], + web_url: [:route, { namespace: [:route] }] + }) + end end end end |