| 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 base64 | 5 import base64 |
| 6 import json | 6 import json |
| 7 | 7 |
| 8 from common import constants |
| 8 from common.http_client_appengine import HttpClientAppengine as HttpClient | 9 from common.http_client_appengine import HttpClientAppengine as HttpClient |
| 9 from common.pipeline_wrapper import BasePipeline | 10 from common.pipeline_wrapper import BasePipeline |
| 10 from common.pipeline_wrapper import pipeline | 11 from common.pipeline_wrapper import pipeline |
| 12 from common.waterfall import failure_type |
| 11 from model.wf_analysis import WfAnalysis | 13 from model.wf_analysis import WfAnalysis |
| 12 from model.wf_step import WfStep | 14 from model.wf_step import WfStep |
| 13 from waterfall import build_util | 15 from waterfall import build_util |
| 14 from waterfall import buildbot | 16 from waterfall import buildbot |
| 15 from waterfall import swarming_util | 17 from waterfall import swarming_util |
| 16 | 18 |
| 17 | 19 |
| 18 _MAX_BUILDS_TO_CHECK = 20 | 20 _MAX_BUILDS_TO_CHECK = 20 |
| 19 | 21 |
| 20 | 22 |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 failed_step, http_client) | 362 failed_step, http_client) |
| 361 | 363 |
| 362 if result: # pragma: no cover | 364 if result: # pragma: no cover |
| 363 # Iterates backwards to get a more precise failed_steps info. | 365 # Iterates backwards to get a more precise failed_steps info. |
| 364 self._UpdateFirstFailureOnTestLevel( | 366 self._UpdateFirstFailureOnTestLevel( |
| 365 master_name, builder_name, build_number, step_name, | 367 master_name, builder_name, build_number, step_name, |
| 366 failed_step, http_client) | 368 failed_step, http_client) |
| 367 | 369 |
| 368 self._UpdateFailureInfoBuilds(failed_steps, builds) | 370 self._UpdateFailureInfoBuilds(failed_steps, builds) |
| 369 | 371 |
| 372 @staticmethod |
| 373 def _GetFailureType(build_info): |
| 374 if not build_info.failed_steps: |
| 375 return failure_type.UNKNOWN |
| 376 if constants.COMPILE_STEP_NAME in build_info.failed_steps: |
| 377 return failure_type.COMPILE |
| 378 # TODO(http://crbug.com/602733): differentiate test steps from infra ones. |
| 379 return failure_type.TEST |
| 380 |
| 370 # Arguments number differs from overridden method - pylint: disable=W0221 | 381 # Arguments number differs from overridden method - pylint: disable=W0221 |
| 371 def run(self, master_name, builder_name, build_number): | 382 def run(self, master_name, builder_name, build_number): |
| 372 """ | 383 """ |
| 373 Args: | 384 Args: |
| 374 master_name (str): the master name of a build. | 385 master_name (str): the master name of a build. |
| 375 builder_name (str): the builder name of a build. | 386 builder_name (str): the builder name of a build. |
| 376 build_number (int): the build number of a build. | 387 build_number (int): the build number of a build. |
| 377 | 388 |
| 378 Returns: | 389 Returns: |
| 379 A dict in the following form: | 390 A dict in the following form: |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 ], | 422 ], |
| 412 } | 423 } |
| 413 } | 424 } |
| 414 } | 425 } |
| 415 """ | 426 """ |
| 416 build_info = self._ExtractBuildInfo(master_name, builder_name, build_number) | 427 build_info = self._ExtractBuildInfo(master_name, builder_name, build_number) |
| 417 | 428 |
| 418 if not build_info: # pragma: no cover | 429 if not build_info: # pragma: no cover |
| 419 raise pipeline.Retry('Failed to extract build info.') | 430 raise pipeline.Retry('Failed to extract build info.') |
| 420 | 431 |
| 432 build_failure_type = self._GetFailureType(build_info) |
| 433 |
| 421 failure_info = { | 434 failure_info = { |
| 422 'failed': True, | 435 'failed': True, |
| 423 'master_name': master_name, | 436 'master_name': master_name, |
| 424 'builder_name': builder_name, | 437 'builder_name': builder_name, |
| 425 'build_number': build_number, | 438 'build_number': build_number, |
| 426 'chromium_revision': build_info.chromium_revision, | 439 'chromium_revision': build_info.chromium_revision, |
| 427 'builds': {}, | 440 'builds': {}, |
| 428 'failed_steps': {}, | 441 'failed_steps': {}, |
| 442 'failure_type': build_failure_type, |
| 429 } | 443 } |
| 430 | 444 |
| 431 if (build_info.result == buildbot.SUCCESS or | 445 if build_info.result == buildbot.SUCCESS or not build_info.failed_steps: |
| 432 not build_info.failed_steps): | |
| 433 failure_info['failed'] = False | 446 failure_info['failed'] = False |
| 434 return failure_info | 447 return failure_info |
| 435 | 448 |
| 436 builds = dict() | 449 builds = dict() |
| 437 self._SaveBlamelistAndChromiumRevisionIntoDict(build_info, builds) | 450 self._SaveBlamelistAndChromiumRevisionIntoDict(build_info, builds) |
| 438 | 451 |
| 439 failed_steps = self._CreateADictOfFailedSteps(build_info) | 452 failed_steps = self._CreateADictOfFailedSteps(build_info) |
| 440 | 453 |
| 441 # Checks first failed builds for each failed step. | 454 # Checks first failed builds for each failed step. |
| 442 self._CheckForFirstKnownFailure( | 455 self._CheckForFirstKnownFailure( |
| 443 master_name, builder_name, build_number, failed_steps, builds) | 456 master_name, builder_name, build_number, failed_steps, builds) |
| 444 | 457 |
| 445 # Checks first failed builds for each failed test. | 458 if build_failure_type == failure_type.TEST: |
| 446 self._CheckFirstKnownFailureForSwarmingTests( | 459 # Checks first failed builds for each failed test. |
| 447 master_name, builder_name, build_number, failed_steps, builds) | 460 self._CheckFirstKnownFailureForSwarmingTests( |
| 461 master_name, builder_name, build_number, failed_steps, builds) |
| 448 | 462 |
| 449 failure_info['builds'] = builds | 463 failure_info['builds'] = builds |
| 450 failure_info['failed_steps'] = failed_steps | 464 failure_info['failed_steps'] = failed_steps |
| 451 | 465 |
| 452 analysis = WfAnalysis.Get(master_name, builder_name, build_number) | 466 analysis = WfAnalysis.Get(master_name, builder_name, build_number) |
| 453 analysis.not_passed_steps = build_info.not_passed_steps | 467 analysis.not_passed_steps = build_info.not_passed_steps |
| 468 analysis.build_failure_type = build_failure_type |
| 454 analysis.put() | 469 analysis.put() |
| 455 | 470 |
| 456 return failure_info | 471 return failure_info |
| OLD | NEW |