Index: py/utils/gs_utils.py |
diff --git a/py/utils/gs_utils.py b/py/utils/gs_utils.py |
index ecbe68c74e656abbba7e5d3fbfd151ef0ae2f854..43db0d7b5f3ab0c4b4eb1478e0f6853760b55521 100755 |
--- a/py/utils/gs_utils.py |
+++ b/py/utils/gs_utils.py |
@@ -202,8 +202,6 @@ class GSUtils(object): |
fine_grained_acl_list: list of (id_type, id_value, permission) tuples |
to apply to every file uploaded (on top of the predefined_acl), |
or None if predefined_acl is sufficient |
- TODO(epoger): add unittests for this param, although it seems to work |
- in my manual testing |
The copy operates as a "merge with overwrite": any files in source_dir will |
be "overlaid" on top of the existing content in dest_dir. Existing files |
@@ -227,24 +225,26 @@ class GSUtils(object): |
self.upload_dir_contents( # recurse |
source_dir=local_path, dest_bucket=dest_bucket, |
dest_dir=posixpath.join(dest_dir, filename), |
- predefined_acl=predefined_acl) |
+ predefined_acl=predefined_acl, |
+ fine_grained_acl_list=fine_grained_acl_list) |
epoger
2014/07/18 20:41:26
whoops
|
else: |
item = Key(b) |
- item.key = posixpath.join(dest_dir, filename) |
+ dest_path = posixpath.join(dest_dir, filename) |
+ item.key = dest_path |
try: |
item.set_contents_from_filename( |
filename=local_path, policy=predefined_acl) |
except BotoServerError, e: |
e.body = (repr(e.body) + |
' while uploading local_path=%s to bucket=%s, path=%s' % ( |
- local_path, dest_bucket, item.key)) |
+ local_path, dest_bucket, dest_path)) |
raise |
# TODO(epoger): This may be inefficient, because it calls |
# _connect_to_bucket() for every file. Depending on how expensive that |
# call is, we may want to optimize this. |
for (id_type, id_value, permission) in fine_grained_acl_list or []: |
self.set_acl( |
- bucket=dest_bucket, path=item.key, |
+ bucket=dest_bucket, path=dest_path, |
id_type=id_type, id_value=id_value, permission=permission) |
def download_file(self, source_bucket, source_path, dest_path, |
@@ -627,15 +627,20 @@ and write gs://chromium-skia-gm ? |
subdir = 'subdir' |
filenames = ['file1', 'file2'] |
- # Create directory tree on local disk, and upload it. |
+ # Create directory tree on local disk and upload it. |
+ id_type = ID_TYPE_GROUP_BY_DOMAIN |
+ id_value = 'chromium.org' |
+ set_permission = PERMISSION_READ |
local_src_dir = tempfile.mkdtemp() |
os.mkdir(os.path.join(local_src_dir, subdir)) |
try: |
for filename in filenames: |
with open(os.path.join(local_src_dir, subdir, filename), 'w') as f: |
f.write('contents of %s\n' % filename) |
- gs.upload_dir_contents(source_dir=local_src_dir, dest_bucket=bucket, |
- dest_dir=remote_dir) |
+ gs.upload_dir_contents( |
epoger
2014/07/18 20:41:26
This was indented wrong before (and calling upload
|
+ source_dir=local_src_dir, dest_bucket=bucket, dest_dir=remote_dir, |
+ predefined_acl=PREDEFINED_ACL_PRIVATE, |
+ fine_grained_acl_list=[(id_type, id_value, set_permission)]) |
finally: |
shutil.rmtree(local_src_dir) |
@@ -649,6 +654,14 @@ and write gs://chromium-skia-gm ? |
assert dirs == [], '%s == []' % dirs |
assert files == filenames, '%s == %s' % (files, filenames) |
+ # Check the fine-grained ACLs we set in Google Storage. |
+ for filename in filenames: |
+ got_permission = gs.get_acl( |
+ bucket=bucket, path=posixpath.join(remote_dir, subdir, filename), |
+ id_type=id_type, id_value=id_value) |
+ assert got_permission == set_permission, '%s == %s' % ( |
+ got_permission, set_permission) |
+ |
# Download the directory tree we just uploaded, make sure its contents |
# are what we expect, and then delete the tree in Google Storage. |
local_dest_dir = tempfile.mkdtemp() |