| Index: appengine/cr-buildbucket/service.py
|
| diff --git a/appengine/cr-buildbucket/service.py b/appengine/cr-buildbucket/service.py
|
| index 9678ef0b18eff6adbea2f3e0d0e222b685108d68..9749d7a04456bece0786eeb8837cd83e03afcae7 100644
|
| --- a/appengine/cr-buildbucket/service.py
|
| +++ b/appengine/cr-buildbucket/service.py
|
| @@ -833,3 +833,30 @@ def parse_identity(identity):
|
| except ValueError as ex:
|
| raise errors.InvalidInputError('Invalid identity identity: %s' % ex)
|
| return identity
|
| +
|
| +
|
| +def longest_pending_time(bucket, builder):
|
| + """Returns longest waiting time among SCHEDULED builds of a builder.
|
| +
|
| + |builder| is a value of "builder" tag.
|
| +
|
| + Returns a datetime.timedelta.
|
| + """
|
| + if not bucket:
|
| + raise errors.InvalidInputError('no bucket')
|
| + if not acl.can_access_bucket(bucket):
|
| + raise acl.current_identity_cannot('access bucket %s', bucket)
|
| + if not builder:
|
| + raise errors.InvalidInputError('no builder')
|
| +
|
| + # Find the oldest, still SCHEDULED build in this builder.
|
| + q = model.Build.query(
|
| + model.Build.bucket == bucket,
|
| + model.Build.tags == ('builder:%s' % builder),
|
| + model.Build.status == model.BuildStatus.SCHEDULED,
|
| + projection=[model.Build.create_time])
|
| + q = q.order(model.Build.create_time)
|
| + result = q.fetch(1)
|
| + if not result:
|
| + return datetime.timedelta(0)
|
| + return utils.utcnow() - result[0].create_time
|
|
|