From a468918525ca7f82638d37059a5f5568ec3e5bbd Mon Sep 17 00:00:00 2001 From: Fabien Boucher Date: Tue, 14 May 2019 17:58:42 +0200 Subject: [PATCH] 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 --- .../single-tenant/git/common-config/zuul.yaml | 3 + tests/unit/test_scheduler.py | 59 +++++++++++++++++++ tests/unit/test_web.py | 37 +++++++++++- zuul/scheduler.py | 2 + 4 files changed, 100 insertions(+), 1 deletion(-) diff --git a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml index ec7eca504e..be9e5ff733 100644 --- a/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml +++ b/tests/fixtures/config/single-tenant/git/common-config/zuul.yaml @@ -154,6 +154,9 @@ dependencies: project-merge - project1-project2-integration: dependencies: project-merge + post: + jobs: + - project-post - project: name: org/project2 diff --git a/tests/unit/test_scheduler.py b/tests/unit/test_scheduler.py index 49a6959111..28b6267f08 100644 --- a/tests/unit/test_scheduler.py +++ b/tests/unit/test_scheduler.py @@ -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', diff --git a/tests/unit/test_web.py b/tests/unit/test_web.py index e054ae0288..9c57f81c37 100644 --- a/tests/unit/test_web.py +++ b/tests/unit/test_web.py @@ -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) diff --git a/zuul/scheduler.py b/zuul/scheduler.py index b2b83a2c37..418b30ebee 100644 --- a/zuul/scheduler.py +++ b/zuul/scheduler.py @@ -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\