OLD | NEW |
1 # Copyright 2014 The Swarming Authors. All rights reserved. | 1 # Copyright 2014 The Swarming Authors. All rights reserved. |
2 # Use of this source code is governed under the Apache License, Version 2.0 that | 2 # Use of this source code is governed under the Apache License, Version 2.0 that |
3 # can be found in the LICENSE file. | 3 # can be found in the LICENSE file. |
4 | 4 |
5 """Toolset to run multiple Swarming tasks in parallel.""" | 5 """Toolset to run multiple Swarming tasks in parallel.""" |
6 | 6 |
7 import getpass | 7 import getpass |
8 import json | 8 import json |
9 import os | 9 import os |
10 import subprocess | 10 import subprocess |
11 import sys | 11 import sys |
12 import tempfile | 12 import tempfile |
13 import time | 13 import time |
14 | 14 |
15 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) | 15 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) |
16 ROOT_DIR = os.path.dirname(BASE_DIR) | 16 ROOT_DIR = os.path.dirname(BASE_DIR) |
17 | 17 |
18 sys.path.insert(0, ROOT_DIR) | 18 sys.path.insert(0, ROOT_DIR) |
19 | 19 |
20 import auth | 20 import auth |
21 import isolateserver | 21 import isolateserver |
| 22 from utils import logging_utils |
22 from utils import threading_utils | 23 from utils import threading_utils |
23 from utils import tools | 24 from utils import tools |
24 | 25 |
25 | 26 |
26 def task_to_name(name, dimensions, isolated_hash): | 27 def task_to_name(name, dimensions, isolated_hash): |
27 """Returns a task name the same way swarming.py generates them.""" | 28 """Returns a task name the same way swarming.py generates them.""" |
28 return '%s/%s/%s' % ( | 29 return '%s/%s/%s' % ( |
29 name, | 30 name, |
30 '_'.join('%s=%s' % (k, v) for k, v in sorted(dimensions.iteritems())), | 31 '_'.join('%s=%s' % (k, v) for k, v in sorted(dimensions.iteritems())), |
31 isolated_hash) | 32 isolated_hash) |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 failed_tasks.append(task_name) | 145 failed_tasks.append(task_name) |
145 | 146 |
146 duration = time.time() - start | 147 duration = time.time() - start |
147 print('\nCompleted in %3.2fs' % duration) | 148 print('\nCompleted in %3.2fs' % duration) |
148 if failed_tasks: | 149 if failed_tasks: |
149 print('Detected the following failures:') | 150 print('Detected the following failures:') |
150 for task in sorted(failed_tasks): | 151 for task in sorted(failed_tasks): |
151 print(' %s' % task) | 152 print(' %s' % task) |
152 | 153 |
153 | 154 |
154 class OptionParser(tools.OptionParserWithLogging): | 155 class OptionParser(logging_utils.OptionParserWithLogging): |
155 def __init__(self, **kwargs): | 156 def __init__(self, **kwargs): |
156 tools.OptionParserWithLogging.__init__(self, **kwargs) | 157 logging_utils.OptionParserWithLogging.__init__(self, **kwargs) |
157 self.server_group = tools.optparse.OptionGroup(self, 'Server') | 158 self.server_group = tools.optparse.OptionGroup(self, 'Server') |
158 self.server_group.add_option( | 159 self.server_group.add_option( |
159 '-S', '--swarming', | 160 '-S', '--swarming', |
160 metavar='URL', default=os.environ.get('SWARMING_SERVER', ''), | 161 metavar='URL', default=os.environ.get('SWARMING_SERVER', ''), |
161 help='Swarming server to use') | 162 help='Swarming server to use') |
162 isolateserver.add_isolate_server_options(self.server_group) | 163 isolateserver.add_isolate_server_options(self.server_group) |
163 self.add_option_group(self.server_group) | 164 self.add_option_group(self.server_group) |
164 auth.add_auth_options(self) | 165 auth.add_auth_options(self) |
165 self.add_option( | 166 self.add_option( |
166 '-d', '--dimension', default=[], action='append', nargs=2, | 167 '-d', '--dimension', default=[], action='append', nargs=2, |
167 dest='dimensions', metavar='FOO bar', | 168 dest='dimensions', metavar='FOO bar', |
168 help='dimension to filter on') | 169 help='dimension to filter on') |
169 self.add_option( | 170 self.add_option( |
170 '--priority', type='int', | 171 '--priority', type='int', |
171 help='The lower value, the more important the task is. It may be ' | 172 help='The lower value, the more important the task is. It may be ' |
172 'important to specify a higher priority since the default value ' | 173 'important to specify a higher priority since the default value ' |
173 'will make the task to be triggered only when the bots are idle.') | 174 'will make the task to be triggered only when the bots are idle.') |
174 self.add_option( | 175 self.add_option( |
175 '--deadline', type='int', default=6*60*60, | 176 '--deadline', type='int', default=6*60*60, |
176 help='Seconds to allow the task to be pending for a bot to run before ' | 177 help='Seconds to allow the task to be pending for a bot to run before ' |
177 'this task request expires.') | 178 'this task request expires.') |
178 | 179 |
179 def parse_args(self, *args, **kwargs): | 180 def parse_args(self, *args, **kwargs): |
180 options, args = tools.OptionParserWithLogging.parse_args( | 181 options, args = logging_utils.OptionParserWithLogging.parse_args( |
181 self, *args, **kwargs) | 182 self, *args, **kwargs) |
182 options.swarming = options.swarming.rstrip('/') | 183 options.swarming = options.swarming.rstrip('/') |
183 if not options.swarming: | 184 if not options.swarming: |
184 self.error('--swarming is required.') | 185 self.error('--swarming is required.') |
185 auth.process_auth_options(self, options) | 186 auth.process_auth_options(self, options) |
186 isolateserver.process_isolate_server_options(self, options, False) | 187 isolateserver.process_isolate_server_options(self, options, False) |
187 options.dimensions = dict(options.dimensions) | 188 options.dimensions = dict(options.dimensions) |
188 return options, args | 189 return options, args |
189 | 190 |
190 def format_description(self, _): | 191 def format_description(self, _): |
191 return self.description | 192 return self.description |
OLD | NEW |