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:
Fabien Boucher 2019-05-14 17:58:42 +02:00
parent 4a0261c9a8
commit a468918525
4 changed files with 100 additions and 1 deletions

View File

@ -154,6 +154,9 @@
dependencies: project-merge
- project1-project2-integration:
dependencies: project-merge
post:
jobs:
- project-post
- project:
name: org/project2

View File

@ -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',

View File

@ -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)

View File

@ -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\