Skip to content

Commit cf3d5c8

Browse files
committed
Implementing Bigtable ColumnFamily.create().
1 parent 9e2b07d commit cf3d5c8

2 files changed

Lines changed: 95 additions & 1 deletion

File tree

gcloud/bigtable/column_family.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
from gcloud._helpers import _total_seconds
2121
from gcloud.bigtable._generated import bigtable_table_data_pb2 as data_pb2
22+
from gcloud.bigtable._generated import (
23+
bigtable_table_service_messages_pb2 as messages_pb2)
2224
from gcloud.bigtable._generated import duration_pb2
2325

2426

@@ -193,6 +195,10 @@ def to_pb(self):
193195
class ColumnFamily(object):
194196
"""Representation of a Google Cloud Bigtable Column Family.
195197
198+
We can use a :class:`ColumnFamily` to:
199+
200+
* :meth:`create` itself
201+
196202
:type column_family_id: str
197203
:param column_family_id: The ID of the column family. Must be of the
198204
form ``[_a-zA-Z0-9][-_.a-zA-Z0-9]*``.
@@ -238,6 +244,22 @@ def __eq__(self, other):
238244
def __ne__(self, other):
239245
return not self.__eq__(other)
240246

247+
def create(self):
248+
"""Create this column family."""
249+
if self.gc_rule is None:
250+
column_family = data_pb2.ColumnFamily()
251+
else:
252+
column_family = data_pb2.ColumnFamily(gc_rule=self.gc_rule.to_pb())
253+
request_pb = messages_pb2.CreateColumnFamilyRequest(
254+
name=self._table.name,
255+
column_family_id=self.column_family_id,
256+
column_family=column_family,
257+
)
258+
client = self._table._cluster._client
259+
# We expect a `.data_pb2.ColumnFamily`
260+
client._table_stub.CreateColumnFamily(request_pb,
261+
client.timeout_seconds)
262+
241263

242264
def _gc_rule_from_pb(gc_rule_pb):
243265
"""Convert a protobuf GC rule to a native object.

gcloud/bigtable/test_column_family.py

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

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

399458
class Test__gc_rule_from_pb(unittest2.TestCase):
400459

@@ -471,7 +530,20 @@ def WhichOneof(cls, name):
471530
self.assertEqual(MockProto.names, ['rule'])
472531

473532

533+
class _Cluster(object):
534+
535+
def __init__(self, client=None):
536+
self._client = client
537+
538+
539+
class _Client(object):
540+
541+
def __init__(self, timeout_seconds=None):
542+
self.timeout_seconds = timeout_seconds
543+
544+
474545
class _Table(object):
475546

476-
def __init__(self, name):
547+
def __init__(self, name, client=None):
477548
self.name = name
549+
self._cluster = _Cluster(client)

0 commit comments

Comments
 (0)