testing/talos/mach_commands.py

Wed, 31 Dec 2014 06:55:50 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:55:50 +0100
changeset 2
7e26c7da4463
permissions
-rw-r--r--

Added tag UPSTREAM_283F7C6 for changeset ca08bd8f51b2

     1 # This Source Code Form is subject to the terms of the Mozilla Public
     2 # License, v. 2.0. If a copy of the MPL was not distributed with this
     3 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
     5 # Integrates Talos mozharness with mach
     7 from __future__ import print_function, unicode_literals
     9 import os
    10 import sys
    11 import json
    12 import which
    13 import socket
    15 from mozbuild.base import (
    16     MozbuildObject,
    17     MachCommandBase
    18 )
    20 from mach.decorators import (
    21     CommandArgument,
    22     CommandProvider,
    23     Command,
    24 )
    26 class TalosRunner(MozbuildObject):
    27     def run_test(self, suite, repo, rev):
    28         """
    29         We want to do couple of things before running Talos
    30         1. Clone mozharness
    31         2. Make config for Talos Mozharness
    32         3. Run mozharness
    33         """
    35         print("Running Talos test suite %s" % suite)
    36         self.init_variables(suite, repo, rev)
    37         self.clone_mozharness()
    38         self.make_config()
    39         self.write_config()
    40         self.make_args()
    41         return self.run_mozharness()
    43     def init_variables(self, suite, repo, rev):
    44         self.suite = suite
    45         self.mozharness_repo = repo
    46         self.mozharness_rev = rev
    48         self.talos_dir = os.path.join(self.topsrcdir, 'testing', 'talos')
    49         self.mozharness_dir = os.path.join(self.topobjdir, 'mozharness')
    50         self.config_dir = os.path.join(self.mozharness_dir, 'configs', 'talos')
    51         self.talos_json = os.path.join(self.talos_dir, 'talos.json')
    52         self.config_filename = 'in_tree_conf.json'
    53         self.config_file_path = os.path.join(self.config_dir,
    54                                              self.config_filename)
    55         self.binary_path = self.get_binary_path()
    56         self.virtualenv_script = os.path.join(self.topsrcdir, 'python',
    57                                               'virtualenv', 'virtualenv.py')
    58         self.virtualenv_path = os.path.join(self.mozharness_dir, 'venv')
    59         self.python_interp = sys.executable
    61     def clone_mozharness(self):
    62         """Clones mozharness into topobjdir/mozharness
    63            using mercurial. If mozharness is already cloned,
    64            it updates it to the latest version"""
    65         try:
    66             mercurial = which.which('hg')
    67         except which.WhichError as e:
    68             print("You don't have hg in your PATH: {0}".format(e))
    69             raise e
    70         clone_cmd = [mercurial, 'clone', '-r', self.mozharness_rev,
    71                      self.mozharness_repo, self.mozharness_dir]
    72         pull_cmd = [mercurial, 'pull', '-r', self.mozharness_rev, '-u']
    74         dot_hg = os.path.join(self.mozharness_dir, '.hg')
    75         if os.path.exists(dot_hg):
    76             self.run_process(args=pull_cmd, cwd=self.mozharness_dir)
    77         else:
    78             self.run_process(args=clone_cmd)
    80     def make_config(self):
    81         self.config = {
    82             'talos_json': self.talos_json,
    83             'binary_path': self.binary_path,
    84             'log_name': 'talos',
    85             'virtualenv_path': self.virtualenv_path,
    86             'pypi_url': 'http://pypi.python.org/simple',
    87             'use_talos_json': True,
    88             'base_work_dir': self.mozharness_dir,
    89             'exes': {
    90                 'python': self.python_interp,
    91                 'virtualenv': [self.python_interp, self.virtualenv_script]
    92             },
    93             'title': socket.gethostname(),
    94             'default_actions': [
    95                 'clone-talos',
    96                 'create-virtualenv',
    97                 'run-tests',
    98             ],
    99             'python_webserver': True
   100         }
   102     def make_args(self):
   103         self.args = {
   104             'config': {
   105                 'suite': self.suite,
   106                 'use_talos_json': True
   107             },
   108            'initial_config_file': self.config_file_path,
   109        }
   111     def write_config(self):
   112         try:
   113             config_file = open(self.config_file_path, 'wb')
   114             config_file.write(json.dumps(self.config))
   115         except IOError as e:
   116             err_str = "Error writing to Talos Mozharness config file {0}:{1}"
   117             print(err_str.format(self.config_file_path, str(e)))
   118             raise e
   120     def run_mozharness(self):
   121         sys.path.insert(0, self.mozharness_dir)
   122         from mozharness.mozilla.testing.talos import Talos
   123         talos_mh = Talos(config=self.args['config'],
   124                          initial_config_file=self.args['initial_config_file'])
   125         return talos_mh.run()
   127 @CommandProvider
   128 class MachCommands(MachCommandBase):
   129     mozharness_repo = 'https://hg.mozilla.org/build/mozharness'
   130     mozharness_rev = 'production'
   132     @Command('talos-test', category='testing',
   133              description='Run talos tests.')
   134     @CommandArgument('suite', help='Talos test suite to run. Valid suites are '
   135                                    'chromez, dirtypaint, dromaeojs, other,'
   136                                    'svgr, rafx, tpn, tp5o, xperf.')
   137     @CommandArgument('--repo', default=mozharness_repo,
   138                      help='The mozharness repository to clone from. '
   139                           'Defaults to http://hg.mozilla.org/build/mozharness')
   140     @CommandArgument('--rev', default=mozharness_rev,
   141                      help='The mozharness revision to clone. Defaults to '
   142                           'production')
   143     def run_talos_test(self, suite, repo=None, rev=None):
   144         talos = self._spawn(TalosRunner)
   146         try:
   147             return talos.run_test(suite, repo, rev)
   148         except Exception as e:
   149             print(str(e))
   150             return 1

mercurial