Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
d52d81f
Add support for the Bucket's 'versioning' field.
tseaver Nov 4, 2014
8477e85
Add tests asserting that 'get_metatdata' raises w/ 'versioning'.
tseaver Nov 4, 2014
037a732
Add support for the Bucket's 'logging' field.
tseaver Nov 4, 2014
c586a7c
Add CORS support to buckets.
tseaver Nov 4, 2014
b721f42
Add location support to buckets.
tseaver Nov 4, 2014
c9fa1f3
Expanded / explicit coverage and assertions for '_helpers._MetadataMi…
tseaver Nov 5, 2014
2c3725d
Remove redundant coverage for mixin methods.
tseaver Nov 5, 2014
36966e8
Stop using 'metadata' to refer to all properties in bucket/key repres…
tseaver Nov 5, 2014
79e0b05
Wrap method / attr name in single quotes.
tseaver Nov 5, 2014
7533899
Add read-only properties for non-writable bucket fields.
tseaver Nov 5, 2014
9d7fc2f
Merge branch '314-bucket_versioning_support' into 314-omnibus
tseaver Nov 5, 2014
40c03c5
Merge branch '314-bucket_logging_support' into 314-omnibus
tseaver Nov 5, 2014
1fdacb4
Merge branch '314-bucket_cors_support' into 314-omnibus
tseaver Nov 5, 2014
48677ee
Merge branch '314-bucket_location_support' into 314-omnibus
tseaver Nov 5, 2014
c3fcb2e
Re-order methods to match field order.
tseaver Nov 5, 2014
aa7afbb
Make 'lazy' test less eager.
tseaver Nov 5, 2014
5f1667a
Fix up accessor / mutators methods to use new helpers.
tseaver Nov 5, 2014
72f3e5a
Bucket has more fields than pylint wants to allow.
tseaver Nov 5, 2014
f77e593
Remove backward-compatibility aliases.
tseaver Nov 6, 2014
b8ea274
Docstring fixes.
tseaver Nov 6, 2014
262b413
Drop (unused-and-confusing) '_has_property' method.
tseaver Nov 6, 2014
25b7b5c
Use 'properties' to ensure loading before lookup.
tseaver Nov 6, 2014
13b28c2
Fix copy-paste errors in 'Bucket' accessor docstrings.
tseaver Nov 6, 2014
3eaf39d
Avoid remapping names of keys in server-side properties.
tseaver Nov 6, 2014
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add support for the Bucket's 'logging' field.
See: https://cloud.google.com/storage/docs/accesslogs

Addresses 'logging' part of #314.
  • Loading branch information
tseaver committed Nov 5, 2014
commit 037a732299063f175df15060d02cd3dad9bdbd93
40 changes: 40 additions & 0 deletions gcloud/storage/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ class Bucket(_MetadataMixin):
'acl': 'get_acl',
'defaultObjectAcl': 'get_default_object_acl',
'lifecycle': 'get_lifecycle',
'logging': 'get_logging',
}
"""Mapping of field name -> accessor for fields w/ custom accessors."""

Expand Down Expand Up @@ -471,6 +472,45 @@ def update_lifecycle(self, rules):
"""
self.patch_metadata({'lifecycle': {'rule': rules}})

def get_logging(self):
"""Return info about access logging for this bucket.

See: https://cloud.google.com/storage/docs/accesslogs#status

:rtype: dict or None
:returns: a dict w/ keys, ``bucket_name`` and ``object_prefix``
(if logging is enabled), or None (if not).
"""
if not self.has_metadata('logging'):
self.reload_metadata()
info = self.metadata.get('logging')
if info is not None:
info = info.copy()
info['bucket_name'] = info.pop('logBucket')
info['object_prefix'] = info.pop('logObjectPrefix', '')

This comment was marked as spam.

This comment was marked as spam.

This comment was marked as spam.

return info

def enable_logging(self, bucket_name, object_prefix=''):
"""Enable access logging for this bucket.

See: https://cloud.google.com/storage/docs/accesslogs#delivery

:type bucket_name: string
:param bucket_name: name of bucket in which to store access logs

:type object_prefix: string
:param object_prefix: prefix for access log filenames
"""
info = {'logBucket': bucket_name, 'logObjectPrefix': object_prefix}
self.patch_metadata({'logging': info})

def disable_logging(self):
"""Disable access logging for this bucket.

