コード例 #1
0
  def make_task_request(
      self, service_account, service_account_token, try_number=1):
    now = utils.utcnow()
    args = {
      'created_ts': now,
      'manual_tags': [u'tag:1'],
      'name': 'Request with %s' % service_account,
      'priority': 50,
      'task_slices': [
        task_request.TaskSlice(
            expiration_secs=60,
            properties=task_request.TaskProperties(
                command=[u'command1'],
                dimensions_data={u'pool': [u'default']},
                execution_timeout_secs=24*60*60)),
      ],
      'user': '******',
    }
    req = task_request.TaskRequest(**args)
    task_request.init_new_request(req, True)
    req.key = task_request.new_request_key()
    req.service_account = service_account
    req.service_account_token = service_account_token
    req.put()

    summary_key = task_pack.request_key_to_result_summary_key(req.key)
    run_result_key = task_pack.result_summary_key_to_run_result_key(
        summary_key, try_number)
    return task_pack.pack_run_result_key(run_result_key)
コード例 #2
0
    def post(self):
        logging.error('Unexpected old client')
        data = self.parse_body()
        msg = log_unexpected_subset_keys(self._EXPECTED_DATA_KEYS,
                                         self._REQUIRED_DATA_KEYS, data,
                                         self.request, 'client',
                                         'request keys')
        if msg:
            self.abort_with_error(400, error=msg)
        data_properties = data['properties']
        msg = log_unexpected_subset_keys(self._EXPECTED_PROPERTIES_KEYS,
                                         self._REQUIRED_PROPERTIES_KEYS,
                                         data_properties, self.request,
                                         'client', 'request properties keys')
        if msg:
            self.abort_with_error(400, error=msg)

        # Class TaskProperties takes care of making everything deterministic.
        properties = task_request.TaskProperties(
            commands=data_properties['commands'],
            data=data_properties['data'],
            dimensions=data_properties['dimensions'],
            env=data_properties['env'],
            execution_timeout_secs=data_properties['execution_timeout_secs'],
            grace_period_secs=data_properties.get('grace_period_secs', 30),
            idempotent=data_properties.get('idempotent', False),
            io_timeout_secs=data_properties['io_timeout_secs'])

        now = utils.utcnow()
        expiration_ts = now + datetime.timedelta(
            seconds=data['scheduling_expiration_secs'])
        request = task_request.TaskRequest(
            created_ts=now,
            expiration_ts=expiration_ts,
            name=data['name'],
            parent_task_id=data.get('parent_task_id'),
            priority=data['priority'],
            properties=properties,
            tags=data['tags'],
            user=data['user'] or '')

        try:
            request = task_request.make_request(request, acl.is_bot_or_admin())
        except (AttributeError, datastore_errors.BadValueError, TypeError,
                ValueError) as e:
            self.abort_with_error(400, error=str(e))

        result_summary = task_scheduler.schedule_request(request)
        data = {
            'request': request.to_dict(),
            'task_id': task_pack.pack_result_summary_key(result_summary.key),
        }
        self.send_response(utils.to_json_encodable(data))
コード例 #3
0
def _gen_properties(**kwargs):
    """Creates a TaskProperties."""
    args = {
        'command': [u'command1'],
        'dimensions': {
            u'pool': [u'default']
        },
        'env': {},
        'execution_timeout_secs': 24 * 60 * 60,
        'io_timeout_secs': None,
    }
    args.update(kwargs or {})
    args['dimensions_data'] = args.pop('dimensions')
    return task_request.TaskProperties(**args)
コード例 #4
0
    def terminate(self, request):
        """Asks a bot to terminate itself gracefully.

    The bot will stay in the DB, use 'delete' to remove it from the DB
    afterward. This request returns a pseudo-taskid that can be waited for to
    wait for the bot to turn down.

    This command is particularly useful when a privileged user needs to safely
    debug a machine specific issue. The user can trigger a terminate for one of
    the bot exhibiting the issue, wait for the pseudo-task to run then access
    the machine with the guarantee that the bot is not running anymore.
    """
        # TODO(maruel): Disallow a terminate task when there's one currently
        # pending or if the bot is considered 'dead', e.g. no contact since 10
        # minutes.
        logging.info('%s', request)
        bot_key = bot_management.get_info_key(request.bot_id)
        get_or_raise(bot_key)  # raises 404 if there is no such bot
        try:
            # Craft a special priority 0 task to tell the bot to shutdown.
            properties = task_request.TaskProperties(
                dimensions={u'id': request.bot_id},
                execution_timeout_secs=0,
                grace_period_secs=0,
                io_timeout_secs=0)
            now = utils.utcnow()
            request = task_request.TaskRequest(
                created_ts=now,
                expiration_ts=now + datetime.timedelta(days=1),
                name='Terminate %s' % request.bot_id,
                priority=0,
                properties=properties,
                tags=['terminate:1'],
                user=auth.get_current_identity().to_bytes())
            assert request.properties.is_terminate
            posted_request = task_request.make_request(request,
                                                       acl.is_bot_or_admin())
        except (datastore_errors.BadValueError, TypeError, ValueError) as e:
            raise endpoints.BadRequestException(e.message)

        result_summary = task_scheduler.schedule_request(posted_request)
        return swarming_rpcs.TerminateResponse(
            task_id=task_pack.pack_result_summary_key(result_summary.key))
