"""
Autogenerated state module using `pop-create-idem <https://gitlab.com/saltstack/pop/pop-create-idem>`__

hub.exec.boto3.client.elasticache.create_cache_cluster
hub.exec.boto3.client.elasticache.delete_cache_cluster
hub.exec.boto3.client.elasticache.describe_cache_clusters
hub.exec.boto3.client.elasticache.modify_cache_cluster
hub.exec.boto3.client.elasticache.reboot_cache_cluster
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, cache_cluster_id: Text, replication_group_id: Text = None, az_mode: Text = None, preferred_availability_zone: Text = None, preferred_availability_zones: List = None, num_cache_nodes: int = None, cache_node_type: Text = None, engine: Text = None, engine_version: Text = None, cache_parameter_group_name: Text = None, cache_subnet_group_name: Text = None, cache_security_group_names: List = None, security_group_ids: List = None, tags: List = None, snapshot_arns: List = None, snapshot_name: Text = None, preferred_maintenance_window: Text = None, port: int = None, notification_topic_arn: Text = None, auto_minor_version_upgrade: bool = None, snapshot_retention_limit: int = None, snapshot_window: Text = None, auth_token: Text = None, outpost_mode: Text = None, preferred_outpost_arn: Text = None, preferred_outpost_arns: List = None, log_delivery_configurations: List = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates a cluster. All nodes in the cluster run the same protocol-compliant cache engine software, either
    Memcached or Redis. This operation is not supported for Redis (cluster mode enabled) clusters.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        cache_cluster_id(Text): The node group (shard) identifier. This parameter is stored as a lowercase string.  Constraints:
            A name must contain from 1 to 50 alphanumeric characters or hyphens.   The first character must
            be a letter.   A name cannot end with a hyphen or contain two consecutive hyphens.
        replication_group_id(Text, optional): The ID of the replication group to which this cluster should belong. If this parameter is
            specified, the cluster is added to the specified replication group as a read replica; otherwise,
            the cluster is a standalone primary that is not part of any replication group. If the specified
            replication group is Multi-AZ enabled and the Availability Zone is not specified, the cluster is
            created in Availability Zones that provide the best spread of read replicas across Availability
            Zones.  This parameter is only valid if the Engine parameter is redis. Defaults to None.
        az_mode(Text, optional): Specifies whether the nodes in this Memcached cluster are created in a single Availability Zone
            or created across multiple Availability Zones in the cluster's region. This parameter is only
            supported for Memcached clusters. If the AZMode and PreferredAvailabilityZones are not
            specified, ElastiCache assumes single-az mode. Defaults to None.
        preferred_availability_zone(Text, optional): The EC2 Availability Zone in which the cluster is created. All nodes belonging to this cluster
            are placed in the preferred Availability Zone. If you want to create your nodes across multiple
            Availability Zones, use PreferredAvailabilityZones. Default: System chosen Availability Zone. Defaults to None.
        preferred_availability_zones(List, optional): A list of the Availability Zones in which cache nodes are created. The order of the zones in the
            list is not important. This option is only supported on Memcached.  If you are creating your
            cluster in an Amazon VPC (recommended) you can only locate nodes in Availability Zones that are
            associated with the subnets in the selected subnet group. The number of Availability Zones
            listed must equal the value of NumCacheNodes.  If you want all the nodes in the same
            Availability Zone, use PreferredAvailabilityZone instead, or repeat the Availability Zone
            multiple times in the list. Default: System chosen Availability Zones. Defaults to None.
        num_cache_nodes(int, optional): The initial number of cache nodes that the cluster has. For clusters running Redis, this value
            must be 1. For clusters running Memcached, this value must be between 1 and 40. If you need more
            than 40 nodes for your Memcached cluster, please fill out the ElastiCache Limit Increase Request
            form at http://aws.amazon.com/contact-us/elasticache-node-limit-request/. Defaults to None.
        cache_node_type(Text, optional): The compute and memory capacity of the nodes in the node group (shard). The following node types
            are supported by ElastiCache. Generally speaking, the current generation types provide more
            memory and computational power at lower cost when compared to their equivalent previous
            generation counterparts.   General purpose:   Current generation:   M6g node types (available
            only for Redis engine version 5.0.6 onward and for Memcached engine version 1.5.16 onward).
            cache.m6g.large, cache.m6g.xlarge, cache.m6g.2xlarge, cache.m6g.4xlarge, cache.m6g.8xlarge,
            cache.m6g.12xlarge, cache.m6g.16xlarge   For region availability, see Supported Node Types    M5
            node types: cache.m5.large, cache.m5.xlarge, cache.m5.2xlarge, cache.m5.4xlarge,
            cache.m5.12xlarge, cache.m5.24xlarge   M4 node types: cache.m4.large, cache.m4.xlarge,
            cache.m4.2xlarge, cache.m4.4xlarge, cache.m4.10xlarge   T3 node types: cache.t3.micro,
            cache.t3.small, cache.t3.medium   T2 node types: cache.t2.micro, cache.t2.small, cache.t2.medium
            Previous generation: (not recommended)  T1 node types: cache.t1.micro   M1 node types:
            cache.m1.small, cache.m1.medium, cache.m1.large, cache.m1.xlarge   M3 node types:
            cache.m3.medium, cache.m3.large, cache.m3.xlarge, cache.m3.2xlarge      Compute optimized:
            Previous generation: (not recommended)  C1 node types: cache.c1.xlarge      Memory optimized:
            Current generation:   R6g node types (available only for Redis engine version 5.0.6 onward and
            for Memcached engine version 1.5.16 onward).  cache.r6g.large, cache.r6g.xlarge,
            cache.r6g.2xlarge, cache.r6g.4xlarge, cache.r6g.8xlarge, cache.r6g.12xlarge, cache.r6g.16xlarge
            For region availability, see Supported Node Types    R5 node types: cache.r5.large,
            cache.r5.xlarge, cache.r5.2xlarge, cache.r5.4xlarge, cache.r5.12xlarge, cache.r5.24xlarge   R4
            node types: cache.r4.large, cache.r4.xlarge, cache.r4.2xlarge, cache.r4.4xlarge,
            cache.r4.8xlarge, cache.r4.16xlarge    Previous generation: (not recommended)  M2 node types:
            cache.m2.xlarge, cache.m2.2xlarge, cache.m2.4xlarge   R3 node types: cache.r3.large,
            cache.r3.xlarge, cache.r3.2xlarge, cache.r3.4xlarge, cache.r3.8xlarge       Additional node type
            info    All current generation instance types are created in Amazon VPC by default.   Redis
            append-only files (AOF) are not supported for T1 or T2 instances.   Redis Multi-AZ with
            automatic failover is not supported on T1 instances.   Redis configuration variables appendonly
            and appendfsync are not supported on Redis version 2.8.22 and later. Defaults to None.
        engine(Text, optional): The name of the cache engine to be used for this cluster. Valid values for this parameter are:
            memcached | redis. Defaults to None.
        engine_version(Text, optional): The version number of the cache engine to be used for this cluster. To view the supported cache
            engine versions, use the DescribeCacheEngineVersions operation.  Important: You can upgrade to a
            newer engine version (see Selecting a Cache Engine and Version), but you cannot downgrade to an
            earlier engine version. If you want to use an earlier engine version, you must delete the
            existing cluster or replication group and create it anew with the earlier engine version. Defaults to None.
        cache_parameter_group_name(Text, optional): The name of the parameter group to associate with this cluster. If this argument is omitted, the
            default parameter group for the specified engine is used. You cannot use any parameter group
            which has cluster-enabled='yes' when creating a cluster. Defaults to None.
        cache_subnet_group_name(Text, optional): The name of the subnet group to be used for the cluster. Use this parameter only when you are
            creating a cluster in an Amazon Virtual Private Cloud (Amazon VPC).  If you're going to launch
            your cluster in an Amazon VPC, you need to create a subnet group before you start creating a
            cluster. For more information, see Subnets and Subnet Groups. Defaults to None.
        cache_security_group_names(List, optional): A list of security group names to associate with this cluster. Use this parameter only when you
            are creating a cluster outside of an Amazon Virtual Private Cloud (Amazon VPC). Defaults to None.
        security_group_ids(List, optional): One or more VPC security groups associated with the cluster. Use this parameter only when you
            are creating a cluster in an Amazon Virtual Private Cloud (Amazon VPC). Defaults to None.
        tags(List, optional): A list of tags to be added to this resource. Defaults to None.
        snapshot_arns(List, optional): A single-element string list containing an Amazon Resource Name (ARN) that uniquely identifies a
            Redis RDB snapshot file stored in Amazon S3. The snapshot file is used to populate the node
            group (shard). The Amazon S3 object name in the ARN cannot contain any commas.  This parameter
            is only valid if the Engine parameter is redis.  Example of an Amazon S3 ARN:
            arn:aws:s3:::my_bucket/snapshot1.rdb. Defaults to None.
        snapshot_name(Text, optional): The name of a Redis snapshot from which to restore data into the new node group (shard). The
            snapshot status changes to restoring while the new node group (shard) is being created.  This
            parameter is only valid if the Engine parameter is redis. Defaults to None.
        preferred_maintenance_window(Text, optional): Specifies the weekly time range during which maintenance on the cluster is performed. It is
            specified as a range in the format ddd:hh24:mi-ddd:hh24:mi (24H Clock UTC). The minimum
            maintenance window is a 60 minute period. Valid values for ddd are:. Defaults to None.
        port(int, optional): The port number on which each of the cache nodes accepts connections. Defaults to None.
        notification_topic_arn(Text, optional): The Amazon Resource Name (ARN) of the Amazon Simple Notification Service (SNS) topic to which
            notifications are sent.  The Amazon SNS topic owner must be the same as the cluster owner. Defaults to None.
        auto_minor_version_upgrade(bool, optional): This parameter is currently disabled. Defaults to None.
        snapshot_retention_limit(int, optional): The number of days for which ElastiCache retains automatic snapshots before deleting them. For
            example, if you set SnapshotRetentionLimit to 5, a snapshot taken today is retained for 5 days
            before being deleted.  This parameter is only valid if the Engine parameter is redis.  Default:
            0 (i.e., automatic backups are disabled for this cache cluster). Defaults to None.
        snapshot_window(Text, optional): The daily time range (in UTC) during which ElastiCache begins taking a daily snapshot of your
            node group (shard). Example: 05:00-09:00  If you do not specify this parameter, ElastiCache
            automatically chooses an appropriate time range.  This parameter is only valid if the Engine
            parameter is redis. Defaults to None.
        auth_token(Text, optional):  Reserved parameter. The password used to access a password protected server. Password
            constraints:   Must be only printable ASCII characters.   Must be at least 16 characters and no
            more than 128 characters in length.   The only permitted printable special characters are !, &,
            #, $, ^, <, >, and -. Other printable special characters cannot be used in the AUTH token.   For
            more information, see AUTH password at http://redis.io/commands/AUTH. Defaults to None.
        outpost_mode(Text, optional): Specifies whether the nodes in the cluster are created in a single outpost or across multiple
            outposts. Defaults to None.
        preferred_outpost_arn(Text, optional): The outpost ARN in which the cache cluster is created. Defaults to None.
        preferred_outpost_arns(List, optional): The outpost ARNs in which the cache cluster is created. Defaults to None.
        log_delivery_configurations(List, optional): Specifies the destination, format and type of the logs. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.elasticache.cache_cluster.present:
                - name: value
                - cache_cluster_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.elasticache.cache_cluster.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    
    before = await hub.exec.boto3.client.elasticache.describe_cache_clusters(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.elasticache.create_cache_cluster(
                ctx,
                
                
                **{"CacheClusterId": cache_cluster_id, "ReplicationGroupId": replication_group_id, "AZMode": az_mode, "PreferredAvailabilityZone": preferred_availability_zone, "PreferredAvailabilityZones": preferred_availability_zones, "NumCacheNodes": num_cache_nodes, "CacheNodeType": cache_node_type, "Engine": engine, "EngineVersion": engine_version, "CacheParameterGroupName": cache_parameter_group_name, "CacheSubnetGroupName": cache_subnet_group_name, "CacheSecurityGroupNames": cache_security_group_names, "SecurityGroupIds": security_group_ids, "Tags": tags, "SnapshotArns": snapshot_arns, "SnapshotName": snapshot_name, "PreferredMaintenanceWindow": preferred_maintenance_window, "Port": port, "NotificationTopicArn": notification_topic_arn, "AutoMinorVersionUpgrade": auto_minor_version_upgrade, "SnapshotRetentionLimit": snapshot_retention_limit, "SnapshotWindow": snapshot_window, "AuthToken": auth_token, "OutpostMode": outpost_mode, "PreferredOutpostArn": preferred_outpost_arn, "PreferredOutpostArns": preferred_outpost_arns, "LogDeliveryConfigurations": log_delivery_configurations}
            )
            result["result"] = ret["status"]
            if not result["result"]:
                result["comment"] = ret["comment"]
                return result
            ret["comment"] = f"Created '{name}'"
        except hub.tool.boto3.exception.ClientError as e:
            result["comment"] = f"{e.__class__.__name__}: {e}"

    
    # TODO perform other modifications as needed here
    ...

    after = await hub.exec.boto3.client.elasticache.describe_cache_clusters(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, cache_cluster_id: Text, final_snapshot_identifier: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a previously provisioned cluster. DeleteCacheCluster deletes all associated cache nodes, node endpoints
    and the cluster itself. When you receive a successful response from this operation, Amazon ElastiCache
    immediately begins deleting the cluster; you cannot cancel or revert this operation. This operation is not valid
    for:   Redis (cluster mode enabled) clusters   Redis (cluster mode disabled) clusters   A cluster that is the
    last read replica of a replication group   A cluster that is the primary node of a replication group   A node
    group (shard) that has Multi-AZ mode enabled   A cluster from a Redis (cluster mode enabled) replication group
    A cluster that is not in the available state

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        cache_cluster_id(Text): The cluster identifier for the cluster to be deleted. This parameter is not case sensitive.
        final_snapshot_identifier(Text, optional): The user-supplied name of a final cluster snapshot. This is the unique name that identifies the
            snapshot. ElastiCache creates the snapshot, and then deletes the cluster immediately afterward. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.elasticache.cache_cluster.absent:
                - name: value
                - cache_cluster_id: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.elasticache.cache_cluster.id(
        ctx,
        jmes_path=name
    )
    if ret["status"]:
        # name is now the first id that matched the JMES search path
        name = ret["ret"]
    

    

    before = await hub.exec.boto3.client.elasticache.describe_cache_clusters(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.elasticache.delete_cache_cluster(
                ctx,
                
                
                **{"CacheClusterId": cache_cluster_id, "FinalSnapshotIdentifier": final_snapshot_identifier}
            )
            result["result"] = ret["status"]
            if not result["result"]:
                result["comment"] = ret["comment"]
                return result
            result["comment"] = f"Deleted '{name}'"
        except hub.tool.boto3.exception.ClientError as e:
            result["comment"] = f"{e.__class__.__name__}: {e}"

    

    after = await hub.exec.boto3.client.elasticache.describe_cache_clusters(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

