Skip to content

Commit a79d98d

Browse files
tseaverfrankyn
authored andcommitted
feat(storage): support predefined ACLs in 'Bucket.create' (googleapis#9334)
Closes googleapis#9295.
1 parent 0771add commit a79d98d

File tree

2 files changed

+83
-1
lines changed

2 files changed

+83
-1
lines changed

storage/google/cloud/storage/bucket.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,14 @@ def exists(self, client=None):
595595
except NotFound:
596596
return False
597597

598-
def create(self, client=None, project=None, location=None):
598+
def create(
599+
self,
600+
client=None,
601+
project=None,
602+
location=None,
603+
predefined_acl=None,
604+
predefined_default_object_acl=None,
605+
):
599606
"""Creates current bucket.
600607
601608
If the bucket already exists, will raise
@@ -622,6 +629,16 @@ def create(self, client=None, project=None, location=None):
622629
:param location: Optional. The location of the bucket. If not passed,
623630
the default location, US, will be used. See
624631
https://cloud.google.com/storage/docs/bucket-locations
632+
633+
:type predefined_acl: str
634+
:param predefined_acl:
635+
Optional. Name of predefined ACL to apply to bucket. See:
636+
https://cloud.google.com/storage/docs/access-control/lists#predefined-acl
637+
638+
:type predefined_default_object_acl: str
639+
:param predefined_default_object_acl:
640+
Optional. Name of predefined ACL to apply to bucket's objects. See:
641+
https://cloud.google.com/storage/docs/access-control/lists#predefined-acl
625642
"""
626643
if self.user_project is not None:
627644
raise ValueError("Cannot create bucket with 'user_project' set.")
@@ -635,6 +652,17 @@ def create(self, client=None, project=None, location=None):
635652
raise ValueError("Client project not set: pass an explicit project.")
636653

637654
query_params = {"project": project}
655+
656+
if predefined_acl is not None:
657+
predefined_acl = BucketACL.validate_predefined(predefined_acl)
658+
query_params["predefinedAcl"] = predefined_acl
659+
660+
if predefined_default_object_acl is not None:
661+
predefined_default_object_acl = DefaultObjectACL.validate_predefined(
662+
predefined_default_object_acl
663+
)
664+
query_params["predefinedDefaultObjectAcl"] = predefined_default_object_acl
665+
638666
properties = {key: self._properties[key] for key in self._changes}
639667
properties["name"] = self.name
640668

storage/tests/unit/test_bucket.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,60 @@ def test_create_w_extra_properties(self):
646646
self.assertEqual(kw["query_params"], {"project": PROJECT})
647647
self.assertEqual(kw["data"], DATA)
648648

649+
def test_create_w_predefined_acl_invalid(self):
650+
PROJECT = "PROJECT"
651+
BUCKET_NAME = "bucket-name"
652+
DATA = {"name": BUCKET_NAME}
653+
connection = _Connection(DATA)
654+
client = _Client(connection, project=PROJECT)
655+
bucket = self._make_one(client=client, name=BUCKET_NAME)
656+
657+
with self.assertRaises(ValueError):
658+
bucket.create(predefined_acl="bogus")
659+
660+
def test_create_w_predefined_acl_valid(self):
661+
PROJECT = "PROJECT"
662+
BUCKET_NAME = "bucket-name"
663+
DATA = {"name": BUCKET_NAME}
664+
connection = _Connection(DATA)
665+
client = _Client(connection, project=PROJECT)
666+
bucket = self._make_one(client=client, name=BUCKET_NAME)
667+
bucket.create(predefined_acl="publicRead")
668+
669+
kw, = connection._requested
670+
self.assertEqual(kw["method"], "POST")
671+
self.assertEqual(kw["path"], "/b")
672+
expected_qp = {"project": PROJECT, "predefinedAcl": "publicRead"}
673+
self.assertEqual(kw["query_params"], expected_qp)
674+
self.assertEqual(kw["data"], DATA)
675+
676+
def test_create_w_predefined_default_object_acl_invalid(self):
677+
PROJECT = "PROJECT"
678+
BUCKET_NAME = "bucket-name"
679+
DATA = {"name": BUCKET_NAME}
680+
connection = _Connection(DATA)
681+
client = _Client(connection, project=PROJECT)
682+
bucket = self._make_one(client=client, name=BUCKET_NAME)
683+
684+
with self.assertRaises(ValueError):
685+
bucket.create(predefined_default_object_acl="bogus")
686+
687+
def test_create_w_predefined_default_object_acl_valid(self):
688+
PROJECT = "PROJECT"
689+
BUCKET_NAME = "bucket-name"
690+
DATA = {"name": BUCKET_NAME}
691+
connection = _Connection(DATA)
692+
client = _Client(connection, project=PROJECT)
693+
bucket = self._make_one(client=client, name=BUCKET_NAME)
694+
bucket.create(predefined_default_object_acl="publicRead")
695+
696+
kw, = connection._requested
697+
self.assertEqual(kw["method"], "POST")
698+
self.assertEqual(kw["path"], "/b")
699+
expected_qp = {"project": PROJECT, "predefinedDefaultObjectAcl": "publicRead"}
700+
self.assertEqual(kw["query_params"], expected_qp)
701+
self.assertEqual(kw["data"], DATA)
702+
649703
def test_acl_property(self):
650704
from google.cloud.storage.acl import BucketACL
651705

0 commit comments

Comments
 (0)