| OLD | NEW |
| 1 # Copyright 2014 The Chromium Authors. All rights reserved. | 1 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import contextlib | 5 import contextlib |
| 6 import copy | 6 import copy |
| 7 import json | 7 import json |
| 8 | 8 |
| 9 from infra.libs.infra_types import freeze, thaw | 9 from infra.libs.infra_types import freeze, thaw |
| 10 from recipe_engine import recipe_api | 10 from recipe_engine import recipe_api |
| 11 from recipe_engine import util as recipe_util | 11 from recipe_engine import util as recipe_util |
| 12 | 12 |
| 13 from . import builders |
| 14 from . import steps |
| 15 |
| 13 | 16 |
| 14 class ChromiumTestsApi(recipe_api.RecipeApi): | 17 class ChromiumTestsApi(recipe_api.RecipeApi): |
| 18 def __init__(self, *args, **kwargs): |
| 19 super(ChromiumTestsApi, self).__init__(*args, **kwargs) |
| 20 self._builders = {} |
| 21 self.add_builders(builders.BUILDERS) |
| 22 |
| 23 @property |
| 24 def builders(self): |
| 25 return self._builders |
| 26 |
| 27 @property |
| 28 def steps(self): |
| 29 return steps |
| 30 |
| 31 def add_builders(self, builders): |
| 32 """Adds builders to our builder map""" |
| 33 self._builders.update(builders) |
| 34 |
| 15 def configure_build(self, mastername, buildername, override_bot_type=None, | 35 def configure_build(self, mastername, buildername, override_bot_type=None, |
| 16 ): | 36 ): |
| 17 master_dict = self.m.chromium.builders.get(mastername, {}) | 37 master_dict = self.builders.get(mastername, {}) |
| 18 bot_config = master_dict.get('builders', {}).get(buildername) | 38 bot_config = master_dict.get('builders', {}).get(buildername) |
| 19 | 39 |
| 20 # Get the buildspec version. It can be supplied as a build property or as | 40 # Get the buildspec version. It can be supplied as a build property or as |
| 21 # a recipe config value. | 41 # a recipe config value. |
| 22 buildspec_version = (self.m.properties.get('buildspec_version') or | 42 buildspec_version = (self.m.properties.get('buildspec_version') or |
| 23 bot_config.get('buildspec_version')) | 43 bot_config.get('buildspec_version')) |
| 24 | 44 |
| 25 self.m.chromium.set_config( | 45 self.m.chromium.set_config( |
| 26 bot_config.get('chromium_config'), | 46 bot_config.get('chromium_config'), |
| 27 **bot_config.get('chromium_config_kwargs', {})) | 47 **bot_config.get('chromium_config_kwargs', {})) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 component_rev = self.m.properties.get('revision') or 'HEAD' | 86 component_rev = self.m.properties.get('revision') or 'HEAD' |
| 67 if bot_type == 'tester': | 87 if bot_type == 'tester': |
| 68 component_rev = self.m.properties.get( | 88 component_rev = self.m.properties.get( |
| 69 'parent_got_revision', component_rev) | 89 'parent_got_revision', component_rev) |
| 70 dep = bot_config.get('set_component_rev') | 90 dep = bot_config.get('set_component_rev') |
| 71 self.m.gclient.c.revisions[dep['name']] = dep['rev_str'] % component_rev | 91 self.m.gclient.c.revisions[dep['name']] = dep['rev_str'] % component_rev |
| 72 | 92 |
| 73 def prepare_checkout(self, mastername, buildername): | 93 def prepare_checkout(self, mastername, buildername): |
| 74 # Make an independent copy so that we don't overwrite global state | 94 # Make an independent copy so that we don't overwrite global state |
| 75 # with updates made dynamically based on the test specs. | 95 # with updates made dynamically based on the test specs. |
| 76 master_dict = thaw(self.m.chromium.builders.get(mastername, {})) | 96 master_dict = thaw(self.builders.get(mastername, {})) |
| 77 bot_config = master_dict.get('builders', {}).get(buildername) | 97 bot_config = master_dict.get('builders', {}).get(buildername) |
| 78 | 98 |
| 79 if self.m.platform.is_win: | 99 if self.m.platform.is_win: |
| 80 self.m.chromium.taskkill() | 100 self.m.chromium.taskkill() |
| 81 | 101 |
| 82 # Bot Update re-uses the gclient configs. | 102 # Bot Update re-uses the gclient configs. |
| 83 update_step = self.m.bot_update.ensure_checkout( | 103 update_step = self.m.bot_update.ensure_checkout( |
| 84 patch_root=bot_config.get('patch_root')) | 104 patch_root=bot_config.get('patch_root')) |
| 85 assert update_step.json.output['did_run'] | 105 assert update_step.json.output['did_run'] |
| 86 # HACK(dnj): Remove after 'crbug.com/398105' has landed | 106 # HACK(dnj): Remove after 'crbug.com/398105' has landed |
| (...skipping 26 matching lines...) Expand all Loading... |
| 113 # TODO(phajdan.jr): Bots should have no generators instead. | 133 # TODO(phajdan.jr): Bots should have no generators instead. |
| 114 if bot_config.get('disable_tests'): | 134 if bot_config.get('disable_tests'): |
| 115 test_spec = {} | 135 test_spec = {} |
| 116 scripts_compile_targets = {} | 136 scripts_compile_targets = {} |
| 117 else: | 137 else: |
| 118 test_spec = self.read_test_spec(self.m, test_spec_file) | 138 test_spec = self.read_test_spec(self.m, test_spec_file) |
| 119 test_spec_path = self.m.path['checkout'].join('testing', 'buildbot', | 139 test_spec_path = self.m.path['checkout'].join('testing', 'buildbot', |
| 120 test_spec_file) | 140 test_spec_file) |
| 121 | 141 |
| 122 scripts_compile_targets = \ | 142 scripts_compile_targets = \ |
| 123 self.m.chromium.get_compile_targets_for_scripts().json.output | 143 self.get_compile_targets_for_scripts().json.output |
| 124 | 144 |
| 125 for loop_buildername, builder_dict in master_dict.get( | 145 for loop_buildername, builder_dict in master_dict.get( |
| 126 'builders', {}).iteritems(): | 146 'builders', {}).iteritems(): |
| 127 builder_dict['tests'] = self.generate_tests_from_test_spec( | 147 builder_dict['tests'] = self.generate_tests_from_test_spec( |
| 128 self.m, test_spec, builder_dict, | 148 self.m, test_spec, builder_dict, |
| 129 loop_buildername, mastername, enable_swarming, | 149 loop_buildername, mastername, enable_swarming, |
| 130 scripts_compile_targets, builder_dict.get('test_generators', [])) | 150 scripts_compile_targets, builder_dict.get('test_generators', [])) |
| 131 | 151 |
| 132 if self.m.chromium.c.lto: | 152 if self.m.chromium.c.lto: |
| 133 self.m.chromium.download_lto_plugin() | 153 self.m.chromium.download_lto_plugin() |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 394 build_archive_url=specified_url) | 414 build_archive_url=specified_url) |
| 395 | 415 |
| 396 if (self.m.chromium.c.TARGET_PLATFORM == 'android' and | 416 if (self.m.chromium.c.TARGET_PLATFORM == 'android' and |
| 397 bot_config.get('root_devices')): | 417 bot_config.get('root_devices')): |
| 398 self.m.adb.root_devices() | 418 self.m.adb.root_devices() |
| 399 | 419 |
| 400 # TODO(shinyak): bot_config.get('tests', []) sometimes return tuple. | 420 # TODO(shinyak): bot_config.get('tests', []) sometimes return tuple. |
| 401 tests = list(bot_config.get('tests', [])) | 421 tests = list(bot_config.get('tests', [])) |
| 402 | 422 |
| 403 if bot_config.get('goma_canary'): | 423 if bot_config.get('goma_canary'): |
| 404 tests.insert(0, self.m.chromium.steps.DiagnoseGomaTest()) | 424 tests.insert(0, steps.DiagnoseGomaTest()) |
| 405 | 425 |
| 406 if bot_type in ('tester', 'builder_tester'): | 426 if bot_type in ('tester', 'builder_tester'): |
| 407 isolated_targets = [t.isolate_target for t in tests if t.uses_swarming] | 427 isolated_targets = [t.isolate_target for t in tests if t.uses_swarming] |
| 408 if isolated_targets: | 428 if isolated_targets: |
| 409 self.m.isolate.find_isolated_tests(self.m.chromium.output_dir) | 429 self.m.isolate.find_isolated_tests(self.m.chromium.output_dir) |
| 410 | 430 |
| 411 return tests | 431 return tests |
| 412 | 432 |
| 413 def _make_legacy_build_url(self, master_config, mastername): | 433 def _make_legacy_build_url(self, master_config, mastername): |
| 414 return self.m.archive.legacy_download_url( | 434 return self.m.archive.legacy_download_url( |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 611 master_config.get('build_gs_bucket'), | 631 master_config.get('build_gs_bucket'), |
| 612 extra_url_components=None) | 632 extra_url_components=None) |
| 613 elif (mastername == 'tryserver.chromium.perf' or | 633 elif (mastername == 'tryserver.chromium.perf' or |
| 614 (mastername == 'tryserver.chromium.linux' and | 634 (mastername == 'tryserver.chromium.linux' and |
| 615 buildername == 'linux_full_bisect_builder')): | 635 buildername == 'linux_full_bisect_builder')): |
| 616 return None | 636 return None |
| 617 else: | 637 else: |
| 618 return self.m.archive.legacy_upload_url( | 638 return self.m.archive.legacy_upload_url( |
| 619 master_config.get('build_gs_bucket'), | 639 master_config.get('build_gs_bucket'), |
| 620 extra_url_components=self.m.properties['mastername']) | 640 extra_url_components=self.m.properties['mastername']) |
| 641 |
| 642 def get_common_args_for_scripts(self): |
| 643 args = [] |
| 644 |
| 645 args.extend(['--build-config-fs', self.m.chromium.c.build_config_fs]) |
| 646 |
| 647 paths = {} |
| 648 for path in ('build', 'checkout'): |
| 649 paths[path] = self.m.path[path] |
| 650 args.extend(['--paths', self.m.json.input(paths)]) |
| 651 |
| 652 properties = {} |
| 653 # TODO(phajdan.jr): Remove buildnumber when no longer used. |
| 654 |
| 655 mastername = self.m.properties.get('mastername') |
| 656 buildername = self.m.properties.get('buildername') |
| 657 master_dict = self.builders.get(mastername, {}) |
| 658 bot_config = master_dict.get('builders', {}).get(buildername, {}) |
| 659 |
| 660 for name in ('buildername', 'slavename', 'buildnumber', 'mastername'): |
| 661 properties[name] = self.m.properties[name] |
| 662 |
| 663 # Optional properties |
| 664 for name in ('perf-id', 'results-url'): |
| 665 if bot_config.get(name): |
| 666 properties[name] = bot_config[name] |
| 667 |
| 668 properties['target_platform'] = self.m.chromium.c.TARGET_PLATFORM |
| 669 |
| 670 args.extend(['--properties', self.m.json.input(properties)]) |
| 671 |
| 672 return args |
| 673 |
| 674 def get_compile_targets_for_scripts(self): |
| 675 return self.m.python( |
| 676 name='get compile targets for scripts', |
| 677 script=self.m.path['checkout'].join( |
| 678 'testing', 'scripts', 'get_compile_targets.py'), |
| 679 args=[ |
| 680 '--output', self.m.json.output(), |
| 681 '--', |
| 682 ] + self.get_common_args_for_scripts(), |
| 683 step_test_data=lambda: self.m.json.test_api.output({})) |
| OLD | NEW |