Skip to content

Commit be33b58

Browse files
committed
Wrapping gRPC "already exists" with a HappyBase exception.
Fixes #1818.
1 parent b27907b commit be33b58

File tree

2 files changed

+56
-1
lines changed

2 files changed

+56
-1
lines changed

gcloud/bigtable/happybase/connection.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import datetime
1919
import warnings
2020

21+
from grpc.beta import interfaces
22+
from grpc.framework.interfaces.face import face
2123
import six
2224

2325
from gcloud.bigtable.client import Client
@@ -338,7 +340,14 @@ def create_table(self, name, families):
338340
# Create table instance and then make API calls.
339341
name = self._table_name(name)
340342
low_level_table = _LowLevelTable(name, self._cluster)
341-
low_level_table.create()
343+
try:
344+
low_level_table.create()
345+
except face.NetworkError as network_err:
346+
if network_err.code == interfaces.StatusCode.ALREADY_EXISTS:
347+
from happybase.hbase import ttypes
348+
raise ttypes.AlreadyExists(name)
349+
else:
350+
raise
342351

343352
for column_family_name, gc_rule in gc_rule_dict.items():
344353
column_family = low_level_table.column_family(

gcloud/bigtable/happybase/test_connection.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,49 @@ def test_create_table_bad_value(self):
395395
with self.assertRaises(ValueError):
396396
connection.create_table(name, families)
397397

398+
def _create_table_error_helper(self, err_val, err_type):
399+
from gcloud._testing import _Monkey
400+
from gcloud.bigtable.happybase import connection as MUT
401+
402+
cluster = _Cluster() # Avoid implicit environ check.
403+
connection = self._makeOne(autoconnect=False, cluster=cluster)
404+
405+
tables_created = []
406+
407+
def make_table(*args, **kwargs):
408+
kwargs['create_error'] = err_val
409+
result = _MockLowLevelTable(*args, **kwargs)
410+
tables_created.append(result)
411+
return result
412+
413+
name = 'table-name'
414+
families = {'foo': {}}
415+
with _Monkey(MUT, _LowLevelTable=make_table):
416+
with self.assertRaises(err_type):
417+
connection.create_table(name, families)
418+
419+
self.assertEqual(len(tables_created), 1)
420+
self.assertEqual(tables_created[0].create_calls, 1)
421+
422+
def test_create_table_already_exists(self):
423+
from grpc.beta import interfaces
424+
from grpc.framework.interfaces.face import face
425+
from happybase.hbase import ttypes
426+
427+
err_val = face.NetworkError(None, None,
428+
interfaces.StatusCode.ALREADY_EXISTS, None)
429+
self._create_table_error_helper(err_val, ttypes.AlreadyExists)
430+
431+
def test_create_table_connection_error(self):
432+
from grpc.beta import interfaces
433+
from grpc.framework.interfaces.face import face
434+
err_val = face.NetworkError(None, None,
435+
interfaces.StatusCode.INTERNAL, None)
436+
self._create_table_error_helper(err_val, face.NetworkError)
437+
438+
def test_create_table_other_error(self):
439+
self._create_table_error_helper(RuntimeError, RuntimeError)
440+
398441
def _delete_table_helper(self, disable=False):
399442
from gcloud._testing import _Monkey
400443
from gcloud.bigtable.happybase import connection as MUT
@@ -612,6 +655,7 @@ class _MockLowLevelTable(object):
612655
def __init__(self, *args, **kwargs):
613656
self.args = args
614657
self.kwargs = kwargs
658+
self.create_error = kwargs.get('create_error')
615659
self.delete_calls = 0
616660
self.create_calls = 0
617661
self.col_fam_created = []
@@ -621,6 +665,8 @@ def delete(self):
621665

622666
def create(self):
623667
self.create_calls += 1
668+
if self.create_error:
669+
raise self.create_error
624670

625671
def column_family(self, column_family_id, gc_rule=None):
626672
result = _MockLowLevelColumnFamily(column_family_id, gc_rule=gc_rule)

0 commit comments

Comments
 (0)