Skip to content

Commit 9dc17cc

Browse files
committed
Implementing Bigtable Cluster.list_tables().
This uses the table stub instead of the cluster stub. This method is actually talking to a different service than every method until now. Also implementing Table.__eq__ so table comparison succeeds in unit tests.
1 parent f575283 commit 9dc17cc

File tree

4 files changed

+125
-0
lines changed

4 files changed

+125
-0
lines changed

gcloud/bigtable/cluster.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
from gcloud.bigtable._generated import bigtable_cluster_data_pb2 as data_pb2
2121
from gcloud.bigtable._generated import (
2222
bigtable_cluster_service_messages_pb2 as messages_pb2)
23+
from gcloud.bigtable._generated import (
24+
bigtable_table_service_messages_pb2 as table_messages_pb2)
2325
from gcloud.bigtable.table import Table
2426

2527

@@ -248,3 +250,27 @@ def delete(self):
248250
# We expect a `._generated.empty_pb2.Empty`
249251
self._client._cluster_stub.DeleteCluster(
250252
request_pb, self._client.timeout_seconds)
253+
254+
def list_tables(self):
255+
"""List the tables in this cluster.
256+
257+
:rtype: list of :class:`Table <gcloud.bigtable.table.Table>`
258+
:returns: The list of tables owned by the cluster.
259+
:raises: :class:`ValueError <exceptions.ValueError>` if one of the
260+
returned tables has a name that is not of the expected format.
261+
"""
262+
request_pb = table_messages_pb2.ListTablesRequest(name=self.name)
263+
# We expect a `table_messages_pb2.ListTablesResponse`
264+
table_list_pb = self._client._table_stub.ListTables(
265+
request_pb, self._client.timeout_seconds)
266+
267+
result = []
268+
for table_pb in table_list_pb.tables:
269+
before, table_id = table_pb.name.split(
270+
self.name + '/tables/', 1)
271+
if before != '':
272+
raise ValueError('Table name %s not of expected format' % (
273+
table_pb.name,))
274+
result.append(self.table(table_id))
275+
276+
return result

gcloud/bigtable/table.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,12 @@ def row(self, row_key):
5555
:returns: A row owned by this table.
5656
"""
5757
return Row(row_key, self)
58+
59+
def __eq__(self, other):
60+
if not isinstance(other, self.__class__):
61+
return False
62+
return (other.table_id == self.table_id and
63+
other._cluster == self._cluster)
64+
65+
def __ne__(self, other):
66+
return not self.__eq__(other)

gcloud/bigtable/test_cluster.py

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,71 @@ def test_delete(self):
301301
{},
302302
)])
303303

304+
def _list_tables_helper(self, table_id, table_name=None):
305+
from gcloud.bigtable._generated import (
306+
bigtable_table_data_pb2 as table_data_pb2)
307+
from gcloud.bigtable._generated import (
308+
bigtable_table_service_messages_pb2 as table_messages_pb2)
309+
from gcloud.bigtable._testing import _FakeStub
310+
311+
project = 'PROJECT'
312+
zone = 'zone'
313+
cluster_id = 'cluster-id'
314+
timeout_seconds = 45
315+
316+
client = _Client(project, timeout_seconds=timeout_seconds)
317+
cluster = self._makeOne(zone, cluster_id, client)
318+
319+
# Create request_
320+
cluster_name = ('projects/' + project + '/zones/' + zone +
321+
'/clusters/' + cluster_id)
322+
request_pb = table_messages_pb2.ListTablesRequest(name=cluster_name)
323+
324+
# Create response_pb
325+
table_name = table_name or (cluster_name + '/tables/' + table_id)
326+
response_pb = table_messages_pb2.ListTablesResponse(
327+
tables=[
328+
table_data_pb2.Table(name=table_name),
329+
],
330+
)
331+
332+
# Patch the stub used by the API method.
333+
client._table_stub = stub = _FakeStub(response_pb)
334+
335+
# Create expected_result.
336+
expected_table = cluster.table(table_id)
337+
expected_result = [expected_table]
338+
339+
# Perform the method and check the result.
340+
result = cluster.list_tables()
341+
342+
self.assertEqual(result, expected_result)
343+
self.assertEqual(stub.method_calls, [(
344+
'ListTables',
345+
(request_pb, timeout_seconds),
346+
{},
347+
)])
348+
349+
def test_list_tables(self):
350+
table_id = 'table_id'
351+
self._list_tables_helper(table_id)
352+
353+
def test_list_tables_failure_bad_split(self):
354+
with self.assertRaises(ValueError):
355+
self._list_tables_helper(None, table_name='wrong-format')
356+
357+
def test_list_tables_failure_name_bad_before(self):
358+
project = 'PROJECT'
359+
zone = 'zone'
360+
cluster_id = 'cluster-id'
361+
362+
table_id = 'table_id'
363+
bad_table_name = ('nonempty-section-before' +
364+
'projects/' + project + '/zones/' + zone +
365+
'/clusters/' + cluster_id + '/tables/' + table_id)
366+
with self.assertRaises(ValueError):
367+
self._list_tables_helper(table_id, table_name=bad_table_name)
368+
304369

305370
class Test__get_pb_property_value(unittest2.TestCase):
306371

gcloud/bigtable/test_table.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,28 @@ def test_row_factory(self):
5656
self.assertTrue(isinstance(row, Row))
5757
self.assertEqual(row._row_key, row_key)
5858
self.assertEqual(row._table, table)
59+
60+
def test___eq__(self):
61+
table_id = 'table_id'
62+
cluster = object()
63+
table1 = self._makeOne(table_id, cluster)
64+
table2 = self._makeOne(table_id, cluster)
65+
self.assertEqual(table1, table2)
66+
67+
def test___eq__type_differ(self):
68+
table1 = self._makeOne('table_id', None)
69+
table2 = object()
70+
self.assertNotEqual(table1, table2)
71+
72+
def test___ne__same_value(self):
73+
table_id = 'table_id'
74+
cluster = object()
75+
table1 = self._makeOne(table_id, cluster)
76+
table2 = self._makeOne(table_id, cluster)
77+
comparison_val = (table1 != table2)
78+
self.assertFalse(comparison_val)
79+
80+
def test___ne__(self):
81+
table1 = self._makeOne('table_id1', 'cluster1')
82+
table2 = self._makeOne('table_id2', 'cluster2')
83+
self.assertNotEqual(table1, table2)

0 commit comments

Comments
 (0)