summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLin Jen-Shin <godfat@godfat.org>2016-06-01 18:34:20 +0800
committerLin Jen-Shin <godfat@godfat.org>2016-06-09 16:00:24 +0800
commit4f7f3258c18dfc207b838401f5ed71a3197eb22d (patch)
tree000b69e4ab22149b118daa6fae1f23c8d6c10088
parent860760120843ea5ad003cc2f52b28cf0fc7c647b (diff)
downloadgitlab-ce-4f7f3258c18dfc207b838401f5ed71a3197eb22d.tar.gz
Implement the logic for locking runner
-rw-r--r--app/models/ci/build.rb4
-rw-r--r--app/models/ci/runner.rb18
-rw-r--r--spec/models/build_spec.rb55
3 files changed, 72 insertions, 5 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index b8ada6361ac..860ac16eefd 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -291,9 +291,7 @@ module Ci
end
def can_be_served?(runner)
- return false unless has_tags? || runner.run_untagged?
-
- (tag_list - runner.tag_list).empty?
+ runner.can_serve?(self)
end
def has_tags?
diff --git a/app/models/ci/runner.rb b/app/models/ci/runner.rb
index adb65292208..d61a8c00634 100644
--- a/app/models/ci/runner.rb
+++ b/app/models/ci/runner.rb
@@ -91,6 +91,12 @@ module Ci
!shared?
end
+ def can_serve?(build)
+ not_locked_or_locked_to?(build.project) &&
+ run_untagged_or_has_tags?(build) &&
+ accepting_tags?(build.tag_list)
+ end
+
def only_for?(project)
projects == [project]
end
@@ -111,5 +117,17 @@ module Ci
'can not be empty when runner is not allowed to pick untagged jobs')
end
end
+
+ def not_locked_or_locked_to?(project)
+ !locked? || projects.exists?(id: project.id)
+ end
+
+ def run_untagged_or_has_tags?(build)
+ run_untagged? || build.has_tags?
+ end
+
+ def accepting_tags?(target_tags)
+ (target_tags - tag_list).empty?
+ end
end
end
diff --git a/spec/models/build_spec.rb b/spec/models/build_spec.rb
index 7660ea2659c..8cd1ffae9ce 100644
--- a/spec/models/build_spec.rb
+++ b/spec/models/build_spec.rb
@@ -296,16 +296,67 @@ describe Ci::Build, models: true do
it_behaves_like 'tagged build picker'
end
- context 'when runner can not pick untagged jobs' do
+ context 'when runner cannot pick untagged jobs' do
before { runner.run_untagged = false }
- it 'can not handle builds without tags' do
+ it 'cannot handle builds without tags' do
expect(build.can_be_served?(runner)).to be_falsey
end
it_behaves_like 'tagged build picker'
end
end
+
+ context 'when runner is locked' do
+ before { runner.locked = true }
+
+ shared_examples 'locked build picker' do |serve_matching_tags|
+ context 'when runner cannot pick untagged jobs' do
+ before { runner.run_untagged = false }
+
+ it 'cannot handle builds without tags' do
+ expect(build.can_be_served?(runner)).to be_falsey
+ end
+ end
+
+ context 'when having runner tags' do
+ before { runner.tag_list = ['bb', 'cc'] }
+
+ it "#{serve_matching_tags} handle it for matching tags" do
+ build.tag_list = ['bb']
+ expected = if serve_matching_tags
+ be_truthy
+ else
+ be_falsey
+ end
+ expect(build.can_be_served?(runner)).to expected
+ end
+
+ it 'cannot handle it for builds without matching tags' do
+ build.tag_list = ['aa']
+ expect(build.can_be_served?(runner)).to be_falsey
+ end
+ end
+ end
+
+ context 'when serving the same project' do
+ it 'can handle it' do
+ expect(build.can_be_served?(runner)).to be_truthy
+ end
+
+ it_behaves_like 'locked build picker', true
+ end
+
+ context 'serving a different project' do
+ before { runner.runner_projects.destroy_all }
+
+ it 'cannot handle it' do
+ expect(build.can_be_served?(runner)).to be_falsey
+ end
+
+ it_behaves_like 'locked build picker', false
+ end
+ end
end
describe '#has_tags?' do