Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
20 changes: 11 additions & 9 deletions gcloud/storage/bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
... print blob
"""

import copy
import os
import six

Expand Down Expand Up @@ -513,29 +514,30 @@ def id(self):
"""
return self.properties['id']

def get_lifecycle(self):
"""Retrieve lifecycle rules configured for this bucket.
@property
def lifecycle_rules(self):
"""Lifecycle rules configured for this bucket.

See: https://cloud.google.com/storage/docs/lifecycle and
https://cloud.google.com/storage/docs/json_api/v1/buckets

:rtype: list(dict)
:returns: A sequence of mappings describing each lifecycle rule.
"""
info = self.properties.get('lifecycle', {})
return [rule.copy() for rule in info.get('rule', ())]
info = self._properties.get('lifecycle', {})
return [copy.deepcopy(rule) for rule in info.get('rule', ())]

def update_lifecycle(self, rules):
"""Update CORS policies configured for this bucket.
@lifecycle_rules.setter
def lifecycle_rules(self, rules):
"""Update the lifecycle rules configured for this bucket.

See: https://cloud.google.com/storage/docs/lifecycle and
https://cloud.google.com/storage/docs/json_api/v1/buckets

:type rules: list(dict)
:param rules: A sequence of mappings describing each lifecycle rule.
:rtype: list(dict)
:returns: A sequence of mappings describing each lifecycle rule.
"""
self._patch_properties({'lifecycle': {'rule': rules}})
self.patch()

location = _scalar_property('location')
"""Retrieve location configured for this bucket.
Expand Down
76 changes: 29 additions & 47 deletions gcloud/storage/test_bucket.py
Original file line number Diff line number Diff line change
Expand Up @@ -674,75 +674,57 @@ def test_id(self):
bucket = self._makeOne(properties=properties)
self.assertEqual(bucket.id, ID)

def test_get_lifecycle_eager(self):
def test_location_getter(self):

This comment was marked as spam.

This comment was marked as spam.

NAME = 'name'
LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}}
before = {'lifecycle': {'rule': [LC_RULE]}}
connection = _Connection()
before = {'location': 'AS'}
bucket = self._makeOne(NAME, connection, properties=before)
entries = bucket.get_lifecycle()
self.assertEqual(len(entries), 1)
self.assertEqual(entries[0]['action']['type'], 'Delete')
self.assertEqual(entries[0]['condition']['age'], 42)
self.assertEqual(bucket.location, 'AS')
kw = connection._requested
self.assertEqual(len(kw), 0)

def test_get_lifecycle_lazy(self):
NAME = 'name'
LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}}
after = {'lifecycle': {'rule': [LC_RULE]}}
connection = _Connection(after)
bucket = self._makeOne(NAME, connection)
bucket._reload_properties()
entries = bucket.get_lifecycle()
self.assertEqual(len(entries), 1)
self.assertEqual(entries[0]['action']['type'], 'Delete')
self.assertEqual(entries[0]['condition']['age'], 42)
kw = connection._requested
self.assertEqual(len(kw), 1)
self.assertEqual(kw[0]['method'], 'GET')
self.assertEqual(kw[0]['path'], '/b/%s' % NAME)
self.assertEqual(kw[0]['query_params'], {'projection': 'noAcl'})

def test_update_lifecycle(self):
def test_location_setter(self):
NAME = 'name'
LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}}
after = {'lifecycle': {'rule': [LC_RULE]}}
connection = _Connection(after)
connection = _Connection({'location': 'AS'})
bucket = self._makeOne(NAME, connection)
bucket.update_lifecycle([LC_RULE])
bucket.location = 'AS'
bucket.patch()
self.assertEqual(bucket.location, 'AS')
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]['data'], {'location': 'AS'})
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})
entries = bucket.get_lifecycle()
self.assertEqual(len(entries), 1)
self.assertEqual(entries[0]['action']['type'], 'Delete')
self.assertEqual(entries[0]['condition']['age'], 42)

def test_location_getter(self):
def test_lifecycle_rules_getter(self):
NAME = 'name'
connection = _Connection()
before = {'location': 'AS'}
bucket = self._makeOne(NAME, connection, properties=before)
self.assertEqual(bucket.location, 'AS')
kw = connection._requested
self.assertEqual(len(kw), 0)

def test_location_setter(self):
LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}}
rules = [LC_RULE]
properties = {'lifecycle': {'rule': rules}}
bucket = self._makeOne(NAME, properties=properties)
self.assertEqual(bucket.lifecycle_rules, rules)
# Make sure it's a copy
self.assertFalse(bucket.lifecycle_rules is rules)

def test_lifecycle_rules_setter(self):
NAME = 'name'
connection = _Connection({'location': 'AS'})
LC_RULE = {'action': {'type': 'Delete'}, 'condition': {'age': 42}}
rules = [LC_RULE]
after = {'lifecycle': {'rule': rules}}
connection = _Connection(after)

bucket = self._makeOne(NAME, connection)
bucket.location = 'AS'
self.assertEqual(bucket.lifecycle_rules, [])

bucket.lifecycle_rules = rules
bucket.patch()
self.assertEqual(bucket.location, 'AS')
self.assertEqual(bucket.lifecycle_rules, rules)
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'], {'location': 'AS'})
self.assertEqual(kw[0]['data'], after)
self.assertEqual(kw[0]['query_params'], {'projection': 'full'})

def test_get_logging_w_prefix(self):
Expand Down