diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py index baf8881673..f83eda44e0 100755 --- a/tests/test_scheduler.py +++ b/tests/test_scheduler.py @@ -2682,7 +2682,7 @@ class TestScheduler(ZuulTestCase): self.worker.release('.*') self.waitUntilSettled() - def test_client_enqueue(self): + def test_client_enqueue_change(self): "Test that the RPC client can enqueue a change" A = self.fake_gerrit.addFakeChange('org/project', 'master', 'A') A.addApproval('CRVW', 2) @@ -2705,6 +2705,24 @@ class TestScheduler(ZuulTestCase): self.assertEqual(A.reported, 2) self.assertEqual(r, True) + def test_client_enqueue_ref(self): + "Test that the RPC client can enqueue a ref" + + client = zuul.rpcclient.RPCClient('127.0.0.1', + self.gearman_server.port) + r = client.enqueue_ref( + pipeline='post', + project='org/project', + trigger='gerrit', + ref='master', + oldrev='90f173846e3af9154517b88543ffbd1691f31366', + newrev='d479a0bfcb34da57a31adb2a595c0cf687812543') + self.waitUntilSettled() + job_names = [x.name for x in self.history] + self.assertEqual(len(self.history), 1) + self.assertIn('project-post', job_names) + self.assertEqual(r, True) + def test_client_enqueue_negative(self): "Test that the RPC client returns errors" client = zuul.rpcclient.RPCClient('127.0.0.1', diff --git a/zuul/cmd/client.py b/zuul/cmd/client.py index bc2c152d80..6e14ff5692 100644 --- a/zuul/cmd/client.py +++ b/zuul/cmd/client.py @@ -56,6 +56,24 @@ class Client(zuul.cmd.ZuulApp): required=True) cmd_enqueue.set_defaults(func=self.enqueue) + cmd_enqueue = subparsers.add_parser('enqueue-ref', + help='enqueue a ref') + cmd_enqueue.add_argument('--trigger', help='trigger name', + required=True) + cmd_enqueue.add_argument('--pipeline', help='pipeline name', + required=True) + cmd_enqueue.add_argument('--project', help='project name', + required=True) + cmd_enqueue.add_argument('--ref', help='ref name', + required=True) + cmd_enqueue.add_argument( + '--oldrev', help='old revision', + default='0000000000000000000000000000000000000000') + cmd_enqueue.add_argument( + '--newrev', help='new revision', + default='0000000000000000000000000000000000000000') + cmd_enqueue.set_defaults(func=self.enqueue_ref) + cmd_promote = subparsers.add_parser('promote', help='promote one or more changes') cmd_promote.add_argument('--pipeline', help='pipeline name', @@ -82,6 +100,9 @@ class Client(zuul.cmd.ZuulApp): show_running_jobs.set_defaults(func=self.show_running_jobs) self.args = parser.parse_args() + if self.args.func == self.enqueue_ref: + if self.args.oldrev == self.args.newrev: + parser.error("The old and new revisions must not be the same.") def setup_logging(self): """Client logging does not rely on conf file""" @@ -112,6 +133,16 @@ class Client(zuul.cmd.ZuulApp): change=self.args.change) return r + def enqueue_ref(self): + client = zuul.rpcclient.RPCClient(self.server, self.port) + r = client.enqueue_ref(pipeline=self.args.pipeline, + project=self.args.project, + trigger=self.args.trigger, + ref=self.args.ref, + oldrev=self.args.oldrev, + newrev=self.args.newrev) + return r + def promote(self): client = zuul.rpcclient.RPCClient(self.server, self.port) r = client.promote(pipeline=self.args.pipeline, diff --git a/zuul/rpcclient.py b/zuul/rpcclient.py index f43c3b9056..609f63606c 100644 --- a/zuul/rpcclient.py +++ b/zuul/rpcclient.py @@ -56,6 +56,16 @@ class RPCClient(object): } return not self.submitJob('zuul:enqueue', data).failure + def enqueue_ref(self, pipeline, project, trigger, ref, oldrev, newrev): + data = {'pipeline': pipeline, + 'project': project, + 'trigger': trigger, + 'ref': ref, + 'oldrev': oldrev, + 'newrev': newrev, + } + return not self.submitJob('zuul:enqueue_ref', data).failure + def promote(self, pipeline, change_ids): data = {'pipeline': pipeline, 'change_ids': change_ids, diff --git a/zuul/rpclistener.py b/zuul/rpclistener.py index 05b8d033ec..d54da9f38e 100644 --- a/zuul/rpclistener.py +++ b/zuul/rpclistener.py @@ -48,6 +48,7 @@ class RPCListener(object): def register(self): self.worker.registerFunction("zuul:enqueue") + self.worker.registerFunction("zuul:enqueue_ref") self.worker.registerFunction("zuul:promote") self.worker.registerFunction("zuul:get_running_jobs") @@ -83,7 +84,7 @@ class RPCListener(object): except Exception: self.log.exception("Exception while getting job") - def handle_enqueue(self, job): + def _common_enqueue(self, job): args = json.loads(job.arguments) event = model.TriggerEvent() errors = '' @@ -106,6 +107,11 @@ class RPCListener(object): else: errors += 'Invalid pipeline: %s\n' % (args['pipeline'],) + return (args, event, errors, pipeline, project) + + def handle_enqueue(self, job): + (args, event, errors, pipeline, project) = self._common_enqueue(job) + if not errors: event.change_number, event.patch_number = args['change'].split(',') try: @@ -119,6 +125,20 @@ class RPCListener(object): self.sched.enqueue(event) job.sendWorkComplete() + def handle_enqueue_ref(self, job): + (args, event, errors, pipeline, project) = self._common_enqueue(job) + + if not errors: + event.ref = args['ref'] + event.oldrev = args['oldrev'] + event.newrev = args['newrev'] + + if errors: + job.sendWorkException(errors.encode('utf8')) + else: + self.sched.enqueue(event) + job.sendWorkComplete() + def handle_promote(self, job): args = json.loads(job.arguments) pipeline_name = args['pipeline']