RDS: Automated snapshots now have the appropriate SnapshotType (#6444)
This commit is contained in:
parent
bec9130d4c
commit
5c0827547d
@ -5318,7 +5318,7 @@
|
|||||||
|
|
||||||
## rds
|
## rds
|
||||||
<details>
|
<details>
|
||||||
<summary>38% implemented</summary>
|
<summary>39% implemented</summary>
|
||||||
|
|
||||||
- [ ] add_role_to_db_cluster
|
- [ ] add_role_to_db_cluster
|
||||||
- [ ] add_role_to_db_instance
|
- [ ] add_role_to_db_instance
|
||||||
@ -5329,9 +5329,9 @@
|
|||||||
- [ ] backtrack_db_cluster
|
- [ ] backtrack_db_cluster
|
||||||
- [X] cancel_export_task
|
- [X] cancel_export_task
|
||||||
- [ ] copy_db_cluster_parameter_group
|
- [ ] copy_db_cluster_parameter_group
|
||||||
- [ ] copy_db_cluster_snapshot
|
- [X] copy_db_cluster_snapshot
|
||||||
- [ ] copy_db_parameter_group
|
- [ ] copy_db_parameter_group
|
||||||
- [ ] copy_db_snapshot
|
- [X] copy_db_snapshot
|
||||||
- [ ] copy_option_group
|
- [ ] copy_option_group
|
||||||
- [ ] create_blue_green_deployment
|
- [ ] create_blue_green_deployment
|
||||||
- [ ] create_custom_db_engine_version
|
- [ ] create_custom_db_engine_version
|
||||||
|
@ -34,9 +34,9 @@ rds
|
|||||||
- [ ] backtrack_db_cluster
|
- [ ] backtrack_db_cluster
|
||||||
- [X] cancel_export_task
|
- [X] cancel_export_task
|
||||||
- [ ] copy_db_cluster_parameter_group
|
- [ ] copy_db_cluster_parameter_group
|
||||||
- [ ] copy_db_cluster_snapshot
|
- [X] copy_db_cluster_snapshot
|
||||||
- [ ] copy_db_parameter_group
|
- [ ] copy_db_parameter_group
|
||||||
- [ ] copy_db_snapshot
|
- [X] copy_db_snapshot
|
||||||
- [ ] copy_option_group
|
- [ ] copy_option_group
|
||||||
- [ ] create_blue_green_deployment
|
- [ ] create_blue_green_deployment
|
||||||
- [ ] create_custom_db_engine_version
|
- [ ] create_custom_db_engine_version
|
||||||
|
@ -436,13 +436,20 @@ class ClusterSnapshot(BaseModel):
|
|||||||
"db-cluster-snapshot-id": FilterDef(
|
"db-cluster-snapshot-id": FilterDef(
|
||||||
["snapshot_id"], "DB Cluster Snapshot Identifiers"
|
["snapshot_id"], "DB Cluster Snapshot Identifiers"
|
||||||
),
|
),
|
||||||
"snapshot-type": FilterDef(None, "Snapshot Types"),
|
"snapshot-type": FilterDef(["snapshot_type"], "Snapshot Types"),
|
||||||
"engine": FilterDef(["cluster.engine"], "Engine Names"),
|
"engine": FilterDef(["cluster.engine"], "Engine Names"),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, cluster: Cluster, snapshot_id: str, tags: List[Dict[str, str]]):
|
def __init__(
|
||||||
|
self,
|
||||||
|
cluster: Cluster,
|
||||||
|
snapshot_id: str,
|
||||||
|
snapshot_type: str,
|
||||||
|
tags: List[Dict[str, str]],
|
||||||
|
):
|
||||||
self.cluster = cluster
|
self.cluster = cluster
|
||||||
self.snapshot_id = snapshot_id
|
self.snapshot_id = snapshot_id
|
||||||
|
self.snapshot_type = snapshot_type
|
||||||
self.tags = tags
|
self.tags = tags
|
||||||
self.status = "available"
|
self.status = "available"
|
||||||
self.created_at = iso_8601_datetime_with_milliseconds(
|
self.created_at = iso_8601_datetime_with_milliseconds(
|
||||||
@ -467,7 +474,7 @@ class ClusterSnapshot(BaseModel):
|
|||||||
<Port>{{ cluster.port }}</Port>
|
<Port>{{ cluster.port }}</Port>
|
||||||
<Engine>{{ cluster.engine }}</Engine>
|
<Engine>{{ cluster.engine }}</Engine>
|
||||||
<Status>{{ snapshot.status }}</Status>
|
<Status>{{ snapshot.status }}</Status>
|
||||||
<SnapshotType>manual</SnapshotType>
|
<SnapshotType>{{ snapshot.snapshot_type }}</SnapshotType>
|
||||||
<DBClusterSnapshotArn>{{ snapshot.snapshot_arn }}</DBClusterSnapshotArn>
|
<DBClusterSnapshotArn>{{ snapshot.snapshot_arn }}</DBClusterSnapshotArn>
|
||||||
<SourceRegion>{{ cluster.region }}</SourceRegion>
|
<SourceRegion>{{ cluster.region }}</SourceRegion>
|
||||||
{% if cluster.iops %}
|
{% if cluster.iops %}
|
||||||
@ -551,9 +558,7 @@ class Database(CloudFormationModel):
|
|||||||
)
|
)
|
||||||
self.db_cluster_identifier: Optional[str] = kwargs.get("db_cluster_identifier")
|
self.db_cluster_identifier: Optional[str] = kwargs.get("db_cluster_identifier")
|
||||||
self.db_instance_identifier = kwargs.get("db_instance_identifier")
|
self.db_instance_identifier = kwargs.get("db_instance_identifier")
|
||||||
self.source_db_identifier: Optional[str] = kwargs.get(
|
self.source_db_identifier: Optional[str] = kwargs.get("source_db_identifier")
|
||||||
"source_db_ide.db_cluster_identifierntifier"
|
|
||||||
)
|
|
||||||
self.db_instance_class = kwargs.get("db_instance_class")
|
self.db_instance_class = kwargs.get("db_instance_class")
|
||||||
self.port = kwargs.get("port")
|
self.port = kwargs.get("port")
|
||||||
if self.port is None:
|
if self.port is None:
|
||||||
@ -1056,15 +1061,20 @@ class DatabaseSnapshot(BaseModel):
|
|||||||
),
|
),
|
||||||
"db-snapshot-id": FilterDef(["snapshot_id"], "DB Snapshot Identifiers"),
|
"db-snapshot-id": FilterDef(["snapshot_id"], "DB Snapshot Identifiers"),
|
||||||
"dbi-resource-id": FilterDef(["database.dbi_resource_id"], "Dbi Resource Ids"),
|
"dbi-resource-id": FilterDef(["database.dbi_resource_id"], "Dbi Resource Ids"),
|
||||||
"snapshot-type": FilterDef(None, "Snapshot Types"),
|
"snapshot-type": FilterDef(["snapshot_type"], "Snapshot Types"),
|
||||||
"engine": FilterDef(["database.engine"], "Engine Names"),
|
"engine": FilterDef(["database.engine"], "Engine Names"),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, database: Database, snapshot_id: str, tags: List[Dict[str, str]]
|
self,
|
||||||
|
database: Database,
|
||||||
|
snapshot_id: str,
|
||||||
|
snapshot_type: str,
|
||||||
|
tags: List[Dict[str, str]],
|
||||||
):
|
):
|
||||||
self.database = database
|
self.database = database
|
||||||
self.snapshot_id = snapshot_id
|
self.snapshot_id = snapshot_id
|
||||||
|
self.snapshot_type = snapshot_type
|
||||||
self.tags = tags
|
self.tags = tags
|
||||||
self.status = "available"
|
self.status = "available"
|
||||||
self.created_at = iso_8601_datetime_with_milliseconds(
|
self.created_at = iso_8601_datetime_with_milliseconds(
|
||||||
@ -1092,7 +1102,7 @@ class DatabaseSnapshot(BaseModel):
|
|||||||
<MasterUsername>{{ database.master_username }}</MasterUsername>
|
<MasterUsername>{{ database.master_username }}</MasterUsername>
|
||||||
<EngineVersion>{{ database.engine_version }}</EngineVersion>
|
<EngineVersion>{{ database.engine_version }}</EngineVersion>
|
||||||
<LicenseModel>{{ database.license_model }}</LicenseModel>
|
<LicenseModel>{{ database.license_model }}</LicenseModel>
|
||||||
<SnapshotType>manual</SnapshotType>
|
<SnapshotType>{{ snapshot.snapshot_type }}</SnapshotType>
|
||||||
{% if database.iops %}
|
{% if database.iops %}
|
||||||
<Iops>{{ database.iops }}</Iops>
|
<Iops>{{ database.iops }}</Iops>
|
||||||
<StorageType>io1</StorageType>
|
<StorageType>io1</StorageType>
|
||||||
@ -1566,10 +1576,20 @@ class RDSBackend(BaseBackend):
|
|||||||
self.databases[database_id] = database
|
self.databases[database_id] = database
|
||||||
return database
|
return database
|
||||||
|
|
||||||
|
def create_auto_snapshot(
|
||||||
|
self,
|
||||||
|
db_instance_identifier: str,
|
||||||
|
db_snapshot_identifier: str,
|
||||||
|
) -> DatabaseSnapshot:
|
||||||
|
return self.create_db_snapshot(
|
||||||
|
db_instance_identifier, db_snapshot_identifier, snapshot_type="automated"
|
||||||
|
)
|
||||||
|
|
||||||
def create_db_snapshot(
|
def create_db_snapshot(
|
||||||
self,
|
self,
|
||||||
db_instance_identifier: str,
|
db_instance_identifier: str,
|
||||||
db_snapshot_identifier: str,
|
db_snapshot_identifier: str,
|
||||||
|
snapshot_type: str = "manual",
|
||||||
tags: Optional[List[Dict[str, str]]] = None,
|
tags: Optional[List[Dict[str, str]]] = None,
|
||||||
) -> DatabaseSnapshot:
|
) -> DatabaseSnapshot:
|
||||||
database = self.databases.get(db_instance_identifier)
|
database = self.databases.get(db_instance_identifier)
|
||||||
@ -1585,11 +1605,13 @@ class RDSBackend(BaseBackend):
|
|||||||
tags = list()
|
tags = list()
|
||||||
if database.copy_tags_to_snapshot and not tags:
|
if database.copy_tags_to_snapshot and not tags:
|
||||||
tags = database.get_tags()
|
tags = database.get_tags()
|
||||||
snapshot = DatabaseSnapshot(database, db_snapshot_identifier, tags)
|
snapshot = DatabaseSnapshot(
|
||||||
|
database, db_snapshot_identifier, snapshot_type, tags
|
||||||
|
)
|
||||||
self.database_snapshots[db_snapshot_identifier] = snapshot
|
self.database_snapshots[db_snapshot_identifier] = snapshot
|
||||||
return snapshot
|
return snapshot
|
||||||
|
|
||||||
def copy_database_snapshot(
|
def copy_db_snapshot(
|
||||||
self,
|
self,
|
||||||
source_snapshot_identifier: str,
|
source_snapshot_identifier: str,
|
||||||
target_snapshot_identifier: str,
|
target_snapshot_identifier: str,
|
||||||
@ -1597,24 +1619,17 @@ class RDSBackend(BaseBackend):
|
|||||||
) -> DatabaseSnapshot:
|
) -> DatabaseSnapshot:
|
||||||
if source_snapshot_identifier not in self.database_snapshots:
|
if source_snapshot_identifier not in self.database_snapshots:
|
||||||
raise DBSnapshotNotFoundError(source_snapshot_identifier)
|
raise DBSnapshotNotFoundError(source_snapshot_identifier)
|
||||||
if target_snapshot_identifier in self.database_snapshots:
|
|
||||||
raise DBSnapshotAlreadyExistsError(target_snapshot_identifier)
|
|
||||||
if len(self.database_snapshots) >= int(
|
|
||||||
os.environ.get("MOTO_RDS_SNAPSHOT_LIMIT", "100")
|
|
||||||
):
|
|
||||||
raise SnapshotQuotaExceededError()
|
|
||||||
|
|
||||||
source_snapshot = self.database_snapshots[source_snapshot_identifier]
|
source_snapshot = self.database_snapshots[source_snapshot_identifier]
|
||||||
if tags is None:
|
if tags is None:
|
||||||
tags = source_snapshot.tags
|
tags = source_snapshot.tags
|
||||||
else:
|
else:
|
||||||
tags = self._merge_tags(source_snapshot.tags, tags)
|
tags = self._merge_tags(source_snapshot.tags, tags)
|
||||||
target_snapshot = DatabaseSnapshot(
|
return self.create_db_snapshot(
|
||||||
source_snapshot.database, target_snapshot_identifier, tags
|
db_instance_identifier=source_snapshot.database.db_instance_identifier, # type: ignore
|
||||||
|
db_snapshot_identifier=target_snapshot_identifier,
|
||||||
|
tags=tags,
|
||||||
)
|
)
|
||||||
self.database_snapshots[target_snapshot_identifier] = target_snapshot
|
|
||||||
|
|
||||||
return target_snapshot
|
|
||||||
|
|
||||||
def delete_db_snapshot(self, db_snapshot_identifier: str) -> DatabaseSnapshot:
|
def delete_db_snapshot(self, db_snapshot_identifier: str) -> DatabaseSnapshot:
|
||||||
if db_snapshot_identifier not in self.database_snapshots:
|
if db_snapshot_identifier not in self.database_snapshots:
|
||||||
@ -1738,7 +1753,7 @@ class RDSBackend(BaseBackend):
|
|||||||
if database.status != "available":
|
if database.status != "available":
|
||||||
raise InvalidDBInstanceStateError(db_instance_identifier, "stop")
|
raise InvalidDBInstanceStateError(db_instance_identifier, "stop")
|
||||||
if db_snapshot_identifier:
|
if db_snapshot_identifier:
|
||||||
self.create_db_snapshot(db_instance_identifier, db_snapshot_identifier)
|
self.create_auto_snapshot(db_instance_identifier, db_snapshot_identifier)
|
||||||
database.status = "stopped"
|
database.status = "stopped"
|
||||||
return database
|
return database
|
||||||
|
|
||||||
@ -1771,7 +1786,7 @@ class RDSBackend(BaseBackend):
|
|||||||
"Can't delete Instance with protection enabled"
|
"Can't delete Instance with protection enabled"
|
||||||
)
|
)
|
||||||
if db_snapshot_name:
|
if db_snapshot_name:
|
||||||
self.create_db_snapshot(db_instance_identifier, db_snapshot_name)
|
self.create_auto_snapshot(db_instance_identifier, db_snapshot_name)
|
||||||
database = self.databases.pop(db_instance_identifier)
|
database = self.databases.pop(db_instance_identifier)
|
||||||
if database.is_replica:
|
if database.is_replica:
|
||||||
primary = self.find_db_from_id(database.source_db_identifier) # type: ignore
|
primary = self.find_db_from_id(database.source_db_identifier) # type: ignore
|
||||||
@ -2197,10 +2212,18 @@ class RDSBackend(BaseBackend):
|
|||||||
cluster.replication_source_identifier = None
|
cluster.replication_source_identifier = None
|
||||||
return cluster
|
return cluster
|
||||||
|
|
||||||
|
def create_auto_cluster_snapshot(
|
||||||
|
self, db_cluster_identifier: str, db_snapshot_identifier: str
|
||||||
|
) -> ClusterSnapshot:
|
||||||
|
return self.create_db_cluster_snapshot(
|
||||||
|
db_cluster_identifier, db_snapshot_identifier, snapshot_type="automated"
|
||||||
|
)
|
||||||
|
|
||||||
def create_db_cluster_snapshot(
|
def create_db_cluster_snapshot(
|
||||||
self,
|
self,
|
||||||
db_cluster_identifier: str,
|
db_cluster_identifier: str,
|
||||||
db_snapshot_identifier: str,
|
db_snapshot_identifier: str,
|
||||||
|
snapshot_type: str = "manual",
|
||||||
tags: Optional[List[Dict[str, str]]] = None,
|
tags: Optional[List[Dict[str, str]]] = None,
|
||||||
) -> ClusterSnapshot:
|
) -> ClusterSnapshot:
|
||||||
cluster = self.clusters.get(db_cluster_identifier)
|
cluster = self.clusters.get(db_cluster_identifier)
|
||||||
@ -2216,11 +2239,11 @@ class RDSBackend(BaseBackend):
|
|||||||
tags = list()
|
tags = list()
|
||||||
if cluster.copy_tags_to_snapshot:
|
if cluster.copy_tags_to_snapshot:
|
||||||
tags += cluster.get_tags()
|
tags += cluster.get_tags()
|
||||||
snapshot = ClusterSnapshot(cluster, db_snapshot_identifier, tags)
|
snapshot = ClusterSnapshot(cluster, db_snapshot_identifier, snapshot_type, tags)
|
||||||
self.cluster_snapshots[db_snapshot_identifier] = snapshot
|
self.cluster_snapshots[db_snapshot_identifier] = snapshot
|
||||||
return snapshot
|
return snapshot
|
||||||
|
|
||||||
def copy_cluster_snapshot(
|
def copy_db_cluster_snapshot(
|
||||||
self,
|
self,
|
||||||
source_snapshot_identifier: str,
|
source_snapshot_identifier: str,
|
||||||
target_snapshot_identifier: str,
|
target_snapshot_identifier: str,
|
||||||
@ -2228,22 +2251,17 @@ class RDSBackend(BaseBackend):
|
|||||||
) -> ClusterSnapshot:
|
) -> ClusterSnapshot:
|
||||||
if source_snapshot_identifier not in self.cluster_snapshots:
|
if source_snapshot_identifier not in self.cluster_snapshots:
|
||||||
raise DBClusterSnapshotNotFoundError(source_snapshot_identifier)
|
raise DBClusterSnapshotNotFoundError(source_snapshot_identifier)
|
||||||
if target_snapshot_identifier in self.cluster_snapshots:
|
|
||||||
raise DBClusterSnapshotAlreadyExistsError(target_snapshot_identifier)
|
|
||||||
if len(self.cluster_snapshots) >= int(
|
|
||||||
os.environ.get("MOTO_RDS_SNAPSHOT_LIMIT", "100")
|
|
||||||
):
|
|
||||||
raise SnapshotQuotaExceededError()
|
|
||||||
source_snapshot = self.cluster_snapshots[source_snapshot_identifier]
|
source_snapshot = self.cluster_snapshots[source_snapshot_identifier]
|
||||||
if tags is None:
|
if tags is None:
|
||||||
tags = source_snapshot.tags
|
tags = source_snapshot.tags
|
||||||
else:
|
else:
|
||||||
tags = self._merge_tags(source_snapshot.tags, tags) # type: ignore
|
tags = self._merge_tags(source_snapshot.tags, tags) # type: ignore
|
||||||
target_snapshot = ClusterSnapshot(
|
return self.create_db_cluster_snapshot(
|
||||||
source_snapshot.cluster, target_snapshot_identifier, tags
|
db_cluster_identifier=source_snapshot.cluster.db_cluster_identifier, # type: ignore
|
||||||
|
db_snapshot_identifier=target_snapshot_identifier,
|
||||||
|
tags=tags,
|
||||||
)
|
)
|
||||||
self.cluster_snapshots[target_snapshot_identifier] = target_snapshot
|
|
||||||
return target_snapshot
|
|
||||||
|
|
||||||
def delete_db_cluster_snapshot(
|
def delete_db_cluster_snapshot(
|
||||||
self, db_snapshot_identifier: str
|
self, db_snapshot_identifier: str
|
||||||
@ -2303,7 +2321,7 @@ class RDSBackend(BaseBackend):
|
|||||||
self.remove_from_global_cluster(global_id, cluster_identifier)
|
self.remove_from_global_cluster(global_id, cluster_identifier)
|
||||||
|
|
||||||
if snapshot_name:
|
if snapshot_name:
|
||||||
self.create_db_cluster_snapshot(cluster_identifier, snapshot_name)
|
self.create_auto_cluster_snapshot(cluster_identifier, snapshot_name)
|
||||||
return self.clusters.pop(cluster_identifier)
|
return self.clusters.pop(cluster_identifier)
|
||||||
if cluster_identifier in self.neptune.clusters:
|
if cluster_identifier in self.neptune.clusters:
|
||||||
return self.neptune.delete_db_cluster(cluster_identifier) # type: ignore
|
return self.neptune.delete_db_cluster(cluster_identifier) # type: ignore
|
||||||
|
@ -312,7 +312,7 @@ class RDSResponse(BaseResponse):
|
|||||||
db_snapshot_identifier = self._get_param("DBSnapshotIdentifier")
|
db_snapshot_identifier = self._get_param("DBSnapshotIdentifier")
|
||||||
tags = self.unpack_list_params("Tags", "Tag")
|
tags = self.unpack_list_params("Tags", "Tag")
|
||||||
snapshot = self.backend.create_db_snapshot(
|
snapshot = self.backend.create_db_snapshot(
|
||||||
db_instance_identifier, db_snapshot_identifier, tags
|
db_instance_identifier, db_snapshot_identifier, tags=tags
|
||||||
)
|
)
|
||||||
template = self.response_template(CREATE_SNAPSHOT_TEMPLATE)
|
template = self.response_template(CREATE_SNAPSHOT_TEMPLATE)
|
||||||
return template.render(snapshot=snapshot)
|
return template.render(snapshot=snapshot)
|
||||||
@ -321,7 +321,7 @@ class RDSResponse(BaseResponse):
|
|||||||
source_snapshot_identifier = self._get_param("SourceDBSnapshotIdentifier")
|
source_snapshot_identifier = self._get_param("SourceDBSnapshotIdentifier")
|
||||||
target_snapshot_identifier = self._get_param("TargetDBSnapshotIdentifier")
|
target_snapshot_identifier = self._get_param("TargetDBSnapshotIdentifier")
|
||||||
tags = self.unpack_list_params("Tags", "Tag")
|
tags = self.unpack_list_params("Tags", "Tag")
|
||||||
snapshot = self.backend.copy_database_snapshot(
|
snapshot = self.backend.copy_db_snapshot(
|
||||||
source_snapshot_identifier, target_snapshot_identifier, tags
|
source_snapshot_identifier, target_snapshot_identifier, tags
|
||||||
)
|
)
|
||||||
template = self.response_template(COPY_SNAPSHOT_TEMPLATE)
|
template = self.response_template(COPY_SNAPSHOT_TEMPLATE)
|
||||||
@ -642,7 +642,7 @@ class RDSResponse(BaseResponse):
|
|||||||
db_snapshot_identifier = self._get_param("DBClusterSnapshotIdentifier")
|
db_snapshot_identifier = self._get_param("DBClusterSnapshotIdentifier")
|
||||||
tags = self.unpack_list_params("Tags", "Tag")
|
tags = self.unpack_list_params("Tags", "Tag")
|
||||||
snapshot = self.backend.create_db_cluster_snapshot(
|
snapshot = self.backend.create_db_cluster_snapshot(
|
||||||
db_cluster_identifier, db_snapshot_identifier, tags
|
db_cluster_identifier, db_snapshot_identifier, tags=tags
|
||||||
)
|
)
|
||||||
template = self.response_template(CREATE_CLUSTER_SNAPSHOT_TEMPLATE)
|
template = self.response_template(CREATE_CLUSTER_SNAPSHOT_TEMPLATE)
|
||||||
return template.render(snapshot=snapshot)
|
return template.render(snapshot=snapshot)
|
||||||
@ -655,7 +655,7 @@ class RDSResponse(BaseResponse):
|
|||||||
"TargetDBClusterSnapshotIdentifier"
|
"TargetDBClusterSnapshotIdentifier"
|
||||||
)
|
)
|
||||||
tags = self.unpack_list_params("Tags", "Tag")
|
tags = self.unpack_list_params("Tags", "Tag")
|
||||||
snapshot = self.backend.copy_cluster_snapshot(
|
snapshot = self.backend.copy_db_cluster_snapshot(
|
||||||
source_snapshot_identifier, target_snapshot_identifier, tags
|
source_snapshot_identifier, target_snapshot_identifier, tags
|
||||||
)
|
)
|
||||||
template = self.response_template(COPY_CLUSTER_SNAPSHOT_TEMPLATE)
|
template = self.response_template(COPY_CLUSTER_SNAPSHOT_TEMPLATE)
|
||||||
|
@ -6,8 +6,7 @@ from botocore.exceptions import ClientError
|
|||||||
from moto import mock_rds
|
from moto import mock_rds
|
||||||
|
|
||||||
|
|
||||||
class TestDBInstanceFilters(object):
|
class TestDBInstanceFilters:
|
||||||
|
|
||||||
mock = mock_rds()
|
mock = mock_rds()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -189,8 +188,7 @@ class TestDBInstanceFilters(object):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class TestDBSnapshotFilters(object):
|
class TestDBSnapshotFilters:
|
||||||
|
|
||||||
mock = mock_rds()
|
mock = mock_rds()
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -289,6 +287,18 @@ class TestDBSnapshotFilters(object):
|
|||||||
).get("DBSnapshots")
|
).get("DBSnapshots")
|
||||||
snapshots.should.have.length_of(0)
|
snapshots.should.have.length_of(0)
|
||||||
|
|
||||||
|
def test_snapshot_type_filter(self):
|
||||||
|
snapshots = self.client.describe_db_snapshots(
|
||||||
|
Filters=[{"Name": "snapshot-type", "Values": ["manual"]}]
|
||||||
|
)["DBSnapshots"]
|
||||||
|
for snapshot in snapshots:
|
||||||
|
assert snapshot["SnapshotType"] == "manual"
|
||||||
|
|
||||||
|
snapshots = self.client.describe_db_snapshots(
|
||||||
|
Filters=[{"Name": "snapshot-type", "Values": ["automated"]}]
|
||||||
|
)["DBSnapshots"]
|
||||||
|
assert len(snapshots) == 0
|
||||||
|
|
||||||
def test_multiple_filters(self):
|
def test_multiple_filters(self):
|
||||||
snapshots = self.client.describe_db_snapshots(
|
snapshots = self.client.describe_db_snapshots(
|
||||||
Filters=[
|
Filters=[
|
||||||
@ -373,3 +383,66 @@ class TestDBSnapshotFilters(object):
|
|||||||
ex.value.response["Error"]["Message"].should.equal(
|
ex.value.response["Error"]["Message"].should.equal(
|
||||||
"DBSnapshot db-instance-0-snapshot-0 not found."
|
"DBSnapshot db-instance-0-snapshot-0 not found."
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class TestDBClusterSnapshotFilters:
|
||||||
|
mock = mock_rds()
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def setup_class(cls):
|
||||||
|
cls.mock.start()
|
||||||
|
client = boto3.client("rds", region_name="us-west-2")
|
||||||
|
# We'll set up two instances (one postgres, one mysql)
|
||||||
|
# with two snapshots each.
|
||||||
|
for i in range(2):
|
||||||
|
_id = f"db-cluster-{i}"
|
||||||
|
client.create_db_cluster(
|
||||||
|
DBClusterIdentifier=_id,
|
||||||
|
Engine="postgres",
|
||||||
|
MasterUsername="root",
|
||||||
|
MasterUserPassword="hunter2000",
|
||||||
|
)
|
||||||
|
|
||||||
|
for j in range(2):
|
||||||
|
client.create_db_cluster_snapshot(
|
||||||
|
DBClusterIdentifier=_id,
|
||||||
|
DBClusterSnapshotIdentifier=f"snapshot-{i}-{j}",
|
||||||
|
)
|
||||||
|
cls.client = client
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def teardown_class(cls):
|
||||||
|
try:
|
||||||
|
cls.mock.stop()
|
||||||
|
except RuntimeError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def test_invalid_filter_name_raises_error(self):
|
||||||
|
with pytest.raises(ClientError) as ex:
|
||||||
|
self.client.describe_db_cluster_snapshots(
|
||||||
|
Filters=[{"Name": "invalid-filter-name", "Values": []}]
|
||||||
|
)
|
||||||
|
ex.value.response["Error"]["Code"].should.equal("InvalidParameterValue")
|
||||||
|
ex.value.response["Error"]["Message"].should.equal(
|
||||||
|
"Unrecognized filter name: invalid-filter-name"
|
||||||
|
)
|
||||||
|
|
||||||
|
def test_empty_filter_values_raises_error(self):
|
||||||
|
with pytest.raises(ClientError) as ex:
|
||||||
|
self.client.describe_db_cluster_snapshots(
|
||||||
|
Filters=[{"Name": "snapshot-type", "Values": []}]
|
||||||
|
)
|
||||||
|
ex.value.response["Error"]["Code"].should.equal("InvalidParameterCombination")
|
||||||
|
ex.value.response["Error"]["Message"].should.contain("must not be empty")
|
||||||
|
|
||||||
|
def test_snapshot_type_filter(self):
|
||||||
|
snapshots = self.client.describe_db_cluster_snapshots(
|
||||||
|
Filters=[{"Name": "snapshot-type", "Values": ["manual"]}]
|
||||||
|
)["DBClusterSnapshots"]
|
||||||
|
for snapshot in snapshots:
|
||||||
|
assert snapshot["SnapshotType"] == "manual"
|
||||||
|
|
||||||
|
snapshots = self.client.describe_db_cluster_snapshots(
|
||||||
|
Filters=[{"Name": "snapshot-type", "Values": ["automated"]}]
|
||||||
|
)["DBClusterSnapshots"]
|
||||||
|
assert len(snapshots) == 0
|
||||||
|
@ -914,7 +914,7 @@ def test_delete_database():
|
|||||||
instances = conn.describe_db_instances()
|
instances = conn.describe_db_instances()
|
||||||
list(instances["DBInstances"]).should.have.length_of(0)
|
list(instances["DBInstances"]).should.have.length_of(0)
|
||||||
conn.create_db_instance(
|
conn.create_db_instance(
|
||||||
DBInstanceIdentifier="db-primary-1",
|
DBInstanceIdentifier="db-1",
|
||||||
AllocatedStorage=10,
|
AllocatedStorage=10,
|
||||||
Engine="postgres",
|
Engine="postgres",
|
||||||
DBInstanceClass="db.m1.small",
|
DBInstanceClass="db.m1.small",
|
||||||
@ -927,7 +927,7 @@ def test_delete_database():
|
|||||||
list(instances["DBInstances"]).should.have.length_of(1)
|
list(instances["DBInstances"]).should.have.length_of(1)
|
||||||
|
|
||||||
conn.delete_db_instance(
|
conn.delete_db_instance(
|
||||||
DBInstanceIdentifier="db-primary-1",
|
DBInstanceIdentifier="db-1",
|
||||||
FinalDBSnapshotIdentifier="primary-1-snapshot",
|
FinalDBSnapshotIdentifier="primary-1-snapshot",
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -935,10 +935,9 @@ def test_delete_database():
|
|||||||
list(instances["DBInstances"]).should.have.length_of(0)
|
list(instances["DBInstances"]).should.have.length_of(0)
|
||||||
|
|
||||||
# Saved the snapshot
|
# Saved the snapshot
|
||||||
snapshots = conn.describe_db_snapshots(DBInstanceIdentifier="db-primary-1").get(
|
snapshot = conn.describe_db_snapshots(DBInstanceIdentifier="db-1")["DBSnapshots"][0]
|
||||||
"DBSnapshots"
|
assert snapshot["Engine"] == "postgres"
|
||||||
)
|
assert snapshot["SnapshotType"] == "automated"
|
||||||
snapshots[0].get("Engine").should.equal("postgres")
|
|
||||||
|
|
||||||
|
|
||||||
@mock_rds
|
@mock_rds
|
||||||
@ -1085,7 +1084,8 @@ def test_describe_db_snapshots():
|
|||||||
DBInstanceIdentifier="db-primary-1", DBSnapshotIdentifier="snapshot-1"
|
DBInstanceIdentifier="db-primary-1", DBSnapshotIdentifier="snapshot-1"
|
||||||
).get("DBSnapshot")
|
).get("DBSnapshot")
|
||||||
|
|
||||||
created.get("Engine").should.equal("postgres")
|
assert created["Engine"] == "postgres"
|
||||||
|
assert created["SnapshotType"] == "manual"
|
||||||
|
|
||||||
by_database_id = conn.describe_db_snapshots(
|
by_database_id = conn.describe_db_snapshots(
|
||||||
DBInstanceIdentifier="db-primary-1"
|
DBInstanceIdentifier="db-primary-1"
|
||||||
@ -1096,8 +1096,7 @@ def test_describe_db_snapshots():
|
|||||||
by_snapshot_id.should.equal(by_database_id)
|
by_snapshot_id.should.equal(by_database_id)
|
||||||
|
|
||||||
snapshot = by_snapshot_id[0]
|
snapshot = by_snapshot_id[0]
|
||||||
snapshot.should.equal(created)
|
assert snapshot == created
|
||||||
snapshot.get("Engine").should.equal("postgres")
|
|
||||||
|
|
||||||
conn.create_db_snapshot(
|
conn.create_db_snapshot(
|
||||||
DBInstanceIdentifier="db-primary-1", DBSnapshotIdentifier="snapshot-2"
|
DBInstanceIdentifier="db-primary-1", DBSnapshotIdentifier="snapshot-2"
|
||||||
@ -2508,18 +2507,6 @@ def test_create_db_with_iam_authentication():
|
|||||||
db_instance = database["DBInstance"]
|
db_instance = database["DBInstance"]
|
||||||
db_instance["IAMDatabaseAuthenticationEnabled"].should.equal(True)
|
db_instance["IAMDatabaseAuthenticationEnabled"].should.equal(True)
|
||||||
|
|
||||||
|
|
||||||
@mock_rds
|
|
||||||
def test_create_db_snapshot_with_iam_authentication():
|
|
||||||
conn = boto3.client("rds", region_name="us-west-2")
|
|
||||||
|
|
||||||
conn.create_db_instance(
|
|
||||||
DBInstanceIdentifier="rds",
|
|
||||||
DBInstanceClass="db.t1.micro",
|
|
||||||
Engine="postgres",
|
|
||||||
EnableIAMDatabaseAuthentication=True,
|
|
||||||
)
|
|
||||||
|
|
||||||
snapshot = conn.create_db_snapshot(
|
snapshot = conn.create_db_snapshot(
|
||||||
DBInstanceIdentifier="rds", DBSnapshotIdentifier="snapshot"
|
DBInstanceIdentifier="rds", DBSnapshotIdentifier="snapshot"
|
||||||
).get("DBSnapshot")
|
).get("DBSnapshot")
|
||||||
|
@ -309,9 +309,10 @@ def test_delete_db_cluster_do_snapshot():
|
|||||||
DBClusterIdentifier="cluster-id", FinalDBSnapshotIdentifier="final-snapshot"
|
DBClusterIdentifier="cluster-id", FinalDBSnapshotIdentifier="final-snapshot"
|
||||||
)
|
)
|
||||||
client.describe_db_clusters()["DBClusters"].should.have.length_of(0)
|
client.describe_db_clusters()["DBClusters"].should.have.length_of(0)
|
||||||
snapshots = client.describe_db_cluster_snapshots()["DBClusterSnapshots"]
|
snapshot = client.describe_db_cluster_snapshots()["DBClusterSnapshots"][0]
|
||||||
snapshots[0]["DBClusterIdentifier"].should.equal("cluster-id")
|
assert snapshot["DBClusterIdentifier"] == "cluster-id"
|
||||||
snapshots[0]["DBClusterSnapshotIdentifier"].should.equal("final-snapshot")
|
assert snapshot["DBClusterSnapshotIdentifier"] == "final-snapshot"
|
||||||
|
assert snapshot["SnapshotType"] == "automated"
|
||||||
|
|
||||||
|
|
||||||
@mock_rds
|
@mock_rds
|
||||||
@ -470,9 +471,10 @@ def test_create_db_cluster_snapshot():
|
|||||||
DBClusterIdentifier="db-primary-1", DBClusterSnapshotIdentifier="g-1"
|
DBClusterIdentifier="db-primary-1", DBClusterSnapshotIdentifier="g-1"
|
||||||
).get("DBClusterSnapshot")
|
).get("DBClusterSnapshot")
|
||||||
|
|
||||||
snapshot.get("Engine").should.equal("postgres")
|
assert snapshot["Engine"] == "postgres"
|
||||||
snapshot.get("DBClusterIdentifier").should.equal("db-primary-1")
|
assert snapshot["DBClusterIdentifier"] == "db-primary-1"
|
||||||
snapshot.get("DBClusterSnapshotIdentifier").should.equal("g-1")
|
assert snapshot["DBClusterSnapshotIdentifier"] == "g-1"
|
||||||
|
assert snapshot["SnapshotType"] == "manual"
|
||||||
result = conn.list_tags_for_resource(ResourceName=snapshot["DBClusterSnapshotArn"])
|
result = conn.list_tags_for_resource(ResourceName=snapshot["DBClusterSnapshotArn"])
|
||||||
result["TagList"].should.equal([])
|
result["TagList"].should.equal([])
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user