Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Unified Diff: py/utils/gs_utils.py

Issue 661563002: Add does_storage_object_exist to gs_utils (Closed) Base URL: https://skia.googlesource.com/common.git@master
Patch Set: Work harder to find .boto Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« .gitignore ('K') | « .gitignore ('k') | py/utils/gs_utils_manualtest.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: py/utils/gs_utils.py
diff --git a/py/utils/gs_utils.py b/py/utils/gs_utils.py
index d5c5b95b1332b0174aa704e85bd53b7db6b4f417..fd9999c3872fc4c1d2c7a3492bd2da74c0dc6265 100644
--- a/py/utils/gs_utils.py
+++ b/py/utils/gs_utils.py
@@ -52,7 +52,7 @@ from boto.s3.prefix import Prefix
# each core sits idle waiting for network I/O to complete.
DEFAULT_UPLOAD_THREADS = 10
-_GS_PREFIX = 'gs://'
+GS_PREFIX = 'gs://'
class AnonymousGSConnection(GSConnection):
@@ -132,19 +132,34 @@ class GSUtils(object):
Params:
boto_file_path: full path (local-OS-style) on local disk where .boto
- credentials file can be found. If None, then the GSUtils object
- created will be able to access only public files in Google Storage.
+ credentials file can be found. If None, fall back on the
+ AWS_CREDENTIAL_FILE environment variable, then look in a set of
+ common paths for the .boto file. If no .boto file is found, then the
+ GSUtils object created will be able to access only public files in
+ Google Storage.
Raises an exception if no file is found at boto_file_path, or if the file
found there is malformed.
"""
self._gs_access_key_id = None
self._gs_secret_access_key = None
+ if not boto_file_path:
+ if os.environ.get('AWS_CREDENTIAL_FILE'):
+ boto_file_path = os.path.expanduser(os.environ['AWS_CREDENTIAL_FILE'])
+ if not boto_file_path:
rmistry 2014/10/16 18:09:58 Remove this if since you already have it above.
borenet 2014/10/16 18:12:51 This is only intended to run if AWS_CREDENTIAL_FIL
+ for path in (os.path.join(os.path.expanduser('~'), '.boto'),):
+ if os.path.isfile(path):
+ boto_file_path = path
+ break
+
if boto_file_path:
print ('Reading boto file from %s' % boto_file_path)
boto_dict = _config_file_as_dict(filepath=boto_file_path)
self._gs_access_key_id = boto_dict['gs_access_key_id']
self._gs_secret_access_key = boto_dict['gs_secret_access_key']
+ else:
+ print >> sys.stderr, 'Warning: no .boto file found.'
+
# Which field we get/set in ACL entries, depending on IdType.
self._field_by_id_type = {
self.IdType.GROUP_BY_DOMAIN: 'domain',
@@ -582,13 +597,24 @@ class GSUtils(object):
dirs.append(item.name[prefix_length:-1])
return (dirs, files)
+ def does_storage_object_exist(self, bucket, object_name):
+ """Determines whether an object exists in Google Storage.
+
+ Returns True if it exists else returns False.
+ """
+ b = self._connect_to_bucket(bucket=bucket)
+ if object_name in b:
+ return True
+ dirs, files = self.list_bucket_contents(bucket, object_name)
+ return bool(dirs or files)
+
@staticmethod
def is_gs_url(url):
"""Returns True if url is a legal Google Storage URL ("gs://bucket/file").
"""
try:
- if url.lower().startswith(_GS_PREFIX) and len(url) > len(_GS_PREFIX):
- return url[len(_GS_PREFIX)].isalnum()
+ if url.lower().startswith(GS_PREFIX) and len(url) > len(GS_PREFIX):
+ return url[len(GS_PREFIX)].isalnum()
else:
return False
except AttributeError:
@@ -602,7 +628,7 @@ class GSUtils(object):
"""
if not GSUtils.is_gs_url(url):
raise AttributeError('"%s" is not a legal Google Storage URL' % url)
- prefix_removed = url[len(_GS_PREFIX):]
+ prefix_removed = url[len(GS_PREFIX):]
pathsep_index = prefix_removed.find('/')
if pathsep_index < 0:
return (prefix_removed, '')
« .gitignore ('K') | « .gitignore ('k') | py/utils/gs_utils_manualtest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698