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

hub.exec.boto3.client.ecs.deregister_task_definition
hub.exec.boto3.client.ecs.describe_task_definition
hub.exec.boto3.client.ecs.list_task_definitions
hub.exec.boto3.client.ecs.register_task_definition
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, family: Text, container_definitions: List, task_role_arn: Text = None, execution_role_arn: Text = None, network_mode: Text = None, volumes: List = None, placement_constraints: List = None, requires_compatibilities: List = None, cpu: Text = None, memory: Text = None, tags: List = None, pid_mode: Text = None, ipc_mode: Text = None, proxy_configuration: Dict = None, inference_accelerators: List = None, ephemeral_storage: Dict = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Registers a new task definition from the supplied family and containerDefinitions. Optionally, you can add data
    volumes to your containers with the volumes parameter. For more information about task definition parameters and
    defaults, see Amazon ECS Task Definitions in the Amazon Elastic Container Service Developer Guide. You can
    specify an IAM role for your task with the taskRoleArn parameter. When you specify an IAM role for a task, its
    containers can then use the latest versions of the CLI or SDKs to make API requests to the Amazon Web Services
    services that are specified in the IAM policy associated with the role. For more information, see IAM Roles for
    Tasks in the Amazon Elastic Container Service Developer Guide. You can specify a Docker networking mode for the
    containers in your task definition with the networkMode parameter. The available network modes correspond to
    those described in Network settings in the Docker run reference. If you specify the awsvpc network mode, the
    task is allocated an elastic network interface, and you must specify a NetworkConfiguration when you create a
    service or run a task with the task definition. For more information, see Task Networking in the Amazon Elastic
    Container Service Developer Guide.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        family(Text): You must specify a family for a task definition, which allows you to track multiple versions of
            the same task definition. The family is used as a name for your task definition. Up to 255
            letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed.
        task_role_arn(Text, optional): The short name or full Amazon Resource Name (ARN) of the IAM role that containers in this task
            can assume. All containers in this task are granted the permissions that are specified in this
            role. For more information, see IAM Roles for Tasks in the Amazon Elastic Container Service
            Developer Guide. Defaults to None.
        execution_role_arn(Text, optional): The Amazon Resource Name (ARN) of the task execution role that grants the Amazon ECS container
            agent permission to make Amazon Web Services API calls on your behalf. The task execution IAM
            role is required depending on the requirements of your task. For more information, see Amazon
            ECS task execution IAM role in the Amazon Elastic Container Service Developer Guide. Defaults to None.
        network_mode(Text, optional): The Docker networking mode to use for the containers in the task. The valid values are none,
            bridge, awsvpc, and host. If no network mode is specified, the default is bridge. For Amazon ECS
            tasks on Fargate, the awsvpc network mode is required. For Amazon ECS tasks on Amazon EC2 Linux
            instances, any network mode can be used. For Amazon ECS tasks on Amazon EC2 Windows instances,
            <default> or awsvpc can be used. If the network mode is set to none, you cannot specify port
            mappings in your container definitions, and the tasks containers do not have external
            connectivity. The host and awsvpc network modes offer the highest networking performance for
            containers because they use the EC2 network stack instead of the virtualized network stack
            provided by the bridge mode. With the host and awsvpc network modes, exposed container ports are
            mapped directly to the corresponding host port (for the host network mode) or the attached
            elastic network interface port (for the awsvpc network mode), so you cannot take advantage of
            dynamic host port mappings.   When using the host network mode, you should not run containers
            using the root user (UID 0). It is considered best practice to use a non-root user.  If the
            network mode is awsvpc, the task is allocated an elastic network interface, and you must specify
            a NetworkConfiguration value when you create a service or run a task with the task definition.
            For more information, see Task Networking in the Amazon Elastic Container Service Developer
            Guide. If the network mode is host, you cannot run multiple instantiations of the same task on a
            single container instance when port mappings are used. For more information, see Network
            settings in the Docker run reference. Defaults to None.
        container_definitions(List): A list of container definitions in JSON format that describe the different containers that make
            up your task.
        volumes(List, optional): A list of volume definitions in JSON format that containers in your task may use. Defaults to None.
        placement_constraints(List, optional): An array of placement constraint objects to use for the task. You can specify a maximum of 10
            constraints per task (this limit includes constraints in the task definition and those specified
            at runtime). Defaults to None.
        requires_compatibilities(List, optional): The task launch type that Amazon ECS should validate the task definition against. A client
            exception is returned if the task definition doesn't validate against the compatibilities
            specified. If no value is specified, the parameter is omitted from the response. Defaults to None.
        cpu(Text, optional): The number of CPU units used by the task. It can be expressed as an integer using CPU units, for
            example 1024, or as a string using vCPUs, for example 1 vCPU or 1 vcpu, in a task definition.
            String values are converted to an integer indicating the CPU units when the task definition is
            registered.  Task-level CPU and memory parameters are ignored for Windows containers. We
            recommend specifying container-level resources for Windows containers.  If you are using the EC2
            launch type, this field is optional. Supported values are between 128 CPU units (0.125 vCPUs)
            and 10240 CPU units (10 vCPUs). If you are using the Fargate launch type, this field is required
            and you must use one of the following values, which determines your range of supported values
            for the memory parameter:   256 (.25 vCPU) - Available memory values: 512 (0.5 GB), 1024 (1 GB),
            2048 (2 GB)   512 (.5 vCPU) - Available memory values: 1024 (1 GB), 2048 (2 GB), 3072 (3 GB),
            4096 (4 GB)   1024 (1 vCPU) - Available memory values: 2048 (2 GB), 3072 (3 GB), 4096 (4 GB),
            5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB)   2048 (2 vCPU) - Available memory values:
            Between 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB)   4096 (4 vCPU) - Available
            memory values: Between 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB). Defaults to None.
        memory(Text, optional): The amount of memory (in MiB) used by the task. It can be expressed as an integer using MiB, for
            example 1024, or as a string using GB, for example 1GB or 1 GB, in a task definition. String
            values are converted to an integer indicating the MiB when the task definition is registered.
            Task-level CPU and memory parameters are ignored for Windows containers. We recommend specifying
            container-level resources for Windows containers.  If using the EC2 launch type, this field is
            optional. If using the Fargate launch type, this field is required and you must use one of the
            following values, which determines your range of supported values for the cpu parameter:   512
            (0.5 GB), 1024 (1 GB), 2048 (2 GB) - Available cpu values: 256 (.25 vCPU)   1024 (1 GB), 2048 (2
            GB), 3072 (3 GB), 4096 (4 GB) - Available cpu values: 512 (.5 vCPU)   2048 (2 GB), 3072 (3 GB),
            4096 (4 GB), 5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB) - Available cpu values: 1024 (1
            vCPU)   Between 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB) - Available cpu
            values: 2048 (2 vCPU)   Between 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB) -
            Available cpu values: 4096 (4 vCPU). Defaults to None.
        tags(List, optional): The metadata that you apply to the task definition to help you categorize and organize them.
            Each tag consists of a key and an optional value, both of which you define. The following basic
            restrictions apply to tags:   Maximum number of tags per resource - 50   For each resource, each
            tag key must be unique, and each tag key can have only one value.   Maximum key length - 128
            Unicode characters in UTF-8   Maximum value length - 256 Unicode characters in UTF-8   If your
            tagging schema is used across multiple services and resources, remember that other services may
            have restrictions on allowed characters. Generally allowed characters are: letters, numbers, and
            spaces representable in UTF-8, and the following characters: + - = . _ : / @.   Tag keys and
            values are case-sensitive.   Do not use aws:, AWS:, or any upper or lowercase combination of
            such as a prefix for either keys or values as it is reserved for Amazon Web Services use. You
            cannot edit or delete tag keys or values with this prefix. Tags with this prefix do not count
            against your tags per resource limit. Defaults to None.
        pid_mode(Text, optional): The process namespace to use for the containers in the task. The valid values are host or task.
            If host is specified, then all containers within the tasks that specified the host PID mode on
            the same container instance share the same process namespace with the host Amazon EC2 instance.
            If task is specified, all containers within the specified task share the same process namespace.
            If no value is specified, the default is a private namespace. For more information, see PID
            settings in the Docker run reference. If the host PID mode is used, be aware that there is a
            heightened risk of undesired process namespace expose. For more information, see Docker
            security.  This parameter is not supported for Windows containers or tasks run on Fargate. Defaults to None.
        ipc_mode(Text, optional): The IPC resource namespace to use for the containers in the task. The valid values are host,
            task, or none. If host is specified, then all containers within the tasks that specified the
            host IPC mode on the same container instance share the same IPC resources with the host Amazon
            EC2 instance. If task is specified, all containers within the specified task share the same IPC
            resources. If none is specified, then IPC resources within the containers of a task are private
            and not shared with other containers in a task or on the container instance. If no value is
            specified, then the IPC resource namespace sharing depends on the Docker daemon setting on the
            container instance. For more information, see IPC settings in the Docker run reference. If the
            host IPC mode is used, be aware that there is a heightened risk of undesired IPC namespace
            expose. For more information, see Docker security. If you are setting namespaced kernel
            parameters using systemControls for the containers in the task, the following will apply to your
            IPC resource namespace. For more information, see System Controls in the Amazon Elastic
            Container Service Developer Guide.   For tasks that use the host IPC mode, IPC namespace related
            systemControls are not supported.   For tasks that use the task IPC mode, IPC namespace related
            systemControls will apply to all containers within a task.    This parameter is not supported
            for Windows containers or tasks run on Fargate. Defaults to None.
        proxy_configuration(Dict, optional): The configuration details for the App Mesh proxy. For tasks hosted on Amazon EC2 instances, the
            container instances require at least version 1.26.0 of the container agent and at least version
            1.26.0-1 of the ecs-init package to enable a proxy configuration. If your container instances
            are launched from the Amazon ECS-optimized AMI version 20190301 or later, then they contain the
            required versions of the container agent and ecs-init. For more information, see Amazon ECS-
            optimized AMI versions in the Amazon Elastic Container Service Developer Guide. Defaults to None.
        inference_accelerators(List, optional): The Elastic Inference accelerators to use for the containers in the task. Defaults to None.
        ephemeral_storage(Dict, optional): The amount of ephemeral storage to allocate for the task. This parameter is used to expand the
            total amount of ephemeral storage available, beyond the default amount, for tasks hosted on
            Fargate. For more information, see Fargate task storage in the Amazon ECS User Guide for
            Fargate.  This parameter is only supported for tasks hosted on Fargate using platform version
            1.4.0 or later. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.ecs.task_definition.present:
                - name: value
                - family: value
                - container_definitions: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.ecs.task_definition.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.ecs.describe_task_definition(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.ecs.register_task_definition(
                ctx,
                
                
                **{"family": family, "taskRoleArn": task_role_arn, "executionRoleArn": execution_role_arn, "networkMode": network_mode, "containerDefinitions": container_definitions, "volumes": volumes, "placementConstraints": placement_constraints, "requiresCompatibilities": requires_compatibilities, "cpu": cpu, "memory": memory, "tags": tags, "pidMode": pid_mode, "ipcMode": ipc_mode, "proxyConfiguration": proxy_configuration, "inferenceAccelerators": inference_accelerators, "ephemeralStorage": ephemeral_storage}
            )
            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.ecs.describe_task_definition(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, task_definition: Text)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deregisters the specified task definition by family and revision. Upon deregistration, the task definition is
    marked as INACTIVE. Existing tasks and services that reference an INACTIVE task definition continue to run
    without disruption. Existing services that reference an INACTIVE task definition can still scale up or down by
    modifying the service's desired count. You cannot use an INACTIVE task definition to run new tasks or create new
    services, and you cannot update an existing service to reference an INACTIVE task definition. However, there may
    be up to a 10-minute window following deregistration where these restrictions have not yet taken effect.  At
    this time, INACTIVE task definitions remain discoverable in your account indefinitely. However, this behavior is
    subject to change in the future, so you should not rely on INACTIVE task definitions persisting beyond the
    lifecycle of any associated tasks and services.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        task_definition(Text): The family and revision (family:revision) or full Amazon Resource Name (ARN) of the task
            definition to deregister. You must specify a revision.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_absent:
              aws_auto.ecs.task_definition.absent:
                - name: value
                - task_definition: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.ecs.task_definition.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.ecs.describe_task_definition(name)

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.ecs.deregister_task_definition(
                ctx,
                
                
                **{"taskDefinition": task_definition}
            )
            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.ecs.describe_task_definition(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

