Bug 895451 - Automate Talos setup & running Talos on the tree. DONTBUILD. r=gps
authorArmen Zambrano Gasparnian <armenzg@mozilla.com>
Fri, 26 Jul 2013 11:04:31 -0400
changeset 140155 d08133d025b3
parent 140154 68062bad2d33
child 140156 98c66f6c0414
push id25016
push userryanvm@gmail.com
push date2013-07-27 02:25 +0000
treeherdermozilla-central@fb48c7d58b8b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersgps
bugs895451
milestone25.0a1
Bug 895451 - Automate Talos setup & running Talos on the tree. DONTBUILD. r=gps
build/mach_bootstrap.py
testing/talos/mach_commands.py
--- a/build/mach_bootstrap.py
+++ b/build/mach_bootstrap.py
@@ -60,16 +60,17 @@ MACH_MODULES = [
     'python/mach/mach/commands/commandinfo.py',
     'python/mozboot/mozboot/mach_commands.py',
     'python/mozbuild/mozbuild/config.py',
     'python/mozbuild/mozbuild/mach_commands.py',
     'python/mozbuild/mozbuild/frontend/mach_commands.py',
     'testing/marionette/mach_commands.py',
     'testing/mochitest/mach_commands.py',
     'testing/xpcshell/mach_commands.py',
+    'testing/talos/mach_commands.py',
     'tools/mach_commands.py',
 ]
 
 
 CATEGORIES = {
     'build': {
         'short': 'Build Commands',
         'long': 'Interact with the build system',
new file mode 100644
--- /dev/null
+++ b/testing/talos/mach_commands.py
@@ -0,0 +1,149 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Integrates Talos mozharness with mach
+
+from __future__ import print_function, unicode_literals
+
+import os
+import sys
+import json
+import which
+
+from mozbuild.base import (
+    MozbuildObject,
+    MachCommandBase
+)
+
+from mach.decorators import (
+    CommandArgument,
+    CommandProvider,
+    Command,
+)
+
+class TalosRunner(MozbuildObject):
+    def run_test(self, suite, repo, rev):
+        """
+        We want to do couple of things before running Talos
+        1. Clone mozharness
+        2. Make config for Talos Mozharness
+        3. Run mozharness
+        """
+
+        print("Running Talos test suite %s" % suite)
+        self.init_variables(suite, repo, rev)
+        self.clone_mozharness()
+        self.make_config()
+        self.write_config()
+        self.make_args()
+        return self.run_mozharness()
+
+    def init_variables(self, suite, repo, rev):
+        self.suite = suite
+        self.mozharness_repo = repo
+        self.mozharness_rev = rev
+
+        self.talos_dir = os.path.join(self.topsrcdir, 'testing', 'talos')
+        self.mozharness_dir = os.path.join(self.topobjdir, 'mozharness')
+        self.config_dir = os.path.join(self.mozharness_dir, 'configs', 'talos')
+        self.talos_json = os.path.join(self.talos_dir, 'talos.json')
+        self.config_filename = 'in_tree_conf.json'
+        self.config_file_path = os.path.join(self.config_dir,
+                                             self.config_filename)
+        self.binary_path = self.get_binary_path()
+        self.virtualenv_script = os.path.join(self.topsrcdir, 'python',
+                                              'virtualenv', 'virtualenv.py')
+        self.virtualenv_path = os.path.join(self.mozharness_dir, 'venv')
+        self.python_interp = sys.executable
+
+    def clone_mozharness(self):
+        """Clones mozharness into topobjdir/mozharness
+           using mercurial. If mozharness is already cloned,
+           it updates it to the latest version"""
+        try:
+            mercurial = which.which('hg')
+        except which.WhichError as e:
+            print("You don't have hg in your PATH: {0}".format(e))
+            raise e
+        clone_cmd = [mercurial, 'clone', '-r', self.mozharness_rev,
+                     self.mozharness_repo, self.mozharness_dir]
+        pull_cmd = [mercurial, 'pull', '-r', self.mozharness_rev, '-u']
+
+        dot_hg = os.path.join(self.mozharness_dir, '.hg')
+        if os.path.exists(dot_hg):
+            self.run_process(args=pull_cmd, cwd=self.mozharness_dir)
+        else:
+            self.run_process(args=clone_cmd)
+
+    def make_config(self):
+        self.config = {
+            'talos_json': self.talos_json,
+            'binary_path': self.binary_path,
+            'log_name': 'talos',
+            'virtualenv_path': self.virtualenv_path,
+            'pypi_url': 'http://pypi.python.org/simple',
+            'use_talos_json': True,
+            'base_work_dir': self.mozharness_dir,
+            'exes': {
+                'python': self.python_interp,
+                'virtualenv': [self.python_interp, self.virtualenv_script]
+            },
+            'title': os.uname()[1].lower().split('.')[0],
+            'default_actions': [
+                'clone-talos',
+                'create-virtualenv',
+                'run-tests',
+            ],
+            'python_webserver': True
+        }
+
+    def make_args(self):
+        self.args = {
+            'config': {
+                'suite': self.suite,
+                'use_talos_json': True
+            },
+           'initial_config_file': self.config_file_path,
+       }
+
+    def write_config(self):
+        try:
+            config_file = open(self.config_file_path, 'wb')
+            config_file.write(json.dumps(self.config))
+        except IOError as e:
+            err_str = "Error writing to Talos Mozharness config file {0}:{1}"
+            print(err_str.format(self.config_file_path, str(e)))
+            raise e
+
+    def run_mozharness(self):
+        sys.path.append(self.mozharness_dir)
+        from mozharness.mozilla.testing.talos import Talos
+        talos_mh = Talos(config=self.args['config'],
+                         initial_config_file=self.args['initial_config_file'])
+        return talos_mh.run()
+
+@CommandProvider
+class MachCommands(MachCommandBase):
+    mozharness_repo = 'https://hg.mozilla.org/build/mozharness'
+    mozharness_rev = 'production'
+
+    @Command('talos-test', category='testing',
+             description='Run talos tests.')
+    @CommandArgument('suite', help='Talos test suite to run. Valid suites are '
+                                   'chromez, dirtypaint, dromaeojs, other,'
+                                   'svgr, rafx, tpn, tp5o, xperf.')
+    @CommandArgument('--repo', default=mozharness_repo,
+                     help='The mozharness repository to clone from. '
+                          'Defaults to http://hg.mozilla.org/build/mozharness')
+    @CommandArgument('--rev', default=mozharness_rev,
+                     help='The mozharness revision to clone. Defaults to '
+                          'production')
+    def run_talos_test(self, suite, repo=None, rev=None):
+        talos = self._spawn(TalosRunner)
+
+        try:
+            return talos.run_test(suite, repo, rev)
+        except Exception as e:
+            print(str(e))
+            return 1