Bug 1435729 - Always use vendored tooltool.py; r?jlund draft
authorGregory Szorc <gps@mozilla.com>
Wed, 07 Feb 2018 14:37:48 -0800
changeset 752330 87dff21ee451856ccc004f9fddcd9700cf96ed1a
parent 752153 65133e49fbfd5306632301f74be7cd15890bdf9f
child 752363 b33b60f26c69bc47f37ad2cefad34aba62e1f18e
push id98229
push userbmo:gps@mozilla.com
push dateWed, 07 Feb 2018 22:37:58 +0000
reviewersjlund
bugs1435729
milestone60.0a1
Bug 1435729 - Always use vendored tooltool.py; r?jlund Previously, we were downloading tooltool.py from random servers. Considering tooltool.py is used to secure the download of future components, downloading tooltool.py from potentially 3rd party services was a major lapse in our end-to-end security, as a compromised tooltool.py wouldn't honor integrity checks. This commit copies the already vendored copy of tooltool.py into the mozharness directory. A copy needs to be in the mozharness directory because then a copy of mozharness without access to a source checkout will have access to it. We modify the code in mozharness that fetches tooltool to use the copy from mozharness (unless `mach artifact toolchain` is available). Since a copy of tooltool.py is always reliably available, we can remove all config entries related to tooltool.py. MozReview-Commit-ID: C7ls1xWrPMq
testing/mozharness/configs/android/androidarm_4_3.py
testing/mozharness/configs/android/androidx86.py
testing/mozharness/configs/awsy/linux_config.py
testing/mozharness/configs/awsy/macosx_config.py
testing/mozharness/configs/awsy/taskcluster_windows_config.py
testing/mozharness/configs/developer_config.py
testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py
testing/mozharness/configs/firefox_ui_tests/releng_release.py
testing/mozharness/configs/firefox_ui_tests/taskcluster.py
testing/mozharness/configs/firefox_ui_tests/taskcluster_windows.py
testing/mozharness/configs/marionette/prod_config.py
testing/mozharness/configs/marionette/windows_config.py
testing/mozharness/configs/marionette/windows_taskcluster_config.py
testing/mozharness/configs/openh264/android-aarch64.py
testing/mozharness/configs/openh264/android-arm.py
testing/mozharness/configs/openh264/android-x86.py
testing/mozharness/configs/openh264/linux32.py
testing/mozharness/configs/openh264/linux64.py
testing/mozharness/configs/openh264/macosx64.py
testing/mozharness/configs/openh264/win32.py
testing/mozharness/configs/openh264/win64.py
testing/mozharness/configs/single_locale/ash_android-api-16.py
testing/mozharness/configs/single_locale/date_android-api-16.py
testing/mozharness/configs/single_locale/jamun_android-api-16.py
testing/mozharness/configs/single_locale/maple_android-api-16.py
testing/mozharness/configs/single_locale/mozilla-aurora_android-api-16.py
testing/mozharness/configs/single_locale/mozilla-beta_android-api-16.py
testing/mozharness/configs/single_locale/mozilla-central_android-api-16.py
testing/mozharness/configs/single_locale/mozilla-release_android-api-16.py
testing/mozharness/configs/single_locale/staging_release_mozilla-beta_android_api_16.py
testing/mozharness/configs/single_locale/staging_release_mozilla-release_android_api_16.py
testing/mozharness/configs/single_locale/try_android-api-16.py
testing/mozharness/configs/talos/linux64_config_taskcluster.py
testing/mozharness/configs/talos/linux_config.py
testing/mozharness/configs/talos/mac_config.py
testing/mozharness/configs/talos/windows_config.py
testing/mozharness/configs/talos/windows_taskcluster_config.py
testing/mozharness/configs/talos/windows_vm_config.py
testing/mozharness/configs/unittests/linux_unittest.py
testing/mozharness/configs/unittests/mac_unittest.py
testing/mozharness/configs/unittests/thunderbird_buildbot.py
testing/mozharness/configs/unittests/win_taskcluster_unittest.py
testing/mozharness/configs/unittests/win_unittest.py
testing/mozharness/configs/web_platform_tests/prod_config.py
testing/mozharness/configs/web_platform_tests/prod_config_windows.py
testing/mozharness/configs/web_platform_tests/prod_config_windows_taskcluster.py
testing/mozharness/external_tools/tooltool.py
testing/mozharness/mozharness/mozilla/testing/codecoverage.py
testing/mozharness/mozharness/mozilla/tooltool.py
testing/talos/mach_commands.py
--- a/testing/mozharness/configs/android/androidarm_4_3.py
+++ b/testing/mozharness/configs/android/androidarm_4_3.py
@@ -18,17 +18,16 @@ config = {
         "filename": "android-sdk_r24.0.2a-linux.tar.gz",
         "unpack": "True"
         }
         ] """,
     "emulator_process_name": "emulator64-arm",
     "emulator_extra_args": "-show-kernel -debug init,console,gles,memcheck,adbserver,adbclient,adb,avd_config,socket",
     "exes": {
         'adb': '%(abs_work_dir)s/android-sdk-linux/platform-tools/adb',
-        'tooltool.py': ['python', '/builds/worker/scripts/tooltool.py'],
     },
     "env": {
         "DISPLAY": ":0.0",
         "PATH": "%(PATH)s:%(abs_work_dir)s/android-sdk-linux/tools:%(abs_work_dir)s/android-sdk-linux/platform-tools",
         "MINIDUMP_SAVEPATH": "%(abs_work_dir)s/../minidumps"
     },
     "emulator": {
         "name": "test-1",
--- a/testing/mozharness/configs/android/androidx86.py
+++ b/testing/mozharness/configs/android/androidx86.py
@@ -15,17 +15,16 @@ config = {
         "filename": "android-sdk18_0.r18moz1.orig.tar.gz",
         "unpack": "True"
         }
         ] """,
     "emulator_process_name": "emulator64-x86",
     "emulator_extra_args": "-show-kernel -debug init,console,gles,memcheck,adbserver,adbclient,adb,avd_config,socket -qemu -m 1024",
     "exes": {
         'adb': '%(abs_work_dir)s/android-sdk18/platform-tools/adb',
-        'tooltool.py': ['python', '/builds/worker/scripts/tooltool.py'],
     },
     "env": {
         "DISPLAY": ":0.0",
         "PATH": "%(PATH)s:%(abs_work_dir)s/android-sdk18/tools:%(abs_work_dir)s/android-sdk18/platform-tools",
         "MINIDUMP_SAVEPATH": "%(abs_work_dir)s/../minidumps"
     },
     "emulator": {
         "name": "test-1",
--- a/testing/mozharness/configs/awsy/linux_config.py
+++ b/testing/mozharness/configs/awsy/linux_config.py
@@ -11,17 +11,16 @@ else:
     MINIDUMP_STACKWALK_PATH = "linux32-minidump_stackwalk"
 ABS_WORK_DIR = os.path.join(os.getcwd(), "build")
 BINARY_PATH = os.path.join(ABS_WORK_DIR, "application", "firefox", "firefox-bin")
 INSTALLER_PATH = os.path.join(ABS_WORK_DIR, "installer.tar.bz2")
 
 config = {
     "log_name": "awsy",
     "binary_path": BINARY_PATH,
-    "download_tooltool": True,
     "installer_path": INSTALLER_PATH,
     "virtualenv_path": VENV_PATH,
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "cmd_timeout": 6500,
     "pip_index": False,
--- a/testing/mozharness/configs/awsy/macosx_config.py
+++ b/testing/mozharness/configs/awsy/macosx_config.py
@@ -4,17 +4,16 @@ PYTHON = "/usr/bin/env python"
 VENV_PATH = '%s/build/venv' % os.getcwd()
 TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/macosx64/releng.manifest"
 MINIDUMP_STACKWALK_PATH = "macosx64-minidump_stackwalk"
 ABS_WORK_DIR = os.path.join(os.getcwd(), "build")
 INSTALLER_PATH = os.path.join(ABS_WORK_DIR, "installer.dmg")
 
 config = {
     "log_name": "awsy",
-    "download_tooltool": True,
     "installer_path": INSTALLER_PATH,
     "virtualenv_path": VENV_PATH,
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "cmd_timeout": 6500,
     "pip_index": False,
--- a/testing/mozharness/configs/awsy/taskcluster_windows_config.py
+++ b/testing/mozharness/configs/awsy/taskcluster_windows_config.py
@@ -8,17 +8,16 @@ external_tools_path = os.path.join(
 )
 
 config = {
     "virtualenv_python_dll": os.path.join(os.path.dirname(sys.executable), 'python27.dll'),
     "virtualenv_path": 'venv',
     "exes": {
         'python': sys.executable,
         'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
-        'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
         'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
     },
     "proxxy": {},
     "find_links": [
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
 
--- a/testing/mozharness/configs/developer_config.py
+++ b/testing/mozharness/configs/developer_config.py
@@ -32,17 +32,16 @@ config = {
 
     # Talos related
     "python_webserver": True,
     "virtualenv_path": '%s/build/venv' % os.getcwd(),
     "preflight_run_cmd_suites": [],
     "postflight_run_cmd_suites": [],
 
     # Tooltool related
-    "download_tooltool": True,
     "tooltool_cache": os.path.join(LOCAL_WORKDIR, "builds/tooltool_cache"),
     "tooltool_cache_path": os.path.join(LOCAL_WORKDIR, "builds/tooltool_cache"),
     "tooltool_authentication_file": os.path.join(LOCAL_WORKDIR, "relengapi.tok"),
 
     # VCS tools
     "gittool.py": 'http://hg.mozilla.org/build/puppet/raw-file/faaf5abd792e/modules/packages/files/gittool.py',
 
     # Android related
--- a/testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py
+++ b/testing/mozharness/configs/firefox_ui_tests/qa_jenkins.py
@@ -7,13 +7,12 @@ config = {
 
     # PIP
     'find_links': ['http://pypi.pub.build.mozilla.org/pub'],
     'pip_index': False,
 
     # mozcrash support
     'download_minidump_stackwalk': True,
     'download_symbols': 'ondemand',
-    'download_tooltool': True,
 
     # Disable proxxy because it isn't present in the QA environment.
     'proxxy': {},
 }
--- a/testing/mozharness/configs/firefox_ui_tests/releng_release.py
+++ b/testing/mozharness/configs/firefox_ui_tests/releng_release.py
@@ -24,10 +24,9 @@ config = {
 
     # PIP
     'find_links': ['http://pypi.pub.build.mozilla.org/pub'],
     'pip_index': False,
 
     # mozcrash support
     'download_minidump_stackwalk': True,
     'download_symbols': 'ondemand',
-    'download_tooltool': True,
 }
--- a/testing/mozharness/configs/firefox_ui_tests/taskcluster.py
+++ b/testing/mozharness/configs/firefox_ui_tests/taskcluster.py
@@ -1,18 +1,14 @@
 # Config file for firefox ui tests run via TaskCluster.
 
 
 config = {
     "vcs_share_base": "/builds/hg-shared",
 
-    "exes": {
-        'tooltool.py': "/tools/tooltool.py",
-    },
-
     "find_links": [
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
 
     "download_minidump_stackwalk": True,
     "tooltool_cache": "/builds/worker/tooltool-cache",
 }
--- a/testing/mozharness/configs/firefox_ui_tests/taskcluster_windows.py
+++ b/testing/mozharness/configs/firefox_ui_tests/taskcluster_windows.py
@@ -5,17 +5,16 @@ import sys
 
 
 config = {
     "virtualenv_python_dll": os.path.join(os.path.dirname(sys.executable), 'python27.dll'),
     "virtualenv_path": 'venv',
     "exes": {
         'python': sys.executable,
         'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
-        'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
         'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
     },
 
     "proxxy": {},
     "find_links": [
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
--- a/testing/mozharness/configs/marionette/prod_config.py
+++ b/testing/mozharness/configs/marionette/prod_config.py
@@ -4,19 +4,16 @@ import os
 HG_SHARE_BASE_DIR = "/builds/hg-shared"
 
 config = {
     # marionette options
     "marionette_address": "localhost:2828",
     "test_manifest": "unit-tests.ini",
 
     "vcs_share_base": HG_SHARE_BASE_DIR,
-    "exes": {
-        'tooltool.py': "/tools/tooltool.py",
-    },
 
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
 
     "buildbot_json_path": "buildprops.json",
--- a/testing/mozharness/configs/marionette/windows_config.py
+++ b/testing/mozharness/configs/marionette/windows_config.py
@@ -1,25 +1,23 @@
 # This is a template config file for marionette production on Windows.
 import os
-import sys
 
 config = {
     # marionette options
     "marionette_address": "localhost:2828",
     "test_manifest": "unit-tests.ini",
 
     "virtualenv_python_dll": 'c:/mozilla-build/python27/python27.dll',
     "virtualenv_path": 'venv',
     "exes": {
         'python': 'c:/mozilla-build/python27/python',
         'hg': 'c:/mozilla-build/hg/hg',
         'mozinstall': ['%s/build/venv/scripts/python' % os.getcwd(),
                        '%s/build/venv/scripts/mozinstall-script.py' % os.getcwd()],
-        'tooltool.py': [sys.executable, 'C:/mozilla-build/tooltool.py'],
     },
 
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
 
--- a/testing/mozharness/configs/marionette/windows_taskcluster_config.py
+++ b/testing/mozharness/configs/marionette/windows_taskcluster_config.py
@@ -7,17 +7,16 @@ config = {
     "marionette_address": "localhost:2828",
     "test_manifest": "unit-tests.ini",
 
     "virtualenv_python_dll": os.path.join(os.path.dirname(sys.executable), 'python27.dll'),
     "virtualenv_path": 'venv',
     "exes": {
         'python': sys.executable,
         'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
-        'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
         'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
     },
 
     "proxxy": {},
     "find_links": [
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
--- a/testing/mozharness/configs/openh264/android-aarch64.py
+++ b/testing/mozharness/configs/openh264/android-aarch64.py
@@ -17,30 +17,28 @@ config = {
         'dump-symbols',
         'upload',
     ],
 
     'tooltool_manifest_file': "android.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
-        'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'dump_syms_binary': 'dump_syms',
     'arch': 'aarch64',
     # https://dxr.mozilla.org/mozilla-central/rev/5322c03f4c8587fe526172d3f87160031faa6d75/mobile/android/config/mozconfigs/android-aarch64/nightly#6
     'min_sdk': 21,
     'use_mock': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'android',
     'partial_env': {
         'PATH': '%(abs_work_dir)s/android-sdk-linux/tools:%(PATH)s',
     },
 }
--- a/testing/mozharness/configs/openh264/android-arm.py
+++ b/testing/mozharness/configs/openh264/android-arm.py
@@ -17,30 +17,28 @@ config = {
         'dump-symbols',
         'upload',
     ],
 
     'tooltool_manifest_file': "android.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
-        'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'dump_syms_binary': 'dump_syms',
     'arch': 'arm',
     # https://dxr.mozilla.org/mozilla-central/rev/5322c03f4c8587fe526172d3f87160031faa6d75/mobile/android/config/mozconfigs/android-api-15/nightly#6
     'min_sdk': 16,
     'use_mock': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'android',
     'partial_env': {
         'PATH': '%(abs_work_dir)s/android-sdk-linux/tools:%(PATH)s',
     },
 }
--- a/testing/mozharness/configs/openh264/android-x86.py
+++ b/testing/mozharness/configs/openh264/android-x86.py
@@ -17,31 +17,29 @@ config = {
         'dump-symbols',
         'upload',
     ],
 
     'tooltool_manifest_file': "android.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
-        'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'avoid_avx2': True,
     'dump_syms_binary': 'dump_syms',
     'arch': 'x86',
     # https://dxr.mozilla.org/mozilla-central/rev/5322c03f4c8587fe526172d3f87160031faa6d75/mobile/android/config/mozconfigs/android-x86/nightly#4
     'min_sdk': 16,
     'use_mock': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'android',
     'partial_env': {
         'PATH': '%(abs_work_dir)s/android-sdk-linux/tools:%(PATH)s',
     },
 }
--- a/testing/mozharness/configs/openh264/linux32.py
+++ b/testing/mozharness/configs/openh264/linux32.py
@@ -7,26 +7,24 @@ external_tools_path = os.path.join(
     'external_tools',
 )
 
 config = {
     'tooltool_manifest_file': "linux.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
-        'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'dump_syms_binary': 'dump_syms',
     'arch': 'x86',
     'use_mock': True,
     'avoid_avx2': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'linux',
 }
--- a/testing/mozharness/configs/openh264/linux64.py
+++ b/testing/mozharness/configs/openh264/linux64.py
@@ -7,26 +7,24 @@ external_tools_path = os.path.join(
     'external_tools',
 )
 
 config = {
     'tooltool_manifest_file': "linux.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
-        'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'dump_syms_binary': 'dump_syms',
     'arch': 'x64',
     'use_mock': True,
     'avoid_avx2': True,
     'mock_target': 'mozilla-centos6-x86_64',
     'mock_packages': ['make', 'git', 'nasm', 'glibc-devel.i686',
                       'libstdc++-devel.i686', 'zip', 'yasm',
                       'mozilla-python27'],
     'mock_files': [
         ('/home/cltbld/.ssh', '/home/mock_mozilla/.ssh'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
     ],
     'operating_system': 'linux',
 }
--- a/testing/mozharness/configs/openh264/macosx64.py
+++ b/testing/mozharness/configs/openh264/macosx64.py
@@ -7,15 +7,14 @@ external_tools_path = os.path.join(
     'external_tools',
 )
 
 config = {
     'tooltool_manifest_file': "osx.manifest",
     'tooltool_cache': "/builds/tooltool_cache",
     'exes': {
         'gittool.py': [os.path.join(external_tools_path, 'gittool.py')],
-        'tooltool.py': "/builds/tooltool.py",
         'python2.7': "/tools/python27/bin/python2.7",
     },
     'dump_syms_binary': 'dump_syms',
     'arch': 'x64',
     'use_yasm': True,
 }
--- a/testing/mozharness/configs/openh264/win32.py
+++ b/testing/mozharness/configs/openh264/win32.py
@@ -9,17 +9,16 @@ external_tools_path = os.path.join(
 )
 
 VSPATH = '%(abs_work_dir)s/vs2017_15.4.2'
 config = {
    'tooltool_manifest_file': "win.manifest",
    'exes': {
        'gittool.py': [sys.executable, os.path.join(external_tools_path, 'gittool.py')],
        'python2.7': 'c:\\mozilla-build\\python27\\python2.7.exe',
-       'tooltool.py': [sys.executable, "c:\\mozilla-build\\tooltool.py"],
    },
    'dump_syms_binary': 'dump_syms.exe',
    'arch': 'x86',
    'use_yasm': True,
    'operating_system': 'msvc',
    'partial_env': {
        'PATH': '%s;%s;%s' % (
            (
--- a/testing/mozharness/configs/openh264/win64.py
+++ b/testing/mozharness/configs/openh264/win64.py
@@ -9,17 +9,16 @@ external_tools_path = os.path.join(
 )
 
 VSPATH = '%(abs_work_dir)s/vs2017_15.4.2'
 config = {
    'tooltool_manifest_file': "win.manifest",
    'exes': {
         'gittool.py': [sys.executable, os.path.join(external_tools_path, 'gittool.py')],
         'python2.7': 'c:\\mozilla-build\\python27\\python2.7.exe',
-        'tooltool.py': [sys.executable, "c:\\mozilla-build\\tooltool.py"],
    },
    'dump_syms_binary': 'dump_syms.exe',
    'arch': 'x64',
    'use_yasm': True,
    'operating_system': 'msvc',
    'partial_env': {
        'PATH': '%s;%s;%s' % (
            (
--- a/testing/mozharness/configs/single_locale/ash_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/ash_android-api-16.py
@@ -18,19 +18,16 @@ config = {
     "ignore_locales": ["en-US"],
     "nightly_build": True,
     'balrog_credentials_file': 'oauth.txt',
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "repo": "https://hg.mozilla.org/projects/ash",
         "branch": "default",
         "dest": MOZILLA_DIR,
     }, {
         "repo": "https://hg.mozilla.org/build/buildbot-configs",
         "branch": "default",
         "dest": "buildbot-configs"
@@ -82,12 +79,11 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/date_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/date_android-api-16.py
@@ -18,19 +18,16 @@ config = {
     "ignore_locales": ["en-US"],
     "nightly_build": True,
     'balrog_credentials_file': 'oauth.txt',
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools",
     }, {
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/projects/date",
@@ -82,12 +79,11 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/jamun_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/jamun_android-api-16.py
@@ -17,19 +17,16 @@ config = {
     "ignore_locales": ["en-US"],
     "nightly_build": True,
     'balrog_credentials_file': 'oauth.txt',
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools",
     }, {
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/projects/jamun",
@@ -79,12 +76,11 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/maple_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/maple_android-api-16.py
@@ -18,19 +18,16 @@ config = {
     "ignore_locales": ["en-US"],
     "nightly_build": True,
     'balrog_credentials_file': 'oauth.txt',
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools",
     }, {
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/projects/maple",
@@ -80,12 +77,11 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/mozilla-aurora_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/mozilla-aurora_android-api-16.py
@@ -20,19 +20,16 @@ config = {
     "ignore_locales": ["en-US"],
     "nightly_build": True,
     'balrog_credentials_file': 'oauth.txt',
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools",
     }, {
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/releases/mozilla-aurora",
@@ -86,12 +83,11 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/mozilla-beta_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/mozilla-beta_android-api-16.py
@@ -24,19 +24,16 @@ config = {
     "platform": "android",
     "is_release_or_beta": True,
     "build_type": "api-16-opt",
     "build_target": "Android_arm-eabi-gcc3",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "repo": "https://hg.mozilla.org/releases/mozilla-beta",
         "branch": "default",
         "dest": MOZILLA_DIR,
     }, {
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools"
@@ -78,14 +75,13 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
         ('/builds/mozilla-fennec-geoloc-api.key', '/builds/mozilla-fennec-geoloc-api.key'),
         ('/builds/adjust-sdk-beta.token', '/builds/adjust-sdk-beta.token'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/mozilla-central_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/mozilla-central_android-api-16.py
@@ -20,19 +20,16 @@ config = {
     "ignore_locales": ["en-US"],
     "nightly_build": True,
     'balrog_credentials_file': 'oauth.txt',
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools",
     }, {
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/mozilla-central",
@@ -86,12 +83,11 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/mozilla-release_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/mozilla-release_android-api-16.py
@@ -24,19 +24,16 @@ config = {
     "platform": "android",
     "is_release_or_beta": True,
     "build_type": "api-16-opt",
     "build_target": "Android_arm-eabi-gcc3",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "repo": "https://hg.mozilla.org/releases/mozilla-release",
         "branch": "default",
         "dest": MOZILLA_DIR,
     }, {
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools"
@@ -78,14 +75,13 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
         ('/builds/mozilla-fennec-geoloc-api.key', '/builds/mozilla-fennec-geoloc-api.key'),
         ('/builds/adjust-sdk.token', '/builds/adjust-sdk.token'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/staging_release_mozilla-beta_android_api_16.py
+++ b/testing/mozharness/configs/single_locale/staging_release_mozilla-beta_android_api_16.py
@@ -19,19 +19,16 @@ config = {
     "ignore_locales": ["en-US"],
     "balrog_credentials_file": "oauth.txt",
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "is_release_or_beta": True,
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "repo": "https://hg.mozilla.org/%(user_repo_override)s/mozilla-beta",
         "branch": "default",
         "dest": MOZILLA_DIR,
     }, {
         "repo": "https://hg.mozilla.org/%(user_repo_override)s/buildbot-configs",
         "branch": "default",
         "dest": "buildbot-configs"
@@ -80,14 +77,13 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
         ('/builds/mozilla-fennec-geoloc-api.key', '/builds/mozilla-fennec-geoloc-api.key'),
         ('/builds/adjust-sdk-beta.token', '/builds/adjust-sdk-beta.token'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/staging_release_mozilla-release_android_api_16.py
+++ b/testing/mozharness/configs/single_locale/staging_release_mozilla-release_android_api_16.py
@@ -19,19 +19,16 @@ config = {
     "ignore_locales": ["en-US"],
     "balrog_credentials_file": "oauth.txt",
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "is_release_or_beta": True,
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "repos": [{
         "repo": "https://hg.mozilla.org/%(user_repo_override)s/mozilla-release",
         "branch": "default",
         "dest": MOZILLA_DIR,
     }, {
         "repo": "https://hg.mozilla.org/%(user_repo_override)s/buildbot-configs",
         "branch": "default",
         "dest": "buildbot-configs"
@@ -80,14 +77,13 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
         ('/builds/mozilla-fennec-geoloc-api.key', '/builds/mozilla-fennec-geoloc-api.key'),
         ('/builds/adjust-sdk.token', '/builds/adjust-sdk.token'),
     ],
 }
--- a/testing/mozharness/configs/single_locale/try_android-api-16.py
+++ b/testing/mozharness/configs/single_locale/try_android-api-16.py
@@ -17,19 +17,16 @@ config = {
     "locales_dir": "mobile/android/locales",
     "ignore_locales": ["en-US"],
     'balrog_credentials_file': 'oauth.txt',
     "tools_repo": "https://hg.mozilla.org/build/tools",
     "tooltool_config": {
         "manifest": "mobile/android/config/tooltool-manifests/android/releng.manifest",
         "output_dir": "%(abs_work_dir)s/" + MOZILLA_DIR,
     },
-    "exes": {
-        'tooltool.py': '/builds/tooltool.py',
-    },
     "update_gecko_source_to_enUS": False,
     "nightly_build": True,
     "repos": [{
         "vcs": "hg",
         "repo": "https://hg.mozilla.org/build/tools",
         "branch": "default",
         "dest": "tools",
     }, {
@@ -84,12 +81,11 @@ config = {
                       'java-1.7.0-openjdk-devel',
                       'openssh-clients',
                       'zlib-devel-1.2.3-27.el6.i686',
                       ],
     "mock_files": [
         ("/home/cltbld/.ssh", "/home/mock_mozilla/.ssh"),
         ('/home/cltbld/.hgrc', '/builds/.hgrc'),
         ('/builds/relengapi.tok', '/builds/relengapi.tok'),
-        ('/tools/tooltool.py', '/builds/tooltool.py'),
         ('/usr/local/lib/hgext', '/usr/local/lib/hgext'),
     ],
 }
--- a/testing/mozharness/configs/talos/linux64_config_taskcluster.py
+++ b/testing/mozharness/configs/talos/linux64_config_taskcluster.py
@@ -8,26 +8,24 @@ VENV_PATH = '%s/build/venv' % os.getcwd(
 if platform.architecture()[0] == '64bit':
     TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux64/releng.manifest"
     MINIDUMP_STACKWALK_PATH = "linux64-minidump_stackwalk"
 else:
     TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/releng.manifest"
     MINIDUMP_STACKWALK_PATH = "linux32-minidump_stackwalk"
 
 exes = {
-    'tooltool.py': ["/builds/tooltool.py"],
     'python': PYTHON,
 }
 ABS_WORK_DIR = os.path.join(os.getcwd(), "build")
 INSTALLER_PATH = os.path.join(ABS_WORK_DIR, "installer.tar.bz2")
 
 config = {
     "log_name": "talos",
     "buildbot_json_path": "buildprops.json",
-    "download_tooltool": True,
     "installer_path": INSTALLER_PATH,
     "virtualenv_path": VENV_PATH,
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
     "exes": exes,
--- a/testing/mozharness/configs/talos/linux_config.py
+++ b/testing/mozharness/configs/talos/linux_config.py
@@ -4,31 +4,26 @@ import platform
 VENV_PATH = '%s/build/venv' % os.getcwd()
 if platform.architecture()[0] == '64bit':
     TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux64/releng.manifest"
     MINIDUMP_STACKWALK_PATH = "linux64-minidump_stackwalk"
 else:
     TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/releng.manifest"
     MINIDUMP_STACKWALK_PATH = "linux32-minidump_stackwalk"
 
-exes = {
-    'tooltool.py': "/tools/tooltool.py",
-}
-
 config = {
     "log_name": "talos",
     "buildbot_json_path": "buildprops.json",
     "installer_path": "installer.exe",
     "virtualenv_path": VENV_PATH,
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
-    "exes": exes,
     "title": os.uname()[1].lower().split('.')[0],
     "default_actions": [
         "clobber",
         "read-buildbot-config",
         "download-and-extract",
         "populate-webroot",
         "create-virtualenv",
         "install",
--- a/testing/mozharness/configs/talos/mac_config.py
+++ b/testing/mozharness/configs/talos/mac_config.py
@@ -17,19 +17,16 @@ config = {
     "buildbot_json_path": "buildprops.json",
     "installer_path": "installer.exe",
     "virtualenv_path": VENV_PATH,
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
-    "exes": {
-        'tooltool.py': "/tools/tooltool.py",
-    },
     "title": os.uname()[1].lower().split('.')[0],
     "default_actions": [
         "clobber",
         "read-buildbot-config",
         "download-and-extract",
         "populate-webroot",
         "create-virtualenv",
         "install",
--- a/testing/mozharness/configs/talos/windows_config.py
+++ b/testing/mozharness/configs/talos/windows_config.py
@@ -19,17 +19,16 @@ config = {
     "virtualenv_modules": ['pywin32', 'talos', 'mozinstall'],
     "exes": {
         'python': PYTHON,
         'easy_install': ['%s/scripts/python' % VENV_PATH,
                          '%s/scripts/easy_install-2.7-script.py' % VENV_PATH],
         'mozinstall': ['%s/scripts/python' % VENV_PATH,
                        '%s/scripts/mozinstall-script.py' % VENV_PATH],
         'hg': 'c:/mozilla-build/hg/hg',
-        'tooltool.py': [PYTHON, 'C:/mozilla-build/tooltool.py'],
     },
     "title": socket.gethostname().split('.')[0],
     "default_actions": [
         "clobber",
         "read-buildbot-config",
         "download-and-extract",
         "populate-webroot",
         "create-virtualenv",
--- a/testing/mozharness/configs/talos/windows_taskcluster_config.py
+++ b/testing/mozharness/configs/talos/windows_taskcluster_config.py
@@ -17,17 +17,16 @@ config = {
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "virtualenv_modules": ['pypiwin32', 'talos', 'mozinstall'],
     "exes": {
         'python': PYTHON,
         'mozinstall': ['%s/scripts/python' % VENV_PATH,
                        '%s/scripts/mozinstall-script.py' % VENV_PATH],
         'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg'),
-        'tooltool.py': [PYTHON, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
     },
     "title": socket.gethostname().split('.')[0],
     "default_actions": [
         "populate-webroot",
         "create-virtualenv",
         "install",
         "setup-mitmproxy",
         "run-tests",
--- a/testing/mozharness/configs/talos/windows_vm_config.py
+++ b/testing/mozharness/configs/talos/windows_vm_config.py
@@ -20,17 +20,16 @@ config = {
     "virtualenv_modules": ['pywin32', 'talos', 'mozinstall'],
     "exes": {
         'python': PYTHON,
         'easy_install': ['%s/scripts/python' % VENV_PATH,
                          '%s/scripts/easy_install-2.7-script.py' % VENV_PATH],
         'mozinstall': ['%s/scripts/python' % VENV_PATH,
                        '%s/scripts/mozinstall-script.py' % VENV_PATH],
         'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg'),
-        'tooltool.py': [PYTHON, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
     },
     "title": socket.gethostname().split('.')[0],
     "default_actions": [
         "clobber",
         "read-buildbot-config",
         "download-and-extract",
         "populate-webroot",
         "create-virtualenv",
--- a/testing/mozharness/configs/unittests/linux_unittest.py
+++ b/testing/mozharness/configs/unittests/linux_unittest.py
@@ -30,19 +30,16 @@ else:
     VALGRIND_SUPP_ARCH = os.path.join(VALGRIND_SUPP_DIR,
                                       "i386-pc-linux-gnu.sup")
     NODEJS_PATH = "node-linux-x86/bin/node"
     NODEJS_TOOLTOOL_MANIFEST_PATH = "config/tooltool-manifests/linux32/nodejs.manifest"
 
 #####
 config = {
     "buildbot_json_path": "buildprops.json",
-    "exes": {
-        "tooltool.py": "/tools/tooltool.py",
-    },
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
     ###
     "installer_path": INSTALLER_PATH,
     "binary_path": BINARY_PATH,
--- a/testing/mozharness/configs/unittests/mac_unittest.py
+++ b/testing/mozharness/configs/unittests/mac_unittest.py
@@ -4,19 +4,16 @@ import os
 INSTALLER_PATH = os.path.join(os.getcwd(), "installer.dmg")
 XPCSHELL_NAME = 'xpcshell'
 EXE_SUFFIX = ''
 DISABLE_SCREEN_SAVER = False
 ADJUST_MOUSE_AND_SCREEN = False
 #####
 config = {
     "buildbot_json_path": "buildprops.json",
-    "exes": {
-        'tooltool.py': "/tools/tooltool.py",
-    },
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
     "pip_index": False,
     ###
     "installer_path": INSTALLER_PATH,
     "xpcshell_name": XPCSHELL_NAME,
--- a/testing/mozharness/configs/unittests/thunderbird_buildbot.py
+++ b/testing/mozharness/configs/unittests/thunderbird_buildbot.py
@@ -12,10 +12,9 @@ config = {
 
 # Specify virtualenv directory for thunderbird buildbot tests explicitly.
 # The default configuration in `linux_unittest.py` specifies a path that
 # doesn't exist on buildbot. We need to specify the other paths here too, since
 # config entries are overriden wholesale.
 if platform.system() == "Linux":
     config["exes"] = {
         "python": "/tools/buildbot/bin/python",
-        "tooltool.py": "/tools/tooltool.py",
     }
--- a/testing/mozharness/configs/unittests/win_taskcluster_unittest.py
+++ b/testing/mozharness/configs/unittests/win_taskcluster_unittest.py
@@ -20,17 +20,16 @@ TASKBAR_AUTOHIDE_REG_PATH = {
     'Windows 7': 'HKCU:SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StuckRects2',
     'Windows 10': 'HKCU:SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\StuckRects3'
 }.get('{} {}'.format(platform.system(), platform.release()))
 #####
 config = {
     "exes": {
         'python': sys.executable,
         'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
-        'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
         'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
     },
     ###
     "installer_path": INSTALLER_PATH,
     "binary_path": BINARY_PATH,
     "xpcshell_name": XPCSHELL_NAME,
     "virtualenv_modules": ['pypiwin32'],
     "virtualenv_path": 'venv',
--- a/testing/mozharness/configs/unittests/win_unittest.py
+++ b/testing/mozharness/configs/unittests/win_unittest.py
@@ -12,17 +12,16 @@ ADJUST_MOUSE_AND_SCREEN = True
 #####
 config = {
     "buildbot_json_path": "buildprops.json",
     "exes": {
         'python': sys.executable,
         'hg': 'c:/mozilla-build/hg/hg',
         'mozinstall': ['%s/build/venv/scripts/python' % os.getcwd(),
                        '%s/build/venv/scripts/mozinstall-script.py' % os.getcwd()],
-        'tooltool.py': [sys.executable, 'C:/mozilla-build/tooltool.py'],
     },
     ###
     "installer_path": INSTALLER_PATH,
     "binary_path": BINARY_PATH,
     "xpcshell_name": XPCSHELL_NAME,
     "virtualenv_path": 'venv',
     "virtualenv_python_dll": os.path.join(os.path.dirname(sys.executable), "python27.dll"),
     "virtualenv_modules": ['pywin32'],
--- a/testing/mozharness/configs/web_platform_tests/prod_config.py
+++ b/testing/mozharness/configs/web_platform_tests/prod_config.py
@@ -11,20 +11,16 @@ config = {
         "--processes=1",
         "--config=%(test_path)s/wptrunner.ini",
         "--ca-cert-path=%(test_path)s/certs/cacert.pem",
         "--host-key-path=%(test_path)s/certs/web-platform.test.key",
         "--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
         "--certutil-binary=%(test_install_path)s/bin/certutil",
     ],
 
-    "exes": {
-        'tooltool.py': "/tools/tooltool.py",
-    },
-
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
 
     "pip_index": False,
 
     "buildbot_json_path": "buildprops.json",
@@ -32,16 +28,14 @@ config = {
     "default_blob_upload_servers": [
          "https://blobupload.elasticbeanstalk.com",
     ],
 
     "blob_uploader_auth_file" : os.path.join(os.getcwd(), "oauth.txt"),
 
     "download_minidump_stackwalk": True,
 
-    "download_tooltool": True,
-
     # this would normally be in "exes", but "exes" is clobbered by remove_executables
     "geckodriver": "%(abs_test_bin_dir)s/geckodriver",
 
     "verify_category": "web-platform",
 }
 
--- a/testing/mozharness/configs/web_platform_tests/prod_config_windows.py
+++ b/testing/mozharness/configs/web_platform_tests/prod_config_windows.py
@@ -20,17 +20,16 @@ config = {
         "--certutil-binary=%(test_install_path)s/bin/certutil",
     ],
 
     "exes": {
         'python': sys.executable,
         'hg': 'c:/mozilla-build/hg/hg',
         'mozinstall': ['%s/build/venv/scripts/python' % os.getcwd(),
                        '%s/build/venv/scripts/mozinstall-script.py' % os.getcwd()],
-        'tooltool.py': [sys.executable, 'C:/mozilla-build/tooltool.py'],
     },
 
     "find_links": [
         "http://pypi.pvt.build.mozilla.org/pub",
         "http://pypi.pub.build.mozilla.org/pub",
     ],
 
     "pip_index": False,
--- a/testing/mozharness/configs/web_platform_tests/prod_config_windows_taskcluster.py
+++ b/testing/mozharness/configs/web_platform_tests/prod_config_windows_taskcluster.py
@@ -18,17 +18,16 @@ config = {
         "--host-key-path=%(test_path)s/certs/web-platform.test.key",
         "--host-cert-path=%(test_path)s/certs/web-platform.test.pem",
         "--certutil-binary=%(test_install_path)s/bin/certutil",
     ],
 
     "exes": {
         'python': sys.executable,
         'mozinstall': ['build/venv/scripts/python', 'build/venv/scripts/mozinstall-script.py'],
-        'tooltool.py': [sys.executable, os.path.join(os.environ['MOZILLABUILD'], 'tooltool.py')],
         'hg': os.path.join(os.environ['PROGRAMFILES'], 'Mercurial', 'hg')
     },
 
     "proxxy": {},
     "find_links": [
         "http://pypi.pub.build.mozilla.org/pub",
     ],
 
copy from python/mozbuild/mozbuild/action/tooltool.py
copy to testing/mozharness/external_tools/tooltool.py
--- a/testing/mozharness/mozharness/mozilla/testing/codecoverage.py
+++ b/testing/mozharness/mozharness/mozilla/testing/codecoverage.py
@@ -9,17 +9,21 @@ import sys
 import tarfile
 import tempfile
 
 import mozinfo
 from mozharness.base.script import (
     PreScriptAction,
     PostScriptAction,
 )
-from mozharness.mozilla.tooltool import TooltoolMixin
+
+_here = os.path.abspath(os.path.dirname(__file__))
+_tooltool_path = os.path.normpath(os.path.join(_here, '..', '..', '..',
+                                               'external_tools',
+                                               'tooltool.py'))
 
 code_coverage_config_options = [
     [["--code-coverage"],
      {"action": "store_true",
       "dest": "code_coverage",
       "default": False,
       "help": "Whether gcov c++ code coverage should be run."
       }],
@@ -117,18 +121,17 @@ class CodeCoverageMixin(object):
             tar_file = 'grcov-linux-standalone-x86_64.tar.bz2'
         elif mozinfo.os == 'win':
             platform = 'win32'
             tar_file = 'grcov-win-i686.tar.bz2'
 
         manifest = os.path.join(dirs.get('abs_test_install_dir', os.path.join(dirs['abs_work_dir'], 'tests')), \
             'config/tooltool-manifests/%s/ccov.manifest' % platform)
 
-        tooltool_path = self._fetch_tooltool_py()
-        cmd = [sys.executable, tooltool_path, '--url', 'https://tooltool.mozilla-releng.net/', 'fetch', \
+        cmd = [sys.executable, _tooltool_path, '--url', 'https://tooltool.mozilla-releng.net/', 'fetch', \
             '-m', manifest, '-o', '-c', '/builds/worker/tooltool-cache']
         self.run_command(cmd, cwd=self.grcov_dir)
 
         with tarfile.open(os.path.join(self.grcov_dir, tar_file)) as tar:
             tar.extractall(self.grcov_dir)
 
     @PostScriptAction('run-tests')
     def _package_coverage_data(self, action, success=None):
--- a/testing/mozharness/mozharness/mozilla/tooltool.py
+++ b/testing/mozharness/mozharness/mozilla/tooltool.py
@@ -6,23 +6,23 @@ from mozharness.base.errors import Pytho
 from mozharness.base.log import ERROR, FATAL
 from mozharness.mozilla.proxxy import Proxxy
 
 TooltoolErrorList = PythonErrorList + [{
     'substr': 'ERROR - ', 'level': ERROR
 }]
 
 
-TOOLTOOL_PY_URL = \
-    "https://raw.githubusercontent.com/mozilla/build-tooltool/master/tooltool.py"
-
 TOOLTOOL_SERVERS = [
     'https://tooltool.mozilla-releng.net/',
 ]
 
+_here = os.path.abspath(os.path.dirname(__file__))
+_external_tools_path = os.path.normpath(os.path.join(_here, '..', '..',
+                                                     'external_tools'))
 
 class TooltoolMixin(object):
     """Mixin class for handling tooltool manifests.
     To use a tooltool server other than the Mozilla server, override
     config['tooltool_servers'].  To specify a different authentication
     file than that used in releng automation,override
     config['tooltool_authentication_file']; set it to None to not pass
     any authentication information (OK for public files)
@@ -45,29 +45,29 @@ class TooltoolMixin(object):
             return fn
 
     def tooltool_fetch(self, manifest,
                        output_dir=None, privileged=False, cache=None):
         """docstring for tooltool_fetch"""
         for d in (output_dir, cache):
             if d is not None and not os.path.exists(d):
                 self.mkdir_p(d)
-        # Use vendored tooltool.py if available.
         if self.topsrcdir:
             cmd = [
                 sys.executable, '-u',
                 os.path.join(self.topsrcdir, 'mach'),
                 'artifact',
                 'toolchain',
                 '-v',
             ]
-        elif self.config.get("download_tooltool"):
-            cmd = [sys.executable, self._fetch_tooltool_py()]
         else:
-            cmd = self.query_exe('tooltool.py', return_type='list')
+            cmd = [
+                sys.executable, '-u',
+                os.path.join(_external_tools_path, 'tooltool.py'),
+            ]
 
         # get the tooltool servers from configuration
         default_urls = self.config.get('tooltool_servers', TOOLTOOL_SERVERS)
 
         # add slashes (bug 1155630)
         def add_slash(url):
             return url if url.endswith('/') else (url + '/')
         default_urls = [add_slash(u) for u in default_urls]
@@ -115,27 +115,16 @@ class TooltoolMixin(object):
                     'privileged': privileged,
                     'output_timeout': timeout,
                     },
             good_statuses=(0, ),
             error_message="Tooltool %s fetch failed!" % manifest,
             error_level=FATAL,
         )
 
-    def _fetch_tooltool_py(self):
-        """ Retrieve tooltool.py
-        """
-        dirs = self.query_abs_dirs()
-        file_path = os.path.join(dirs['abs_work_dir'], "tooltool.py")
-        self.download_file(TOOLTOOL_PY_URL, file_path)
-        if not os.path.exists(file_path):
-            self.fatal("We can't get tooltool.py")
-        self.chmod(file_path, 0755)
-        return file_path
-
     def create_tooltool_manifest(self, contents, path=None):
         """ Currently just creates a manifest, given the contents.
         We may want a template and individual values in the future?
         """
         if path is None:
             dirs = self.query_abs_dirs()
             path = os.path.join(dirs['abs_work_dir'], 'tooltool.tt')
         self.write_to_file(path, contents, error_level=FATAL)
--- a/testing/talos/mach_commands.py
+++ b/testing/talos/mach_commands.py
@@ -66,17 +66,16 @@ class TalosRunner(MozbuildObject):
             'pypi_url': 'http://pypi.python.org/simple',
             'base_work_dir': self.mozharness_dir,
             'exes': {
                 'python': self.python_interp,
                 'virtualenv': [self.python_interp, self.virtualenv_script]
             },
             'title': socket.gethostname(),
             'default_actions': default_actions,
-            'download_tooltool': True,
             'talos_extra_options': ['--develop'] + self.talos_args,
             'python3_manifest': {
                 'win32': 'python3.manifest',
                 'win64': 'python3_x64.manifest',
             }
         }
 
     def make_args(self):