1# Copyright (c) 2013 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"""An interface for accessing Google Cloud Storage.""" 6 7import os 8import shutil 9import tempfile 10 11from autotest_lib.client.common_lib import file_utils 12from common_util import simple_system 13 14 15PUBLIC_BOTO = 'public/.chromeos.gestures.untrusted.write.boto' 16GS_BUCKET = 'gs://chromeos-touchpad' 17GS_BUCKET_PUBLIC = GS_BUCKET + '-public' 18GSUTIL = 'gsutil' 19GSUTIL_URI_ROOT = 'http://storage.googleapis.com/pub' 20GSUTIL_TAR_NAME = 'gsutil.tar.gz' 21GSUTIL_URI = os.path.join(GSUTIL_URI_ROOT, GSUTIL_TAR_NAME) 22GSUTIL_INSTALL_DIR = os.path.join('/', 'usr', 'local', 'share') 23GSUTIL_PATH = os.path.join(GSUTIL_INSTALL_DIR, GSUTIL) 24 25 26def download_and_install_gsutil(): 27 """Download and install gsutil package.""" 28 if not os.path.isdir(GSUTIL_PATH): 29 print 'Installing %s ...' % GSUTIL 30 31 # Download the gsutil tarball to a temporary directory 32 temp_dir = tempfile.mkdtemp() 33 gsutil_temp_file = os.path.join(temp_dir, GSUTIL_TAR_NAME) 34 print ' Downloading gsutil tarball: "%s".' % GSUTIL_URI 35 file_utils.download_file(GSUTIL_URI, gsutil_temp_file) 36 37 # Untar the gsutil tarball 38 untar_cmd_str = 'tar xf %s -C %s' 39 untar_cmd = untar_cmd_str % (gsutil_temp_file, GSUTIL_INSTALL_DIR) 40 print ' Untarring the gsutil tarball.' 41 simple_system(untar_cmd) 42 43 # Remove the tarball and the temp directory 44 shutil.rmtree(temp_dir) 45 46 # Set the PATH environment variable for gsutil 47 PATH = os.environ['PATH'] 48 os.environ['PATH'] = ':'.join([GSUTIL_PATH, PATH]) 49 50 51class CrosGs(object): 52 """A class handling google cloud storage access.""" 53 def __init__(self, board, boto=PUBLIC_BOTO): 54 download_and_install_gsutil() 55 56 # Set up gsutil commands 57 self.bucket = GS_BUCKET_PUBLIC if boto == PUBLIC_BOTO else GS_BUCKET 58 bucket = self.bucket 59 self.default_bucket_dir = os.path.join( 60 'firmware_test', board, 'data', '') 61 _cmd_prefix = 'BOTO_CONFIG=%s gsutil ' % boto 62 self.ls_cmd = '{0} {1} {2}/%s'.format(_cmd_prefix, 'ls', bucket) 63 upload_cmd_str = '{0} {1} %s %s {2}/%s' 64 self.upload_cmd = upload_cmd_str.format(_cmd_prefix, 'cp', bucket) 65 download_cmd_str = '{0} {1} %s {2}/%s %s' 66 self.download_cmd = download_cmd_str.format(_cmd_prefix, 'cp', bucket) 67 self.rm_cmd = '{0} {1} {2}/%s'.format(_cmd_prefix, 'rm', bucket) 68 69 def ls(self, files=''): 70 """ls the files in the selected bucket.""" 71 simple_system(self.ls_cmd % files) 72 73 def upload(self, data, bucket_dir=''): 74 """Upload the data to the chosen bucket.""" 75 if not bucket_dir: 76 bucket_dir = self.default_bucket_dir 77 cp_flag = '-R' if os.path.isdir(data) else '' 78 simple_system(self.upload_cmd % (cp_flag, data, bucket_dir)) 79 msg = '\nGesture event files have been uploaded to "%s"\n' 80 data_dir = os.path.basename(data) 81 print msg % os.path.join(self.bucket, bucket_dir, data_dir) 82 83 def rm(self, single_file): 84 """Remove single_file.""" 85 simple_system(self.rm_cmd % single_file) 86 87 def rmdir(self, data_dir): 88 """Remove all files in the data directory.""" 89 simple_system(self.rm_cmd % os.path.join(data_dir, '*')) 90