See: https://cloud.google.com/storage/docs/accesslogs#disabling
"""
self.patch_metadata({'logging': None})


class BucketIterator(Iterator):
"""An iterator listing all buckets.
Expand Down
102 changes: 102 additions & 0 deletions gcloud/storage/test_bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -510,6 +510,23 @@ def test_get_metadata_lifecycle_w_default(self):
kw = connection._requested
self.assertEqual(len(kw), 0)

def test_get_metadata_logging_no_default(self):
NAME = 'name'
connection = _Connection()
bucket = self._makeOne(connection, NAME)
self.assertRaises(KeyError, bucket.get_metadata, 'logging')
kw = connection._requested
self.assertEqual(len(kw), 0)

def test_get_metadata_logging_w_default(self):
NAME = 'name'
connection = _Connection()
bucket = self._makeOne(connection, NAME)
default = object()
self.assertRaises(KeyError, bucket.get_metadata, 'logging', default)
kw = connection._requested
self.assertEqual(len(kw), 0)

def test_get_metadata_miss(self):
NAME = 'name'
before = {'bar': 'Bar'}
Expand Down Expand Up @@ -781,6 +798,91 @@ def test_update_lifecycle(self):
self.assertEqual(entries[0]['action']['type'], 'Delete')
self.assertEqual(entries[0]['condition']['age'], 42)

def test_get_logging_eager_w_prefix(self):
NAME = 'name'
LOG_BUCKET = 'logs'
LOG_PREFIX = 'pfx'
before = {
'logging': {'logBucket': LOG_BUCKET,
'logObjectPrefix': LOG_PREFIX}}
connection = _Connection()
bucket = self._makeOne(connection, NAME, before)
info = bucket.get_logging()
self.assertEqual(info['bucket_name'], LOG_BUCKET)
self.assertEqual(info['object_prefix'], LOG_PREFIX)
kw = connection._requested
self.assertEqual(len(kw), 0)

def test_get_logging_lazy_wo_prefix(self):
NAME = 'name'
LOG_BUCKET = 'logs'
after = {'logging': {'logBucket': LOG_BUCKET}}
connection = _Connection(after)
bucket = self._makeOne(connection, NAME)
info = bucket.get_logging()
self.assertEqual(info['bucket_name'], LOG_BUCKET)
self.assertEqual(info['object_prefix'], '')
kw = connection._requested
self.assertEqual(len(kw), 1)
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
self.assertEqual(kw[0]['query_params'], {'projection': 'noAcl'})

def test_enable_logging_defaults(self):
NAME = 'name'
LOG_BUCKET = 'logs'
before = {'logging': None}
after = {'logging': {'logBucket': LOG_BUCKET, 'logObjectPrefix': ''}}
connection = _Connection(after)
bucket = self._makeOne(connection, NAME, before)
self.assertTrue(bucket.get_logging() is None)
bucket.enable_logging(LOG_BUCKET)
info = bucket.get_logging()
self.assertEqual(info['bucket_name'], LOG_BUCKET)
self.assertEqual(info['object_prefix'], '')
kw = connection._requested
self.assertEqual(len(kw), 1)
self.assertEqual(kw[0]['method'], 'PATCH')
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
self.assertEqual(kw[0]['data'], after)
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})

def test_enable_logging_explicit(self):
NAME = 'name'
LOG_BUCKET = 'logs'
LOG_PFX = 'pfx'
before = {'logging': None}
after = {
'logging': {'logBucket': LOG_BUCKET, 'logObjectPrefix': LOG_PFX}}
connection = _Connection(after)
bucket = self._makeOne(connection, NAME, before)
self.assertTrue(bucket.get_logging() is None)
bucket.enable_logging(LOG_BUCKET, LOG_PFX)
info = bucket.get_logging()
self.assertEqual(info['bucket_name'], LOG_BUCKET)
self.assertEqual(info['object_prefix'], LOG_PFX)
kw = connection._requested
self.assertEqual(len(kw), 1)
self.assertEqual(kw[0]['method'], 'PATCH')
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
self.assertEqual(kw[0]['data'], after)
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})

def test_disable_logging(self):
NAME = 'name'
before = {'logging': {'logBucket': 'logs', 'logObjectPrefix': 'pfx'}}
after = {'logging': None}
connection = _Connection(after)
bucket = self._makeOne(connection, NAME, before)
self.assertTrue(bucket.get_logging() is not None)
bucket.disable_logging()
self.assertTrue(bucket.get_logging() is None)
kw = connection._requested
self.assertEqual(len(kw), 1)
self.assertEqual(kw[0]['method'], 'PATCH')
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
self.assertEqual(kw[0]['data'], {'logging': None})
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})


class TestBucketIterator(unittest2.TestCase):

Expand Down