DynamoDB: describe_table() - return correct error msg (#5997)
This commit is contained in:
parent
0f93cd24c8
commit
88d991e306
@ -4,12 +4,15 @@ from moto.core.exceptions import JsonRESTError
|
|||||||
from moto.dynamodb.limits import HASH_KEY_MAX_LENGTH, RANGE_KEY_MAX_LENGTH
|
from moto.dynamodb.limits import HASH_KEY_MAX_LENGTH, RANGE_KEY_MAX_LENGTH
|
||||||
|
|
||||||
|
|
||||||
|
ERROR_TYPE_PREFIX = "com.amazonaws.dynamodb.v20120810#"
|
||||||
|
|
||||||
|
|
||||||
class DynamodbException(JsonRESTError):
|
class DynamodbException(JsonRESTError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class MockValidationException(DynamodbException):
|
class MockValidationException(DynamodbException):
|
||||||
error_type = "com.amazonaws.dynamodb.v20111205#ValidationException"
|
error_type = ERROR_TYPE_PREFIX + "ValidationException"
|
||||||
|
|
||||||
def __init__(self, message: str):
|
def __init__(self, message: str):
|
||||||
super().__init__(MockValidationException.error_type, message=message)
|
super().__init__(MockValidationException.error_type, message=message)
|
||||||
@ -190,7 +193,7 @@ class IncorrectDataType(MockValidationException):
|
|||||||
|
|
||||||
|
|
||||||
class ConditionalCheckFailed(DynamodbException):
|
class ConditionalCheckFailed(DynamodbException):
|
||||||
error_type = "com.amazonaws.dynamodb.v20111205#ConditionalCheckFailedException"
|
error_type = ERROR_TYPE_PREFIX + "ConditionalCheckFailedException"
|
||||||
|
|
||||||
def __init__(self, msg: Optional[str] = None):
|
def __init__(self, msg: Optional[str] = None):
|
||||||
super().__init__(
|
super().__init__(
|
||||||
@ -279,44 +282,47 @@ class TooManyAddClauses(InvalidUpdateExpression):
|
|||||||
|
|
||||||
|
|
||||||
class ResourceNotFoundException(JsonRESTError):
|
class ResourceNotFoundException(JsonRESTError):
|
||||||
def __init__(self, msg: Optional[str] = None):
|
def __init__(self, msg: Optional[str] = None, table_name: Optional[str] = None):
|
||||||
err = "com.amazonaws.dynamodb.v20111205#ResourceNotFoundException"
|
err = ERROR_TYPE_PREFIX + "ResourceNotFoundException"
|
||||||
super().__init__(err, msg or "Requested resource not found")
|
default_msg = "Requested resource not found"
|
||||||
|
if table_name is not None:
|
||||||
|
default_msg += f": Table: {table_name} not found"
|
||||||
|
super().__init__(err, msg or default_msg)
|
||||||
|
|
||||||
|
|
||||||
class TableNotFoundException(JsonRESTError):
|
class TableNotFoundException(JsonRESTError):
|
||||||
def __init__(self, name: str):
|
def __init__(self, name: str):
|
||||||
err = "com.amazonaws.dynamodb.v20111205#TableNotFoundException"
|
err = ERROR_TYPE_PREFIX + "TableNotFoundException"
|
||||||
super().__init__(err, f"Table not found: {name}")
|
super().__init__(err, f"Table not found: {name}")
|
||||||
|
|
||||||
|
|
||||||
class SourceTableNotFoundException(JsonRESTError):
|
class SourceTableNotFoundException(JsonRESTError):
|
||||||
def __init__(self, source_table_name: str):
|
def __init__(self, source_table_name: str):
|
||||||
er = "com.amazonaws.dynamodb.v20111205#SourceTableNotFoundException"
|
er = ERROR_TYPE_PREFIX + "SourceTableNotFoundException"
|
||||||
super().__init__(er, f"Source table not found: {source_table_name}")
|
super().__init__(er, f"Source table not found: {source_table_name}")
|
||||||
|
|
||||||
|
|
||||||
class BackupNotFoundException(JsonRESTError):
|
class BackupNotFoundException(JsonRESTError):
|
||||||
def __init__(self, backup_arn: str):
|
def __init__(self, backup_arn: str):
|
||||||
er = "com.amazonaws.dynamodb.v20111205#BackupNotFoundException"
|
er = ERROR_TYPE_PREFIX + "BackupNotFoundException"
|
||||||
super().__init__(er, f"Backup not found: {backup_arn}")
|
super().__init__(er, f"Backup not found: {backup_arn}")
|
||||||
|
|
||||||
|
|
||||||
class TableAlreadyExistsException(JsonRESTError):
|
class TableAlreadyExistsException(JsonRESTError):
|
||||||
def __init__(self, target_table_name: str):
|
def __init__(self, target_table_name: str):
|
||||||
er = "com.amazonaws.dynamodb.v20111205#TableAlreadyExistsException"
|
er = ERROR_TYPE_PREFIX + "TableAlreadyExistsException"
|
||||||
super().__init__(er, f"Table already exists: {target_table_name}")
|
super().__init__(er, f"Table already exists: {target_table_name}")
|
||||||
|
|
||||||
|
|
||||||
class ResourceInUseException(JsonRESTError):
|
class ResourceInUseException(JsonRESTError):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
er = "com.amazonaws.dynamodb.v20111205#ResourceInUseException"
|
er = ERROR_TYPE_PREFIX + "ResourceInUseException"
|
||||||
super().__init__(er, "Resource in use")
|
super().__init__(er, "Resource in use")
|
||||||
|
|
||||||
|
|
||||||
class StreamAlreadyEnabledException(JsonRESTError):
|
class StreamAlreadyEnabledException(JsonRESTError):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
er = "com.amazonaws.dynamodb.v20111205#ResourceInUseException"
|
er = ERROR_TYPE_PREFIX + "ResourceInUseException"
|
||||||
super().__init__(er, "Cannot enable stream")
|
super().__init__(er, "Cannot enable stream")
|
||||||
|
|
||||||
|
|
||||||
|
@ -123,8 +123,10 @@ class DynamoDBBackend(BaseBackend):
|
|||||||
return tables, None
|
return tables, None
|
||||||
|
|
||||||
def describe_table(self, name: str) -> Dict[str, Any]:
|
def describe_table(self, name: str) -> Dict[str, Any]:
|
||||||
table = self.get_table(name)
|
# We can't use get_table() here, because the error message is slightly different for this operation
|
||||||
return table.describe(base_key="Table")
|
if name not in self.tables:
|
||||||
|
raise ResourceNotFoundException(table_name=name)
|
||||||
|
return self.tables[name].describe(base_key="Table")
|
||||||
|
|
||||||
def update_table(
|
def update_table(
|
||||||
self,
|
self,
|
||||||
|
@ -66,7 +66,9 @@ def test_describe_missing_table_boto3():
|
|||||||
conn.describe_table(TableName="messages")
|
conn.describe_table(TableName="messages")
|
||||||
ex.value.response["Error"]["Code"].should.equal("ResourceNotFoundException")
|
ex.value.response["Error"]["Code"].should.equal("ResourceNotFoundException")
|
||||||
ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400)
|
ex.value.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400)
|
||||||
ex.value.response["Error"]["Message"].should.equal("Requested resource not found")
|
ex.value.response["Error"]["Message"].should.equal(
|
||||||
|
"Requested resource not found: Table: messages not found"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@mock_dynamodb
|
@mock_dynamodb
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
|
import json
|
||||||
import sure # noqa # pylint: disable=unused-import
|
import sure # noqa # pylint: disable=unused-import
|
||||||
|
from moto import mock_dynamodb
|
||||||
import moto.server as server
|
import moto.server as server
|
||||||
|
|
||||||
"""
|
"""
|
||||||
@ -7,6 +8,7 @@ Test the different server responses
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
@mock_dynamodb
|
||||||
def test_table_list():
|
def test_table_list():
|
||||||
backend = server.create_backend_app("dynamodb")
|
backend = server.create_backend_app("dynamodb")
|
||||||
test_client = backend.test_client()
|
test_client = backend.test_client()
|
||||||
@ -17,3 +19,18 @@ def test_table_list():
|
|||||||
res = test_client.get("/", headers=headers)
|
res = test_client.get("/", headers=headers)
|
||||||
res.data.should.contain(b"TableNames")
|
res.data.should.contain(b"TableNames")
|
||||||
res.headers.should.have.key("X-Amz-Crc32")
|
res.headers.should.have.key("X-Amz-Crc32")
|
||||||
|
|
||||||
|
headers = {"X-Amz-Target": "DynamoDB_20120810.DescribeTable"}
|
||||||
|
res = test_client.post(
|
||||||
|
"/", headers=headers, data=json.dumps({"TableName": "test-table2"})
|
||||||
|
)
|
||||||
|
res.headers.should.have.key("X-Amzn-ErrorType").equals(
|
||||||
|
"com.amazonaws.dynamodb.v20120810#ResourceNotFoundException"
|
||||||
|
)
|
||||||
|
body = json.loads(res.data.decode("utf-8"))
|
||||||
|
body.should.equal(
|
||||||
|
{
|
||||||
|
"__type": "com.amazonaws.dynamodb.v20120810#ResourceNotFoundException",
|
||||||
|
"message": "Requested resource not found: Table: test-table2 not found",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user