summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexis Reigel <alexis.reigel.ext@siemens.com>2017-10-05 20:53:24 +0200
committerAlexis Reigel <alexis.reigel.ext@siemens.com>2018-02-28 09:50:51 +0100
commit66353d22385115753aa16c30a5bcd0942fbaca52 (patch)
tree74be947736d32ebeb3332a7b2088b2ae0b013c06
parent5f59ff0aff75ebe9586a91e921fc5e4f09ae4b34 (diff)
downloadgitlab-ce-66353d22385115753aa16c30a5bcd0942fbaca52.tar.gz
support group hierarchies for group runners
-rw-r--r--app/models/ci/runner.rb11
-rw-r--r--spec/models/ci/runner_spec.rb9
2 files changed, 13 insertions, 7 deletions
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index dde0602dfbc..1b9c2f70a84 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -30,13 +30,10 @@ module Ci
joins(:runner_projects).where(ci_runner_projects: { project_id: project_id })
}
scope :belonging_to_group, -> (project_id) {
- joins(
- %{
- INNER JOIN ci_runner_groups ON ci_runner_groups.runner_id = ci_runners.id
- INNER JOIN namespaces ON namespaces.id = ci_runner_groups.group_id
- INNER JOIN projects ON projects.namespace_id = namespaces.id
- }
- ).where('projects.id = :project_id', project_id: project_id)
+ project_groups = Group.joins(:projects).where(projects: { id: project_id })
+ hierarchy_groups = Gitlab::GroupHierarchy.new(project_groups).base_and_ancestors
+
+ joins(:groups).where(namespaces: { id: hierarchy_groups })
}
scope :owned_or_shared, -> (project_id) do
diff --git a/spec/models/ci/runner_spec.rb b/spec/models/ci/runner_spec.rb
index 1456c44dbf6..ba0db43a1e7 100644
--- a/spec/models/ci/runner_spec.rb
+++ b/spec/models/ci/runner_spec.rb
@@ -93,6 +93,15 @@ describe Ci::Runner do
expect(described_class.belonging_to_group(specific_project.id)).to eq [specific_runner]
end
+
+ it 'returns the group runner from a parent group' do
+ parent_group = create :group
+ group = create :group, parent: parent_group
+ project = create :project, group: group
+ runner = create :ci_runner, :specific, groups: [parent_group]
+
+ expect(described_class.belonging_to_group(project.id)).to eq [runner]
+ end
end
describe '.owned_or_shared' do