예제 #1
0
  def _EnqueueUserRecallTasks(self, message_criteria, owner_email):
    """Efficiently add tasks for each user to recall messages (bulk add).

    Bulk add() saves roundtrips (rpc calls).

    Args:
      message_criteria: String criteria (message-id) to recall.
      owner_email: String email address of user running this recall.
    """
    if recall_task.RecallTaskModel.IsTaskAborted(self._task_key_id):
      return
    cursor = None
    while True:
      user_recall_tasks = []
      results, cursor, unused_more = (
          domain_user.DomainUserToCheckModel.FetchOnePageOfActiveUsersForTask(
              task_key_id=self._task_key_id,
              cursor=cursor))
      for user in results:
        user_recall_tasks.append(Task(
            name='%s_%s_%s' % (
                view_utils.CreateSafeUserEmailForTaskName(owner_email),
                view_utils.CreateSafeUserEmailForTaskName(user.user_email),
                view_utils.GetCurrentDateTimeForTaskName()),
            params={'message_criteria': message_criteria,
                    'task_key_id': self._task_key_id,
                    'user_email': user.user_email,
                    'user_key_id': user.key.id()},
            target='recall-backend',
            url='/backend/recall_user_messages'))
      if not user_recall_tasks:
        break
      self._AddUserRecallTasks(user_recall_tasks=user_recall_tasks)
예제 #2
0
  def _EnqueueUserRetrievalTasks(self, message_criteria, owner_email):
    """Efficiently add tasks to enumerate domain users as a list (bulk add).

    Bulk add() saves roundtrips (rpc calls).

    Args:
      message_criteria: String criteria (message-id) to recall.
      owner_email: String email address of user running this recall.
    """
    user_retrieval_tasks = []
    # Use countdown to space out these requests a little.
    # There is a 15 request/s quota on the Admin SDK API.
    limit_requests_s = 15
    for prefix_counter, email_prefix in enumerate(PartitionEmailPrefixes()):
      user_retrieval_tasks.append(
          Task(countdown=(prefix_counter / limit_requests_s),
               name='%s_%s_%s' % (
                   view_utils.CreateSafeUserEmailForTaskName(owner_email),
                   email_prefix,
                   view_utils.GetCurrentDateTimeForTaskName()),
               params={'email_prefix': email_prefix,
                       'message_criteria': message_criteria,
                       'owner_email': owner_email,
                       'task_key_id': self._task_key_id},
               target='recall-backend',
               url='/backend/retrieve_domain_users'))
    self._AddUserRetrievalTask(task=user_retrieval_tasks)
예제 #3
0
    def _EnqueueMasterRecallTask(self, owner_email, message_criteria,
                                 task_key_id):
        """Add master recall task with error handling.

    Args:
      owner_email: String email address of user running this recall.
      message_criteria: String criteria (message-id) to recall.
      task_key_id: Int unique id of the parent task.

    Raises:
      re-raises any task queue errors.
    """
        task_name = '%s_%s' % (view_utils.CreateSafeUserEmailForTaskName(
            owner_email), view_utils.GetCurrentDateTimeForTaskName())
        master_task = Task(name=task_name,
                           params={
                               'owner_email': owner_email,
                               'task_key_id': task_key_id,
                               'message_criteria': message_criteria
                           },
                           target='0.recall-backend',
                           url='/backend/recall_messages')
        try:
            master_task.add(queue_name='recall-messages-queue')
        except TaskQueueError:
            view_utils.FailRecallTask(
                task_key_id=task_key_id,
                reason_string='Failed to enqueue master task.')
            raise
예제 #4
0
  def _AddTaskToMonitorUserRecallTasksHaveCompleted(self, owner_email):
    """Adds final task which monitors user recall tasks for completion.

    Args:
      owner_email: String email address of user running this recall.
    """
    self._AddUserRecallTasks(user_recall_tasks=Task(
        name='%s_monitor_%s' % (
            view_utils.CreateSafeUserEmailForTaskName(owner_email),
            view_utils.GetCurrentDateTimeForTaskName()),
        params={'task_key_id': self._task_key_id},
        target='recall-backend',
        url='/backend/wait_for_task_completion'))