From af2476f5e33636ee514b201baca6610e12cf4348 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Thu, 23 Jan 2014 14:47:36 -0800 Subject: [PATCH] Report queue window in status JSON. In order to render queue window information nicely in status pages pass the window for each queue in the JSON status blob. Also, annotate each change in a queue with an active flag indicating whether or not it is currently within the window. Change-Id: Iccba9fb307f98a4fc145402ecd0a38f3d75b3253 --- tests/test_scheduler.py | 5 +++++ zuul/model.py | 4 ++++ zuul/scheduler.py | 6 ++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py index 0ce0f88c60..8bc07e1457 100755 --- a/tests/test_scheduler.py +++ b/tests/test_scheduler.py @@ -2781,8 +2781,13 @@ class TestScheduler(testtools.TestCase): status_jobs = set() for p in data['pipelines']: for q in p['change_queues']: + if q['dependent']: + self.assertEqual(q['window'], 20) + else: + self.assertEqual(q['window'], 0) for head in q['heads']: for change in head: + self.assertTrue(change['active']) self.assertEqual(change['id'], '1,1') for job in change['jobs']: status_jobs.add(job['name']) diff --git a/zuul/model.py b/zuul/model.py index cc1817faff..d02e651822 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -240,6 +240,8 @@ class Pipeline(object): j_queue = dict(name=queue.name) j_queues.append(j_queue) j_queue['heads'] = [] + j_queue['window'] = queue.window + j_queue['dependent'] = queue.dependent j_changes = [] for e in queue.queue: @@ -299,6 +301,7 @@ class Pipeline(object): def formatItemJSON(self, item): changeish = item.change ret = {} + ret['active'] = item.active if hasattr(changeish, 'url') and changeish.url is not None: ret['url'] = changeish.url else: @@ -672,6 +675,7 @@ class QueueItem(object): self.enqueue_time = None self.dequeue_time = None self.reported = False + self.active = False def __repr__(self): if self.pipeline: diff --git a/zuul/scheduler.py b/zuul/scheduler.py index f9d8085064..19741b0b06 100644 --- a/zuul/scheduler.py +++ b/zuul/scheduler.py @@ -1133,6 +1133,8 @@ class BasePipelineManager(object): pass return (True, nnfi) dep_item = self.getFailingDependentItem(item) + actionable = change_queue.isActionable(item) + item.active = actionable if dep_item: failing_reasons.append('a needed change is failing') self.cancelJobs(item, prime=False) @@ -1151,11 +1153,11 @@ class BasePipelineManager(object): change_queue.moveItem(item, nnfi) changed = True self.cancelJobs(item) - if change_queue.isActionable(item): + if actionable: self.prepareRef(item) if item.current_build_set.unable_to_merge: failing_reasons.append("it has a merge conflict") - if change_queue.isActionable(item) and self.launchJobs(item): + if actionable and self.launchJobs(item): changed = True if self.pipeline.didAnyJobFail(item): failing_reasons.append("at least one job failed")