From 30ecd5cc461ec59908f339a63a46c52a73cedec3 Mon Sep 17 00:00:00 2001 From: Fabien Boucher Date: Wed, 11 Jul 2018 18:27:26 +0200 Subject: [PATCH] zuul-web: key endpoint: return 404 when tenant or project not found Fix the endpoint to remove 500 error when tenant or project is not found. Change-Id: I5fec37635cca8a697dba1c749d75c78bae24411c --- tests/unit/test_web.py | 6 ++++++ zuul/rpclistener.py | 7 ++++++- zuul/web/__init__.py | 3 +++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_web.py b/tests/unit/test_web.py index a9b0879c6d..0aac21ac64 100644 --- a/tests/unit/test_web.py +++ b/tests/unit/test_web.py @@ -267,6 +267,12 @@ class TestWeb(BaseTestWeb): self.assertEqual(resp.content, public_pem) self.assertIn('text/plain', resp.headers.get('Content-Type')) + resp = self.get_url("api/tenant/non-tenant/key/org/project.pub") + self.assertEqual(404, resp.status_code) + + resp = self.get_url("api/tenant/tenant-one/key/org/no-project.pub") + self.assertEqual(404, resp.status_code) + def test_web_404_on_unknown_tenant(self): resp = self.get_url("api/tenant/non-tenant/status") self.assertEqual(404, resp.status_code) diff --git a/zuul/rpclistener.py b/zuul/rpclistener.py index d329cc6d20..54e122ef64 100644 --- a/zuul/rpclistener.py +++ b/zuul/rpclistener.py @@ -354,7 +354,12 @@ class RPCListener(object): def handle_key_get(self, job): args = json.loads(job.arguments) tenant = self.sched.abide.tenants.get(args.get("tenant")) - (trusted, project) = tenant.getProject(args.get("project")) + project = None + if tenant: + (trusted, project) = tenant.getProject(args.get("project")) + if not project: + job.sendWorkComplete("") + return job.sendWorkComplete( encryption.serialize_rsa_public_key(project.public_key)) diff --git a/zuul/web/__init__.py b/zuul/web/__init__.py index 418ccd8b83..8a0501df64 100755 --- a/zuul/web/__init__.py +++ b/zuul/web/__init__.py @@ -289,6 +289,9 @@ class ZuulWebAPI(object): def key(self, tenant, project): job = self.rpc.submitJob('zuul:key_get', {'tenant': tenant, 'project': project}) + if not job.data: + raise cherrypy.HTTPError( + 404, 'Project %s does not exist.' % project) resp = cherrypy.response resp.headers['Access-Control-Allow-Origin'] = '*' resp.headers['Content-Type'] = 'text/plain'