示例#1
0
def _check_state():
    """Check that the worker's state is consistent with the host's knowledge."""
    try:
        status = stub().GetStatus(untrusted_runner_pb2.GetStatusRequest(),
                                  timeout=config.GET_STATUS_TIMEOUT_SECONDS)
    except grpc.RpcError:
        logs.log_error('GetStatus failed.')
        return False

    if status.revision != utils.current_source_version():
        logs.log_warn(
            'Mismatching source revision: %s (host) vs %s (worker).' %
            (utils.current_source_version(), status.revision))
        return False

    if _host_state.worker_bot_name != status.bot_name:
        logs.log_warn('Worker bot name invalid (IP changed?).')
        return False

    if _host_state.worker_start_time:
        if _host_state.worker_start_time == status.start_time:
            return True

        logs.log_warn('Worker start time changed.')
        return False

    _host_state.worker_start_time = status.start_time
    return True
示例#2
0
def update_heartbeat(force_update=False):
  """Updates heartbeat with current timestamp and log data."""
  # Check if the heartbeat was recently updated. If yes, bail out.
  last_modified_time = persistent_cache.get_value(
      HEARTBEAT_LAST_UPDATE_KEY, constructor=datetime.datetime.utcfromtimestamp)
  if (not force_update and last_modified_time and not dates.time_has_expired(
      last_modified_time, seconds=data_types.HEARTBEAT_WAIT_INTERVAL)):
    return 0

  bot_name = environment.get_value('BOT_NAME')
  current_time = datetime.datetime.utcnow()

  try:
    heartbeat = ndb.Key(data_types.Heartbeat, bot_name).get()
    if not heartbeat:
      heartbeat = data_types.Heartbeat()
      heartbeat.bot_name = bot_name

    heartbeat.key = ndb.Key(data_types.Heartbeat, bot_name)
    heartbeat.task_payload = tasks.get_task_payload()
    heartbeat.task_end_time = tasks.get_task_end_time()
    heartbeat.last_beat_time = current_time
    heartbeat.source_version = utils.current_source_version()
    heartbeat.put()

    persistent_cache.set_value(
        HEARTBEAT_LAST_UPDATE_KEY, time.time(), persist_across_reboots=True)
  except:
    logs.log_error('Unable to update heartbeat.')
    return 0

  return 1
示例#3
0
def get_local_source_revision():
  """Return the local source revision."""
  return utils.current_source_version()
示例#4
0
 def GetStatus(self, request, context):  # pylint: disable=unused-argument
     return untrusted_runner_pb2.GetStatusResponse(
         revision=utils.current_source_version(),
         start_time=_worker_state.start_time,
         bot_name=environment.get_value('BOT_NAME'))