Ejemplo n.º 1
0
    def GetAllSlaveBuildbucketInfo(buildbucket_client,
                                   scheduled_buildbucket_info_dict,
                                   dry_run=True):
        """Get buildbucket info from Buildbucket for all scheduled slave builds.

    For each build in the scheduled builds dict, get build status and build
    result from Buildbucket and return a updated buildbucket_info_dict.

    Args:
      buildbucket_client: Instance of buildbucket_lib.buildbucket_client.
      scheduled_buildbucket_info_dict: A dict mapping scheduled slave build
        config name to its buildbucket information in the format of
        BuildbucketInfo (see buildbucket.GetBuildInfoDict for details).
      dry_run: Boolean indicating whether it's a dry run. Default to True.

    Returns:
      A dict mapping all scheduled slave build config names to their
      BuildbucketInfos (The BuildbucketInfo of the most recently retried one of
      there're multiple retries for a slave build config).
    """
        #TODO(nxia): consider replacing this with a more elaborate fix
        if buildbucket_client is None:
            return {}

        all_buildbucket_info_dict = {}
        for build_config, build_info in scheduled_buildbucket_info_dict.iteritems(
        ):
            buildbucket_id = build_info.buildbucket_id
            retry = build_info.retry
            created_ts = build_info.created_ts
            status = None
            result = None
            url = None

            try:
                content = buildbucket_client.GetBuildRequest(
                    buildbucket_id, dry_run)
                status = buildbucket_lib.GetBuildStatus(content)
                result = buildbucket_lib.GetBuildResult(content)
                url = buildbucket_lib.GetBuildURL(content)
            except buildbucket_lib.BuildbucketResponseException as e:
                # If we have a temporary issue accessing the build status from the
                # Buildbucket, log the error and continue with other builds.
                # SlaveStatus will handle the missing builds in ShouldWait().
                logging.error('Failed to get status for build %s id %s: %s',
                              build_config, buildbucket_id, e)

            all_buildbucket_info_dict[
                build_config] = buildbucket_lib.BuildbucketInfo(
                    buildbucket_id, retry, created_ts, status, result, url)

        return all_buildbucket_info_dict
    def testGetBuildInfoDict(self):
        """Test GetBuildInfoDict with metadata and config."""
        metadata = metadata_lib.CBuildbotMetadata()
        slaves = [('config_1', 'bb_id_1', 0), ('config_1', 'bb_id_2', 1),
                  ('config_2', 'bb_id_3', 2)]
        metadata.ExtendKeyListWithList(
            constants.METADATA_SCHEDULED_IMPORTANT_SLAVES, slaves)

        buildbucket_info_dict = buildbucket_lib.GetBuildInfoDict(metadata)
        self.assertEqual(len(buildbucket_info_dict), 2)
        self.assertEqual(
            buildbucket_info_dict['config_1'],
            buildbucket_lib.BuildbucketInfo('bb_id_2', 1, 1, None, None, None))
        self.assertEqual(
            buildbucket_info_dict['config_2'],
            buildbucket_lib.BuildbucketInfo('bb_id_3', 0, 2, None, None, None))

        buildbucket_info_dict_with_experimental = (
            buildbucket_lib.GetBuildInfoDict(metadata,
                                             exclude_experimental=False))
        self.assertEqual(len(buildbucket_info_dict), 2)
        self.assertEqual(
            buildbucket_info_dict_with_experimental['config_1'],
            buildbucket_lib.BuildbucketInfo('bb_id_2', 1, 1, None, None, None))
        self.assertEqual(
            buildbucket_info_dict_with_experimental['config_2'],
            buildbucket_lib.BuildbucketInfo('bb_id_3', 0, 2, None, None, None))

        metadata.UpdateWithDict(
            {constants.METADATA_EXPERIMENTAL_BUILDERS: ['config_2']})
        buildbucket_info_dict = buildbucket_lib.GetBuildInfoDict(metadata)
        self.assertEqual(len(buildbucket_info_dict), 1)
        self.assertEqual(
            buildbucket_info_dict['config_1'],
            buildbucket_lib.BuildbucketInfo('bb_id_2', 1, 1, None, None, None))

        buildbucket_info_dict_with_experimental = (
            buildbucket_lib.GetBuildInfoDict(metadata,
                                             exclude_experimental=False))
        self.assertEqual(len(buildbucket_info_dict_with_experimental), 2)
        self.assertEqual(
            buildbucket_info_dict_with_experimental['config_1'],
            buildbucket_lib.BuildbucketInfo('bb_id_2', 1, 1, None, None, None))
        self.assertEqual(
            buildbucket_info_dict_with_experimental['config_2'],
            buildbucket_lib.BuildbucketInfo('bb_id_3', 0, 2, None, None, None))
    def testGetAllSlaveBuildbucketInfo(self):
        """Test GetAllSlaveBuildbucketInfo."""

        # Test completed builds.
        buildbucket_info_dict = {
            'build1':
            buildbucket_lib.BuildbucketInfo('id_1', 1, 0, None, None, None),
            'build2':
            buildbucket_lib.BuildbucketInfo('id_2', 1, 0, None, None, None)
        }
        self.PatchObject(buildbucket_lib,
                         'GetScheduledBuildDict',
                         return_value=buildbucket_info_dict)

        expected_status = 'COMPLETED'
        expected_result = 'SUCCESS'
        expected_url = 'fake_url'
        content = {
            'build': {
                'status': expected_status,
                'result': expected_result,
                'url': expected_url
            }
        }

        self.buildbucket_client.GetBuildRequest.return_value = content
        updated_buildbucket_info_dict = (
            builder_status_lib.SlaveBuilderStatus.GetAllSlaveBuildbucketInfo(
                self.buildbucket_client, buildbucket_info_dict))

        self.assertEqual(updated_buildbucket_info_dict['build1'].status,
                         expected_status)
        self.assertEqual(updated_buildbucket_info_dict['build1'].result,
                         expected_result)
        self.assertEqual(updated_buildbucket_info_dict['build1'].url,
                         expected_url)
        self.assertEqual(updated_buildbucket_info_dict['build2'].status,
                         expected_status)
        self.assertEqual(updated_buildbucket_info_dict['build2'].result,
                         expected_result)
        self.assertEqual(updated_buildbucket_info_dict['build1'].url,
                         expected_url)

        # Test started builds.
        expected_status = 'STARTED'
        expected_result = None
        content = {'build': {'status': 'STARTED'}}
        self.buildbucket_client.GetBuildRequest.return_value = content
        updated_buildbucket_info_dict = (
            builder_status_lib.SlaveBuilderStatus.GetAllSlaveBuildbucketInfo(
                self.buildbucket_client, buildbucket_info_dict))

        self.assertEqual(updated_buildbucket_info_dict['build1'].status,
                         expected_status)
        self.assertEqual(updated_buildbucket_info_dict['build1'].result,
                         expected_result)
        self.assertEqual(updated_buildbucket_info_dict['build2'].status,
                         expected_status)
        self.assertEqual(updated_buildbucket_info_dict['build2'].result,
                         expected_result)

        # Test BuildbucketResponseException failures.
        self.buildbucket_client.GetBuildRequest.side_effect = (
            buildbucket_lib.BuildbucketResponseException)
        updated_buildbucket_info_dict = (
            builder_status_lib.SlaveBuilderStatus.GetAllSlaveBuildbucketInfo(
                self.buildbucket_client, buildbucket_info_dict))
        self.assertIsNone(updated_buildbucket_info_dict['build1'].status)
        self.assertIsNone(updated_buildbucket_info_dict['build2'].status)