# Copyright (c) 2012-2025, Mark Peek <mark@peek.org>
# All rights reserved.
#
# See LICENSE file for full license.
#
# *** Do not modify - this file is autogenerated ***


from . import AWSObject, AWSProperty, PropsDictType, Tags
from .validators import boolean, integer


class TagSpecification(AWSProperty):
    """
    `TagSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-tagspecification.html>`__
    """

    props: PropsDictType = {
        "ResourceType": (str, False),
        "Tags": (Tags, False),
    }


class Volume(AWSObject):
    """
    `Volume <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspacesinstances-volume.html>`__
    """

    resource_type = "AWS::WorkspacesInstances::Volume"

    props: PropsDictType = {
        "AvailabilityZone": (str, True),
        "Encrypted": (boolean, False),
        "Iops": (integer, False),
        "KmsKeyId": (str, False),
        "SizeInGB": (integer, False),
        "SnapshotId": (str, False),
        "TagSpecifications": ([TagSpecification], False),
        "Throughput": (integer, False),
        "VolumeType": (str, False),
    }


class VolumeAssociation(AWSObject):
    """
    `VolumeAssociation <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspacesinstances-volumeassociation.html>`__
    """

    resource_type = "AWS::WorkspacesInstances::VolumeAssociation"

    props: PropsDictType = {
        "Device": (str, True),
        "DisassociateMode": (str, False),
        "VolumeId": (str, True),
        "WorkspaceInstanceId": (str, True),
    }


class EbsBlockDevice(AWSProperty):
    """
    `EbsBlockDevice <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-ebsblockdevice.html>`__
    """

    props: PropsDictType = {
        "Encrypted": (boolean, False),
        "Iops": (integer, False),
        "KmsKeyId": (str, False),
        "Throughput": (integer, False),
        "VolumeSize": (integer, False),
        "VolumeType": (str, False),
    }


class BlockDeviceMapping(AWSProperty):
    """
    `BlockDeviceMapping <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-blockdevicemapping.html>`__
    """

    props: PropsDictType = {
        "DeviceName": (str, False),
        "Ebs": (EbsBlockDevice, False),
        "NoDevice": (str, False),
        "VirtualName": (str, False),
    }


class CpuOptionsRequest(AWSProperty):
    """
    `CpuOptionsRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-cpuoptionsrequest.html>`__
    """

    props: PropsDictType = {
        "CoreCount": (integer, False),
        "ThreadsPerCore": (integer, False),
    }


class CreditSpecificationRequest(AWSProperty):
    """
    `CreditSpecificationRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-creditspecificationrequest.html>`__
    """

    props: PropsDictType = {
        "CpuCredits": (str, False),
    }


class EnclaveOptionsRequest(AWSProperty):
    """
    `EnclaveOptionsRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-enclaveoptionsrequest.html>`__
    """

    props: PropsDictType = {
        "Enabled": (boolean, False),
    }


class HibernationOptionsRequest(AWSProperty):
    """
    `HibernationOptionsRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-hibernationoptionsrequest.html>`__
    """

    props: PropsDictType = {
        "Configured": (boolean, False),
    }


class IamInstanceProfileSpecification(AWSProperty):
    """
    `IamInstanceProfileSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-iaminstanceprofilespecification.html>`__
    """

    props: PropsDictType = {
        "Name": (str, False),
    }


class InstanceMaintenanceOptionsRequest(AWSProperty):
    """
    `InstanceMaintenanceOptionsRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-instancemaintenanceoptionsrequest.html>`__
    """

    props: PropsDictType = {
        "AutoRecovery": (str, False),
    }


class InstanceMetadataOptionsRequest(AWSProperty):
    """
    `InstanceMetadataOptionsRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-instancemetadataoptionsrequest.html>`__
    """

    props: PropsDictType = {
        "HttpEndpoint": (str, False),
        "HttpProtocolIpv6": (str, False),
        "HttpPutResponseHopLimit": (integer, False),
        "HttpTokens": (str, False),
        "InstanceMetadataTags": (str, False),
    }


class InstanceNetworkInterfaceSpecification(AWSProperty):
    """
    `InstanceNetworkInterfaceSpecification <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-instancenetworkinterfacespecification.html>`__
    """

    props: PropsDictType = {
        "Description": (str, False),
        "DeviceIndex": (integer, False),
        "Groups": ([str], False),
        "SubnetId": (str, False),
    }


class InstanceNetworkPerformanceOptionsRequest(AWSProperty):
    """
    `InstanceNetworkPerformanceOptionsRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-instancenetworkperformanceoptionsrequest.html>`__
    """

    props: PropsDictType = {
        "BandwidthWeighting": (str, False),
    }


class Placement(AWSProperty):
    """
    `Placement <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-placement.html>`__
    """

    props: PropsDictType = {
        "AvailabilityZone": (str, False),
        "GroupName": (str, False),
        "Tenancy": (str, False),
    }


class PrivateDnsNameOptionsRequest(AWSProperty):
    """
    `PrivateDnsNameOptionsRequest <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-privatednsnameoptionsrequest.html>`__
    """

    props: PropsDictType = {
        "EnableResourceNameDnsAAAARecord": (boolean, False),
        "EnableResourceNameDnsARecord": (boolean, False),
        "HostnameType": (str, False),
    }


class RunInstancesMonitoringEnabled(AWSProperty):
    """
    `RunInstancesMonitoringEnabled <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-runinstancesmonitoringenabled.html>`__
    """

    props: PropsDictType = {
        "Enabled": (boolean, False),
    }


class ManagedInstance(AWSProperty):
    """
    `ManagedInstance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-managedinstance.html>`__
    """

    props: PropsDictType = {
        "BlockDeviceMappings": ([BlockDeviceMapping], False),
        "CpuOptions": (CpuOptionsRequest, False),
        "CreditSpecification": (CreditSpecificationRequest, False),
        "DisableApiStop": (boolean, False),
        "EbsOptimized": (boolean, False),
        "EnclaveOptions": (EnclaveOptionsRequest, False),
        "HibernationOptions": (HibernationOptionsRequest, False),
        "IamInstanceProfile": (IamInstanceProfileSpecification, False),
        "ImageId": (str, True),
        "InstanceType": (str, True),
        "KeyName": (str, False),
        "MaintenanceOptions": (InstanceMaintenanceOptionsRequest, False),
        "MetadataOptions": (InstanceMetadataOptionsRequest, False),
        "Monitoring": (RunInstancesMonitoringEnabled, False),
        "NetworkInterfaces": ([InstanceNetworkInterfaceSpecification], False),
        "NetworkPerformanceOptions": (InstanceNetworkPerformanceOptionsRequest, False),
        "Placement": (Placement, False),
        "PrivateDnsNameOptions": (PrivateDnsNameOptionsRequest, False),
        "TagSpecifications": ([TagSpecification], False),
        "UserData": (str, False),
    }


class WorkspaceInstance(AWSObject):
    """
    `WorkspaceInstance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-workspacesinstances-workspaceinstance.html>`__
    """

    resource_type = "AWS::WorkspacesInstances::WorkspaceInstance"

    props: PropsDictType = {
        "ManagedInstance": (ManagedInstance, False),
        "Tags": (Tags, False),
    }


class EC2ManagedInstance(AWSProperty):
    """
    `EC2ManagedInstance <http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-workspacesinstances-workspaceinstance-ec2managedinstance.html>`__
    """

    props: PropsDictType = {
        "InstanceId": (str, False),
    }
