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
This commit is contained in:
Clark Boylan 2014-01-23 14:47:36 -08:00
parent 27f3b26e8e
commit af2476f5e3
3 changed files with 13 additions and 2 deletions

View File

@ -2781,8 +2781,13 @@ class TestScheduler(testtools.TestCase):
status_jobs = set() status_jobs = set()
for p in data['pipelines']: for p in data['pipelines']:
for q in p['change_queues']: 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 head in q['heads']:
for change in head: for change in head:
self.assertTrue(change['active'])
self.assertEqual(change['id'], '1,1') self.assertEqual(change['id'], '1,1')
for job in change['jobs']: for job in change['jobs']:
status_jobs.add(job['name']) status_jobs.add(job['name'])

View File

@ -240,6 +240,8 @@ class Pipeline(object):
j_queue = dict(name=queue.name) j_queue = dict(name=queue.name)
j_queues.append(j_queue) j_queues.append(j_queue)
j_queue['heads'] = [] j_queue['heads'] = []
j_queue['window'] = queue.window
j_queue['dependent'] = queue.dependent
j_changes = [] j_changes = []
for e in queue.queue: for e in queue.queue:
@ -299,6 +301,7 @@ class Pipeline(object):
def formatItemJSON(self, item): def formatItemJSON(self, item):
changeish = item.change changeish = item.change
ret = {} ret = {}
ret['active'] = item.active
if hasattr(changeish, 'url') and changeish.url is not None: if hasattr(changeish, 'url') and changeish.url is not None:
ret['url'] = changeish.url ret['url'] = changeish.url
else: else:
@ -672,6 +675,7 @@ class QueueItem(object):
self.enqueue_time = None self.enqueue_time = None
self.dequeue_time = None self.dequeue_time = None
self.reported = False self.reported = False
self.active = False
def __repr__(self): def __repr__(self):
if self.pipeline: if self.pipeline:

View File

@ -1133,6 +1133,8 @@ class BasePipelineManager(object):
pass pass
return (True, nnfi) return (True, nnfi)
dep_item = self.getFailingDependentItem(item) dep_item = self.getFailingDependentItem(item)
actionable = change_queue.isActionable(item)
item.active = actionable
if dep_item: if dep_item:
failing_reasons.append('a needed change is failing') failing_reasons.append('a needed change is failing')
self.cancelJobs(item, prime=False) self.cancelJobs(item, prime=False)
@ -1151,11 +1153,11 @@ class BasePipelineManager(object):
change_queue.moveItem(item, nnfi) change_queue.moveItem(item, nnfi)
changed = True changed = True
self.cancelJobs(item) self.cancelJobs(item)
if change_queue.isActionable(item): if actionable:
self.prepareRef(item) self.prepareRef(item)
if item.current_build_set.unable_to_merge: if item.current_build_set.unable_to_merge:
failing_reasons.append("it has a merge conflict") 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 changed = True
if self.pipeline.didAnyJobFail(item): if self.pipeline.didAnyJobFail(item):
failing_reasons.append("at least one job failed") failing_reasons.append("at least one job failed")