def CreateRequest(request_id,
                  command_infos=None,
                  user='******',
                  priority=None,
                  queue_timeout_seconds=None,
                  plugin_data=None,
                  max_concurrent_tasks=None,
                  state=common.RequestState.UNKNOWN,
                  notify_state_change=False):
    """Creates a mock Request entity."""
    key = ndb.Key(datastore_entities.Request,
                  str(request_id),
                  namespace=common.NAMESPACE)
    entity = datastore_entities.Request(
        key=key,
        user=user,
        command_infos=command_infos or [],
        priority=priority,
        queue_timeout_seconds=queue_timeout_seconds,
        plugin_data=plugin_data,
        state=state,
        notify_state_change=notify_state_change,
        max_concurrent_tasks=max_concurrent_tasks)
    entity.put()
    return entity
 def testRequestFromEntity(self):
     """Tests converting a Request entity to a message."""
     request = datastore_entities.Request(
         id='id',
         user='******',
         command_infos=[
             datastore_entities.CommandInfo(command_line='command_line',
                                            shard_count=2,
                                            run_count=3,
                                            cluster='cluster',
                                            run_target='run_target')
         ],
         state=common.RequestState.UNKNOWN)
     message = datastore_entities.ToMessage(request)
     self.AssertEqualRequest(request, message)
 def testRequestFromEntity_canceledRequest(self):
     """Tests converting a cancelled Request entity to a message."""
     request = datastore_entities.Request(
         id='id',
         user='******',
         command_infos=[
             datastore_entities.CommandInfo(command_line='command_line',
                                            shard_count=2,
                                            run_count=3,
                                            cluster='cluster',
                                            run_target='run_target')
         ],
         state=common.RequestState.CANCELED,
         cancel_reason=common.CancelReason.QUEUE_TIMEOUT)
     message = datastore_entities.ToMessage(request)
     self.AssertEqualRequest(request, message)
