Fix dequeue ref not handling the project name
This patch fix a misbehavior of the dequeue mechanics do to not taking care of the project name. When mulitple ref changes with same ref (eg. refs/heads/master) but different projects are in the same pipeline then the dequeue cmd will always dequeue the change on the top even if the project name does not match. Change-Id: Iea0ec75ca4a805feee61de2036ffd4efb511a50a
This commit is contained in:
parent
4a0261c9a8
commit
a468918525
|
@ -154,6 +154,9 @@
|
|||
dependencies: project-merge
|
||||
- project1-project2-integration:
|
||||
dependencies: project-merge
|
||||
post:
|
||||
jobs:
|
||||
- project-post
|
||||
|
||||
- project:
|
||||
name: org/project2
|
||||
|
|
|
@ -3894,6 +3894,65 @@ class TestScheduler(ZuulTestCase):
|
|||
self.assertIn('project-post', job_names)
|
||||
self.assertEqual(r, True)
|
||||
|
||||
def test_client_dequeue_ref(self):
|
||||
"Test that the RPC client can dequeue a ref"
|
||||
|
||||
client = zuul.rpcclient.RPCClient('127.0.0.1',
|
||||
self.gearman_server.port)
|
||||
self.addCleanup(client.shutdown)
|
||||
|
||||
self.executor_server.hold_jobs_in_build = True
|
||||
|
||||
p = "review.example.com/org/project"
|
||||
upstream = self.getUpstreamRepos([p])
|
||||
A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A')
|
||||
A.setMerged()
|
||||
A_commit = str(upstream[p].commit('master'))
|
||||
self.log.debug("A commit: %s" % A_commit)
|
||||
|
||||
r = client.enqueue_ref(
|
||||
tenant='tenant-one',
|
||||
pipeline='post',
|
||||
project='org/project',
|
||||
trigger='gerrit',
|
||||
ref='master',
|
||||
oldrev='90f173846e3af9154517b88543ffbd1691f31366',
|
||||
newrev=A_commit)
|
||||
|
||||
p = "review.example.com/org/project1"
|
||||
upstream = self.getUpstreamRepos([p])
|
||||
B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
|
||||
B.setMerged()
|
||||
B_commit = str(upstream[p].commit('master'))
|
||||
self.log.debug("B commit: %s" % B_commit)
|
||||
|
||||
r = client.enqueue_ref(
|
||||
tenant='tenant-one',
|
||||
pipeline='post',
|
||||
project='org/project1',
|
||||
trigger='gerrit',
|
||||
ref='master',
|
||||
oldrev='90f173846e3af9154517b88543ffbd1691f31366',
|
||||
newrev=B_commit)
|
||||
|
||||
self.waitUntilSettled()
|
||||
r = client.dequeue(
|
||||
tenant='tenant-one',
|
||||
pipeline='post',
|
||||
project='org/project1',
|
||||
change=None,
|
||||
ref='master')
|
||||
self.executor_server.release('.*')
|
||||
self.waitUntilSettled()
|
||||
job_names = [x.name for x in self.history]
|
||||
self.assertEqual(len(self.history), 2)
|
||||
aborted_build = [
|
||||
build for build in self.history if
|
||||
build.result == 'ABORTED'][0]
|
||||
self.assertEqual(aborted_build.newrev, B_commit)
|
||||
self.assertIn('project-post', job_names)
|
||||
self.assertEqual(r, True)
|
||||
|
||||
def test_client_dequeue_dependent_change(self):
|
||||
"Test that the RPC client can dequeue a change"
|
||||
client = zuul.rpcclient.RPCClient('127.0.0.1',
|
||||
|
|
|
@ -655,7 +655,42 @@ class TestWeb(BaseTestWeb):
|
|||
'name': 'gate',
|
||||
'queue_name': 'integrated',
|
||||
'jobs': jobs,
|
||||
}]
|
||||
}, {'name': 'post',
|
||||
'queue_name': None,
|
||||
'jobs': [[
|
||||
{'abstract': False,
|
||||
'ansible_version': None,
|
||||
'attempts': 3,
|
||||
'branches': [],
|
||||
'dependencies': [],
|
||||
'description': None,
|
||||
'files': [],
|
||||
'final': False,
|
||||
'implied_branch': None,
|
||||
'irrelevant_files': [],
|
||||
'name': 'project-post',
|
||||
'parent': 'base',
|
||||
'post_review': None,
|
||||
'post_run': [],
|
||||
'pre_run': [],
|
||||
'protected': None,
|
||||
'provides': [],
|
||||
'required_projects': [],
|
||||
'requires': [],
|
||||
'roles': [],
|
||||
'run': [],
|
||||
'semaphore': None,
|
||||
'source_context': {'branch': 'master',
|
||||
'path': 'zuul.yaml',
|
||||
'project': 'common-config'},
|
||||
'tags': [],
|
||||
'timeout': None,
|
||||
'variables': {},
|
||||
'variant_description': '',
|
||||
'voting': True}
|
||||
]],
|
||||
}
|
||||
]
|
||||
}]
|
||||
}, data)
|
||||
|
||||
|
|
|
@ -947,6 +947,8 @@ class Scheduler(threading.Thread):
|
|||
% (item, project.name))
|
||||
for shared_queue in pipeline.queues:
|
||||
for item in shared_queue.queue:
|
||||
if item.change.project != change.project:
|
||||
continue
|
||||
if (isinstance(item.change, model.Change) and
|
||||
item.change.number == change.number and
|
||||
item.change.patchset == change.patchset) or\
|
||||
|
|
Loading…
Reference in New Issue