diff --git a/tests/test_scheduler.py b/tests/test_scheduler.py index 3b7b9f0863..a74ad17f14 100755 --- a/tests/test_scheduler.py +++ b/tests/test_scheduler.py @@ -2879,8 +2879,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 8b76ff4bc8..2ae2e2fa5f 100644 --- a/zuul/model.py +++ b/zuul/model.py @@ -254,6 +254,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: @@ -313,6 +315,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: @@ -686,6 +689,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 213c23a587..2c8ed4c3f7 100644 --- a/zuul/scheduler.py +++ b/zuul/scheduler.py @@ -1135,6 +1135,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) @@ -1153,11 +1155,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")