From abd508ea19245fca7ff54e4f0a8d9bb574f7378b Mon Sep 17 00:00:00 2001 From: Danny Hermes Date: Mon, 26 Sep 2016 10:20:57 -0700 Subject: [PATCH] Translating INVALID_ARGUMENT on datastore commit to standard exception. --- datastore/google/cloud/datastore/connection.py | 6 +++++- datastore/unit_tests/test_connection.py | 13 +++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/datastore/google/cloud/datastore/connection.py b/datastore/google/cloud/datastore/connection.py index ef0eeb066d1c..a339d34f0c18 100644 --- a/datastore/google/cloud/datastore/connection.py +++ b/datastore/google/cloud/datastore/connection.py @@ -23,6 +23,7 @@ from google.cloud import connection as connection_module from google.cloud.environment_vars import DISABLE_GRPC from google.cloud.environment_vars import GCD_HOST +from google.cloud.exceptions import BadRequest from google.cloud.exceptions import Conflict from google.cloud.exceptions import GrpcRendezvous from google.cloud.exceptions import make_exception @@ -313,8 +314,11 @@ def commit(self, project, request_pb): try: return self._stub.Commit(request_pb) except GrpcRendezvous as exc: - if exc.code() == StatusCode.ABORTED: + error_code = exc.code() + if error_code == StatusCode.ABORTED: raise Conflict(exc.details()) + if error_code == StatusCode.INVALID_ARGUMENT: + raise BadRequest(exc.details()) raise def rollback(self, project, request_pb): diff --git a/datastore/unit_tests/test_connection.py b/datastore/unit_tests/test_connection.py index f1030a61c948..6791a59cde76 100644 --- a/datastore/unit_tests/test_connection.py +++ b/datastore/unit_tests/test_connection.py @@ -252,6 +252,19 @@ def test_commit_failure_aborted(self): exc = GrpcRendezvous(exc_state, None, None, None) self._commit_failure_helper(exc, Conflict) + @unittest.skipUnless(_HAVE_GRPC, 'No gRPC') + def test_commit_failure_invalid_argument(self): + from grpc import StatusCode + from grpc._channel import _RPCState + from google.cloud.exceptions import BadRequest + from google.cloud.exceptions import GrpcRendezvous + + details = 'Too long content.' + exc_state = _RPCState((), None, None, + StatusCode.INVALID_ARGUMENT, details) + exc = GrpcRendezvous(exc_state, None, None, None) + self._commit_failure_helper(exc, BadRequest) + @unittest.skipUnless(_HAVE_GRPC, 'No gRPC') def test_commit_failure_cancelled(self): from grpc import StatusCode