Merge "CLI: fail if trying to enqueue/dequeue a change for the wrong project"

This commit is contained in:
Zuul 2019-03-15 05:47:34 +00:00 committed by Gerrit Code Review
commit 34629ff6d2
3 changed files with 77 additions and 1 deletions

View File

@ -3843,6 +3843,31 @@ class TestScheduler(ZuulTestCase):
self.assertEqual(A.reported, 2)
self.assertEqual(r, True)
@simple_layout('layouts/three-projects.yaml')
def test_client_enqueue_change_wrong_project(self):
"Test that an enqueue fails if a change doesn't belong to the project"
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
A.addApproval('Code-Review', 2)
A.addApproval('Approved', 1)
B = self.fake_gerrit.addFakeChange('org/project2', 'master', 'B')
B.addApproval('Code-Review', 2)
B.addApproval('Approved', 1)
client = zuul.rpcclient.RPCClient('127.0.0.1',
self.gearman_server.port)
self.addCleanup(client.shutdown)
with testtools.ExpectedException(
zuul.rpcclient.RPCFailure,
'Change 2,1 does not belong to project "org/project1"'):
r = client.enqueue(tenant='tenant-one',
pipeline='gate',
project='org/project1',
trigger='gerrit',
change='2,1')
self.assertEqual(r, False)
self.waitUntilSettled()
def test_client_enqueue_ref(self):
"Test that the RPC client can enqueue a ref"
p = "review.example.com/org/project"
@ -3949,6 +3974,47 @@ class TestScheduler(ZuulTestCase):
self.executor_server.release()
self.waitUntilSettled()
@simple_layout('layouts/three-projects.yaml')
def test_client_dequeue_wrong_project(self):
"Test that dequeue fails if change and project do not match"
client = zuul.rpcclient.RPCClient('127.0.0.1',
self.gearman_server.port)
self.addCleanup(client.shutdown)
self.executor_server.hold_jobs_in_build = True
A = self.fake_gerrit.addFakeChange('org/project1', 'master', 'A')
B = self.fake_gerrit.addFakeChange('org/project1', 'master', 'B')
C = self.fake_gerrit.addFakeChange('org/project1', 'master', 'C')
D = self.fake_gerrit.addFakeChange('org/project2', 'master', 'D')
A.addApproval('Code-Review', 2)
B.addApproval('Code-Review', 2)
C.addApproval('Code-Review', 2)
D.addApproval('Code-Review', 2)
self.fake_gerrit.addEvent(A.getPatchsetCreatedEvent(1))
self.fake_gerrit.addEvent(B.getPatchsetCreatedEvent(1))
self.fake_gerrit.addEvent(C.getPatchsetCreatedEvent(1))
self.fake_gerrit.addEvent(D.getPatchsetCreatedEvent(1))
self.waitUntilSettled()
with testtools.ExpectedException(
zuul.rpcclient.RPCFailure,
'Change 4,1 does not belong to project "org/project1"'):
r = client.dequeue(
tenant='tenant-one',
pipeline='check',
project='org/project1',
change='4,1',
ref=None)
self.waitUntilSettled()
self.assertEqual(r, False)
self.executor_server.hold_jobs_in_build = False
self.executor_server.release()
self.waitUntilSettled()
def test_client_dequeue_change_by_ref(self):
"Test that the RPC client can dequeue a change by ref"
# Test this on the periodic pipeline, where it makes most sense to

View File

@ -228,7 +228,10 @@ class RPCListener(object):
if not errors:
event.change_number, event.patch_number = args['change'].split(',')
try:
project.source.getChange(event, project)
ch = project.source.getChange(event, refresh=True)
if ch.project.name != project.name:
errors += ('Change %s does not belong to project "%s", '
% (args['change'], project.name))
except Exception:
errors += 'Invalid change: %s\n' % (args['change'],)

View File

@ -942,6 +942,13 @@ class Scheduler(threading.Thread):
pipeline = tenant.layout.pipelines[event.pipeline_name]
(trusted, project) = tenant.getProject(event.project_name)
change = project.source.getChange(event, project)
if change.project.name != project.name:
if event.change:
item = 'Change %s' % event.change
else:
item = 'Ref %s' % event.ref
raise Exception('%s does not belong to project "%s"'
% (item, project.name))
for shared_queue in pipeline.queues:
for item in shared_queue.queue:
if (isinstance(item.change, model.Change) and