• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2019 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""This is a temporary module to help scheduling paygen suites in trampoline.
6
7In trampoline, paygen suites are scheduled via skylab create-test, to schedule
8every paygen test independently, instead of creating a paygen suite via
9skylab create-suite.
10"""
11
12import re
13
14import common
15
16from autotest_lib.server.cros.dynamic_suite import control_file_getter
17from autotest_lib.server.cros.dynamic_suite import suite_common
18
19
20def is_paygen_suite(suite_name):
21    """Check if it's to run a paygen suite in trampoline."""
22    paygen_au_regexp = 'paygen_au_*'
23    return re.match(paygen_au_regexp, suite_name) is not None
24
25
26def get_paygen_tests(build, suite_name):
27    """Parse paygen tests from au control files."""
28    if not is_paygen_suite(suite_name):
29        raise ValueError('Cannot download paygen test control files for '
30                         'non-paygen suite %s' % suite_name)
31
32    ds, _ = suite_common.stage_build_artifacts(
33        build, artifacts=['%s_suite' % suite_name])
34    cf_getter = control_file_getter.DevServerGetter(build, ds)
35    tests = suite_common.retrieve_for_suite(cf_getter, suite_name)
36    return suite_common.filter_tests(
37            tests, suite_common.name_in_tag_predicate(suite_name))
38
39
40def paygen_skylab_args(test, suite_name, image, pool, board, model,
41                       timeout_mins, qs_account, service_account):
42    """Form args for requesting paygen tests in skylab."""
43    args = ['-image', image]
44    args += ['-pool', pool]
45    if board is not None:
46        args += ['-board', board]
47
48    if model is not None:
49        args += ['-model', model]
50
51    args += ['-timeout-mins', str(timeout_mins)]
52
53    tags = ['skylab:run_suite_trampoline',
54            'build:%s' % image,
55            'suite:%s' % suite_name]
56    for t in tags:
57        args += ['-tag', t]
58
59    keyvals = ['build:%s' % image,
60               'suite:%s' % suite_name,
61               'label:%s/%s/%s' % (image, suite_name, test.name)]
62    for k in keyvals:
63        args += ['-keyval', k]
64
65    # Paygen test expects a space-separated string of name=value pairs.
66    # See http://shortn/_C8r3rC0rOP.
67    test_args = ['name=%s' % test.suite,
68                 'update_type=%s' % test.update_type,
69                 'source_release=%s' % test.source_release,
70                 'target_release=%s' % test.target_release,
71                 'target_payload_uri=%s' % test.target_payload_uri,
72                 'source_payload_uri=%s' % test.source_payload_uri,
73                 'suite=%s' % test.suite,
74                 'source_archive_uri=%s' % test.source_archive_uri]
75    args += ['-test-args', ' '.join(test_args)]
76
77    if qs_account:
78        args += ['-qs-account', qs_account]
79    args += ['-service-account-json', service_account]
80
81    return args + ['autoupdate_EndToEndTest']
82