Bug 1347698 - Generalize tc mochitest retriggers to support reftest r?jmaher draft
authorWilliam Lachance <wlachance@mozilla.com>
Wed, 15 Mar 2017 18:01:17 -0400
changeset 500768 c3f622a06eaa258f4296824354d64003c7dbacfb
parent 500767 076207aacf1fe0cd4b63dd9eb66cff82e3b561f5
child 549705 1449173b0d79cce8119054b77c3bd613f25a5fed
push id49795
push userwlachance@mozilla.com
push dateFri, 17 Mar 2017 17:20:17 +0000
reviewersjmaher
bugs1347698
milestone55.0a1
Bug 1347698 - Generalize tc mochitest retriggers to support reftest r?jmaher Let's do this by modifying the mochitest retrigger action into a more generic "test retrigger" action that supports both. MozReview-Commit-ID: H3AbsJ58ASV
taskcluster/actions/mochitest-retrigger-action.py
taskcluster/actions/test-retrigger-action.py
deleted file mode 100644
--- a/taskcluster/actions/mochitest-retrigger-action.py
+++ /dev/null
@@ -1,128 +0,0 @@
-import copy
-import json
-import logging
-
-import requests
-from slugid import nice as slugid
-
-from .registry import register_callback_action
-from taskgraph.create import create_task
-from taskgraph.util.time import (
-    current_json_time,
-    json_time_from_now
-)
-
-TASKCLUSTER_QUEUE_URL = "https://queue.taskcluster.net/v1/task"
-
-logger = logging.getLogger(__name__)
-
-
-@register_callback_action(
-    title='Schedule mochitest retrigger',
-    symbol='mdr',
-    description="Retriggers the specified mochitest job with additional options",
-    context=[{'test-type': 'mochitest'}],  # mochitest-only
-    order=0,
-    schema={
-        'type': 'object',
-        'properties': {
-            'path': {
-                'type': 'string',
-                'maxLength': 255,
-                'default': '',
-                'title': 'Path name',
-                'description': 'Path of mochitest to retrigger'
-            },
-            'logLevel': {
-                'type': 'string',
-                'enum': ['debug', 'info', 'warning', 'error', 'critical'],
-                'default': 'debug',
-                'title': 'Log level',
-                'description': 'Log level for output (default is DEBUG, which is highest)'
-            },
-            'runUntilFail': {
-                'type': 'boolean',
-                'default': True,
-                'title': 'Run until failure',
-                'description': ('Runs the specified set of tests repeatedly '
-                                'until failure (or 30 times)')
-            },
-            'repeat': {
-                'type': 'integer',
-                'default': 30,
-                'minimum': 1,
-                'title': 'Run tests N times',
-                'description': ('Run tests repeatedly (usually used in '
-                                'conjunction with runUntilFail)')
-            },
-            'environment': {
-                'type': 'object',
-                'default': {'MY_ENV_1': 'myvalue1'},
-                'title': 'Extra environment variables',
-                'description': 'Extra environment variables to use for this run'
-            },
-            'preferences': {
-                'type': 'object',
-                'default': {'mygeckopreferences.pref': 'myvalue2'},
-                'title': 'Extra gecko (about:config) preferences',
-                'description': 'Extra gecko (about:config) preferences to use for this run'
-            }
-        },
-        'additionalProperties': False,
-        'required': ['path']
-    }
-)
-def mochitest_retrigger_action(parameters, input, task_group_id, task_id, task):
-    new_task_definition = copy.copy(task)
-
-    # set new created, deadline, and expiry fields
-    new_task_definition['created'] = current_json_time()
-    new_task_definition['deadline'] = json_time_from_now('1d')
-    new_task_definition['expires'] = json_time_from_now('30d')
-
-    # reset artifact expiry
-    for artifact in new_task_definition['payload'].get('artifacts', {}).values():
-        artifact['expires'] = new_task_definition['expires']
-
-    # don't want to run mozharness tests, want a custom mach command instead
-    new_task_definition['payload']['command'] += ['--no-run-tests']
-
-    custom_mach_command = [
-        'mochitest',
-        '--keep-open=false',
-        '-f', new_task_definition['payload']['env']['MOCHITEST_FLAVOR']
-    ]
-
-    enable_e10s = json.loads(new_task_definition['payload']['env'].get(
-        'ENABLE_E10S', 'true'))
-    if not enable_e10s:
-        custom_mach_command += ['--disable-e10s']
-
-    custom_mach_command += ['--log-tbpl=-',
-                            '--log-tbpl-level={}'.format(input['logLevel'])]
-    if input.get('runUntilFail'):
-        custom_mach_command += ['--run-until-fail']
-    if input.get('repeat'):
-        custom_mach_command += ['--repeat', str(input['repeat'])]
-
-    # add any custom gecko preferences
-    for (key, val) in input.get('preferences', {}).iteritems():
-        custom_mach_command += ['--setpref', '{}={}'.format(key, val)]
-
-    custom_mach_command += [input['path']]
-    new_task_definition['payload']['env']['CUSTOM_MACH_COMMAND'] = ' '.join(
-        custom_mach_command)
-
-    # update environment
-    new_task_definition['payload']['env'].update(input.get('environment', {}))
-
-    # tweak the treeherder symbol
-    new_task_definition['extra']['treeherder']['symbol'] += '-custom'
-
-    logging.info("New task definition: %s", new_task_definition)
-
-    # actually create the new task
-    new_task_id = slugid()
-    logger.info("Creating new mochitest task with id %s", new_task_id)
-    session = requests.Session()
-    create_task(session, new_task_id, 'mochitest-debug', new_task_definition)
new file mode 100644
--- /dev/null
+++ b/taskcluster/actions/test-retrigger-action.py
@@ -0,0 +1,133 @@
+import copy
+import json
+import logging
+
+import requests
+from slugid import nice as slugid
+
+from .registry import register_callback_action
+from taskgraph.create import create_task
+from taskgraph.util.time import (
+    current_json_time,
+    json_time_from_now
+)
+
+TASKCLUSTER_QUEUE_URL = "https://queue.taskcluster.net/v1/task"
+
+logger = logging.getLogger(__name__)
+
+
+@register_callback_action(
+    title='Schedule test retrigger',
+    symbol='tr',
+    description="Retriggers the specified test job with additional options",
+    context=[{'test-type': 'mochitest'},
+             {'test-type': 'reftest'}],
+    order=0,
+    schema={
+        'type': 'object',
+        'properties': {
+            'path': {
+                'type': 'string',
+                'maxLength': 255,
+                'default': '',
+                'title': 'Path name',
+                'description': 'Path of test to retrigger'
+            },
+            'logLevel': {
+                'type': 'string',
+                'enum': ['debug', 'info', 'warning', 'error', 'critical'],
+                'default': 'debug',
+                'title': 'Log level',
+                'description': 'Log level for output (default is DEBUG, which is highest)'
+            },
+            'runUntilFail': {
+                'type': 'boolean',
+                'default': True,
+                'title': 'Run until failure',
+                'description': ('Runs the specified set of tests repeatedly '
+                                'until failure (or 30 times)')
+            },
+            'repeat': {
+                'type': 'integer',
+                'default': 30,
+                'minimum': 1,
+                'title': 'Run tests N times',
+                'description': ('Run tests repeatedly (usually used in '
+                                'conjunction with runUntilFail)')
+            },
+            'environment': {
+                'type': 'object',
+                'default': {'MY_ENV_1': 'myvalue1'},
+                'title': 'Extra environment variables',
+                'description': 'Extra environment variables to use for this run'
+            },
+            'preferences': {
+                'type': 'object',
+                'default': {'mygeckopreferences.pref': 'myvalue2'},
+                'title': 'Extra gecko (about:config) preferences',
+                'description': 'Extra gecko (about:config) preferences to use for this run'
+            }
+        },
+        'additionalProperties': False,
+        'required': ['path']
+    }
+)
+def test_retrigger_action(parameters, input, task_group_id, task_id, task):
+    new_task_definition = copy.copy(task)
+
+    # set new created, deadline, and expiry fields
+    new_task_definition['created'] = current_json_time()
+    new_task_definition['deadline'] = json_time_from_now('1d')
+    new_task_definition['expires'] = json_time_from_now('30d')
+
+    # reset artifact expiry
+    for artifact in new_task_definition['payload'].get('artifacts', {}).values():
+        artifact['expires'] = new_task_definition['expires']
+
+    # don't want to run mozharness tests, want a custom mach command instead
+    new_task_definition['payload']['command'] += ['--no-run-tests']
+
+    custom_mach_command = [task['tags']['test-type']]
+
+    # mochitests may specify a flavor
+    if new_task_definition['payload']['env'].get('MOCHITEST_FLAVOR'):
+        custom_mach_command += [
+            '--keep-open=false',
+            '-f',
+            new_task_definition['payload']['env']['MOCHITEST_FLAVOR']
+        ]
+
+    enable_e10s = json.loads(new_task_definition['payload']['env'].get(
+        'ENABLE_E10S', 'true'))
+    if not enable_e10s:
+        custom_mach_command += ['--disable-e10s']
+
+    custom_mach_command += ['--log-tbpl=-',
+                            '--log-tbpl-level={}'.format(input['logLevel'])]
+    if input.get('runUntilFail'):
+        custom_mach_command += ['--run-until-failure']
+    if input.get('repeat'):
+        custom_mach_command += ['--repeat', str(input['repeat'])]
+
+    # add any custom gecko preferences
+    for (key, val) in input.get('preferences', {}).iteritems():
+        custom_mach_command += ['--setpref', '{}={}'.format(key, val)]
+
+    custom_mach_command += [input['path']]
+    new_task_definition['payload']['env']['CUSTOM_MACH_COMMAND'] = ' '.join(
+        custom_mach_command)
+
+    # update environment
+    new_task_definition['payload']['env'].update(input.get('environment', {}))
+
+    # tweak the treeherder symbol
+    new_task_definition['extra']['treeherder']['symbol'] += '-custom'
+
+    logging.info("New task definition: %s", new_task_definition)
+
+    # actually create the new task
+    new_task_id = slugid()
+    logger.info("Creating new mochitest task with id %s", new_task_id)
+    session = requests.Session()
+    create_task(session, new_task_id, 'test-retrigger', new_task_definition)