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)