| OLD | NEW |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 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 | 5 |
| 6 from recipe_engine import recipe_api | 6 from recipe_engine import recipe_api |
| 7 import shlex | 7 import shlex |
| 8 | 8 |
| 9 | 9 |
| 10 DEFAULT_TASK_EXPIRATION = 20*60*60 | 10 DEFAULT_TASK_EXPIRATION = 20*60*60 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 """Directory where the outputs of the swarming tasks will be stored.""" | 25 """Directory where the outputs of the swarming tasks will be stored.""" |
| 26 return self.swarming_temp_dir.join('outputs') | 26 return self.swarming_temp_dir.join('outputs') |
| 27 | 27 |
| 28 def isolated_file_path(self, task_name): | 28 def isolated_file_path(self, task_name): |
| 29 """Get the path to the given task's .isolated file.""" | 29 """Get the path to the given task's .isolated file.""" |
| 30 return self.swarming_temp_dir.join('skia-task-%s.isolated' % task_name) | 30 return self.swarming_temp_dir.join('skia-task-%s.isolated' % task_name) |
| 31 | 31 |
| 32 def setup(self, luci_go_dir, swarming_rev=None): | 32 def setup(self, luci_go_dir, swarming_rev=None): |
| 33 """Performs setup steps for swarming.""" | 33 """Performs setup steps for swarming.""" |
| 34 self.m.swarming_client.checkout(revision=swarming_rev) | 34 self.m.swarming_client.checkout(revision=swarming_rev) |
| 35 self.m.swarming.check_client_version() | 35 self.m.swarming.check_client_version(step_test_data=(0, 8, 6)) |
| 36 self.setup_go_isolate(luci_go_dir) | 36 self.setup_go_isolate(luci_go_dir) |
| 37 | 37 |
| 38 # TODO(rmistry): Remove once the Go binaries are moved to recipes or buildbot. | 38 # TODO(rmistry): Remove once the Go binaries are moved to recipes or buildbot. |
| 39 def setup_go_isolate(self, luci_go_dir): | 39 def setup_go_isolate(self, luci_go_dir): |
| 40 """Generates and puts in place the isolate Go binary.""" | 40 """Generates and puts in place the isolate Go binary.""" |
| 41 self.m.step('download luci-go linux', | 41 self.m.step('download luci-go linux', |
| 42 ['download_from_google_storage', '--no_resume', | 42 ['download_from_google_storage', '--no_resume', |
| 43 '--platform=linux*', '--no_auth', '--bucket', 'chromium-luci', | 43 '--platform=linux*', '--no_auth', '--bucket', 'chromium-luci', |
| 44 '-d', luci_go_dir.join('linux64')]) | 44 '-d', luci_go_dir.join('linux64')]) |
| 45 self.m.step('download luci-go mac', | 45 self.m.step('download luci-go mac', |
| 46 ['download_from_google_storage', '--no_resume', | 46 ['download_from_google_storage', '--no_resume', |
| 47 '--platform=darwin', '--no_auth', '--bucket', 'chromium-luci', | 47 '--platform=darwin', '--no_auth', '--bucket', 'chromium-luci', |
| 48 '-d', luci_go_dir.join('mac64')]) | 48 '-d', luci_go_dir.join('mac64')]) |
| 49 self.m.step('download luci-go win', | 49 self.m.step('download luci-go win', |
| 50 ['download_from_google_storage', '--no_resume', | 50 ['download_from_google_storage', '--no_resume', |
| 51 '--platform=win32', '--no_auth', '--bucket', 'chromium-luci', | 51 '--platform=win32', '--no_auth', '--bucket', 'chromium-luci', |
| 52 '-d', luci_go_dir.join('win64')]) | 52 '-d', luci_go_dir.join('win64')]) |
| 53 # Copy binaries to the expected location. | 53 # Copy binaries to the expected location. |
| 54 dest = self.m.path['slave_build'].join('luci-go') | 54 dest = self.m.path['slave_build'].join('luci-go') |
| 55 self.m.file.rmtree('Go binary dir', dest) | 55 self.m.file.rmtree('Go binary dir', dest) |
| 56 self.m.file.copytree('Copy Go binary', | 56 self.m.file.copytree('Copy Go binary', |
| 57 source=luci_go_dir, | 57 source=luci_go_dir, |
| 58 dest=dest) | 58 dest=dest) |
| 59 | 59 |
| 60 def isolate_and_trigger_task( | 60 def isolate_and_trigger_task( |
| 61 self, isolate_path, isolate_base_dir, task_name, isolate_vars, | 61 self, isolate_path, isolate_base_dir, task_name, isolate_vars, |
| 62 swarm_dimensions, isolate_blacklist=None, extra_isolate_hashes=None, | 62 swarm_dimensions, isolate_blacklist=None, extra_isolate_hashes=None, |
| 63 idempotent=False, store_output=True, extra_args=None, expiration=None, | 63 idempotent=False, store_output=True, extra_args=None, expiration=None, |
| 64 hard_timeout=None, io_timeout=None): | 64 hard_timeout=None, io_timeout=None, cipd_packages=None): |
| 65 """Isolate inputs and trigger the task to run.""" | 65 """Isolate inputs and trigger the task to run.""" |
| 66 os_type = swarm_dimensions.get('os', 'linux') | 66 os_type = swarm_dimensions.get('os', 'linux') |
| 67 isolated_hash = self.isolate_task( | 67 isolated_hash = self.isolate_task( |
| 68 isolate_path, isolate_base_dir, os_type, task_name, isolate_vars, | 68 isolate_path, isolate_base_dir, os_type, task_name, isolate_vars, |
| 69 blacklist=isolate_blacklist, extra_hashes=extra_isolate_hashes) | 69 blacklist=isolate_blacklist, extra_hashes=extra_isolate_hashes) |
| 70 tasks = self.trigger_swarming_tasks([(task_name, isolated_hash)], | 70 tasks = self.trigger_swarming_tasks([(task_name, isolated_hash)], |
| 71 swarm_dimensions, | 71 swarm_dimensions, |
| 72 idempotent=idempotent, | 72 idempotent=idempotent, |
| 73 store_output=store_output, | 73 store_output=store_output, |
| 74 extra_args=extra_args, | 74 extra_args=extra_args, |
| 75 expiration=expiration, | 75 expiration=expiration, |
| 76 hard_timeout=hard_timeout, | 76 hard_timeout=hard_timeout, |
| 77 io_timeout=io_timeout) | 77 io_timeout=io_timeout, |
| 78 cipd_packages=cipd_packages) |
| 78 assert len(tasks) == 1 | 79 assert len(tasks) == 1 |
| 79 return tasks[0] | 80 return tasks[0] |
| 80 | 81 |
| 81 def isolate_task(self, isolate_path, base_dir, os_type, task_name, | 82 def isolate_task(self, isolate_path, base_dir, os_type, task_name, |
| 82 isolate_vars, blacklist=None, extra_hashes=None): | 83 isolate_vars, blacklist=None, extra_hashes=None): |
| 83 """Isolate inputs for the given task.""" | 84 """Isolate inputs for the given task.""" |
| 84 self.create_isolated_gen_json(isolate_path, base_dir, os_type, | 85 self.create_isolated_gen_json(isolate_path, base_dir, os_type, |
| 85 task_name, isolate_vars, | 86 task_name, isolate_vars, |
| 86 blacklist=blacklist) | 87 blacklist=blacklist) |
| 87 hashes = self.batcharchive([task_name]) | 88 hashes = self.batcharchive([task_name]) |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 171 isolateserver = self.m.swarming_client.path.join('isolateserver.py') | 172 isolateserver = self.m.swarming_client.path.join('isolateserver.py') |
| 172 r = self.m.python('upload new .isolated file for %s' % task_name, | 173 r = self.m.python('upload new .isolated file for %s' % task_name, |
| 173 script=isolateserver, | 174 script=isolateserver, |
| 174 args=['archive', '--isolate-server', | 175 args=['archive', '--isolate-server', |
| 175 self.m.isolate.isolate_server, isolated_file], | 176 self.m.isolate.isolate_server, isolated_file], |
| 176 stdout=self.m.raw_io.output()) | 177 stdout=self.m.raw_io.output()) |
| 177 return shlex.split(r.stdout)[0] | 178 return shlex.split(r.stdout)[0] |
| 178 | 179 |
| 179 def trigger_swarming_tasks( | 180 def trigger_swarming_tasks( |
| 180 self, swarm_hashes, dimensions, idempotent=False, store_output=True, | 181 self, swarm_hashes, dimensions, idempotent=False, store_output=True, |
| 181 extra_args=None, expiration=None, hard_timeout=None, io_timeout=None): | 182 extra_args=None, expiration=None, hard_timeout=None, io_timeout=None, |
| 183 cipd_packages=None): |
| 182 """Triggers swarming tasks using swarm hashes. | 184 """Triggers swarming tasks using swarm hashes. |
| 183 | 185 |
| 184 Args: | 186 Args: |
| 185 swarm_hashes: list of str. List of swarm hashes from the isolate server. | 187 swarm_hashes: list of str. List of swarm hashes from the isolate server. |
| 186 dimensions: dict of str to str. The dimensions to run the task on. | 188 dimensions: dict of str to str. The dimensions to run the task on. |
| 187 Eg: {'os': 'Ubuntu', 'gpu': '10de', 'pool': 'Skia'} | 189 Eg: {'os': 'Ubuntu', 'gpu': '10de', 'pool': 'Skia'} |
| 188 idempotent: bool. Whether or not to de-duplicate tasks. | 190 idempotent: bool. Whether or not to de-duplicate tasks. |
| 189 store_output: bool. Whether task output should be stored. | 191 store_output: bool. Whether task output should be stored. |
| 190 extra_args: list of str. Extra arguments to pass to the task. | 192 extra_args: list of str. Extra arguments to pass to the task. |
| 191 expiration: int. Task will expire if not picked up within this time. | 193 expiration: int. Task will expire if not picked up within this time. |
| 192 DEFAULT_TASK_EXPIRATION is used if this argument is None. | 194 DEFAULT_TASK_EXPIRATION is used if this argument is None. |
| 193 hard_timeout: int. Task will timeout if not completed within this time. | 195 hard_timeout: int. Task will timeout if not completed within this time. |
| 194 DEFAULT_TASK_TIMEOUT is used if this argument is None. | 196 DEFAULT_TASK_TIMEOUT is used if this argument is None. |
| 195 io_timeout: int. Task will timeout if there is no output within this time. | 197 io_timeout: int. Task will timeout if there is no output within this time. |
| 196 DEFAULT_IO_TIMEOUT is used if this argument is None. | 198 DEFAULT_IO_TIMEOUT is used if this argument is None. |
| 199 cipd_packages: CIPD packages which these tasks depend on. |
| 197 | 200 |
| 198 Returns: | 201 Returns: |
| 199 List of swarming.SwarmingTask instances. | 202 List of swarming.SwarmingTask instances. |
| 200 """ | 203 """ |
| 201 swarming_tasks = [] | 204 swarming_tasks = [] |
| 202 for task_name, swarm_hash in swarm_hashes: | 205 for task_name, swarm_hash in swarm_hashes: |
| 203 swarming_task = self.m.swarming.task( | 206 swarming_task = self.m.swarming.task( |
| 204 title=task_name, | 207 title=task_name, |
| 208 cipd_packages=cipd_packages, |
| 205 isolated_hash=swarm_hash) | 209 isolated_hash=swarm_hash) |
| 206 if store_output: | 210 if store_output: |
| 207 swarming_task.task_output_dir = self.tasks_output_dir.join(task_name) | 211 swarming_task.task_output_dir = self.tasks_output_dir.join(task_name) |
| 208 swarming_task.dimensions = dimensions | 212 swarming_task.dimensions = dimensions |
| 209 swarming_task.idempotent = idempotent | 213 swarming_task.idempotent = idempotent |
| 210 swarming_task.priority = 90 | 214 swarming_task.priority = 90 |
| 211 swarming_task.expiration = ( | 215 swarming_task.expiration = ( |
| 212 expiration if expiration else DEFAULT_TASK_EXPIRATION) | 216 expiration if expiration else DEFAULT_TASK_EXPIRATION) |
| 213 swarming_task.hard_timeout = ( | 217 swarming_task.hard_timeout = ( |
| 214 hard_timeout if hard_timeout else DEFAULT_TASK_TIMEOUT) | 218 hard_timeout if hard_timeout else DEFAULT_TASK_TIMEOUT) |
| (...skipping 29 matching lines...) Expand all Loading... |
| 244 def collect_swarming_task_isolate_hash(self, swarming_task): | 248 def collect_swarming_task_isolate_hash(self, swarming_task): |
| 245 """Wait for the given swarming task to finish and return its output hash. | 249 """Wait for the given swarming task to finish and return its output hash. |
| 246 | 250 |
| 247 Args: | 251 Args: |
| 248 swarming_task: An instance of swarming.SwarmingTask. | 252 swarming_task: An instance of swarming.SwarmingTask. |
| 249 Returns: | 253 Returns: |
| 250 the hash of the isolate output of the task. | 254 the hash of the isolate output of the task. |
| 251 """ | 255 """ |
| 252 res = self.collect_swarming_task(swarming_task) | 256 res = self.collect_swarming_task(swarming_task) |
| 253 return res.json.output['shards'][0]['isolated_out']['isolated'] | 257 return res.json.output['shards'][0]['isolated_out']['isolated'] |
| OLD | NEW |