Skip to content

Commit 40c03c5

Browse files
committed
Merge branch '314-bucket_logging_support' into 314-omnibus
2 parents 9d7fc2f + 037a732 commit 40c03c5

2 files changed

Lines changed: 126 additions & 3 deletions

File tree

gcloud/storage/bucket.py

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,10 @@ class Bucket(_PropertyMixin):
2424
CUSTOM_PROPERTY_ACCESSORS = {
2525
'acl': 'get_acl()',
2626
'defaultObjectAcl': 'get_default_object_acl()',
27-
'lifecycle': 'get_lifecycle()',
2827
'etag': 'etag',
2928
'id': 'id',
29+
'lifecycle': 'get_lifecycle()',
30+
'logging': 'get_logging()',
3031
'metageneration': 'metageneration',
3132
'name': 'name',
3233
'owner': 'owner',
@@ -595,6 +596,45 @@ def disable_versioning(self):
595596
"""
596597
self.patch_metadata({'versioning': {'enabled': False}})
597598

599+
def get_logging(self):
600+
"""Return info about access logging for this bucket.
601+
602+
See: https://cloud.google.com/storage/docs/accesslogs#status
603+
604+
:rtype: dict or None
605+
:returns: a dict w/ keys, ``bucket_name`` and ``object_prefix``
606+
(if logging is enabled), or None (if not).
607+
"""
608+
if not self.has_metadata('logging'):
609+
self.reload_metadata()
610+
info = self.metadata.get('logging')
611+
if info is not None:
612+
info = info.copy()
613+
info['bucket_name'] = info.pop('logBucket')
614+
info['object_prefix'] = info.pop('logObjectPrefix', '')
615+
return info
616+
617+
def enable_logging(self, bucket_name, object_prefix=''):
618+
"""Enable access logging for this bucket.
619+
620+
See: https://cloud.google.com/storage/docs/accesslogs#delivery
621+
622+
:type bucket_name: string
623+
:param bucket_name: name of bucket in which to store access logs
624+
625+
:type object_prefix: string
626+
:param object_prefix: prefix for access log filenames
627+
"""
628+
info = {'logBucket': bucket_name, 'logObjectPrefix': object_prefix}
629+
self.patch_metadata({'logging': info})
630+
631+
def disable_logging(self):
632+
"""Disable access logging for this bucket.
633+
634+
See: https://cloud.google.com/storage/docs/accesslogs#disabling
635+
"""
636+
self.patch_metadata({'logging': None})
637+
598638

599639
class BucketIterator(Iterator):
600640
"""An iterator listing all buckets.

gcloud/storage/test_bucket.py

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -701,7 +701,6 @@ def test_enable_versioning(self):
701701
kw = connection._requested
702702
self.assertEqual(len(kw), 1)
703703
self.assertEqual(kw[0]['method'], 'PATCH')
704-
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
705704
self.assertEqual(kw[0]['data'], {'versioning': {'enabled': True}})
706705
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
707706

@@ -717,8 +716,92 @@ def test_disable_versioning(self):
717716
kw = connection._requested
718717
self.assertEqual(len(kw), 1)
719718
self.assertEqual(kw[0]['method'], 'PATCH')
719+
self.assertEqual(kw[0]['data'], after)
720+
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
721+
722+
def test_get_logging_eager_w_prefix(self):
723+
NAME = 'name'
724+
LOG_BUCKET = 'logs'
725+
LOG_PREFIX = 'pfx'
726+
before = {
727+
'logging': {'logBucket': LOG_BUCKET,
728+
'logObjectPrefix': LOG_PREFIX}}
729+
connection = _Connection()
730+
bucket = self._makeOne(connection, NAME, before)
731+
info = bucket.get_logging()
732+
self.assertEqual(info['bucket_name'], LOG_BUCKET)
733+
self.assertEqual(info['object_prefix'], LOG_PREFIX)
734+
kw = connection._requested
735+
self.assertEqual(len(kw), 0)
736+
737+
def test_get_logging_lazy_wo_prefix(self):
738+
NAME = 'name'
739+
LOG_BUCKET = 'logs'
740+
after = {'logging': {'logBucket': LOG_BUCKET}}
741+
connection = _Connection(after)
742+
bucket = self._makeOne(connection, NAME)
743+
info = bucket.get_logging()
744+
self.assertEqual(info['bucket_name'], LOG_BUCKET)
745+
self.assertEqual(info['object_prefix'], '')
746+
kw = connection._requested
747+
self.assertEqual(len(kw), 1)
748+
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
749+
self.assertEqual(kw[0]['query_params'], {'projection': 'noAcl'})
750+
751+
def test_enable_logging_defaults(self):
752+
NAME = 'name'
753+
LOG_BUCKET = 'logs'
754+
before = {'logging': None}
755+
after = {'logging': {'logBucket': LOG_BUCKET, 'logObjectPrefix': ''}}
756+
connection = _Connection(after)
757+
bucket = self._makeOne(connection, NAME, before)
758+
self.assertTrue(bucket.get_logging() is None)
759+
bucket.enable_logging(LOG_BUCKET)
760+
info = bucket.get_logging()
761+
self.assertEqual(info['bucket_name'], LOG_BUCKET)
762+
self.assertEqual(info['object_prefix'], '')
763+
kw = connection._requested
764+
self.assertEqual(len(kw), 1)
765+
self.assertEqual(kw[0]['method'], 'PATCH')
766+
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
767+
self.assertEqual(kw[0]['data'], after)
768+
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
769+
770+
def test_enable_logging_explicit(self):
771+
NAME = 'name'
772+
LOG_BUCKET = 'logs'
773+
LOG_PFX = 'pfx'
774+
before = {'logging': None}
775+
after = {
776+
'logging': {'logBucket': LOG_BUCKET, 'logObjectPrefix': LOG_PFX}}
777+
connection = _Connection(after)
778+
bucket = self._makeOne(connection, NAME, before)
779+
self.assertTrue(bucket.get_logging() is None)
780+
bucket.enable_logging(LOG_BUCKET, LOG_PFX)
781+
info = bucket.get_logging()
782+
self.assertEqual(info['bucket_name'], LOG_BUCKET)
783+
self.assertEqual(info['object_prefix'], LOG_PFX)
784+
kw = connection._requested
785+
self.assertEqual(len(kw), 1)
786+
self.assertEqual(kw[0]['method'], 'PATCH')
787+
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
788+
self.assertEqual(kw[0]['data'], after)
789+
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
790+
791+
def test_disable_logging(self):
792+
NAME = 'name'
793+
before = {'logging': {'logBucket': 'logs', 'logObjectPrefix': 'pfx'}}
794+
after = {'logging': None}
795+
connection = _Connection(after)
796+
bucket = self._makeOne(connection, NAME, before)
797+
self.assertTrue(bucket.get_logging() is not None)
798+
bucket.disable_logging()
799+
self.assertTrue(bucket.get_logging() is None)
800+
kw = connection._requested
801+
self.assertEqual(len(kw), 1)
802+
self.assertEqual(kw[0]['method'], 'PATCH')
720803
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
721-
self.assertEqual(kw[0]['data'], {'versioning': {'enabled': False}})
804+
self.assertEqual(kw[0]['data'], {'logging': None})
722805
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
723806

724807

0 commit comments

Comments
 (0)