Skip to content

Commit e2d0e1c

Browse files
committed
Merge pull request #1324 from dhermes/bigtable-column-family-update
Implementing Bigtable ColumnFamily.update().
2 parents 3a26d60 + d54b9e1 commit e2d0e1c

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

gcloud/bigtable/column_family.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ class ColumnFamily(object):
197197
198198
We can use a :class:`ColumnFamily` to:
199199
200+
* :meth:`update` itself
200201
* :meth:`delete` itself
201202
202203
:type column_family_id: str
@@ -244,6 +245,25 @@ def __eq__(self, other):
244245
def __ne__(self, other):
245246
return not self.__eq__(other)
246247

248+
def update(self):
249+
"""Update this column family.
250+
251+
.. note::
252+
253+
Only the GC rule can be updated. By changing the column family ID,
254+
you will simply be referring to a different column family.
255+
"""
256+
request_kwargs = {'name': self.name}
257+
if self.gc_rule is not None:
258+
request_kwargs['gc_rule'] = self.gc_rule.to_pb()
259+
request_pb = data_pb2.ColumnFamily(**request_kwargs)
260+
client = self._table._cluster._client
261+
# We expect a `.data_pb2.ColumnFamily`. We ignore it since the only
262+
# data it contains are the GC rule and the column family ID already
263+
# stored on this instance.
264+
client._table_stub.UpdateColumnFamily(request_pb,
265+
client.timeout_seconds)
266+
247267
def delete(self):
248268
"""Delete this column family."""
249269
request_pb = messages_pb2.DeleteColumnFamilyRequest(name=self.name)

gcloud/bigtable/test_column_family.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,62 @@ def test___ne__(self):
395395
column_family2 = self._makeOne('column_family_id2', None)
396396
self.assertNotEqual(column_family1, column_family2)
397397

398+
def _update_test_helper(self, gc_rule=None):
399+
from gcloud.bigtable._generated import (
400+
bigtable_table_data_pb2 as data_pb2)
401+
from gcloud.bigtable._testing import _FakeStub
402+
403+
project_id = 'project-id'
404+
zone = 'zone'
405+
cluster_id = 'cluster-id'
406+
table_id = 'table-id'
407+
column_family_id = 'column-family-id'
408+
timeout_seconds = 28
409+
table_name = ('projects/' + project_id + '/zones/' + zone +
410+
'/clusters/' + cluster_id + '/tables/' + table_id)
411+
column_family_name = table_name + '/columnFamilies/' + column_family_id
412+
413+
client = _Client(timeout_seconds=timeout_seconds)
414+
table = _Table(table_name, client=client)
415+
column_family = self._makeOne(column_family_id, table, gc_rule=gc_rule)
416+
417+
# Create request_pb
418+
if gc_rule is None:
419+
request_pb = data_pb2.ColumnFamily(name=column_family_name)
420+
else:
421+
request_pb = data_pb2.ColumnFamily(
422+
name=column_family_name,
423+
gc_rule=gc_rule.to_pb(),
424+
)
425+
426+
# Create response_pb
427+
response_pb = data_pb2.ColumnFamily()
428+
429+
# Patch the stub used by the API method.
430+
client._table_stub = stub = _FakeStub(response_pb)
431+
432+
# Create expected_result.
433+
expected_result = None # update() has no return value.
434+
435+
# Perform the method and check the result.
436+
self.assertEqual(stub.results, (response_pb,))
437+
result = column_family.update()
438+
self.assertEqual(stub.results, ())
439+
self.assertEqual(result, expected_result)
440+
self.assertEqual(stub.method_calls, [(
441+
'UpdateColumnFamily',
442+
(request_pb, timeout_seconds),
443+
{},
444+
)])
445+
446+
def test_update(self):
447+
self._update_test_helper(gc_rule=None)
448+
449+
def test_update_with_gc_rule(self):
450+
from gcloud.bigtable.column_family import MaxVersionsGCRule
451+
gc_rule = MaxVersionsGCRule(1337)
452+
self._update_test_helper(gc_rule=gc_rule)
453+
398454
def test_delete(self):
399455
from gcloud.bigtable._generated import (
400456
bigtable_table_service_messages_pb2 as messages_pb2)

0 commit comments

Comments
 (0)