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 import logging | 5 import logging |
6 import os | 6 import os |
7 import sys | 7 import sys |
8 import time | 8 import time |
9 | 9 |
10 import cloudstorage | 10 import cloudstorage |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 user_email = email_helper.GetUserEmail() | 261 user_email = email_helper.GetUserEmail() |
262 user_name = user_email[:user_email.find('@')] | 262 user_name = user_email[:user_email.find('@')] |
263 if user_name: | 263 if user_name: |
264 task_dir_components.append(user_name) | 264 task_dir_components.append(user_name) |
265 task_name = task.BackendParams().get('task_name') | 265 task_name = task.BackendParams().get('task_name') |
266 if task_name: | 266 if task_name: |
267 task_dir_components.append(task_name) | 267 task_dir_components.append(task_name) |
268 task_dir_components.append(task_tag) | 268 task_dir_components.append(task_tag) |
269 task_dir = os.path.join(task.Action(), '_'.join(task_dir_components)) | 269 task_dir = os.path.join(task.Action(), '_'.join(task_dir_components)) |
270 | 270 |
271 # Create the instance template if required. | |
272 if not CreateInstanceTemplate(task, task_dir): | |
273 return Render('Template creation failed.', memory_logs) | |
274 | |
275 # Build the URL where the result will live. | 271 # Build the URL where the result will live. |
276 task_url = None | 272 task_url = None |
277 if task.Action() == 'trace': | 273 if task.Action() == 'trace': |
278 bucket = task.BackendParams().get('storage_bucket') | 274 bucket = task.BackendParams().get('storage_bucket') |
279 if bucket: | 275 if bucket: |
280 task_url = 'https://console.cloud.google.com/storage/%s/%s' % (bucket, | 276 task_url = 'https://console.cloud.google.com/storage/%s/%s' % (bucket, |
281 task_dir) | 277 task_dir) |
282 elif task.Action() == 'report': | 278 elif task.Action() == 'report': |
283 task_url = common.clovis_paths.GetBigQueryTableURL(project_name, task_tag) | 279 task_url = common.clovis_paths.GetBigQueryTableURL(project_name, task_tag) |
284 else: | 280 else: |
285 error_string = 'Unsupported action: %s.' % task.Action() | 281 error_string = 'Unsupported action: %s.' % task.Action() |
286 clovis_logger.error(error_string) | 282 clovis_logger.error(error_string) |
287 return Render(error_string, memory_logs) | 283 return Render(error_string, memory_logs) |
288 clovis_logger.info('Task result URL: ' + task_url) | 284 clovis_logger.info('Task result URL: ' + task_url) |
289 | 285 |
290 # Split the task in smaller tasks. | 286 # Split the task in smaller tasks. |
291 sub_tasks = SplitClovisTask(task) | 287 sub_tasks = SplitClovisTask(task) |
292 if not sub_tasks: | 288 if not sub_tasks: |
293 return Render('Task split failed.', memory_logs) | 289 return Render('Task split failed.', memory_logs) |
294 | 290 |
295 if not EnqueueTasks(sub_tasks, task_tag): | 291 if not EnqueueTasks(sub_tasks, task_tag): |
296 return Render('Task creation failed.', memory_logs) | 292 return Render('Task creation failed.', memory_logs) |
297 | 293 |
298 # Start the instances if required. | |
299 if not CreateInstances(task): | |
300 return Render('Instance creation failed.', memory_logs) | |
301 | |
302 # Start polling the progress. | 294 # Start polling the progress. |
303 clovis_logger.info('Creating worker polling task.') | 295 clovis_logger.info('Creating worker polling task.') |
304 first_poll_delay_minutes = 10 | 296 first_poll_delay_minutes = 10 |
305 timeout_hours = task.BackendParams().get('timeout_hours', 5) | 297 timeout_hours = task.BackendParams().get('timeout_hours', 5) |
306 deferred.defer(PollWorkers, task_tag, time.time(), timeout_hours, user_email, | 298 deferred.defer(PollWorkers, task_tag, time.time(), timeout_hours, user_email, |
307 task_url, _countdown=(60 * first_poll_delay_minutes)) | 299 task_url, _countdown=(60 * first_poll_delay_minutes)) |
308 | 300 |
| 301 # Start the instances if required. |
| 302 if not CreateInstanceTemplate(task, task_dir): |
| 303 return Render('Instance template creation failed.', memory_logs) |
| 304 if not CreateInstances(task): |
| 305 return Render('Instance creation failed.', memory_logs) |
| 306 |
309 return Render(flask.Markup( | 307 return Render(flask.Markup( |
310 'Success!<br>Your task %s has started.<br>' | 308 'Success!<br>Your task %s has started.<br>' |
311 'You will be notified at %s when completed.') % (task_tag, user_email), | 309 'You will be notified at %s when completed.') % (task_tag, user_email), |
312 memory_logs) | 310 memory_logs) |
313 | 311 |
314 | 312 |
315 def EnqueueTasks(tasks, task_tag): | 313 def EnqueueTasks(tasks, task_tag): |
316 """Enqueues a list of tasks in the Google Cloud task queue, for consumption by | 314 """Enqueues a list of tasks in the Google Cloud task queue, for consumption by |
317 Google Compute Engine. | 315 Google Compute Engine. |
318 """ | 316 """ |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 @app.errorhandler(404) | 358 @app.errorhandler(404) |
361 def PageNotFound(e): # pylint: disable=unused-argument | 359 def PageNotFound(e): # pylint: disable=unused-argument |
362 """Return a custom 404 error.""" | 360 """Return a custom 404 error.""" |
363 return 'Sorry, Nothing at this URL.', 404 | 361 return 'Sorry, Nothing at this URL.', 404 |
364 | 362 |
365 | 363 |
366 @app.errorhandler(500) | 364 @app.errorhandler(500) |
367 def ApplicationError(e): | 365 def ApplicationError(e): |
368 """Return a custom 500 error.""" | 366 """Return a custom 500 error.""" |
369 return 'Sorry, unexpected error: {}'.format(e), 499 | 367 return 'Sorry, unexpected error: {}'.format(e), 499 |
OLD | NEW |