예제 #1
0
class NukeSnapshot:
    """Abstract ec2 snpashot in a class."""
    def __init__(self, region_name=None) -> None:
        """Initialize snpashot nuke."""
        self.ec2 = AwsClient().connect("ec2", region_name)

    def nuke(self, older_than_seconds: float) -> None:
        """Ec2 snapshot deleting function.

        Delete all snapshot present on the current aws account.

        :param int older_than_seconds:
            The timestamp in seconds used from which the aws resource
            will be deleted
        """
        for snapshot_id in self.list_snapshot(older_than_seconds):
            try:
                self.ec2.delete_snapshot(SnapshotId=snapshot_id)
                print("Nuke snapshot {0}".format(snapshot_id))
            except ClientError as exc:
                nuke_exceptions("ec2 snapshot", snapshot_id, exc)

    def list_snapshot(self, time_delete: float) -> Iterator[str]:
        """Snapshot list function.

        List the IDs of all snapshot owner with a timestamp lower
        than time_delete.

        :param int time_delete:
            Timestamp in seconds used for filter AMI

        :yield Iterator[str]:
            AMI IDs
        """
        paginator = self.ec2.get_paginator("describe_snapshots")

        for page in paginator.paginate(OwnerIds=["self"]):
            for snapshot in page["Snapshots"]:
                if snapshot["StartTime"].timestamp() < time_delete:
                    yield snapshot["SnapshotId"]
class NukeElasticache:
    """Abstract elasticache nuke in a class."""
    def __init__(self, region_name=None) -> None:
        """Initialize elasticache nuke."""
        self.elasticache = AwsClient().connect("elasticache", region_name)

        try:
            self.elasticache.describe_cache_clusters()
        except EndpointConnectionError:
            print("Elasticache resource is not available in this aws region")
            return

    def nuke(self, older_than_seconds: float) -> None:
        """Elasticache resources deleting function.

        Deleting all elasticache resources with
        a timestamp greater than older_than_seconds.
        That include:
          - clusters
          - snapshots
          - subnets
          - param groups

        :param int older_than_seconds:
            The timestamp in seconds used from which the aws
            resource will be deleted
        """
        self.nuke_clusters(older_than_seconds)
        self.nuke_snapshots(older_than_seconds)
        self.nuke_subnets()
        self.nuke_param_groups()

    def nuke_clusters(self, time_delete: float) -> None:
        """Elasticache cluster deleting function.

        Deleting elasticache cluster with a timestamp lower than
        time_delete.

        :param int older_than_seconds:
            The timestamp in seconds used from which the aws resource
            will be deleted
        """
        for cluster in self.list_clusters(time_delete):
            try:
                self.elasticache.delete_cache_cluster(CacheClusterId=cluster)
                print("Nuke elasticache cluster {0}".format(cluster))
            except ClientError as exc:
                nuke_exceptions("elasticache cluster", cluster, exc)

    def nuke_snapshots(self, time_delete: float) -> None:
        """Elasticache snapshot deleting function.

        Deleting elasticache snapshot with a timestamp lower than
        time_delete.

        :param int older_than_seconds:
            The timestamp in seconds used from which the aws resource
            will be deleted
        """
        for snapshot in self.list_snapshots(time_delete):
            try:
                self.elasticache.delete_snapshot(SnapshotName=snapshot)
                print("Nuke elasticache snapshot {0}".format(snapshot))
            except ClientError as exc:
                nuke_exceptions("elasticache snapshot", snapshot, exc)

    def nuke_subnets(self) -> None:
        """Elasticache subnet deleting function.

        Deleting elasticache subnets
        """
        for subnet in self.list_subnets():

            try:
                self.elasticache.delete_cache_subnet_group(
                    CacheSubnetGroupName=subnet)
                print("Nuke elasticache subnet{0}".format(subnet))
            except ClientError as exc:
                nuke_exceptions("elasticache subnet", subnet, exc)

    def nuke_param_groups(self) -> None:
        """Elasticache param group deleting function.

        Deleting elasticache parameter groups
        """
        for param in self.list_param_groups():
            try:
                self.elasticache.delete_cache_parameter_group(
                    CacheParameterGroupName=param)
                print("Nuke elasticache param {0}".format(param))
            except ClientError as exc:
                nuke_exceptions("elasticache param", param, exc)

    def list_clusters(self, time_delete: float) -> Iterator[str]:
        """Elasticache cluster list function.

        List IDs of all elasticache clusters with a timestamp
        lower than time_delete.

        :param int time_delete:
            Timestamp in seconds used for filter elasticache clusters

        :yield Iterator[str]:
            Elasticache clusters IDs
        """
        paginator = self.elasticache.get_paginator("describe_cache_clusters")

        for page in paginator.paginate():
            for cluster in page["CacheClusters"]:
                if cluster["CacheClusterCreateTime"].timestamp() < time_delete:
                    yield cluster["CacheClusterId"]

    def list_snapshots(self, time_delete: float) -> Iterator[str]:
        """Elasticache snapshots list function.

        List names of all elasticache snapshots with a timestamp
        lower than time_delete.

        :param int time_delete:
            Timestamp in seconds used for filter elasticache snapshots

        :yield Iterator[str]:
            Elasticache snpashots names
        """
        paginator = self.elasticache.get_paginator("describe_snapshots")

        for page in paginator.paginate():
            for snapshot in page["Snapshots"]:
                date_snap = snapshot["NodeSnapshots"][0]["SnapshotCreateTime"]
                if date_snap.timestamp() < time_delete:
                    yield snapshot["SnapshotName"]

    def list_subnets(self) -> Iterator[str]:
        """Elasticache subnet list function.

        List elasticache subnet group names

        :yield Iterator[str]:
            Elasticache subnet group names
        """
        paginator = self.elasticache.get_paginator(
            "describe_cache_subnet_groups")

        for page in paginator.paginate():
            for subnet in page["CacheSubnetGroups"]:
                yield subnet["CacheSubnetGroupName"]

    def list_param_groups(self) -> Iterator[str]:
        """Elasticache parameters group list function.

        List elasticache param group names

        :yield Iterator[str]:
            Elasticache param group names
        """
        paginator = self.elasticache.get_paginator(
            "describe_cache_parameter_groups")

        for page in paginator.paginate():
            for param_group in page["CacheParameterGroups"]:
                yield param_group["CacheParameterGroupName"]