1 # Copyright 2016 The Chromium OS Authors. All rights reserved. 2 # Use of this source code is governed by a BSD-style license that can be 3 # found in the LICENSE file. 4 5 """Script to archive old Autotest results to Google Storage. 6 7 Uses gsutil to archive files to the configured Google Storage bucket. 8 Upon successful copy, the local results directory is deleted. 9 """ 10 11 import logging 12 import os 13 14 from apiclient import discovery 15 from oauth2client.client import ApplicationDefaultCredentialsError 16 from oauth2client.client import GoogleCredentials 17 from autotest_lib.server.hosts import moblab_host 18 19 import common 20 21 # Cloud service 22 # TODO(ntang): move this to config. 23 CLOUD_SERVICE_ACCOUNT_FILE = moblab_host.MOBLAB_SERVICE_ACCOUNT_LOCATION 24 PUBSUB_SERVICE_NAME = 'pubsub' 25 PUBSUB_VERSION = 'v1beta2' 26 PUBSUB_SCOPES = ['https://www.googleapis.com/auth/pubsub'] 27 # number of retry to publish an event. 28 _PUBSUB_NUM_RETRIES = 3 29 30 31 def _get_pubsub_service(): 32 """Gets the pubsub service api handle.""" 33 if not os.path.isfile(CLOUD_SERVICE_ACCOUNT_FILE): 34 logging.error('No credential file found') 35 return None 36 37 try: 38 credentials = GoogleCredentials.from_stream(CLOUD_SERVICE_ACCOUNT_FILE) 39 if credentials.create_scoped_required(): 40 credentials = credentials.create_scoped(PUBSUB_SCOPES) 41 return discovery.build(PUBSUB_SERVICE_NAME, PUBSUB_VERSION, 42 credentials=credentials) 43 except ApplicationDefaultCredentialsError as ex: 44 logging.error('Failed to get credential.') 45 except: 46 logging.error('Failed to get the pubsub service handle.') 47 48 return None 49 50 51 def publish_notifications(topic, messages=[]): 52 """Publishes a test result notification to a given pubsub topic. 53 54 @param topic: The Cloud pubsub topic. 55 @param messages: A list of notification messages. 56 57 @returns A list of pubsub message ids, and empty if fails. 58 """ 59 pubsub = _get_pubsub_service() 60 if pubsub: 61 try: 62 body = {'messages': messages} 63 resp = pubsub.projects().topics().publish(topic=topic, 64 body=body).execute(num_retries=_PUBSUB_NUM_RETRIES) 65 if resp: 66 msgIds = resp.get('messageIds') 67 if msgIds: 68 logging.debug('Published notification message') 69 return msgIds 70 except: 71 pass 72 logging.error('Failed to publish test result notifiation.') 73 return [] 74