Fixed #1162
This commit is contained in:
parent
d2717ac371
commit
16e0326fe7
@ -21,8 +21,8 @@ class DynamoHandler(BaseResponse):
|
|||||||
if match:
|
if match:
|
||||||
return match.split(".")[1]
|
return match.split(".")[1]
|
||||||
|
|
||||||
def error(self, type_, status=400):
|
def error(self, type_, message, status=400):
|
||||||
return status, self.response_headers, dynamo_json_dump({'__type': type_})
|
return status, self.response_headers, dynamo_json_dump({'__type': type_, 'message': message})
|
||||||
|
|
||||||
def call_action(self):
|
def call_action(self):
|
||||||
self.body = json.loads(self.body or '{}')
|
self.body = json.loads(self.body or '{}')
|
||||||
@ -82,7 +82,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
return dynamo_json_dump(table.describe())
|
return dynamo_json_dump(table.describe())
|
||||||
else:
|
else:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ResourceInUseException'
|
er = 'com.amazonaws.dynamodb.v20111205#ResourceInUseException'
|
||||||
return self.error(er)
|
return self.error(er, 'Resource in use')
|
||||||
|
|
||||||
def delete_table(self):
|
def delete_table(self):
|
||||||
name = self.body['TableName']
|
name = self.body['TableName']
|
||||||
@ -91,7 +91,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
return dynamo_json_dump(table.describe())
|
return dynamo_json_dump(table.describe())
|
||||||
else:
|
else:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
||||||
return self.error(er)
|
return self.error(er, 'Requested resource not found')
|
||||||
|
|
||||||
def tag_resource(self):
|
def tag_resource(self):
|
||||||
tags = self.body['Tags']
|
tags = self.body['Tags']
|
||||||
@ -120,7 +120,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
return json.dumps({'Tags': tags_resp})
|
return json.dumps({'Tags': tags_resp})
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
||||||
return self.error(er)
|
return self.error(er, 'Requested resource not found')
|
||||||
|
|
||||||
def update_table(self):
|
def update_table(self):
|
||||||
name = self.body['TableName']
|
name = self.body['TableName']
|
||||||
@ -138,7 +138,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
table = dynamodb_backend2.tables[name]
|
table = dynamodb_backend2.tables[name]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
||||||
return self.error(er)
|
return self.error(er, 'Requested resource not found')
|
||||||
return dynamo_json_dump(table.describe(base_key='Table'))
|
return dynamo_json_dump(table.describe(base_key='Table'))
|
||||||
|
|
||||||
def put_item(self):
|
def put_item(self):
|
||||||
@ -190,7 +190,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
name, item, expected, overwrite)
|
name, item, expected, overwrite)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ConditionalCheckFailedException'
|
er = 'com.amazonaws.dynamodb.v20111205#ConditionalCheckFailedException'
|
||||||
return self.error(er)
|
return self.error(er, 'A condition specified in the operation could not be evaluated.')
|
||||||
|
|
||||||
if result:
|
if result:
|
||||||
item_dict = result.to_json()
|
item_dict = result.to_json()
|
||||||
@ -198,7 +198,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
return dynamo_json_dump(item_dict)
|
return dynamo_json_dump(item_dict)
|
||||||
else:
|
else:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
||||||
return self.error(er)
|
return self.error(er, 'Requested resource not found')
|
||||||
|
|
||||||
def batch_write_item(self):
|
def batch_write_item(self):
|
||||||
table_batches = self.body['RequestItems']
|
table_batches = self.body['RequestItems']
|
||||||
@ -235,15 +235,14 @@ class DynamoHandler(BaseResponse):
|
|||||||
item = dynamodb_backend2.get_item(name, key)
|
item = dynamodb_backend2.get_item(name, key)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
er = 'com.amazon.coral.validate#ValidationException'
|
er = 'com.amazon.coral.validate#ValidationException'
|
||||||
return self.error(er, status=400)
|
return self.error(er, 'Validation Exception')
|
||||||
if item:
|
if item:
|
||||||
item_dict = item.describe_attrs(attributes=None)
|
item_dict = item.describe_attrs(attributes=None)
|
||||||
item_dict['ConsumedCapacityUnits'] = 0.5
|
item_dict['ConsumedCapacityUnits'] = 0.5
|
||||||
return dynamo_json_dump(item_dict)
|
return dynamo_json_dump(item_dict)
|
||||||
else:
|
else:
|
||||||
# Item not found
|
# Item not found
|
||||||
er = '{}'
|
return 200, self.response_headers, '{}'
|
||||||
return self.error(er, status=200)
|
|
||||||
|
|
||||||
def batch_get_item(self):
|
def batch_get_item(self):
|
||||||
table_batches = self.body['RequestItems']
|
table_batches = self.body['RequestItems']
|
||||||
@ -282,6 +281,12 @@ class DynamoHandler(BaseResponse):
|
|||||||
value_alias_map = self.body['ExpressionAttributeValues']
|
value_alias_map = self.body['ExpressionAttributeValues']
|
||||||
|
|
||||||
table = dynamodb_backend2.get_table(name)
|
table = dynamodb_backend2.get_table(name)
|
||||||
|
|
||||||
|
# If table does not exist
|
||||||
|
if table is None:
|
||||||
|
return self.error('com.amazonaws.dynamodb.v20120810#ResourceNotFoundException',
|
||||||
|
'Requested resource not found')
|
||||||
|
|
||||||
index_name = self.body.get('IndexName')
|
index_name = self.body.get('IndexName')
|
||||||
if index_name:
|
if index_name:
|
||||||
all_indexes = (table.global_indexes or []) + \
|
all_indexes = (table.global_indexes or []) + \
|
||||||
@ -350,7 +355,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
filter_kwargs[key] = value
|
filter_kwargs[key] = value
|
||||||
if hash_key_name is None:
|
if hash_key_name is None:
|
||||||
er = "'com.amazonaws.dynamodb.v20120810#ResourceNotFoundException"
|
er = "'com.amazonaws.dynamodb.v20120810#ResourceNotFoundException"
|
||||||
return self.error(er)
|
return self.error(er, 'Requested resource not found')
|
||||||
hash_key = key_conditions[hash_key_name][
|
hash_key = key_conditions[hash_key_name][
|
||||||
'AttributeValueList'][0]
|
'AttributeValueList'][0]
|
||||||
if len(key_conditions) == 1:
|
if len(key_conditions) == 1:
|
||||||
@ -359,7 +364,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
else:
|
else:
|
||||||
if range_key_name is None and not filter_kwargs:
|
if range_key_name is None and not filter_kwargs:
|
||||||
er = "com.amazon.coral.validate#ValidationException"
|
er = "com.amazon.coral.validate#ValidationException"
|
||||||
return self.error(er)
|
return self.error(er, 'Validation Exception')
|
||||||
else:
|
else:
|
||||||
range_condition = key_conditions.get(range_key_name)
|
range_condition = key_conditions.get(range_key_name)
|
||||||
if range_condition:
|
if range_condition:
|
||||||
@ -381,7 +386,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
exclusive_start_key, scan_index_forward, index_name=index_name, **filter_kwargs)
|
exclusive_start_key, scan_index_forward, index_name=index_name, **filter_kwargs)
|
||||||
if items is None:
|
if items is None:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
||||||
return self.error(er)
|
return self.error(er, 'Requested resource not found')
|
||||||
|
|
||||||
result = {
|
result = {
|
||||||
"Count": len(items),
|
"Count": len(items),
|
||||||
@ -417,7 +422,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
|
|
||||||
if items is None:
|
if items is None:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
er = 'com.amazonaws.dynamodb.v20111205#ResourceNotFoundException'
|
||||||
return self.error(er)
|
return self.error(er, 'Requested resource not found')
|
||||||
|
|
||||||
result = {
|
result = {
|
||||||
"Count": len(items),
|
"Count": len(items),
|
||||||
@ -436,7 +441,7 @@ class DynamoHandler(BaseResponse):
|
|||||||
table = dynamodb_backend2.get_table(name)
|
table = dynamodb_backend2.get_table(name)
|
||||||
if not table:
|
if not table:
|
||||||
er = 'com.amazonaws.dynamodb.v20120810#ConditionalCheckFailedException'
|
er = 'com.amazonaws.dynamodb.v20120810#ConditionalCheckFailedException'
|
||||||
return self.error(er)
|
return self.error(er, 'A condition specified in the operation could not be evaluated.')
|
||||||
|
|
||||||
item = dynamodb_backend2.delete_item(name, keys)
|
item = dynamodb_backend2.delete_item(name, keys)
|
||||||
if item and return_values == 'ALL_OLD':
|
if item and return_values == 'ALL_OLD':
|
||||||
@ -496,10 +501,10 @@ class DynamoHandler(BaseResponse):
|
|||||||
expected)
|
expected)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ConditionalCheckFailedException'
|
er = 'com.amazonaws.dynamodb.v20111205#ConditionalCheckFailedException'
|
||||||
return self.error(er)
|
return self.error(er, 'A condition specified in the operation could not be evaluated.')
|
||||||
except TypeError:
|
except TypeError:
|
||||||
er = 'com.amazonaws.dynamodb.v20111205#ValidationException'
|
er = 'com.amazonaws.dynamodb.v20111205#ValidationException'
|
||||||
return self.error(er)
|
return self.error(er, 'Validation Exception')
|
||||||
|
|
||||||
item_dict = item.to_json()
|
item_dict = item.to_json()
|
||||||
item_dict['ConsumedCapacityUnits'] = 0.5
|
item_dict['ConsumedCapacityUnits'] = 0.5
|
||||||
|
@ -181,3 +181,16 @@ def test_item_add_empty_string_exception():
|
|||||||
ex.exception.response['Error']['Message'].should.equal(
|
ex.exception.response['Error']['Message'].should.equal(
|
||||||
'One or more parameter values were invalid: An AttributeValue may not contain an empty string'
|
'One or more parameter values were invalid: An AttributeValue may not contain an empty string'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@requires_boto_gte("2.9")
|
||||||
|
@mock_dynamodb2
|
||||||
|
def test_query_invalid_table():
|
||||||
|
conn = boto3.client('dynamodb',
|
||||||
|
region_name='us-west-2',
|
||||||
|
aws_access_key_id="ak",
|
||||||
|
aws_secret_access_key="sk")
|
||||||
|
try:
|
||||||
|
conn.query(TableName='invalid_table', KeyConditionExpression='index1 = :partitionkeyval', ExpressionAttributeValues={':partitionkeyval': {'S':'test'}})
|
||||||
|
except ClientError as exception:
|
||||||
|
assert exception.response['Error']['Code'] == "ResourceNotFoundException"
|
Loading…
Reference in New Issue
Block a user