RDS: Ensure cross-region replica returns ARN (#5503)
This commit is contained in:
parent
b176feb540
commit
f082562b0f
@ -644,7 +644,11 @@ class Database(CloudFormationModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def add_replica(self, replica):
|
def add_replica(self, replica):
|
||||||
self.replicas.append(replica.db_instance_identifier)
|
if self.region_name != replica.region_name:
|
||||||
|
# Cross Region replica
|
||||||
|
self.replicas.append(replica.db_instance_arn)
|
||||||
|
else:
|
||||||
|
self.replicas.append(replica.db_instance_identifier)
|
||||||
|
|
||||||
def remove_replica(self, replica):
|
def remove_replica(self, replica):
|
||||||
self.replicas.remove(replica.db_instance_identifier)
|
self.replicas.remove(replica.db_instance_identifier)
|
||||||
@ -772,7 +776,7 @@ class Database(CloudFormationModel):
|
|||||||
if source_db_identifier:
|
if source_db_identifier:
|
||||||
# Replica
|
# Replica
|
||||||
db_kwargs["source_db_identifier"] = source_db_identifier
|
db_kwargs["source_db_identifier"] = source_db_identifier
|
||||||
database = rds_backend.create_database_replica(db_kwargs)
|
database = rds_backend.create_db_instance_read_replica(db_kwargs)
|
||||||
else:
|
else:
|
||||||
database = rds_backend.create_db_instance(db_kwargs)
|
database = rds_backend.create_db_instance(db_kwargs)
|
||||||
return database
|
return database
|
||||||
@ -1360,7 +1364,7 @@ class RDSBackend(BaseBackend):
|
|||||||
|
|
||||||
return self.database_snapshots.pop(db_snapshot_identifier)
|
return self.database_snapshots.pop(db_snapshot_identifier)
|
||||||
|
|
||||||
def create_database_replica(self, db_kwargs):
|
def create_db_instance_read_replica(self, db_kwargs):
|
||||||
database_id = db_kwargs["db_instance_identifier"]
|
database_id = db_kwargs["db_instance_identifier"]
|
||||||
source_database_id = db_kwargs["source_db_identifier"]
|
source_database_id = db_kwargs["source_db_identifier"]
|
||||||
primary = self.find_db_from_id(source_database_id)
|
primary = self.find_db_from_id(source_database_id)
|
||||||
@ -1370,6 +1374,7 @@ class RDSBackend(BaseBackend):
|
|||||||
# Shouldn't really copy here as the instance is duplicated. RDS replicas have different instances.
|
# Shouldn't really copy here as the instance is duplicated. RDS replicas have different instances.
|
||||||
replica = copy.copy(primary)
|
replica = copy.copy(primary)
|
||||||
replica.update(db_kwargs)
|
replica.update(db_kwargs)
|
||||||
|
replica.region_name = self.region_name
|
||||||
replica.set_as_replica()
|
replica.set_as_replica()
|
||||||
self.databases[database_id] = replica
|
self.databases[database_id] = replica
|
||||||
primary.add_replica(replica)
|
primary.add_replica(replica)
|
||||||
|
@ -176,7 +176,7 @@ class RDSResponse(BaseResponse):
|
|||||||
def create_db_instance_read_replica(self):
|
def create_db_instance_read_replica(self):
|
||||||
db_kwargs = self._get_db_replica_kwargs()
|
db_kwargs = self._get_db_replica_kwargs()
|
||||||
|
|
||||||
database = self.backend.create_database_replica(db_kwargs)
|
database = self.backend.create_db_instance_read_replica(db_kwargs)
|
||||||
template = self.response_template(CREATE_DATABASE_REPLICA_TEMPLATE)
|
template = self.response_template(CREATE_DATABASE_REPLICA_TEMPLATE)
|
||||||
return template.render(database=database)
|
return template.render(database=database)
|
||||||
|
|
||||||
|
@ -1713,6 +1713,10 @@ def test_create_database_replica():
|
|||||||
master["DBInstances"][0]["ReadReplicaDBInstanceIdentifiers"].should.equal(
|
master["DBInstances"][0]["ReadReplicaDBInstanceIdentifiers"].should.equal(
|
||||||
["db-replica-1"]
|
["db-replica-1"]
|
||||||
)
|
)
|
||||||
|
replica = conn.describe_db_instances(DBInstanceIdentifier="db-replica-1")[
|
||||||
|
"DBInstances"
|
||||||
|
][0]
|
||||||
|
replica["ReadReplicaSourceDBInstanceIdentifier"].should.equal("db-master-1")
|
||||||
|
|
||||||
conn.delete_db_instance(DBInstanceIdentifier="db-replica-1", SkipFinalSnapshot=True)
|
conn.delete_db_instance(DBInstanceIdentifier="db-replica-1", SkipFinalSnapshot=True)
|
||||||
|
|
||||||
@ -1720,6 +1724,39 @@ def test_create_database_replica():
|
|||||||
master["DBInstances"][0]["ReadReplicaDBInstanceIdentifiers"].should.equal([])
|
master["DBInstances"][0]["ReadReplicaDBInstanceIdentifiers"].should.equal([])
|
||||||
|
|
||||||
|
|
||||||
|
@mock_rds
|
||||||
|
def test_create_database_replica_cross_region():
|
||||||
|
us1 = boto3.client("rds", region_name="us-east-1")
|
||||||
|
us2 = boto3.client("rds", region_name="us-west-2")
|
||||||
|
|
||||||
|
source_id = "db-master-1"
|
||||||
|
source_arn = us1.create_db_instance(
|
||||||
|
DBInstanceIdentifier=source_id,
|
||||||
|
AllocatedStorage=10,
|
||||||
|
Engine="postgres",
|
||||||
|
DBInstanceClass="db.m1.small",
|
||||||
|
)["DBInstance"]["DBInstanceArn"]
|
||||||
|
|
||||||
|
target_id = "db-replica-1"
|
||||||
|
target_arn = us2.create_db_instance_read_replica(
|
||||||
|
DBInstanceIdentifier=target_id,
|
||||||
|
SourceDBInstanceIdentifier=source_arn,
|
||||||
|
DBInstanceClass="db.m1.small",
|
||||||
|
)["DBInstance"]["DBInstanceArn"]
|
||||||
|
|
||||||
|
source_db = us1.describe_db_instances(DBInstanceIdentifier=source_id)[
|
||||||
|
"DBInstances"
|
||||||
|
][0]
|
||||||
|
source_db.should.have.key("ReadReplicaDBInstanceIdentifiers").equals([target_arn])
|
||||||
|
|
||||||
|
target_db = us2.describe_db_instances(DBInstanceIdentifier=target_id)[
|
||||||
|
"DBInstances"
|
||||||
|
][0]
|
||||||
|
target_db.should.have.key("ReadReplicaSourceDBInstanceIdentifier").equals(
|
||||||
|
source_arn
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@mock_rds
|
@mock_rds
|
||||||
@mock_kms
|
@mock_kms
|
||||||
def test_create_database_with_encrypted_storage():
|
def test_create_database_with_encrypted_storage():
|
||||||
|
Loading…
Reference in New Issue
Block a user