"""
Autogenerated using `pop-create-idem <https://gitlab.com/saltstack/pop/pop-create-idem>`__
hub.exec.boto3.client.apigatewayv2.create_domain_name
hub.exec.boto3.client.apigatewayv2.delete_domain_name
hub.exec.boto3.client.apigatewayv2.get_domain_name
hub.exec.boto3.client.apigatewayv2.get_domain_names
hub.exec.boto3.client.apigatewayv2.tag_resource
hub.exec.boto3.client.apigatewayv2.untag_resource
hub.exec.boto3.client.apigatewayv2.update_domain_name
"""
import copy
from dataclasses import field
from dataclasses import make_dataclass
from typing import Any
from typing import Dict
from typing import List
__contracts__ = ["resource"]
[docs]async def present(
    hub,
    ctx,
    name: str,
    resource_id: str = None,
    domain_name_configurations: List[
        make_dataclass(
            "DomainNameConfiguration",
            [
                ("ApiGatewayDomainName", str, field(default=None)),
                ("CertificateArn", str, field(default=None)),
                ("CertificateName", str, field(default=None)),
                ("CertificateUploadDate", str, field(default=None)),
                ("DomainNameStatus", str, field(default=None)),
                ("DomainNameStatusMessage", str, field(default=None)),
                ("EndpointType", str, field(default=None)),
                ("HostedZoneId", str, field(default=None)),
                ("SecurityPolicy", str, field(default=None)),
                ("OwnershipVerificationCertificateArn", str, field(default=None)),
            ],
        )
    ] = None,
    mutual_tls_authentication: make_dataclass(
        "MutualTlsAuthenticationInput",
        [
            ("TruststoreUri", str, field(default=None)),
            ("TruststoreVersion", str, field(default=None)),
        ],
    ) = None,
    tags: Dict[str, str] = None,
) -> Dict[str, Any]:
    """
    Creates an API Gateway v2 domain name resource.
    Args:
        name(str): An Idem name of the resource. This is also used as the name of the domain name during resource creation.
        resource_id(str, Optional): AWS API Gateway v2 domain name.
        domain_name_configurations(List[Dict[str, Any]], Optional): The domain name configurations. Defaults to None.
            * ApiGatewayDomainName (str, Optional): A domain name for the API.
            * CertificateArn (str, Optional): An AWS-managed certificate that will be used by the edge-optimized endpoint for this domain
                name. AWS Certificate Manager is the only supported source.
            * CertificateName (str, Optional): The user-friendly name of the certificate that will be used by the edge-optimized endpoint for
                this domain name.
            * CertificateUploadDate (str, Optional): The timestamp when the certificate that was used by edge-optimized endpoint for this domain name
                was uploaded.
            * DomainNameStatus (str, Optional): The status of the domain name migration. The valid values are AVAILABLE, UPDATING,
                PENDING_CERTIFICATE_REIMPORT, and PENDING_OWNERSHIP_VERIFICATION. If the status is UPDATING, the
                domain cannot be modified further until the existing operation is complete. If it is AVAILABLE,
                the domain can be updated.
            * DomainNameStatusMessage (str, Optional): An optional text message containing detailed information about status of the domain name
                migration.
            * EndpointType (str, Optional): The endpoint type.
            * HostedZoneId (str, Optional): The Amazon Route 53 Hosted Zone ID of the endpoint.
            * SecurityPolicy (str, Optional): The Transport Layer Security (TLS) version of the security policy for this domain name. The
                valid values are TLS_1_0 and TLS_1_2.
            * OwnershipVerificationCertificateArn (str, Optional): The ARN of the public certificate issued by ACM to validate ownership of your custom domain.
                Only required when configuring mutual TLS and using an ACM imported or private CA certificate
                ARN as the regionalCertificateArn
        mutual_tls_authentication(Dict[str, Any], Optional): The mutual TLS authentication configuration for a custom domain name. Defaults to None.
            * TruststoreUri (str, Optional): An Amazon S3 URL that specifies the truststore for mutual TLS authentication, for example,
                s3://bucket-name/key-name. The truststore can contain certificates from public or private
                certificate authorities. To update the truststore, upload a new version to S3, and then update
                your custom domain name to use the new version. To update the truststore, you must have
                permissions to access the S3 object.
            * TruststoreVersion (str, Optional): The version of the S3 object that contains your truststore. To specify a version, you must have
                versioning enabled for the S3 bucket.
        tags(Dict, Optional): The collection of tags associated with a domain name.
    Request Syntax:
        [idem_test_aws_apigatewayv2_domain_name]:
          aws.apigatewayv2.domain_name.present:
            - name: 'string'
            - domain_name_configurations: [
                {
                    'ApiGatewayDomainName': 'string',
                    'CertificateArn': 'string',
                    'CertificateName': 'string',
                    'CertificateUploadDate': datetime(2015, 1, 1),
                    'DomainNameStatus': 'AVAILABLE'|'UPDATING'|'PENDING_CERTIFICATE_REIMPORT'|'PENDING_OWNERSHIP_VERIFICATION',
                    'DomainNameStatusMessage': 'string',
                    'EndpointType': 'REGIONAL'|'EDGE',
                    'HostedZoneId': 'string',
                    'SecurityPolicy': 'TLS_1_0'|'TLS_1_2',
                    'OwnershipVerificationCertificateArn': 'string'
                }
            ]
            - mutual_tls_authentication: {
                'TruststoreUri': 'string',
                'TruststoreVersion': 'string
              }
            - tags: {
                'string': 'string'
              }
    Returns:
        Dict[str, Any]
    Examples:
        .. code-block:: sls
            idem_test_aws_apigatewayv2_domain_name:
              aws.apigatewayv2.domain_name.present:
                - name: value
                - domain_name_configurations: [
                    {
                        'ApiGatewayDomainName': value,
                        'CertificateArn': 'value,
                        'CertificateName': 'value,
                        'CertificateUploadDate': value,
                        'DomainNameStatus': value,
                        'DomainNameStatusMessage': value,
                        'EndpointType': value,
                        'HostedZoneId': value,
                        'SecurityPolicy': value,
                        'OwnershipVerificationCertificateArn': value
                    }
                ]
                - mutual_tls_authentication: {
                    'TruststoreUri': 'string',
                    'TruststoreVersion': 'string
                }
                - tags: {
                    value: value
                }
    """
    result = dict(comment=[], old_state=None, new_state=None, name=name, result=True)
    resource_updated = False
    if resource_id:
        before_ret = await hub.exec.aws.apigatewayv2.domain_name.get(
            ctx=ctx, name=name, resource_id=resource_id
        )
        if not before_ret["result"] or not before_ret["ret"]:
            result["result"] = False
            result["comment"] = before_ret["comment"]
            return result
        result["comment"] = hub.tool.aws.comment_utils.already_exists_comment(
            resource_type="aws.apigatewayv2.domain_name", name=name
        )
        result["old_state"] = copy.deepcopy(before_ret["ret"])
        result["new_state"] = copy.deepcopy(result["old_state"])
        resource_parameters = {
            "domain_name_configurations": domain_name_configurations,
            "mutual_tls_authentication": mutual_tls_authentication,
        }
        update_domain_name_ret = await hub.tool.aws.apigatewayv2.domain_name.update(
            ctx,
            resource_id=resource_id,
            raw_resource=before_ret["ret"],
            resource_parameters=resource_parameters,
        )
        result["comment"] += update_domain_name_ret["comment"]
        if not update_domain_name_ret["result"]:
            result["result"] = False
            return result
        resource_updated = resource_updated or bool(update_domain_name_ret["ret"])
        if update_domain_name_ret["ret"] and ctx.get("test", False):
            result["new_state"].update(update_domain_name_ret["ret"])
        if tags is not None and tags != result["old_state"].get("tags"):
            resource_arn = hub.tool.aws.arn_utils.build(
                service="apigateway",
                region=ctx["acct"]["region_name"],
                resource="/domainnames/" + resource_id,
            )
            update_tags_ret = await hub.tool.aws.apigatewayv2.tag.update_tags(
                ctx,
                resource_arn=resource_arn,
                old_tags=result["old_state"].get("tags", {}),
                new_tags=tags,
            )
            result["comment"] += update_tags_ret["comment"]
            if not update_tags_ret["result"]:
                result["result"] = False
                return result
            resource_updated = resource_updated or bool(update_tags_ret["ret"])
            if update_tags_ret["ret"] and ctx.get("test", False):
                result["new_state"]["tags"] = update_tags_ret["ret"].get("tags")
        if resource_updated and ctx.get("test", False):
            return result
    else:
        if ctx.get("test", False):
            result["new_state"] = hub.tool.aws.test_state_utils.generate_test_state(
                enforced_state={},
                desired_state={
                    "domain_name_configurations": domain_name_configurations,
                    "name": name,
                    "mutual_tls_authentication": mutual_tls_authentication,
                    "tags": tags,
                },
            )
            result["comment"] = hub.tool.aws.comment_utils.would_create_comment(
                resource_type="aws.apigatewayv2.domain_name", name=name
            )
            return result
        create_ret = await hub.exec.boto3.client.apigatewayv2.create_domain_name(
            ctx,
            DomainName=name,
            DomainNameConfigurations=domain_name_configurations,
            MutualTlsAuthentication=mutual_tls_authentication,
            Tags=tags,
        )
        if not create_ret["result"]:
            result["result"] = False
            result["comment"] = create_ret["comment"]
            return result
        result["comment"] = hub.tool.aws.comment_utils.create_comment(
            resource_type="aws.apigatewayv2.domain_name", name=name
        )
        resource_id = create_ret["ret"]["DomainName"]
    if (not result["old_state"]) or resource_updated:
        after_ret = await hub.exec.aws.apigatewayv2.domain_name.get(
            ctx=ctx, name=name, resource_id=resource_id
        )
        if not after_ret["result"] or not after_ret["ret"]:
            result["result"] = False
            result["comment"] += after_ret["comment"]
            return result
        result["new_state"] = after_ret["ret"]
    return result 
