Skip to content

Commit d8317b5

Browse files
chemelnucfindhermes
authored andcommitted
Spanner: Use details from gRPC exception on datatbase create failure (#4557)
Closes #4071. Also adds a system test to verify this.
1 parent 1bbc457 commit d8317b5

File tree

3 files changed

+36
-13
lines changed

3 files changed

+36
-13
lines changed

spanner/google/cloud/spanner_v1/database.py

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,20 @@
1717
import re
1818
import threading
1919

20+
from google.api_core import exceptions
2021
import google.auth.credentials
22+
from google.cloud.exceptions import Conflict
23+
from google.cloud.exceptions import NotFound
2124
from google.gax.errors import GaxError
2225
from google.gax.grpc import exc_to_code
23-
from google.cloud.spanner_v1.gapic.spanner_client import SpannerClient
2426
from grpc import StatusCode
2527
import six
2628

2729
# pylint: disable=ungrouped-imports
28-
from google.cloud.exceptions import Conflict
29-
from google.cloud.exceptions import NotFound
3030
from google.cloud.spanner_v1 import __version__
3131
from google.cloud.spanner_v1._helpers import _options_with_prefix
3232
from google.cloud.spanner_v1.batch import Batch
33+
from google.cloud.spanner_v1.gapic.spanner_client import SpannerClient
3334
from google.cloud.spanner_v1.pool import BurstyPool
3435
from google.cloud.spanner_v1.pool import SessionCheckout
3536
from google.cloud.spanner_v1.session import Session
@@ -208,14 +209,7 @@ def create(self):
208209
options=options,
209210
)
210211
except GaxError as exc:
211-
if exc_to_code(exc.cause) == StatusCode.ALREADY_EXISTS:
212-
raise Conflict(self.name)
213-
elif exc_to_code(exc.cause) == StatusCode.NOT_FOUND:
214-
raise NotFound('Instance not found: {name}'.format(
215-
name=self._instance.name,
216-
))
217-
raise
218-
212+
raise exceptions.from_grpc_error(exc.cause)
219213
return future
220214

221215
def exists(self):

spanner/tests/system/test_system.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
from google.cloud._helpers import UTC
3838
from google.cloud.exceptions import GrpcRendezvous
39+
from google.cloud.exceptions import NotFound
3940
from google.cloud.spanner_v1._helpers import TimestampWithNanoseconds
4041
from google.cloud.spanner import Client
4142
from google.cloud.spanner import KeyRange
@@ -282,6 +283,34 @@ def test_create_database(self):
282283
for database in Config.INSTANCE.list_databases()]
283284
self.assertIn(temp_db_id, database_ids)
284285

286+
def test_table_not_found(self):
287+
temp_db_id = 'temp_db' + unique_resource_id('_')
288+
289+
correct_table = 'MyTable'
290+
incorrect_table = 'NotMyTable'
291+
self.assertNotEqual(correct_table, incorrect_table)
292+
293+
create_table = (
294+
'CREATE TABLE {} (\n'
295+
' Id STRING(36) NOT NULL,\n'
296+
' Field1 STRING(36) NOT NULL\n'
297+
') PRIMARY KEY (Id)').format(correct_table)
298+
index = 'CREATE INDEX IDX ON {} (Field1)'.format(incorrect_table)
299+
300+
temp_db = Config.INSTANCE.database(
301+
temp_db_id,
302+
ddl_statements=[
303+
create_table,
304+
index,
305+
],
306+
)
307+
self.to_delete.append(temp_db)
308+
with self.assertRaises(NotFound) as exc_info:
309+
temp_db.create()
310+
311+
expected = 'Table not found: {0}'.format(incorrect_table)
312+
self.assertEqual(exc_info.exception.args, (expected,))
313+
285314
def test_update_database_ddl(self):
286315
pool = BurstyPool()
287316
temp_db_id = 'temp_db' + unique_resource_id('_')

spanner/tests/unit/test_database.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ def test___ne__(self):
284284
self.assertNotEqual(database1, database2)
285285

286286
def test_create_grpc_error(self):
287-
from google.gax.errors import GaxError
287+
from google.api_core.exceptions import GoogleAPICallError
288288

289289
client = _Client()
290290
api = client.database_admin_api = _FauxDatabaseAdminAPI(
@@ -293,7 +293,7 @@ def test_create_grpc_error(self):
293293
pool = _Pool()
294294
database = self._make_one(self.DATABASE_ID, instance, pool=pool)
295295

296-
with self.assertRaises(GaxError):
296+
with self.assertRaises(GoogleAPICallError):
297297
database.create()
298298

299299
(parent, create_statement, extra_statements,

0 commit comments

Comments
 (0)