Merge "Add autohold-info CLI command"

This commit is contained in:
Zuul 2019-09-20 19:19:07 +00:00 committed by Gerrit Code Review
commit b865ec81bd
7 changed files with 105 additions and 0 deletions

View File

@ -47,6 +47,14 @@ Example::
zuul autohold-delete --id 0000000123
Autohold Info
^^^^^^^^^^^^^
.. program-output:: zuul autohold-info --help
Example::
zuul autohold-info --id 0000000123
Autohold List
^^^^^^^^^^^^^
.. program-output:: zuul autohold-list --help

View File

@ -0,0 +1,5 @@
---
features:
- |
A new zuul CLI command, autohold-info, has been added to retrieve full
details for an existing autohold request.

View File

@ -1716,6 +1716,35 @@ class TestScheduler(ZuulTestCase):
request3 = self.zk.getHoldRequest(request2.id)
self.assertEqual(request2.current_count, request3.current_count)
@simple_layout('layouts/autohold.yaml')
def test_autohold_info(self):
client = zuul.rpcclient.RPCClient('127.0.0.1',
self.gearman_server.port)
self.addCleanup(client.shutdown)
# Empty dict should be returned for "not found"
request = client.autohold_info("XxXxX")
self.assertEqual({}, request)
r = client.autohold('tenant-one', 'org/project', 'project-test2',
"", "", "reason text", 1)
self.assertTrue(r)
# There should be a record in ZooKeeper
request_list = self.zk.getHoldRequests()
self.assertEqual(1, len(request_list))
request = self.zk.getHoldRequest(request_list[0])
self.assertIsNotNone(request)
request = client.autohold_info(request.id)
self.assertNotEqual({}, request)
self.assertEqual('tenant-one', request['tenant'])
self.assertEqual('review.example.com/org/project', request['project'])
self.assertEqual('project-test2', request['job'])
self.assertEqual('reason text', request['reason'])
self.assertEqual(1, request['max_count'])
self.assertEqual(0, request['current_count'])
@simple_layout('layouts/autohold.yaml')
def test_autohold_delete(self):
client = zuul.rpcclient.RPCClient('127.0.0.1',

View File

@ -209,6 +209,13 @@ class Client(zuul.cmd.ZuulApp):
help='request ID',
required=True)
cmd_autohold_info = subparsers.add_parser(
'autohold-info', help='retrieve autohold request detailed info')
cmd_autohold_info.set_defaults(func=self.autohold_info)
cmd_autohold_info.add_argument('--id',
help='request ID',
required=True)
cmd_autohold_list = subparsers.add_parser(
'autohold-list', help='list autohold requests')
cmd_autohold_list.add_argument('--tenant', help='tenant name',
@ -441,6 +448,26 @@ class Client(zuul.cmd.ZuulApp):
client = self.get_client()
return client.autohold_delete(self.args.id)
def autohold_info(self):
client = self.get_client()
request = client.autohold_info(self.args.id)
if not request:
print("Autohold request not found")
return True
print("ID: %s" % request['id'])
print("Tenant: %s" % request['tenant'])
print("Project: %s" % request['project'])
print("Job: %s" % request['job'])
print("Ref Filter: %s" % request['ref_filter'])
print("Max Count: %s" % request['max_count'])
print("Current Count: %s" % request['current_count'])
print("Node Expiration: %s" % request['node_expiration'])
print("Reason: %s" % request['reason'])
return True
def autohold_list(self):
client = self.get_client()
autohold_requests = client.autohold_list(tenant=self.args.tenant)

View File

@ -66,6 +66,14 @@ class RPCClient(object):
data = {'request_id': request_id}
return not self.submitJob('zuul:autohold_delete', data).failure
def autohold_info(self, request_id):
data = {'request_id': request_id}
job = self.submitJob('zuul:autohold_info', data)
if job.failure:
return False
else:
return json.loads(job.data[0])
# todo allow filtering per tenant, like in the REST API
def autohold_list(self, *args, **kwargs):
data = {}

View File

@ -35,6 +35,7 @@ class RPCListener(object):
functions = [
'autohold',
'autohold_delete',
'autohold_info',
'autohold_list',
'allowed_labels_get',
'dequeue',
@ -93,6 +94,16 @@ class RPCListener(object):
return
job.sendWorkComplete()
def handle_autohold_info(self, job):
args = json.loads(job.arguments)
request_id = args['request_id']
try:
data = self.sched.autohold_info(request_id)
except Exception as e:
job.sendWorkException(str(e).encode('utf8'))
return
job.sendWorkComplete(json.dumps(data))
def handle_autohold_delete(self, job):
args = json.loads(job.arguments)
request_id = args['request_id']

View File

@ -580,6 +580,23 @@ class Scheduler(threading.Thread):
data.append(request.toDict())
return data
def autohold_info(self, hold_request_id):
'''
Get autohold request details.
:param str hold_request_id: The unique ID of the request to delete.
'''
try:
hold_request = self.zk.getHoldRequest(hold_request_id)
except Exception:
self.log.exception(
"Error retrieving autohold ID %s:", hold_request_id)
return {}
if hold_request is None:
return {}
return hold_request.toDict()
def autohold_delete(self, hold_request_id):
'''
Delete an autohold request.