moto
moto copied to clipboard
Route53 should raise an exception when record already exists
Hi, I'm trying to mock route53 and test my function, however, I noticed that moto does not raise an exception that real route53 does. This does apply for CREATE and DELETE actions maybe even for UPSERT
moto version = 3.1.4
How to reproduce
Call route53_client.change_resource_record_sets
two times with the same parameters.
Expected behaviour
1st call -> returns a response
{
'ChangeInfo': {
'Id': '...',
'Status': 'PENDING',
'SubmittedAt': ...,
'Comment': '...'
}
}
2nd call raises an error
Actual behaviour
1st call returns {'Id': '/change/C2682N5HXP0BZ4', 'Status': 'INSYNC', 'SubmittedAt': datetime.datetime(2010, 9, 10, 1, 36, 41, 958000, tzinfo=tzutc())}
2nd call returns {'Id': '/change/C2682N5HXP0BZ4', 'Status': 'INSYNC', 'SubmittedAt': datetime.datetime(2010, 9, 10, 1, 36, 41, 958000, tzinfo=tzutc())}
I think that problem is likely this response https://github.com/spulec/moto/blob/67ab7f857ac87671578ebb1127ec971d030ec43a/moto/route53/responses.py#L156-L160
Example code:
import boto3
import botocore.exceptions
import pytest
from moto import mock_route53
ZONE = 'cname.local'
FQDN = f"test.{ZONE}"
FQDN_TARGET = "develop.domain.com"
@pytest.fixture
def route53_client():
with mock_route53():
yield boto3.client("route53")
@pytest.fixture
def route53_zone(route53_client):
resp = route53_client.create_hosted_zone(
Name=ZONE,
CallerReference='ref',
DelegationSetId='string'
)
yield resp['HostedZone']['Id']
def create_cname(route53_client):
return route53_client.change_resource_record_sets(
HostedZoneId=route53_zone,
ChangeBatch={
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": FQDN,
"Type": "CNAME",
"TTL": 600,
"ResourceRecords": [
{"Value": FQDN_TARGET},
],
},
},
]
},
)
def test_r53_create_fail(route53_client, route53_zone, route53_record):
r = create_cname(route53_client)
# this should raise route53_client.exceptions.InvalidChangeBatch with message already exists
# botocore.errorfactory.InvalidChangeBatch: An error occurred (InvalidChangeBatch) when calling the ChangeResourceRecordSets operation: [Tried to create resource record set [name='test.cname.local.', type='CNAME'] but it already exists]
with pytest.raises(botocore.exceptions.ClientError):
r2 = route53_client.change_resource_record_sets(
HostedZoneId=route53_zone,
ChangeBatch={
# 'Comment': 'string',
"Changes": [
{
"Action": "CREATE",
"ResourceRecordSet": {
"Name": FQDN,
"Type": "CNAME",
"TTL": 600,
"ResourceRecords": [
{"Value": FQDN_TARGET},
],
},
},
]
},
)
Thanks for raising this @1oglop1 - will mark it as an enhancement to implement this validation.