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

hub.exec.boto3.client.opsworks.assign_instance
hub.exec.boto3.client.opsworks.create_instance
hub.exec.boto3.client.opsworks.delete_instance
hub.exec.boto3.client.opsworks.deregister_instance
hub.exec.boto3.client.opsworks.describe_instances
hub.exec.boto3.client.opsworks.reboot_instance
hub.exec.boto3.client.opsworks.register_instance
hub.exec.boto3.client.opsworks.start_instance
hub.exec.boto3.client.opsworks.stop_instance
hub.exec.boto3.client.opsworks.unassign_instance
hub.exec.boto3.client.opsworks.update_instance
"""



from typing import *
import dict_tools.differ as differ
async def present(hub, ctx, name: Text, stack_id: Text, layer_ids: List, instance_type: Text, auto_scaling_type: Text = None, hostname: Text = None, os: Text = None, ami_id: Text = None, ssh_key_name: Text = None, availability_zone: Text = None, virtualization_type: Text = None, subnet_id: Text = None, architecture: Text = None, root_device_type: Text = None, block_device_mappings: List = None, install_updates_on_boot: bool = None, ebs_optimized: bool = None, agent_version: Text = None, tenancy: Text = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Creates an instance in a specified stack. For more information, see Adding an Instance to a Layer.  Required
    Permissions: To use this action, an IAM user must have a Manage permissions level for the stack, or an attached
    policy that explicitly grants permissions. For more information on user permissions, see Managing User
    Permissions.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        stack_id(Text): The stack ID.
        layer_ids(List): An array that contains the instance's layer IDs.
        instance_type(Text): The instance type, such as t2.micro. For a list of supported instance types, open the stack in
            the console, choose Instances, and choose + Instance. The Size list contains the currently
            supported types. For more information, see Instance Families and Types. The parameter values
            that you use to specify the various types are in the API Name column of the Available Instance
            Types table.
        auto_scaling_type(Text, optional): For load-based or time-based instances, the type. Windows stacks can use only time-based
            instances. Defaults to None.
        hostname(Text, optional): The instance host name. Defaults to None.
        os(Text, optional): The instance's operating system, which must be set to one of the following.   A supported Linux
            operating system: An Amazon Linux version, such as Amazon Linux 2018.03, Amazon Linux 2017.09,
            Amazon Linux 2017.03, Amazon Linux 2016.09, Amazon Linux 2016.03, Amazon Linux 2015.09, or
            Amazon Linux 2015.03.   A supported Ubuntu operating system, such as Ubuntu 16.04 LTS, Ubuntu
            14.04 LTS, or Ubuntu 12.04 LTS.    CentOS Linux 7     Red Hat Enterprise Linux 7    A supported
            Windows operating system, such as Microsoft Windows Server 2012 R2 Base, Microsoft Windows
            Server 2012 R2 with SQL Server Express, Microsoft Windows Server 2012 R2 with SQL Server
            Standard, or Microsoft Windows Server 2012 R2 with SQL Server Web.   A custom AMI: Custom.   For
            more information about the supported operating systems, see AWS OpsWorks Stacks Operating
            Systems. The default option is the current Amazon Linux version. If you set this parameter to
            Custom, you must use the CreateInstance action's AmiId parameter to specify the custom AMI that
            you want to use. Block device mappings are not supported if the value is Custom. For more
            information about supported operating systems, see Operating SystemsFor more information about
            how to use custom AMIs with AWS OpsWorks Stacks, see Using Custom AMIs. Defaults to None.
        ami_id(Text, optional): A custom AMI ID to be used to create the instance. The AMI should be based on one of the
            supported operating systems. For more information, see Using Custom AMIs.  If you specify a
            custom AMI, you must set Os to Custom. Defaults to None.
        ssh_key_name(Text, optional): The instance's Amazon EC2 key-pair name. Defaults to None.
        availability_zone(Text, optional): The instance Availability Zone. For more information, see Regions and Endpoints. Defaults to None.
        virtualization_type(Text, optional): The instance's virtualization type, paravirtual or hvm. Defaults to None.
        subnet_id(Text, optional): The ID of the instance's subnet. If the stack is running in a VPC, you can use this parameter to
            override the stack's default subnet ID value and direct AWS OpsWorks Stacks to launch the
            instance in a different subnet. Defaults to None.
        architecture(Text, optional): The instance architecture. The default option is x86_64. Instance types do not necessarily
            support both architectures. For a list of the architectures that are supported by the different
            instance types, see Instance Families and Types. Defaults to None.
        root_device_type(Text, optional): The instance root device type. For more information, see Storage for the Root Device. Defaults to None.
        block_device_mappings(List, optional): An array of BlockDeviceMapping objects that specify the instance's block devices. For more
            information, see Block Device Mapping. Note that block device mappings are not supported for
            custom AMIs. Defaults to None.
        install_updates_on_boot(bool, optional): Whether to install operating system and package updates when the instance boots. The default
            value is true. To control when updates are installed, set this value to false. You must then
            update your instances manually by using CreateDeployment to run the update_dependencies stack
            command or by manually running yum (Amazon Linux) or apt-get (Ubuntu) on the instances.   We
            strongly recommend using the default value of true to ensure that your instances have the latest
            security updates. Defaults to None.
        ebs_optimized(bool, optional): Whether to create an Amazon EBS-optimized instance. Defaults to None.
        agent_version(Text, optional): The default AWS OpsWorks Stacks agent version. You have the following options:    INHERIT - Use
            the stack's default agent version setting.    version_number - Use the specified agent version.
            This value overrides the stack's default setting. To update the agent version, edit the instance
            configuration and specify a new version. AWS OpsWorks Stacks then automatically installs that
            version on the instance.   The default setting is INHERIT. To specify an agent version, you must
            use the complete version number, not the abbreviated number shown on the console. For a list of
            available agent version numbers, call DescribeAgentVersions. AgentVersion cannot be set to Chef
            12.2. Defaults to None.
        tenancy(Text, optional): The instance's tenancy option. The default option is no tenancy, or if the instance is running
            in a VPC, inherit tenancy settings from the VPC. The following are valid values for this
            parameter: dedicated, default, or host. Because there are costs associated with changes in
            tenancy options, we recommend that you research tenancy options before choosing them for your
            instances. For more information about dedicated hosts, see Dedicated Hosts Overview and Amazon
            EC2 Dedicated Hosts. For more information about dedicated instances, see Dedicated Instances and
            Amazon EC2 Dedicated Instances. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

            resource_is_present:
              aws_auto.opsworks.instance.present:
                - name: value
                - stack_id: value
                - layer_ids: value
                - instance_type: value
    '''
    
    result = dict(comment="", changes= None, name=name, result=True)
    ret = await hub.exec.boto3.client.opsworks.instance.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.opsworks.describe_instances(name)

    if before:
        result["comment"] = f"'{name}' already exists"
    else:
        try:
            ret = await hub.exec.boto3.client.opsworks.create_instance(
                ctx,
                
                
                **{"StackId": stack_id, "LayerIds": layer_ids, "InstanceType": instance_type, "AutoScalingType": auto_scaling_type, "Hostname": hostname, "Os": os, "AmiId": ami_id, "SshKeyName": ssh_key_name, "AvailabilityZone": availability_zone, "VirtualizationType": virtualization_type, "SubnetId": subnet_id, "Architecture": architecture, "RootDeviceType": root_device_type, "BlockDeviceMappings": block_device_mappings, "InstallUpdatesOnBoot": install_updates_on_boot, "EbsOptimized": ebs_optimized, "AgentVersion": agent_version, "Tenancy": tenancy}
            )
            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.opsworks.describe_instances(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

async def absent(hub, ctx, name: Text, instance_id: Text, delete_elastic_ip: bool = None, delete_volumes: bool = None)  -> Dict[str, Any]:
    r'''
    **Autogenerated function**
    
    Deletes a specified instance, which terminates the associated Amazon EC2 instance. You must stop an instance
    before you can delete it. For more information, see Deleting Instances.  Required Permissions: To use this
    action, an IAM user must have a Manage permissions level for the stack, or an attached policy that explicitly
    grants permissions. For more information on user permissions, see Managing User Permissions.

    Args:
        name(Text): A name, ID, or JMES search path to identify the resource.
        instance_id(Text): The instance ID.
        delete_elastic_ip(bool, optional): Whether to delete the instance Elastic IP address. Defaults to None.
        delete_volumes(bool, optional): Whether to delete the instance's Amazon EBS volumes. Defaults to None.

    Returns:
        Dict[str, Any]

    Examples:

        .. code-block:: sls

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

    if not before:
        result["comment"] = f"'{name}' already absent"
    else:
        try:
            ret = await hub.exec.boto3.client.opsworks.delete_instance(
                ctx,
                
                
                **{"InstanceId": instance_id, "DeleteElasticIp": delete_elastic_ip, "DeleteVolumes": delete_volumes}
            )
            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.opsworks.describe_instances(name)
    result["changes"] = differ.deep_diff(before, after)
    return result

