From 5776248c9144e0eae7f4a7d233bc21b8802de191 Mon Sep 17 00:00:00 2001 From: Tristan Cacqueray Date: Fri, 8 Jun 2018 01:00:01 +0000 Subject: [PATCH] scheduler: add job's variants to the rpc job_list method This change adds the job's variants to the jobs list to enable a more structured representation of the zuul-web jobs endpoint results. Change-Id: I12648d514f4cd3d2a31a95038883bd2eef8a9350 --- tests/unit/test_web.py | 14 ++++++++++++++ zuul/model.py | 4 ++++ zuul/rpclistener.py | 30 ++++++++++++++++++++++++------ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/tests/unit/test_web.py b/tests/unit/test_web.py index 05701a6537..2642ce9a13 100755 --- a/tests/unit/test_web.py +++ b/tests/unit/test_web.py @@ -572,6 +572,20 @@ class TestWeb(BaseTestWeb): resp = self.get_url("api/tenant/non-tenant/jobs") self.assertEqual(404, resp.status_code) + def test_jobs_list_variants(self): + resp = self.get_url("api/tenant/tenant-one/jobs").json() + for job in resp: + if job['name'] in ["base", "noop"]: + variants = None + elif job['name'] == 'project-test1': + variants = [ + {'parent': 'base'}, + {'branches': ['stable'], 'parent': 'base'}, + ] + else: + variants = [{'parent': 'base'}] + self.assertEqual(variants, job.get('variants')) + def test_web_job_noop(self): job = self.get_url("api/tenant/tenant-one/job/noop").json() self.assertEqual("noop", job[0]["name"]) diff --git a/zuul/model.py b/zuul/model.py index e7cff08779..652eedc1ec 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -1292,6 +1292,10 @@ class Job(ConfigObject): if changed: self.roles = tuple(newroles) + def getBranches(self): + # Return the raw branch list that match this job + return self._branches + def setBranchMatcher(self, branches): # Set the branch matcher to match any of the supplied branches self._branches = branches diff --git a/zuul/rpclistener.py b/zuul/rpclistener.py index 384b9c7203..9cc0a88093 100644 --- a/zuul/rpclistener.py +++ b/zuul/rpclistener.py @@ -362,12 +362,30 @@ class RPCListener(object): job.sendWorkComplete(json.dumps(None)) for job_name in sorted(tenant.layout.jobs): desc = None - for tenant_job in tenant.layout.jobs[job_name]: - if tenant_job.description: - desc = tenant_job.description.split('\n')[0] - break - output.append({"name": job_name, - "description": desc}) + variants = [] + for variant in tenant.layout.jobs[job_name]: + if not desc and variant.description: + desc = variant.description.split('\n')[0] + job_variant = {} + if not variant.isBase(): + if variant.parent: + job_variant['parent'] = str(variant.parent) + else: + job_variant['parent'] = tenant.default_base_job + branches = variant.getBranches() + if branches: + job_variant['branches'] = branches + if job_variant: + variants.append(job_variant) + + job_output = { + "name": job_name, + } + if desc: + job_output["description"] = desc + if variants: + job_output["variants"] = variants + output.append(job_output) job.sendWorkComplete(json.dumps(output)) def handle_project_get(self, gear_job):