blob: 9eed5eb3927d4ba324a303ceb7d7756c6aaa960d [file] [log] [blame] [edit]
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""An interface for accessing Google Cloud Storage."""
import os
import shutil
import tempfile
import urllib2
from common_util import simple_system
PUBLIC_BOTO = 'public/.chromeos.gestures.untrusted.write.boto'
GS_BUCKET = 'gs://chromeos-touchpad'
GS_BUCKET_PUBLIC = GS_BUCKET + '-public'
GSUTIL = 'gsutil'
GSUTIL_URI_ROOT = 'http://storage.googleapis.com/pub'
GSUTIL_TAR_NAME = 'gsutil.tar.gz'
GSUTIL_URI = os.path.join(GSUTIL_URI_ROOT, GSUTIL_TAR_NAME)
GSUTIL_INSTALL_DIR = os.path.join('/', 'usr', 'local', 'share')
GSUTIL_PATH = os.path.join(GSUTIL_INSTALL_DIR, GSUTIL)
def download_and_install_gsutil():
"""Download and install gsutil package."""
if not os.path.isdir(GSUTIL_PATH):
print 'Installing %s ...' % GSUTIL
# Download the gsutil tarball to a temporary directory
temp_dir = tempfile.mkdtemp()
gsutil_temp_file = os.path.join(temp_dir, GSUTIL_TAR_NAME)
gsutil_url = urllib2.urlopen(GSUTIL_URI)
print ' Downloading gsutil tarball: "%s".' % GSUTIL_URI
with open(gsutil_temp_file, 'w') as tarfile:
tarfile.write(gsutil_url.read())
# Untar the gsutil tarball
untar_cmd_str = 'tar xf %s -C %s'
untar_cmd = untar_cmd_str % (gsutil_temp_file, GSUTIL_INSTALL_DIR)
print ' Untarring the gsutil tarball.'
simple_system(untar_cmd)
# Remove the tarball and the temp directory
shutil.rmtree(temp_dir)
# Set the PATH environment variable for gsutil
PATH = os.environ['PATH']
os.environ['PATH'] = ':'.join([GSUTIL_PATH, PATH])
class CrosGs(object):
"""A class handling google cloud storage access."""
def __init__(self, board, boto=PUBLIC_BOTO):
download_and_install_gsutil()
# Set up gsutil commands
self.bucket = GS_BUCKET_PUBLIC if boto == PUBLIC_BOTO else GS_BUCKET
bucket = self.bucket
self.default_bucket_dir = os.path.join(
'firmware_test', board, 'data', '')
_cmd_prefix = 'BOTO_CONFIG=%s gsutil ' % boto
self.ls_cmd = '{0} {1} {2}/%s'.format(_cmd_prefix, 'ls', bucket)
upload_cmd_str = '{0} {1} %s %s {2}/%s'
self.upload_cmd = upload_cmd_str.format(_cmd_prefix, 'cp', bucket)
download_cmd_str = '{0} {1} %s {2}/%s %s'
self.download_cmd = download_cmd_str.format(_cmd_prefix, 'cp', bucket)
self.rm_cmd = '{0} {1} {2}/%s'.format(_cmd_prefix, 'rm', bucket)
def ls(self, files=''):
"""ls the files in the selected bucket."""
simple_system(self.ls_cmd % files)
def upload(self, data, bucket_dir=''):
"""Upload the data to the chosen bucket."""
if not bucket_dir:
bucket_dir = self.default_bucket_dir
cp_flag = '-R' if os.path.isdir(data) else ''
simple_system(self.upload_cmd % (cp_flag, data, bucket_dir))
msg = '\nGesture event files have been uploaded to "%s"\n'
data_dir = os.path.basename(data)
print msg % os.path.join(self.bucket, bucket_dir, data_dir)
def rm(self, single_file):
"""Remove single_file."""
simple_system(self.rm_cmd % single_file)
def rmdir(self, data_dir):
"""Remove all files in the data directory."""
simple_system(self.rm_cmd % os.path.join(data_dir, '*'))