def CreateRequest(user,
                  command_infos,
                  priority=None,
                  queue_timeout_seconds=None,
                  type_=None,
                  request_id=None,
                  plugin_data=None,
                  max_retry_on_test_failures=None,
                  prev_test_context=None,
                  max_concurrent_tasks=None):
  """Create a new request and add it to the request_queue.

  Args:
    user: a requesting user.
    command_infos: a list of CommandInfo entities.
    priority: a request priority.
    queue_timeout_seconds: a request timeout in seconds.
    type_: a request type.
    request_id: request_id, used for easy testing.
    plugin_data: a map that contains the plugin data.
    max_retry_on_test_failures: the max number of completed but failed attempts
        for each command.
    prev_test_context: a previous test context.
    max_concurrent_tasks: the max number of concurrent tasks at any given time.
  Returns:
    a Request entity, read only.
  """
  if not request_id:
    request_id = _CreateRequestId()
  key = ndb.Key(
      datastore_entities.Request, request_id,
      namespace=common.NAMESPACE)
  request = datastore_entities.Request(
      key=key,
      user=user,
      command_infos=command_infos,
      priority=priority,
      queue_timeout_seconds=queue_timeout_seconds,
      type=type_,
      plugin_data=plugin_data,
      max_retry_on_test_failures=max_retry_on_test_failures,
      prev_test_context=prev_test_context,
      max_concurrent_tasks=max_concurrent_tasks,
      state=common.RequestState.UNKNOWN)
  request.put()
  return request
 def testMessageFromEntity_cancelRequest_invalidRequest(self):
     """Tests converting a Request object to a message."""
     request_key = ndb.Key(datastore_entities.Request, '123')
     request = datastore_entities.Request(
         key=request_key,
         user='******',
         command_infos=[
             datastore_entities.CommandInfo(command_line='command_line',
                                            shard_count=2,
                                            run_count=3,
                                            cluster='cluster',
                                            run_target='run_target')
         ],
         state=common.RequestState.UNKNOWN,
         cancel_reason=common.CancelReason.INVALID_REQUEST)
     message = datastore_entities.ToMessage(request)
     self.AssertEqualRequest(request, message)
    def testRequestEventMessage_legacyClientCompatibility(self):
        """Tests whether RequestEventMessage is compatible with legacy clients."""
        request = datastore_entities.Request(
            id='request_id',
            user='******',
            command_infos=[
                datastore_entities.CommandInfo(command_line='command_line')
            ])
        message = api_messages.RequestEventMessage(
            type='request_state_changed',
            request_id=request.key.id(),
            new_state=common.RequestState.RUNNING,
            request=datastore_entities.ToMessage(request))

        obj = json.loads(protojson.encode_message(message))

        self.assertEqual('request_state_changed', obj.get('type'))
        self.assertEqual('request_id', obj.get('request_id'))
        self.assertEqual('RUNNING', obj.get('new_state'))
    def testRequestFromEntity_multipleCommandsAndAttempts(self):
        """Tests converting a Request object with multiple Commands."""
        request_key = ndb.Key(datastore_entities.Request, '123')
        request = datastore_entities.Request(
            key=request_key,
            user='******',
            command_infos=[
                datastore_entities.CommandInfo(command_line='command_line',
                                               shard_count=2,
                                               run_count=3,
                                               cluster='cluster',
                                               run_target='run_target')
            ],
            state=common.RequestState.UNKNOWN,
            cancel_reason=common.CancelReason.QUEUE_TIMEOUT)
        command1_key = ndb.Key(datastore_entities.Command,
                               '456',
                               parent=request_key)
        cmd1 = datastore_entities.Command(key=command1_key,
                                          command_line='command_line1',
                                          cluster='cluster',
                                          run_target='run_target',
                                          run_count=10,
                                          state=common.CommandState.QUEUED,
                                          start_time=TIMESTAMP,
                                          end_time=None,
                                          create_time=TIMESTAMP,
                                          update_time=TIMESTAMP,
                                          shard_count=2,
                                          shard_index=0)
        command2_key = ndb.Key(datastore_entities.Command,
                               '457',
                               parent=request_key)
        cmd2 = datastore_entities.Command(key=command2_key,
                                          command_line='command_line2',
                                          cluster='cluster',
                                          run_target='run_target',
                                          run_count=10,
                                          state=common.CommandState.QUEUED,
                                          start_time=TIMESTAMP,
                                          end_time=None,
                                          create_time=TIMESTAMP,
                                          update_time=TIMESTAMP,
                                          shard_count=2,
                                          shard_index=1)
        command_attempt1_key = ndb.Key(datastore_entities.CommandAttempt,
                                       '890',
                                       parent=command1_key)
        cmd_attempt1 = datastore_entities.CommandAttempt(
            key=command_attempt1_key,
            task_id='task_id',
            attempt_id='attempt_id',
            state=common.CommandState.UNKNOWN,
            hostname='hostname',
            device_serial='device_serial',
            start_time=TIMESTAMP,
            end_time=TIMESTAMP,
            status='status',
            error='error',
            summary='summary',
            total_test_count=1000,
            failed_test_count=100,
            passed_test_count=900,
            create_time=TIMESTAMP,
            update_time=TIMESTAMP)
        command_attempt2_key = ndb.Key(datastore_entities.CommandAttempt,
                                       '891',
                                       parent=command1_key)
        cmd_attempt2 = datastore_entities.CommandAttempt(
            key=command_attempt2_key,
            task_id='task_id',
            attempt_id='attempt_id',
            state=common.CommandState.UNKNOWN,
            hostname='hostname',
            device_serial='device_serial',
            start_time=TIMESTAMP,
            end_time=TIMESTAMP,
            status='status',
            error='error',
            summary='summary',
            total_test_count=1000,
            failed_test_count=100,
            passed_test_count=900,
            create_time=TIMESTAMP,
            update_time=TIMESTAMP)
        commands = [cmd1, cmd2]
        command_attempts = [cmd_attempt1, cmd_attempt2]

        message = datastore_entities.ToMessage(
            request, command_attempts=command_attempts, commands=commands)
        self.AssertEqualRequest(request, message)
        self.assertEqual(len(message.commands), len(commands))
        for command, command_msg in zip(commands, message.commands):
            self.AssertEqualCommand(command, command_msg)
        self.assertEqual(len(message.command_attempts), len(command_attempts))
        for attempt, msg in zip(command_attempts, message.command_attempts):
            self.AssertEqualCommandAttempt(attempt, msg)