[docs]async def absent(hub, ctx, name: str, resource_id: str = None) -> Dict[str, Any]:
    """
    Deletes an API Gateway v2 domain name resource.
    Args:
        name(str): An Idem name of the resource.
        resource_id(str, Optional): AWS API Gateway v2 domain name.
            Idem automatically considers this resource being absent if this field is not specified.
    Request syntax:
        [idem_test_aws_apigatewayv2_domain_name]:
          aws.apigatewayv2.domain_name.absent:
            - name: 'string'
            - resource_id: 'string'
    Returns:
        Dict[str, Any]
    Examples:
        .. code-block:: sls
            idem_test_aws_apigatewayv2_domain_name:
              aws.apigatewayv2.domain_name.absent:
                - name: value
                - resource_id: value
    """
    result = dict(comment=[], old_state=None, new_state=None, name=name, result=True)
    if not resource_id:
        result["comment"] = hub.tool.aws.comment_utils.already_absent_comment(
            resource_type="aws.apigatewayv2.domain_name", name=name
        )
        return result
    before_ret = await hub.exec.aws.apigatewayv2.domain_name.get(
        ctx=ctx, name=name, resource_id=resource_id
    )
    if not before_ret["result"]:
        result["result"] = False
        result["comment"] = before_ret["comment"]
        return result
    if not before_ret["ret"]:
        result["comment"] = hub.tool.aws.comment_utils.already_absent_comment(
            resource_type="aws.apigatewayv2.domain_name", name=name
        )
    elif ctx.get("test", False):
        result["old_state"] = before_ret["ret"]
        result["comment"] = hub.tool.aws.comment_utils.would_delete_comment(
            resource_type="aws.apigatewayv2.domain_name", name=name
        )
        return result
    else:
        result["old_state"] = before_ret["ret"]
        delete_ret = await hub.exec.boto3.client.apigatewayv2.delete_domain_name(
            ctx, DomainName=resource_id
        )
        if not delete_ret["result"]:
            result["result"] = False
            result["comment"] = delete_ret["comment"]
            return result
        result["comment"] = hub.tool.aws.comment_utils.delete_comment(
            resource_type="aws.apigatewayv2.domain_name", name=name
        )
    return result 
[docs]async def describe(hub, ctx) -> Dict[str, Dict[str, Any]]:
    """
    Describe the resource in a way that can be recreated/managed with the corresponding "present" function
    Gets the API Gateway v2 domain name resources for an AWS account.
    Returns:
        Dict[str, Dict[str, Any]]
    Examples:
        .. code-block:: bash
            $ idem describe aws.apigatewayv2.domain_name
    """
    result = {}
    describe_ret = await hub.exec.boto3.client.apigatewayv2.get_domain_names(ctx)
    if not describe_ret["result"]:
        hub.log.warning(f"Could not describe domain names {describe_ret['comment']}")
        return result
    for domain_name in describe_ret["ret"]["Items"]:
        resource_translated = (
            hub.tool.aws.apigatewayv2.domain_name.convert_raw_domain_name_to_present(
                raw_resource=domain_name,
            )
        )
        result[resource_translated["name"]] = {
            "aws.apigatewayv2.domain_name.present": [
                {parameter_key: parameter_value}
                for parameter_key, parameter_value in resource_translated.items()
            ]
        }
    return result