Add 'build' method to API

This returns info about a specific build (by uuid).  This can be used
for a page with info about the build as well as links to logs and
artifacts about the build.  It may eventually replace direct links
to logs in reports.

Change-Id: Ifba13ebb58ef535838cea8e7adb2e9760ea798cf
This commit is contained in:
James E. Blair 2018-08-15 17:21:46 -07:00
parent 24bf769145
commit 518643a4db
2 changed files with 37 additions and 2 deletions

View File

@ -499,5 +499,12 @@ class TestBuildInfo(ZuulDBTestCase, BaseTestWeb):
builds = self.get_url("api/tenant/tenant-one/builds").json()
self.assertEqual(len(builds), 6)
uuid = builds[0]['uuid']
build = self.get_url("api/tenant/tenant-one/build/%s" % uuid).json()
self.assertEqual(build['job_name'], builds[0]['job_name'])
resp = self.get_url("api/tenant/tenant-one/build/1234")
self.assertEqual(404, resp.status_code)
resp = self.get_url("api/tenant/non-tenant/builds")
self.assertEqual(404, resp.status_code)

View File

@ -321,8 +321,6 @@ class ZuulWebAPI(object):
branch=None, patchset=None, ref=None, newrev=None,
uuid=None, job_name=None, voting=None, node_name=None,
result=None, limit=50, skip=0):
sql_driver = self.zuulweb.connections.drivers['sql']
# Ask the scheduler which sql connection to use for this tenant
job = self.rpc.submitJob('zuul:tenant_sql_connection',
{'tenant': tenant})
@ -355,6 +353,34 @@ class ZuulWebAPI(object):
resp.headers['Access-Control-Allow-Origin'] = '*'
return data
@cherrypy.expose
@cherrypy.tools.save_params()
@cherrypy.tools.json_out(content_type='application/json; charset=utf-8')
def build(self, tenant, uuid):
# Ask the scheduler which sql connection to use for this tenant
job = self.rpc.submitJob('zuul:tenant_sql_connection',
{'tenant': tenant})
connection_name = json.loads(job.data[0])
if not connection_name:
raise cherrypy.HTTPError(404, 'Tenant %s does not exist.' % tenant)
connection = self.zuulweb.connections.connections[connection_name]
args = {
'buildset_filters': {'tenant': [tenant]},
'build_filters': {'uuid': [uuid]},
'limit': 1,
'skip': 0,
}
data = connection.get_builds(args)
if not data:
raise cherrypy.HTTPError(404, "Build not found")
data = data[0]
resp = cherrypy.response
resp.headers['Access-Control-Allow-Origin'] = '*'
return data
@cherrypy.expose
@cherrypy.tools.save_params()
@cherrypy.tools.websocket(handler_cls=LogStreamHandler)
@ -492,6 +518,8 @@ class ZuulWeb(object):
controller=api, action='console_stream')
route_map.connect('api', '/api/tenant/{tenant}/builds',
controller=api, action='builds')
route_map.connect('api', '/api/tenant/{tenant}/build/{uuid}',
controller=api, action='build')
route_map.connect('api', '/api/tenant/{tenant}/config-errors',
controller=api, action='config_errors')