Updated delete_cluster() for redshift (#2186)
* Updated the deprecated decorator to allow the "SkipFinalClusterSnapshot" option that aws supports. * FIxed logical mistake on the delete_cluster * Removed an unused exception I put in
This commit is contained in:
parent
8cb4db1896
commit
1fd71fd45a
@ -531,14 +531,37 @@ class RedshiftBackend(BaseBackend):
|
|||||||
setattr(cluster, key, value)
|
setattr(cluster, key, value)
|
||||||
|
|
||||||
if new_cluster_identifier:
|
if new_cluster_identifier:
|
||||||
self.delete_cluster(cluster_identifier)
|
dic = {
|
||||||
|
"cluster_identifier": cluster_identifier,
|
||||||
|
"skip_final_snapshot": True,
|
||||||
|
"final_cluster_snapshot_identifier": None
|
||||||
|
}
|
||||||
|
self.delete_cluster(**dic)
|
||||||
cluster.cluster_identifier = new_cluster_identifier
|
cluster.cluster_identifier = new_cluster_identifier
|
||||||
self.clusters[new_cluster_identifier] = cluster
|
self.clusters[new_cluster_identifier] = cluster
|
||||||
|
|
||||||
return cluster
|
return cluster
|
||||||
|
|
||||||
def delete_cluster(self, cluster_identifier):
|
def delete_cluster(self, **cluster_kwargs):
|
||||||
|
cluster_identifier = cluster_kwargs.pop("cluster_identifier")
|
||||||
|
cluster_skip_final_snapshot = cluster_kwargs.pop("skip_final_snapshot")
|
||||||
|
cluster_snapshot_identifer = cluster_kwargs.pop("final_cluster_snapshot_identifier")
|
||||||
|
|
||||||
if cluster_identifier in self.clusters:
|
if cluster_identifier in self.clusters:
|
||||||
|
if cluster_skip_final_snapshot is False and cluster_snapshot_identifer is None:
|
||||||
|
raise ClientError(
|
||||||
|
"InvalidParameterValue",
|
||||||
|
'FinalSnapshotIdentifier is required for Snapshot copy '
|
||||||
|
'when SkipFinalSnapshot is False'
|
||||||
|
)
|
||||||
|
elif cluster_skip_final_snapshot is False and cluster_snapshot_identifer is not None: # create snapshot
|
||||||
|
cluster = self.describe_clusters(cluster_identifier)[0]
|
||||||
|
self.create_cluster_snapshot(
|
||||||
|
cluster_identifier,
|
||||||
|
cluster_snapshot_identifer,
|
||||||
|
cluster.region,
|
||||||
|
cluster.tags)
|
||||||
|
|
||||||
return self.clusters.pop(cluster_identifier)
|
return self.clusters.pop(cluster_identifier)
|
||||||
raise ClusterNotFoundError(cluster_identifier)
|
raise ClusterNotFoundError(cluster_identifier)
|
||||||
|
|
||||||
|
@ -240,8 +240,13 @@ class RedshiftResponse(BaseResponse):
|
|||||||
})
|
})
|
||||||
|
|
||||||
def delete_cluster(self):
|
def delete_cluster(self):
|
||||||
cluster_identifier = self._get_param("ClusterIdentifier")
|
request_kwargs = {
|
||||||
cluster = self.redshift_backend.delete_cluster(cluster_identifier)
|
"cluster_identifier": self._get_param("ClusterIdentifier"),
|
||||||
|
"final_cluster_snapshot_identifier": self._get_param("FinalClusterSnapshotIdentifier"),
|
||||||
|
"skip_final_snapshot": self._get_bool_param("SkipFinalClusterSnapshot")
|
||||||
|
}
|
||||||
|
|
||||||
|
cluster = self.redshift_backend.delete_cluster(**request_kwargs)
|
||||||
|
|
||||||
return self.get_response({
|
return self.get_response({
|
||||||
"DeleteClusterResponse": {
|
"DeleteClusterResponse": {
|
||||||
|
@ -9,7 +9,7 @@ from boto.redshift.exceptions import (
|
|||||||
ClusterParameterGroupNotFound,
|
ClusterParameterGroupNotFound,
|
||||||
ClusterSecurityGroupNotFound,
|
ClusterSecurityGroupNotFound,
|
||||||
ClusterSubnetGroupNotFound,
|
ClusterSubnetGroupNotFound,
|
||||||
InvalidSubnet,
|
InvalidSubnet
|
||||||
)
|
)
|
||||||
from botocore.exceptions import (
|
from botocore.exceptions import (
|
||||||
ClientError
|
ClientError
|
||||||
@ -339,7 +339,7 @@ def test_create_cluster_with_vpc_security_groups_boto3():
|
|||||||
|
|
||||||
@mock_redshift
|
@mock_redshift
|
||||||
def test_create_cluster_with_iam_roles():
|
def test_create_cluster_with_iam_roles():
|
||||||
iam_roles_arn = ['arn:aws:iam:::role/my-iam-role',]
|
iam_roles_arn = ['arn:aws:iam:::role/my-iam-role', ]
|
||||||
client = boto3.client('redshift', region_name='us-east-1')
|
client = boto3.client('redshift', region_name='us-east-1')
|
||||||
cluster_id = 'my_cluster'
|
cluster_id = 'my_cluster'
|
||||||
client.create_cluster(
|
client.create_cluster(
|
||||||
@ -385,29 +385,41 @@ def test_describe_non_existent_cluster():
|
|||||||
conn.describe_clusters.when.called_with(
|
conn.describe_clusters.when.called_with(
|
||||||
"not-a-cluster").should.throw(ClusterNotFound)
|
"not-a-cluster").should.throw(ClusterNotFound)
|
||||||
|
|
||||||
|
|
||||||
@mock_redshift_deprecated
|
@mock_redshift_deprecated
|
||||||
def test_delete_cluster():
|
def test_delete_cluster():
|
||||||
conn = boto.connect_redshift()
|
conn = boto.connect_redshift()
|
||||||
cluster_identifier = 'my_cluster'
|
cluster_identifier = "my_cluster"
|
||||||
|
snapshot_identifier = "my_snapshot"
|
||||||
|
|
||||||
conn.create_cluster(
|
conn.create_cluster(
|
||||||
cluster_identifier,
|
cluster_identifier,
|
||||||
node_type='single-node',
|
node_type="single-node",
|
||||||
master_username="username",
|
master_username="username",
|
||||||
master_user_password="password",
|
master_user_password="password",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
conn.delete_cluster.when.called_with(cluster_identifier, False).should.throw(AttributeError)
|
||||||
|
|
||||||
clusters = conn.describe_clusters()['DescribeClustersResponse'][
|
clusters = conn.describe_clusters()['DescribeClustersResponse'][
|
||||||
'DescribeClustersResult']['Clusters']
|
'DescribeClustersResult']['Clusters']
|
||||||
list(clusters).should.have.length_of(1)
|
list(clusters).should.have.length_of(1)
|
||||||
|
|
||||||
conn.delete_cluster(cluster_identifier)
|
conn.delete_cluster(
|
||||||
|
cluster_identifier=cluster_identifier,
|
||||||
|
skip_final_cluster_snapshot=False,
|
||||||
|
final_cluster_snapshot_identifier=snapshot_identifier
|
||||||
|
)
|
||||||
|
|
||||||
clusters = conn.describe_clusters()['DescribeClustersResponse'][
|
clusters = conn.describe_clusters()['DescribeClustersResponse'][
|
||||||
'DescribeClustersResult']['Clusters']
|
'DescribeClustersResult']['Clusters']
|
||||||
list(clusters).should.have.length_of(0)
|
list(clusters).should.have.length_of(0)
|
||||||
|
|
||||||
|
snapshots = conn.describe_cluster_snapshots()["DescribeClusterSnapshotsResponse"][
|
||||||
|
"DescribeClusterSnapshotsResult"]["Snapshots"]
|
||||||
|
list(snapshots).should.have.length_of(1)
|
||||||
|
|
||||||
|
assert snapshot_identifier in snapshots[0]["SnapshotIdentifier"]
|
||||||
|
|
||||||
# Delete invalid id
|
# Delete invalid id
|
||||||
conn.delete_cluster.when.called_with(
|
conn.delete_cluster.when.called_with(
|
||||||
"not-a-cluster").should.throw(ClusterNotFound)
|
"not-a-cluster").should.throw(ClusterNotFound)
|
||||||
@ -643,7 +655,6 @@ def test_delete_cluster_parameter_group():
|
|||||||
"not-a-parameter-group").should.throw(ClusterParameterGroupNotFound)
|
"not-a-parameter-group").should.throw(ClusterParameterGroupNotFound)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@mock_redshift
|
@mock_redshift
|
||||||
def test_create_cluster_snapshot_of_non_existent_cluster():
|
def test_create_cluster_snapshot_of_non_existent_cluster():
|
||||||
client = boto3.client('redshift', region_name='us-east-1')
|
client = boto3.client('redshift', region_name='us-east-1')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user