Skip to content

Commit b54e9aa

Browse files
committed
Adding Bucket.create() method.
1 parent e60acb8 commit b54e9aa

File tree

3 files changed

+71
-12
lines changed

3 files changed

+71
-12
lines changed

gcloud/storage/api.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ def create_bucket(bucket_name, project=None, connection=None):
143143
144144
This implements "storage.buckets.insert".
145145
146+
If the bucket already exists, will raise
147+
:class:`gcloud.exceptions.Conflict`.
148+
146149
:type project: string
147150
:param project: Optional. The project to use when creating bucket.
148151
If not provided, falls back to default.
@@ -157,21 +160,11 @@ def create_bucket(bucket_name, project=None, connection=None):
157160
158161
:rtype: :class:`gcloud.storage.bucket.Bucket`
159162
:returns: The newly created bucket.
160-
:raises: :class:`gcloud.exceptions.Conflict` if
161-
there is a confict (bucket already exists, invalid name, etc.)
162163
"""
163164
if connection is None:
164165
connection = get_default_connection()
165-
if project is None:
166-
project = get_default_project()
167-
168-
query_params = {'project': project}
169-
response = connection.api_request(method='POST', path='/b',
170-
query_params=query_params,
171-
data={'name': bucket_name})
172-
name = response.get('name')
173-
bucket = Bucket(name, connection=connection)
174-
bucket._properties = response
166+
bucket = Bucket(bucket_name, connection=connection)
167+
bucket.create(project)
175168
return bucket
176169

177170

gcloud/storage/bucket.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import os
3838
import six
3939

40+
from gcloud._helpers import get_default_project
4041
from gcloud.exceptions import NotFound
4142
from gcloud.storage._helpers import _PropertyMixin
4243
from gcloud.storage._helpers import _scalar_property
@@ -125,6 +126,34 @@ def exists(self):
125126
except NotFound:
126127
return False
127128

129+
def create(self, project=None):
130+
"""Creates current bucket.
131+
132+
If the bucket already exists, will raise
133+
:class:`gcloud.exceptions.Conflict`.
134+
135+
This implements "storage.buckets.insert".
136+
137+
:type project: string
138+
:param project: Optional. The project to use when creating bucket.
139+
If not provided, falls back to default.
140+
141+
:rtype: :class:`gcloud.storage.bucket.Bucket`
142+
:returns: The newly created bucket.
143+
:raises: :class:`EnvironmentError` if the project is not given and
144+
can't be inferred.
145+
"""
146+
if project is None:
147+
project = get_default_project()
148+
if project is None:
149+
raise EnvironmentError('Project could not be inferred '
150+
'from environment.')
151+
152+
query_params = {'project': project}
153+
self._properties = self.connection.api_request(
154+
method='POST', path='/b', query_params=query_params,
155+
data={'name': self.name})
156+
128157
@property
129158
def acl(self):
130159
"""Create our ACL on demand."""

gcloud/storage/test_bucket.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,43 @@ def api_request(cls, *args, **kwargs):
186186
expected_cw = [((), expected_called_kwargs)]
187187
self.assertEqual(_FakeConnection._called_with, expected_cw)
188188

189+
def test_create_no_project(self):
190+
from gcloud._testing import _monkey_defaults
191+
BUCKET_NAME = 'bucket-name'
192+
bucket = self._makeOne(BUCKET_NAME)
193+
with _monkey_defaults(project=None):
194+
self.assertRaises(EnvironmentError, bucket.create)
195+
196+
def test_create_hit_explicit_project(self):
197+
BUCKET_NAME = 'bucket-name'
198+
DATA = {'name': BUCKET_NAME}
199+
connection = _Connection(DATA)
200+
PROJECT = 'PROJECT'
201+
bucket = self._makeOne(BUCKET_NAME, connection=connection)
202+
bucket.create(PROJECT)
203+
204+
kw, = connection._requested
205+
self.assertEqual(kw['method'], 'POST')
206+
self.assertEqual(kw['path'], '/b')
207+
self.assertEqual(kw['query_params'], {'project': PROJECT})
208+
self.assertEqual(kw['data'], DATA)
209+
210+
def test_create_hit_implicit_project(self):
211+
from gcloud._testing import _monkey_defaults
212+
BUCKET_NAME = 'bucket-name'
213+
DATA = {'name': BUCKET_NAME}
214+
connection = _Connection(DATA)
215+
PROJECT = 'PROJECT'
216+
bucket = self._makeOne(BUCKET_NAME, connection=connection)
217+
with _monkey_defaults(project=PROJECT):
218+
bucket.create()
219+
220+
kw, = connection._requested
221+
self.assertEqual(kw['method'], 'POST')
222+
self.assertEqual(kw['path'], '/b')
223+
self.assertEqual(kw['query_params'], {'project': PROJECT})
224+
self.assertEqual(kw['data'], DATA)
225+
189226
def test_acl_property(self):
190227
from gcloud.storage.acl import BucketACL
191228
bucket = self._makeOne()

0 commit comments

Comments
 (0)