Merge "CLI: fail if trying to enqueue/dequeue a change for the wrong project"
This commit is contained in:
commit
34629ff6d2
|
@ -3843,6 +3843,31 @@ class TestScheduler(ZuulTestCase):
|
||||||
self.assertEqual(A.reported, 2)
|
self.assertEqual(A.reported, 2)
|
||||||
self.assertEqual(r, True)
|
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):
|
def test_client_enqueue_ref(self):
|
||||||
"Test that the RPC client can enqueue a ref"
|
"Test that the RPC client can enqueue a ref"
|
||||||
p = "review.example.com/org/project"
|
p = "review.example.com/org/project"
|
||||||
|
@ -3949,6 +3974,47 @@ class TestScheduler(ZuulTestCase):
|
||||||
self.executor_server.release()
|
self.executor_server.release()
|
||||||
self.waitUntilSettled()
|
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):
|
def test_client_dequeue_change_by_ref(self):
|
||||||
"Test that the RPC client can dequeue a change by ref"
|
"Test that the RPC client can dequeue a change by ref"
|
||||||
# Test this on the periodic pipeline, where it makes most sense to
|
# Test this on the periodic pipeline, where it makes most sense to
|
||||||
|
|
|
@ -228,7 +228,10 @@ class RPCListener(object):
|
||||||
if not errors:
|
if not errors:
|
||||||
event.change_number, event.patch_number = args['change'].split(',')
|
event.change_number, event.patch_number = args['change'].split(',')
|
||||||
try:
|
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:
|
except Exception:
|
||||||
errors += 'Invalid change: %s\n' % (args['change'],)
|
errors += 'Invalid change: %s\n' % (args['change'],)
|
||||||
|
|
||||||
|
|
|
@ -942,6 +942,13 @@ class Scheduler(threading.Thread):
|
||||||
pipeline = tenant.layout.pipelines[event.pipeline_name]
|
pipeline = tenant.layout.pipelines[event.pipeline_name]
|
||||||
(trusted, project) = tenant.getProject(event.project_name)
|
(trusted, project) = tenant.getProject(event.project_name)
|
||||||
change = project.source.getChange(event, project)
|
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 shared_queue in pipeline.queues:
|
||||||
for item in shared_queue.queue:
|
for item in shared_queue.queue:
|
||||||
if (isinstance(item.change, model.Change) and
|
if (isinstance(item.change, model.Change) and
|
||||||
|
|
Loading…
Reference in New Issue