Add enqueue-ref command to client

Change-Id: Icf496a4d54e346f6dea01c8822e7ef7e5ef8f097
This commit is contained in:
James E. Blair 2015-07-31 16:45:59 -07:00
parent cd5012e2e7
commit 91e3459805
4 changed files with 81 additions and 2 deletions

View File

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

View File

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

View File

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

View File

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