From d8317b58eaaca79fa50019ba605927312a748514 Mon Sep 17 00:00:00 2001 From: chemelnucfin Date: Wed, 20 Dec 2017 09:32:39 -0800 Subject: [PATCH] Spanner: Use details from gRPC exception on datatbase create failure (#4557) Closes #4071. Also adds a system test to verify this. --- spanner/google/cloud/spanner_v1/database.py | 16 ++++-------- spanner/tests/system/test_system.py | 29 +++++++++++++++++++++ spanner/tests/unit/test_database.py | 4 +-- 3 files changed, 36 insertions(+), 13 deletions(-) diff --git a/spanner/google/cloud/spanner_v1/database.py b/spanner/google/cloud/spanner_v1/database.py index a72e25011917..381a88c39463 100644 --- a/spanner/google/cloud/spanner_v1/database.py +++ b/spanner/google/cloud/spanner_v1/database.py @@ -17,19 +17,20 @@ import re import threading +from google.api_core import exceptions import google.auth.credentials +from google.cloud.exceptions import Conflict +from google.cloud.exceptions import NotFound from google.gax.errors import GaxError from google.gax.grpc import exc_to_code -from google.cloud.spanner_v1.gapic.spanner_client import SpannerClient from grpc import StatusCode import six # pylint: disable=ungrouped-imports -from google.cloud.exceptions import Conflict -from google.cloud.exceptions import NotFound from google.cloud.spanner_v1 import __version__ from google.cloud.spanner_v1._helpers import _options_with_prefix from google.cloud.spanner_v1.batch import Batch +from google.cloud.spanner_v1.gapic.spanner_client import SpannerClient from google.cloud.spanner_v1.pool import BurstyPool from google.cloud.spanner_v1.pool import SessionCheckout from google.cloud.spanner_v1.session import Session @@ -208,14 +209,7 @@ def create(self): options=options, ) except GaxError as exc: - if exc_to_code(exc.cause) == StatusCode.ALREADY_EXISTS: - raise Conflict(self.name) - elif exc_to_code(exc.cause) == StatusCode.NOT_FOUND: - raise NotFound('Instance not found: {name}'.format( - name=self._instance.name, - )) - raise - + raise exceptions.from_grpc_error(exc.cause) return future def exists(self): diff --git a/spanner/tests/system/test_system.py b/spanner/tests/system/test_system.py index c8dc5df70bae..4783eebf4c02 100644 --- a/spanner/tests/system/test_system.py +++ b/spanner/tests/system/test_system.py @@ -36,6 +36,7 @@ from google.cloud._helpers import UTC from google.cloud.exceptions import GrpcRendezvous +from google.cloud.exceptions import NotFound from google.cloud.spanner_v1._helpers import TimestampWithNanoseconds from google.cloud.spanner import Client from google.cloud.spanner import KeyRange @@ -282,6 +283,34 @@ def test_create_database(self): for database in Config.INSTANCE.list_databases()] self.assertIn(temp_db_id, database_ids) + def test_table_not_found(self): + temp_db_id = 'temp_db' + unique_resource_id('_') + + correct_table = 'MyTable' + incorrect_table = 'NotMyTable' + self.assertNotEqual(correct_table, incorrect_table) + + create_table = ( + 'CREATE TABLE {} (\n' + ' Id STRING(36) NOT NULL,\n' + ' Field1 STRING(36) NOT NULL\n' + ') PRIMARY KEY (Id)').format(correct_table) + index = 'CREATE INDEX IDX ON {} (Field1)'.format(incorrect_table) + + temp_db = Config.INSTANCE.database( + temp_db_id, + ddl_statements=[ + create_table, + index, + ], + ) + self.to_delete.append(temp_db) + with self.assertRaises(NotFound) as exc_info: + temp_db.create() + + expected = 'Table not found: {0}'.format(incorrect_table) + self.assertEqual(exc_info.exception.args, (expected,)) + def test_update_database_ddl(self): pool = BurstyPool() temp_db_id = 'temp_db' + unique_resource_id('_') diff --git a/spanner/tests/unit/test_database.py b/spanner/tests/unit/test_database.py index 316ca307574b..97c9fe3b0e85 100644 --- a/spanner/tests/unit/test_database.py +++ b/spanner/tests/unit/test_database.py @@ -284,7 +284,7 @@ def test___ne__(self): self.assertNotEqual(database1, database2) def test_create_grpc_error(self): - from google.gax.errors import GaxError + from google.api_core.exceptions import GoogleAPICallError client = _Client() api = client.database_admin_api = _FauxDatabaseAdminAPI( @@ -293,7 +293,7 @@ def test_create_grpc_error(self): pool = _Pool() database = self._make_one(self.DATABASE_ID, instance, pool=pool) - with self.assertRaises(GaxError): + with self.assertRaises(GoogleAPICallError): database.create() (parent, create_statement, extra_statements,