Chromium Code Reviews| Index: appengine/swarming/handlers_endpoints.py |
| diff --git a/appengine/swarming/handlers_endpoints.py b/appengine/swarming/handlers_endpoints.py |
| index ef39512802e46fa7c7c6bc8ed55934f9f246d0d0..c4dc114f773acf1cc5b8b2d77b1765cdcd99e836 100644 |
| --- a/appengine/swarming/handlers_endpoints.py |
| +++ b/appengine/swarming/handlers_endpoints.py |
| @@ -635,6 +635,36 @@ class SwarmingBotsService(remote.Service): |
| items=[message_conversion.bot_info_to_rpc(bot, now) for bot in bots], |
| now=now) |
| + @gae_ts_mon.instrument_endpoint() |
| + @auth.endpoints_method( |
| + swarming_rpcs.BotsRequest, swarming_rpcs.BotsCount, |
| + http_method='GET') |
| + @auth.require(acl.is_privileged_user) |
| + def count(self, request): |
| + """Counts number of bots with given dimensions.""" |
| + logging.info('%s', request) |
| + now = utils.utcnow() |
| + q = bot_management.BotInfo.query().order() |
| + for d in request.dimensions: |
| + parts = d.split(':', 1) |
| + if len(parts) != 2 or any(i.strip() != i or not i for i in parts): |
| + raise endpoints.BadRequestException('Invalid dimensions: %s' % d) |
| + q = q.filter(bot_management.BotInfo.dimensions_flat == d) |
| + q_count = q.count_async() |
| + dt = datetime.timedelta(seconds=config.settings().bot_death_timeout_secs) |
| + timeout = now - dt |
| + q_dead = (q.filter(bot_management.BotInfo.last_seen_ts < timeout) |
|
M-A Ruel
2016/08/01 19:18:37
optional style nit: I'd prefer:
q_dead = q.filter(
kjlubick
2016/08/01 19:25:43
Done.
|
| + .count_async()) |
| + q_quarantined = (q.filter(bot_management.BotInfo.quarantined == True) |
| + .count_async()) |
| + q_busy = q.filter(bot_management.BotInfo.is_busy == True).count_async() |
| + return swarming_rpcs.BotsCount( |
| + count=q_count.get_result(), |
| + quarantined=q_quarantined.get_result(), |
| + dead=q_dead.get_result(), |
| + busy=q_busy.get_result(), |
| + now=now) |
| + |
| def get_routes(): |
| return ( |