def get(self, request): """Returns information about a known bot. This includes its state and dimensions, and if it is currently running a task. """ logging.debug('%s', request) bot_id = request.bot_id bot = bot_management.get_info_key(bot_id).get() deleted = False if not bot: # If there is not BotInfo, look if there are BotEvent child of this # entity. If this is the case, it means the bot was deleted but it's # useful to show information about it to the user even if the bot was # deleted. events = bot_management.get_events_query(bot_id, True).fetch(1) if not events: raise endpoints.NotFoundException('%s not found.' % bot_id) bot = bot_management.BotInfo( key=bot_management.get_info_key(bot_id), dimensions_flat=task_queues.dimensions_to_flat( events[0].dimensions), state=events[0].state, external_ip=events[0].external_ip, authenticated_as=events[0].authenticated_as, version=events[0].version, quarantined=events[0].quarantined, maintenance_msg=events[0].maintenance_msg, task_id=events[0].task_id, last_seen_ts=events[0].ts) deleted = True return message_conversion.bot_info_to_rpc(bot, deleted=deleted)
def list(self, request): """Provides list of known bots. Deleted bots will not be listed. """ logging.debug('%s', request) now = utils.utcnow() q = bot_management.BotInfo.query() try: q = bot_management.filter_dimensions(q, request.dimensions) q = bot_management.filter_availability( q, swarming_rpcs.to_bool(request.quarantined), swarming_rpcs.to_bool(request.in_maintenance), swarming_rpcs.to_bool(request.is_dead), swarming_rpcs.to_bool(request.is_busy), swarming_rpcs.to_bool(request.is_mp)) except ValueError as e: raise endpoints.BadRequestException(str(e)) bots, cursor = datastore_utils.fetch_page(q, request.limit, request.cursor) return swarming_rpcs.BotList( cursor=cursor, death_timeout=config.settings().bot_death_timeout_secs, items=[message_conversion.bot_info_to_rpc(bot) for bot in bots], now=now)
def list(self, request): """Provides list of known bots. Deleted bots will not be listed. """ logging.debug('%s', request) now = utils.utcnow() # Disable the in-process local cache. This is important, as there can be up # to a thousand entities loaded in memory, and this is a pure memory leak, # as there's no chance this specific instance will need these again, # therefore this leads to 'Exceeded soft memory limit' AppEngine errors. q = bot_management.BotInfo.query(default_options=ndb.QueryOptions( use_cache=False)) try: q = bot_management.filter_dimensions(q, request.dimensions) q = bot_management.filter_availability( q, swarming_rpcs.to_bool(request.quarantined), swarming_rpcs.to_bool(request.in_maintenance), swarming_rpcs.to_bool(request.is_dead), swarming_rpcs.to_bool(request.is_busy)) except ValueError as e: raise endpoints.BadRequestException(str(e)) bots, cursor = datastore_utils.fetch_page(q, request.limit, request.cursor) return swarming_rpcs.BotList( cursor=cursor, death_timeout=config.settings().bot_death_timeout_secs, items=[message_conversion.bot_info_to_rpc(bot) for bot in bots], now=now)
def get(self, request): """Returns information about a known bot. This includes its state and dimensions, and if it is currently running a task. """ logging.info('%s', request) bot = get_or_raise(bot_management.get_info_key(request.bot_id)) return message_conversion.bot_info_to_rpc(bot, utils.utcnow())
def list(self, request): """Provides list of known bots. Deleted bots will not be listed. """ logging.info('%s', request) now = utils.utcnow() q = bot_management.BotInfo.query().order(bot_management.BotInfo.key) bots, cursor = datastore_utils.fetch_page(q, request.limit, request.cursor) return swarming_rpcs.BotList( cursor=cursor, death_timeout=config.settings().bot_death_timeout_secs, items=[message_conversion.bot_info_to_rpc(bot, now) for bot in bots], now=now)
def list(self, request): """Provides list of known bots. Deleted bots will not be listed. """ logging.info('%s', request) now = utils.utcnow() cursor = datastore_query.Cursor(urlsafe=request.cursor) q = bot_management.BotInfo.query().order(bot_management.BotInfo.key) bots, cursor, more = q.fetch_page(request.limit, start_cursor=cursor) return swarming_rpcs.BotList( cursor=cursor.urlsafe() if cursor and more else None, death_timeout=config.settings().bot_death_timeout_secs, items=[message_conversion.bot_info_to_rpc(bot, now) for bot in bots], now=now)
def list(self, request): """Provides list of known bots. Deleted bots will not be listed. """ logging.info('%s', request) now = utils.utcnow() q = bot_management.BotInfo.query().order(bot_management.BotInfo.key) for d in request.dimensions: if not ':' in d: raise endpoints.BadRequestException('Invalid 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') q = q.filter(bot_management.BotInfo.dimensions_flat == d) bots, cursor = datastore_utils.fetch_page(q, request.limit, request.cursor) return swarming_rpcs.BotList( cursor=cursor, death_timeout=config.settings().bot_death_timeout_secs, items=[message_conversion.bot_info_to_rpc(bot, now) for bot in bots], now=now)
def list(self, request): """Provides list of known bots. Deleted bots will not be listed. """ logging.info('%s', request) now = utils.utcnow() q = bot_management.BotInfo.query().order(bot_management.BotInfo.key) for d in request.dimensions: if not ':' in d: raise endpoints.BadRequestException('Invalid 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') q = q.filter(bot_management.BotInfo.dimensions_flat == d) bots, cursor = datastore_utils.fetch_page(q, request.limit, request.cursor) return swarming_rpcs.BotList( cursor=cursor, death_timeout=config.settings().bot_death_timeout_secs, items=[ message_conversion.bot_info_to_rpc(bot, now) for bot in bots ], now=now)