コード例 #5
0
def _gen_request(properties=None, **kwargs):
  """Creates a TaskRequest."""
  props = {
    'command': [u'command1'],
    'dimensions': {u'pool': u'default'},
    'env': {},
    'execution_timeout_secs': 24*60*60,
    'io_timeout_secs': None,
  }
  props.update(properties or {})
  now = utils.utcnow()
  args = {
    'created_ts': now,
    'name': 'Request name',
    'priority': 50,
    'properties': task_request.TaskProperties(**props),
    'expiration_ts': now + datetime.timedelta(seconds=60),
    'tags': [u'tag:1'],
    'user': '******',
  }
  args.update(kwargs)
  return task_request.TaskRequest(**args)
コード例 #6
0
ファイル: task_request_test.py プロジェクト: rmistry/luci-py
def _gen_request(properties=None, **kwargs):
    """Creates a TaskRequest."""
    props = {
        'commands': [[u'command1', u'arg1']],
        'data': [
            [u'http://localhost/foo', u'foo.zip'],
            [u'http://localhost/bar', u'bar.zip'],
        ],
        'dimensions': {
            u'OS': u'Windows-3.1.1',
            u'hostname': u'localhost'
        },
        'env': {
            u'foo': u'bar',
            u'joe': u'2'
        },
        'execution_timeout_secs':
        30,
        'grace_period_secs':
        30,
        'idempotent':
        False,
        'io_timeout_secs':
        None,
    }
    props.update(properties or {})
    now = utils.utcnow()
    args = {
        'created_ts': now,
        'name': 'Request name',
        'priority': 50,
        'properties': task_request.TaskProperties(**props),
        'expiration_ts': now + datetime.timedelta(seconds=30),
        'tags': [u'tag:1'],
        'user': '******',
    }
    args.update(kwargs)
    return task_request.TaskRequest(**args)
コード例 #7
0
def _gen_request(properties=None, **kwargs):
    """Creates a TaskRequest."""
    properties = properties or {}
    packages = properties.pop('packages', [{
        'package_name': 'rm',
        'version': PINNED_PACKAGE_VERSION,
    }])
    props = {
        'command': [u'command1', u'arg1'],
        'packages': [task_request.CipdPackage(**p) for p in packages],
        'dimensions': {
            u'OS': u'Windows-3.1.1',
            u'hostname': u'localhost',
            u'pool': u'default',
        },
        'env': {
            u'foo': u'bar',
            u'joe': u'2'
        },
        'execution_timeout_secs': 30,
        'grace_period_secs': 30,
        'idempotent': False,
        'io_timeout_secs': None,
    }
    props.update(properties)
    now = utils.utcnow()
    args = {
        'created_ts': now,
        'name': 'Request name',
        'priority': 50,
        'properties': task_request.TaskProperties(**props),
        'expiration_ts': now + datetime.timedelta(seconds=30),
        'tags': [u'tag:1'],
        'user': '******',
    }
    args.update(kwargs)
    return task_request.TaskRequest(**args)
コード例 #8
0
ファイル: task_request_test.py プロジェクト: stefb965/luci-py
def _gen_properties(**kwargs):
  """Creates a TaskProperties."""
  args = {
    u'cipd_input': _gen_cipd_input(),
    u'command': [u'command1', u'arg1'],
    u'dimensions': {
      u'OS': [u'Windows-3.1.1'],
      u'hostname': [u'localhost'],
      u'pool': [u'default'],
    },
    u'env': {u'foo': u'bar', u'joe': u'2'},
    u'env_prefixes': {u'PATH': [u'local/path']},
    u'execution_timeout_secs': 30,
    u'grace_period_secs': 30,
    u'idempotent': False,
    u'inputs_ref': task_request.FilesRef(
        isolatedserver=u'https://isolateserver.appspot.com',
        namespace=u'default-gzip'),
    u'io_timeout_secs': None,
    u'has_secret_bytes': u'secret_bytes' in kwargs,
  }
  args.update(kwargs)
  args[u'dimensions_data'] = args.pop(u'dimensions')
  return task_request.TaskProperties(**args)