# coding=utf-8
# *** WARNING: this file was generated by the Pulumi Terraform Bridge (tfgen) Tool. ***
# *** Do not edit by hand unless you're certain you know what you are doing! ***

import copy
import warnings
import sys
import pulumi
import pulumi.runtime
from typing import Any, Mapping, Optional, Sequence, Union, overload
if sys.version_info >= (3, 11):
    from typing import NotRequired, TypedDict, TypeAlias
else:
    from typing_extensions import NotRequired, TypedDict, TypeAlias
from . import _utilities
from . import outputs
from ._inputs import *

__all__ = ['ComputeInstanceArgs', 'ComputeInstance']

@pulumi.input_type
class ComputeInstanceArgs:
    def __init__(__self__, *,
                 template_id: pulumi.Input[str],
                 type: pulumi.Input[str],
                 zone: pulumi.Input[str],
                 anti_affinity_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 block_storage_volume_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 deploy_target_id: Optional[pulumi.Input[str]] = None,
                 destroy_protected: Optional[pulumi.Input[bool]] = None,
                 disk_size: Optional[pulumi.Input[int]] = None,
                 elastic_ip_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ipv6: Optional[pulumi.Input[bool]] = None,
                 labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
                 name: Optional[pulumi.Input[str]] = None,
                 network_interfaces: Optional[pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]]] = None,
                 private: Optional[pulumi.Input[bool]] = None,
                 reverse_dns: Optional[pulumi.Input[str]] = None,
                 security_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ssh_key: Optional[pulumi.Input[str]] = None,
                 state: Optional[pulumi.Input[str]] = None,
                 user_data: Optional[pulumi.Input[str]] = None):
        """
        The set of arguments for constructing a ComputeInstance resource.
        :param pulumi.Input[str] template_id: ❗ The get_template (ID) to use when creating the instance.
        :param pulumi.Input[str] type: The instance type (`<family>.<size>`, e.g. `standard.medium`; use the [Exoscale CLI](https://github.com/exoscale/cli/) - `exo compute instance-type list` - for the list of available types). **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[str] zone: ❗ The Exoscale [Zone](https://www.exoscale.com/datacenters/) name.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] anti_affinity_group_ids: ❗ A list of exoscale*anti*affinity_group (IDs) to attach to the instance (may only be set at creation time).
        :param pulumi.Input[Sequence[pulumi.Input[str]]] block_storage_volume_ids: A list of exoscale*block*storage_volume (ID) to attach to the instance.
        :param pulumi.Input[str] deploy_target_id: ❗ A deploy target ID.
        :param pulumi.Input[bool] destroy_protected: Mark the instance as protected, the Exoscale API will refuse to delete the instance until the protection is removed (boolean; default: `false`).
        :param pulumi.Input[int] disk_size: The instance disk size (GiB; at least `10`). Can not be decreased after creation. **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] elastic_ip_ids: A list of exoscale*elastic*ip (IDs) to attach to the instance.
        :param pulumi.Input[bool] ipv6: Enable IPv6 on the instance (boolean; default: `false`).
        :param pulumi.Input[Mapping[str, pulumi.Input[str]]] labels: A map of key/value labels.
        :param pulumi.Input[str] name: The compute instance name.
        :param pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]] network_interfaces: Private network interfaces (may be specified multiple times). Structure is documented below.
        :param pulumi.Input[bool] private: Whether the instance is private (no public IP addresses; default: false)
        :param pulumi.Input[str] reverse_dns: Domain name for reverse DNS record.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] security_group_ids: A list of exoscale*security*group (IDs) to attach to the instance.
        :param pulumi.Input[str] ssh_key: The exoscale*ssh*key (name) to authorize in the instance (may only be set at creation time).
        :param pulumi.Input[str] state: The instance state (`running` or `stopped`; default: `running`).
        :param pulumi.Input[str] user_data: [cloud-init](https://cloudinit.readthedocs.io/) configuration.
        """
        pulumi.set(__self__, "template_id", template_id)
        pulumi.set(__self__, "type", type)
        pulumi.set(__self__, "zone", zone)
        if anti_affinity_group_ids is not None:
            pulumi.set(__self__, "anti_affinity_group_ids", anti_affinity_group_ids)
        if block_storage_volume_ids is not None:
            pulumi.set(__self__, "block_storage_volume_ids", block_storage_volume_ids)
        if deploy_target_id is not None:
            pulumi.set(__self__, "deploy_target_id", deploy_target_id)
        if destroy_protected is not None:
            pulumi.set(__self__, "destroy_protected", destroy_protected)
        if disk_size is not None:
            pulumi.set(__self__, "disk_size", disk_size)
        if elastic_ip_ids is not None:
            pulumi.set(__self__, "elastic_ip_ids", elastic_ip_ids)
        if ipv6 is not None:
            pulumi.set(__self__, "ipv6", ipv6)
        if labels is not None:
            pulumi.set(__self__, "labels", labels)
        if name is not None:
            pulumi.set(__self__, "name", name)
        if network_interfaces is not None:
            pulumi.set(__self__, "network_interfaces", network_interfaces)
        if private is not None:
            pulumi.set(__self__, "private", private)
        if reverse_dns is not None:
            pulumi.set(__self__, "reverse_dns", reverse_dns)
        if security_group_ids is not None:
            pulumi.set(__self__, "security_group_ids", security_group_ids)
        if ssh_key is not None:
            pulumi.set(__self__, "ssh_key", ssh_key)
        if state is not None:
            pulumi.set(__self__, "state", state)
        if user_data is not None:
            pulumi.set(__self__, "user_data", user_data)

    @property
    @pulumi.getter(name="templateId")
    def template_id(self) -> pulumi.Input[str]:
        """
        ❗ The get_template (ID) to use when creating the instance.
        """
        return pulumi.get(self, "template_id")

    @template_id.setter
    def template_id(self, value: pulumi.Input[str]):
        pulumi.set(self, "template_id", value)

    @property
    @pulumi.getter
    def type(self) -> pulumi.Input[str]:
        """
        The instance type (`<family>.<size>`, e.g. `standard.medium`; use the [Exoscale CLI](https://github.com/exoscale/cli/) - `exo compute instance-type list` - for the list of available types). **WARNING**: updating this attribute stops/restarts the instance.
        """
        return pulumi.get(self, "type")

    @type.setter
    def type(self, value: pulumi.Input[str]):
        pulumi.set(self, "type", value)

    @property
    @pulumi.getter
    def zone(self) -> pulumi.Input[str]:
        """
        ❗ The Exoscale [Zone](https://www.exoscale.com/datacenters/) name.
        """
        return pulumi.get(self, "zone")

    @zone.setter
    def zone(self, value: pulumi.Input[str]):
        pulumi.set(self, "zone", value)

    @property
    @pulumi.getter(name="antiAffinityGroupIds")
    def anti_affinity_group_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        ❗ A list of exoscale*anti*affinity_group (IDs) to attach to the instance (may only be set at creation time).
        """
        return pulumi.get(self, "anti_affinity_group_ids")

    @anti_affinity_group_ids.setter
    def anti_affinity_group_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "anti_affinity_group_ids", value)

    @property
    @pulumi.getter(name="blockStorageVolumeIds")
    def block_storage_volume_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        A list of exoscale*block*storage_volume (ID) to attach to the instance.
        """
        return pulumi.get(self, "block_storage_volume_ids")

    @block_storage_volume_ids.setter
    def block_storage_volume_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "block_storage_volume_ids", value)

    @property
    @pulumi.getter(name="deployTargetId")
    def deploy_target_id(self) -> Optional[pulumi.Input[str]]:
        """
        ❗ A deploy target ID.
        """
        return pulumi.get(self, "deploy_target_id")

    @deploy_target_id.setter
    def deploy_target_id(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "deploy_target_id", value)

    @property
    @pulumi.getter(name="destroyProtected")
    def destroy_protected(self) -> Optional[pulumi.Input[bool]]:
        """
        Mark the instance as protected, the Exoscale API will refuse to delete the instance until the protection is removed (boolean; default: `false`).
        """
        return pulumi.get(self, "destroy_protected")

    @destroy_protected.setter
    def destroy_protected(self, value: Optional[pulumi.Input[bool]]):
        pulumi.set(self, "destroy_protected", value)

    @property
    @pulumi.getter(name="diskSize")
    def disk_size(self) -> Optional[pulumi.Input[int]]:
        """
        The instance disk size (GiB; at least `10`). Can not be decreased after creation. **WARNING**: updating this attribute stops/restarts the instance.
        """
        return pulumi.get(self, "disk_size")

    @disk_size.setter
    def disk_size(self, value: Optional[pulumi.Input[int]]):
        pulumi.set(self, "disk_size", value)

    @property
    @pulumi.getter(name="elasticIpIds")
    def elastic_ip_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        A list of exoscale*elastic*ip (IDs) to attach to the instance.
        """
        return pulumi.get(self, "elastic_ip_ids")

    @elastic_ip_ids.setter
    def elastic_ip_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "elastic_ip_ids", value)

    @property
    @pulumi.getter
    def ipv6(self) -> Optional[pulumi.Input[bool]]:
        """
        Enable IPv6 on the instance (boolean; default: `false`).
        """
        return pulumi.get(self, "ipv6")

    @ipv6.setter
    def ipv6(self, value: Optional[pulumi.Input[bool]]):
        pulumi.set(self, "ipv6", value)

    @property
    @pulumi.getter
    def labels(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]:
        """
        A map of key/value labels.
        """
        return pulumi.get(self, "labels")

    @labels.setter
    def labels(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]):
        pulumi.set(self, "labels", value)

    @property
    @pulumi.getter
    def name(self) -> Optional[pulumi.Input[str]]:
        """
        The compute instance name.
        """
        return pulumi.get(self, "name")

    @name.setter
    def name(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "name", value)

    @property
    @pulumi.getter(name="networkInterfaces")
    def network_interfaces(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]]]:
        """
        Private network interfaces (may be specified multiple times). Structure is documented below.
        """
        return pulumi.get(self, "network_interfaces")

    @network_interfaces.setter
    def network_interfaces(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]]]):
        pulumi.set(self, "network_interfaces", value)

    @property
    @pulumi.getter
    def private(self) -> Optional[pulumi.Input[bool]]:
        """
        Whether the instance is private (no public IP addresses; default: false)
        """
        return pulumi.get(self, "private")

    @private.setter
    def private(self, value: Optional[pulumi.Input[bool]]):
        pulumi.set(self, "private", value)

    @property
    @pulumi.getter(name="reverseDns")
    def reverse_dns(self) -> Optional[pulumi.Input[str]]:
        """
        Domain name for reverse DNS record.
        """
        return pulumi.get(self, "reverse_dns")

    @reverse_dns.setter
    def reverse_dns(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "reverse_dns", value)

    @property
    @pulumi.getter(name="securityGroupIds")
    def security_group_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        A list of exoscale*security*group (IDs) to attach to the instance.
        """
        return pulumi.get(self, "security_group_ids")

    @security_group_ids.setter
    def security_group_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "security_group_ids", value)

    @property
    @pulumi.getter(name="sshKey")
    def ssh_key(self) -> Optional[pulumi.Input[str]]:
        """
        The exoscale*ssh*key (name) to authorize in the instance (may only be set at creation time).
        """
        return pulumi.get(self, "ssh_key")

    @ssh_key.setter
    def ssh_key(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "ssh_key", value)

    @property
    @pulumi.getter
    def state(self) -> Optional[pulumi.Input[str]]:
        """
        The instance state (`running` or `stopped`; default: `running`).
        """
        return pulumi.get(self, "state")

    @state.setter
    def state(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "state", value)

    @property
    @pulumi.getter(name="userData")
    def user_data(self) -> Optional[pulumi.Input[str]]:
        """
        [cloud-init](https://cloudinit.readthedocs.io/) configuration.
        """
        return pulumi.get(self, "user_data")

    @user_data.setter
    def user_data(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "user_data", value)


@pulumi.input_type
class _ComputeInstanceState:
    def __init__(__self__, *,
                 anti_affinity_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 block_storage_volume_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 created_at: Optional[pulumi.Input[str]] = None,
                 deploy_target_id: Optional[pulumi.Input[str]] = None,
                 destroy_protected: Optional[pulumi.Input[bool]] = None,
                 disk_size: Optional[pulumi.Input[int]] = None,
                 elastic_ip_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ipv6: Optional[pulumi.Input[bool]] = None,
                 ipv6_address: Optional[pulumi.Input[str]] = None,
                 labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
                 mac_address: Optional[pulumi.Input[str]] = None,
                 name: Optional[pulumi.Input[str]] = None,
                 network_interfaces: Optional[pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]]] = None,
                 private: Optional[pulumi.Input[bool]] = None,
                 private_network_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 public_ip_address: Optional[pulumi.Input[str]] = None,
                 reverse_dns: Optional[pulumi.Input[str]] = None,
                 security_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ssh_key: Optional[pulumi.Input[str]] = None,
                 state: Optional[pulumi.Input[str]] = None,
                 template_id: Optional[pulumi.Input[str]] = None,
                 type: Optional[pulumi.Input[str]] = None,
                 user_data: Optional[pulumi.Input[str]] = None,
                 zone: Optional[pulumi.Input[str]] = None):
        """
        Input properties used for looking up and filtering ComputeInstance resources.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] anti_affinity_group_ids: ❗ A list of exoscale*anti*affinity_group (IDs) to attach to the instance (may only be set at creation time).
        :param pulumi.Input[Sequence[pulumi.Input[str]]] block_storage_volume_ids: A list of exoscale*block*storage_volume (ID) to attach to the instance.
        :param pulumi.Input[str] created_at: The instance creation date.
        :param pulumi.Input[str] deploy_target_id: ❗ A deploy target ID.
        :param pulumi.Input[bool] destroy_protected: Mark the instance as protected, the Exoscale API will refuse to delete the instance until the protection is removed (boolean; default: `false`).
        :param pulumi.Input[int] disk_size: The instance disk size (GiB; at least `10`). Can not be decreased after creation. **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] elastic_ip_ids: A list of exoscale*elastic*ip (IDs) to attach to the instance.
        :param pulumi.Input[bool] ipv6: Enable IPv6 on the instance (boolean; default: `false`).
        :param pulumi.Input[str] ipv6_address: The instance (main network interface) IPv6 address (if enabled).
        :param pulumi.Input[Mapping[str, pulumi.Input[str]]] labels: A map of key/value labels.
        :param pulumi.Input[str] mac_address: MAC address
        :param pulumi.Input[str] name: The compute instance name.
        :param pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]] network_interfaces: Private network interfaces (may be specified multiple times). Structure is documented below.
        :param pulumi.Input[bool] private: Whether the instance is private (no public IP addresses; default: false)
        :param pulumi.Input[Sequence[pulumi.Input[str]]] private_network_ids: A list of private networks (IDs) attached to the instance. Please use the `network_interface.*.network_id` argument instead.
        :param pulumi.Input[str] public_ip_address: The instance (main network interface) IPv4 address.
        :param pulumi.Input[str] reverse_dns: Domain name for reverse DNS record.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] security_group_ids: A list of exoscale*security*group (IDs) to attach to the instance.
        :param pulumi.Input[str] ssh_key: The exoscale*ssh*key (name) to authorize in the instance (may only be set at creation time).
        :param pulumi.Input[str] state: The instance state (`running` or `stopped`; default: `running`).
        :param pulumi.Input[str] template_id: ❗ The get_template (ID) to use when creating the instance.
        :param pulumi.Input[str] type: The instance type (`<family>.<size>`, e.g. `standard.medium`; use the [Exoscale CLI](https://github.com/exoscale/cli/) - `exo compute instance-type list` - for the list of available types). **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[str] user_data: [cloud-init](https://cloudinit.readthedocs.io/) configuration.
        :param pulumi.Input[str] zone: ❗ The Exoscale [Zone](https://www.exoscale.com/datacenters/) name.
        """
        if anti_affinity_group_ids is not None:
            pulumi.set(__self__, "anti_affinity_group_ids", anti_affinity_group_ids)
        if block_storage_volume_ids is not None:
            pulumi.set(__self__, "block_storage_volume_ids", block_storage_volume_ids)
        if created_at is not None:
            pulumi.set(__self__, "created_at", created_at)
        if deploy_target_id is not None:
            pulumi.set(__self__, "deploy_target_id", deploy_target_id)
        if destroy_protected is not None:
            pulumi.set(__self__, "destroy_protected", destroy_protected)
        if disk_size is not None:
            pulumi.set(__self__, "disk_size", disk_size)
        if elastic_ip_ids is not None:
            pulumi.set(__self__, "elastic_ip_ids", elastic_ip_ids)
        if ipv6 is not None:
            pulumi.set(__self__, "ipv6", ipv6)
        if ipv6_address is not None:
            pulumi.set(__self__, "ipv6_address", ipv6_address)
        if labels is not None:
            pulumi.set(__self__, "labels", labels)
        if mac_address is not None:
            pulumi.set(__self__, "mac_address", mac_address)
        if name is not None:
            pulumi.set(__self__, "name", name)
        if network_interfaces is not None:
            pulumi.set(__self__, "network_interfaces", network_interfaces)
        if private is not None:
            pulumi.set(__self__, "private", private)
        if private_network_ids is not None:
            warnings.warn("""Use the network_interface block instead.""", DeprecationWarning)
            pulumi.log.warn("""private_network_ids is deprecated: Use the network_interface block instead.""")
        if private_network_ids is not None:
            pulumi.set(__self__, "private_network_ids", private_network_ids)
        if public_ip_address is not None:
            pulumi.set(__self__, "public_ip_address", public_ip_address)
        if reverse_dns is not None:
            pulumi.set(__self__, "reverse_dns", reverse_dns)
        if security_group_ids is not None:
            pulumi.set(__self__, "security_group_ids", security_group_ids)
        if ssh_key is not None:
            pulumi.set(__self__, "ssh_key", ssh_key)
        if state is not None:
            pulumi.set(__self__, "state", state)
        if template_id is not None:
            pulumi.set(__self__, "template_id", template_id)
        if type is not None:
            pulumi.set(__self__, "type", type)
        if user_data is not None:
            pulumi.set(__self__, "user_data", user_data)
        if zone is not None:
            pulumi.set(__self__, "zone", zone)

    @property
    @pulumi.getter(name="antiAffinityGroupIds")
    def anti_affinity_group_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        ❗ A list of exoscale*anti*affinity_group (IDs) to attach to the instance (may only be set at creation time).
        """
        return pulumi.get(self, "anti_affinity_group_ids")

    @anti_affinity_group_ids.setter
    def anti_affinity_group_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "anti_affinity_group_ids", value)

    @property
    @pulumi.getter(name="blockStorageVolumeIds")
    def block_storage_volume_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        A list of exoscale*block*storage_volume (ID) to attach to the instance.
        """
        return pulumi.get(self, "block_storage_volume_ids")

    @block_storage_volume_ids.setter
    def block_storage_volume_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "block_storage_volume_ids", value)

    @property
    @pulumi.getter(name="createdAt")
    def created_at(self) -> Optional[pulumi.Input[str]]:
        """
        The instance creation date.
        """
        return pulumi.get(self, "created_at")

    @created_at.setter
    def created_at(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "created_at", value)

    @property
    @pulumi.getter(name="deployTargetId")
    def deploy_target_id(self) -> Optional[pulumi.Input[str]]:
        """
        ❗ A deploy target ID.
        """
        return pulumi.get(self, "deploy_target_id")

    @deploy_target_id.setter
    def deploy_target_id(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "deploy_target_id", value)

    @property
    @pulumi.getter(name="destroyProtected")
    def destroy_protected(self) -> Optional[pulumi.Input[bool]]:
        """
        Mark the instance as protected, the Exoscale API will refuse to delete the instance until the protection is removed (boolean; default: `false`).
        """
        return pulumi.get(self, "destroy_protected")

    @destroy_protected.setter
    def destroy_protected(self, value: Optional[pulumi.Input[bool]]):
        pulumi.set(self, "destroy_protected", value)

    @property
    @pulumi.getter(name="diskSize")
    def disk_size(self) -> Optional[pulumi.Input[int]]:
        """
        The instance disk size (GiB; at least `10`). Can not be decreased after creation. **WARNING**: updating this attribute stops/restarts the instance.
        """
        return pulumi.get(self, "disk_size")

    @disk_size.setter
    def disk_size(self, value: Optional[pulumi.Input[int]]):
        pulumi.set(self, "disk_size", value)

    @property
    @pulumi.getter(name="elasticIpIds")
    def elastic_ip_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        A list of exoscale*elastic*ip (IDs) to attach to the instance.
        """
        return pulumi.get(self, "elastic_ip_ids")

    @elastic_ip_ids.setter
    def elastic_ip_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "elastic_ip_ids", value)

    @property
    @pulumi.getter
    def ipv6(self) -> Optional[pulumi.Input[bool]]:
        """
        Enable IPv6 on the instance (boolean; default: `false`).
        """
        return pulumi.get(self, "ipv6")

    @ipv6.setter
    def ipv6(self, value: Optional[pulumi.Input[bool]]):
        pulumi.set(self, "ipv6", value)

    @property
    @pulumi.getter(name="ipv6Address")
    def ipv6_address(self) -> Optional[pulumi.Input[str]]:
        """
        The instance (main network interface) IPv6 address (if enabled).
        """
        return pulumi.get(self, "ipv6_address")

    @ipv6_address.setter
    def ipv6_address(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "ipv6_address", value)

    @property
    @pulumi.getter
    def labels(self) -> Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]:
        """
        A map of key/value labels.
        """
        return pulumi.get(self, "labels")

    @labels.setter
    def labels(self, value: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]]):
        pulumi.set(self, "labels", value)

    @property
    @pulumi.getter(name="macAddress")
    def mac_address(self) -> Optional[pulumi.Input[str]]:
        """
        MAC address
        """
        return pulumi.get(self, "mac_address")

    @mac_address.setter
    def mac_address(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "mac_address", value)

    @property
    @pulumi.getter
    def name(self) -> Optional[pulumi.Input[str]]:
        """
        The compute instance name.
        """
        return pulumi.get(self, "name")

    @name.setter
    def name(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "name", value)

    @property
    @pulumi.getter(name="networkInterfaces")
    def network_interfaces(self) -> Optional[pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]]]:
        """
        Private network interfaces (may be specified multiple times). Structure is documented below.
        """
        return pulumi.get(self, "network_interfaces")

    @network_interfaces.setter
    def network_interfaces(self, value: Optional[pulumi.Input[Sequence[pulumi.Input['ComputeInstanceNetworkInterfaceArgs']]]]):
        pulumi.set(self, "network_interfaces", value)

    @property
    @pulumi.getter
    def private(self) -> Optional[pulumi.Input[bool]]:
        """
        Whether the instance is private (no public IP addresses; default: false)
        """
        return pulumi.get(self, "private")

    @private.setter
    def private(self, value: Optional[pulumi.Input[bool]]):
        pulumi.set(self, "private", value)

    @property
    @pulumi.getter(name="privateNetworkIds")
    @_utilities.deprecated("""Use the network_interface block instead.""")
    def private_network_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        A list of private networks (IDs) attached to the instance. Please use the `network_interface.*.network_id` argument instead.
        """
        return pulumi.get(self, "private_network_ids")

    @private_network_ids.setter
    def private_network_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "private_network_ids", value)

    @property
    @pulumi.getter(name="publicIpAddress")
    def public_ip_address(self) -> Optional[pulumi.Input[str]]:
        """
        The instance (main network interface) IPv4 address.
        """
        return pulumi.get(self, "public_ip_address")

    @public_ip_address.setter
    def public_ip_address(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "public_ip_address", value)

    @property
    @pulumi.getter(name="reverseDns")
    def reverse_dns(self) -> Optional[pulumi.Input[str]]:
        """
        Domain name for reverse DNS record.
        """
        return pulumi.get(self, "reverse_dns")

    @reverse_dns.setter
    def reverse_dns(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "reverse_dns", value)

    @property
    @pulumi.getter(name="securityGroupIds")
    def security_group_ids(self) -> Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]:
        """
        A list of exoscale*security*group (IDs) to attach to the instance.
        """
        return pulumi.get(self, "security_group_ids")

    @security_group_ids.setter
    def security_group_ids(self, value: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]]):
        pulumi.set(self, "security_group_ids", value)

    @property
    @pulumi.getter(name="sshKey")
    def ssh_key(self) -> Optional[pulumi.Input[str]]:
        """
        The exoscale*ssh*key (name) to authorize in the instance (may only be set at creation time).
        """
        return pulumi.get(self, "ssh_key")

    @ssh_key.setter
    def ssh_key(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "ssh_key", value)

    @property
    @pulumi.getter
    def state(self) -> Optional[pulumi.Input[str]]:
        """
        The instance state (`running` or `stopped`; default: `running`).
        """
        return pulumi.get(self, "state")

    @state.setter
    def state(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "state", value)

    @property
    @pulumi.getter(name="templateId")
    def template_id(self) -> Optional[pulumi.Input[str]]:
        """
        ❗ The get_template (ID) to use when creating the instance.
        """
        return pulumi.get(self, "template_id")

    @template_id.setter
    def template_id(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "template_id", value)

    @property
    @pulumi.getter
    def type(self) -> Optional[pulumi.Input[str]]:
        """
        The instance type (`<family>.<size>`, e.g. `standard.medium`; use the [Exoscale CLI](https://github.com/exoscale/cli/) - `exo compute instance-type list` - for the list of available types). **WARNING**: updating this attribute stops/restarts the instance.
        """
        return pulumi.get(self, "type")

    @type.setter
    def type(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "type", value)

    @property
    @pulumi.getter(name="userData")
    def user_data(self) -> Optional[pulumi.Input[str]]:
        """
        [cloud-init](https://cloudinit.readthedocs.io/) configuration.
        """
        return pulumi.get(self, "user_data")

    @user_data.setter
    def user_data(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "user_data", value)

    @property
    @pulumi.getter
    def zone(self) -> Optional[pulumi.Input[str]]:
        """
        ❗ The Exoscale [Zone](https://www.exoscale.com/datacenters/) name.
        """
        return pulumi.get(self, "zone")

    @zone.setter
    def zone(self, value: Optional[pulumi.Input[str]]):
        pulumi.set(self, "zone", value)


class ComputeInstance(pulumi.CustomResource):
    @overload
    def __init__(__self__,
                 resource_name: str,
                 opts: Optional[pulumi.ResourceOptions] = None,
                 anti_affinity_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 block_storage_volume_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 deploy_target_id: Optional[pulumi.Input[str]] = None,
                 destroy_protected: Optional[pulumi.Input[bool]] = None,
                 disk_size: Optional[pulumi.Input[int]] = None,
                 elastic_ip_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ipv6: Optional[pulumi.Input[bool]] = None,
                 labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
                 name: Optional[pulumi.Input[str]] = None,
                 network_interfaces: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ComputeInstanceNetworkInterfaceArgs', 'ComputeInstanceNetworkInterfaceArgsDict']]]]] = None,
                 private: Optional[pulumi.Input[bool]] = None,
                 reverse_dns: Optional[pulumi.Input[str]] = None,
                 security_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ssh_key: Optional[pulumi.Input[str]] = None,
                 state: Optional[pulumi.Input[str]] = None,
                 template_id: Optional[pulumi.Input[str]] = None,
                 type: Optional[pulumi.Input[str]] = None,
                 user_data: Optional[pulumi.Input[str]] = None,
                 zone: Optional[pulumi.Input[str]] = None,
                 __props__=None):
        """
        Manage Exoscale [Compute Instances](https://community.exoscale.com/documentation/compute/).

        Corresponding data sources: exoscale_compute_instance, exoscale_compute_instance_list.

        After the creation, you can retrieve the password of an instance with [Exoscale CLI](https://github.com/exoscale/cli): `exo compute instance reveal-password NAME`.

        ## Example Usage

        ```python
        import pulumi
        import pulumi_exoscale as exoscale
        import pulumiverse_exoscale as exoscale

        my_template = exoscale.get_template(zone="ch-gva-2",
            name="Linux Ubuntu 22.04 LTS 64-bit")
        my_instance = exoscale.ComputeInstance("myInstance",
            zone="ch-gva-2",
            template_id=my_template.id,
            type="standard.medium",
            disk_size=10)
        ```

        Please refer to the examples
        directory for complete configuration examples.

        ## Import

        An existing compute instance may be imported by `<ID>@<zone>`:

        ```sh
        $ pulumi import exoscale:index/computeInstance:ComputeInstance \\
        ```

          exoscale_compute_instance.my_instance \\

          f81d4fae-7dec-11d0-a765-00a0c91e6bf6@ch-gva-2

        :param str resource_name: The name of the resource.
        :param pulumi.ResourceOptions opts: Options for the resource.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] anti_affinity_group_ids: ❗ A list of exoscale*anti*affinity_group (IDs) to attach to the instance (may only be set at creation time).
        :param pulumi.Input[Sequence[pulumi.Input[str]]] block_storage_volume_ids: A list of exoscale*block*storage_volume (ID) to attach to the instance.
        :param pulumi.Input[str] deploy_target_id: ❗ A deploy target ID.
        :param pulumi.Input[bool] destroy_protected: Mark the instance as protected, the Exoscale API will refuse to delete the instance until the protection is removed (boolean; default: `false`).
        :param pulumi.Input[int] disk_size: The instance disk size (GiB; at least `10`). Can not be decreased after creation. **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] elastic_ip_ids: A list of exoscale*elastic*ip (IDs) to attach to the instance.
        :param pulumi.Input[bool] ipv6: Enable IPv6 on the instance (boolean; default: `false`).
        :param pulumi.Input[Mapping[str, pulumi.Input[str]]] labels: A map of key/value labels.
        :param pulumi.Input[str] name: The compute instance name.
        :param pulumi.Input[Sequence[pulumi.Input[Union['ComputeInstanceNetworkInterfaceArgs', 'ComputeInstanceNetworkInterfaceArgsDict']]]] network_interfaces: Private network interfaces (may be specified multiple times). Structure is documented below.
        :param pulumi.Input[bool] private: Whether the instance is private (no public IP addresses; default: false)
        :param pulumi.Input[str] reverse_dns: Domain name for reverse DNS record.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] security_group_ids: A list of exoscale*security*group (IDs) to attach to the instance.
        :param pulumi.Input[str] ssh_key: The exoscale*ssh*key (name) to authorize in the instance (may only be set at creation time).
        :param pulumi.Input[str] state: The instance state (`running` or `stopped`; default: `running`).
        :param pulumi.Input[str] template_id: ❗ The get_template (ID) to use when creating the instance.
        :param pulumi.Input[str] type: The instance type (`<family>.<size>`, e.g. `standard.medium`; use the [Exoscale CLI](https://github.com/exoscale/cli/) - `exo compute instance-type list` - for the list of available types). **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[str] user_data: [cloud-init](https://cloudinit.readthedocs.io/) configuration.
        :param pulumi.Input[str] zone: ❗ The Exoscale [Zone](https://www.exoscale.com/datacenters/) name.
        """
        ...
    @overload
    def __init__(__self__,
                 resource_name: str,
                 args: ComputeInstanceArgs,
                 opts: Optional[pulumi.ResourceOptions] = None):
        """
        Manage Exoscale [Compute Instances](https://community.exoscale.com/documentation/compute/).

        Corresponding data sources: exoscale_compute_instance, exoscale_compute_instance_list.

        After the creation, you can retrieve the password of an instance with [Exoscale CLI](https://github.com/exoscale/cli): `exo compute instance reveal-password NAME`.

        ## Example Usage

        ```python
        import pulumi
        import pulumi_exoscale as exoscale
        import pulumiverse_exoscale as exoscale

        my_template = exoscale.get_template(zone="ch-gva-2",
            name="Linux Ubuntu 22.04 LTS 64-bit")
        my_instance = exoscale.ComputeInstance("myInstance",
            zone="ch-gva-2",
            template_id=my_template.id,
            type="standard.medium",
            disk_size=10)
        ```

        Please refer to the examples
        directory for complete configuration examples.

        ## Import

        An existing compute instance may be imported by `<ID>@<zone>`:

        ```sh
        $ pulumi import exoscale:index/computeInstance:ComputeInstance \\
        ```

          exoscale_compute_instance.my_instance \\

          f81d4fae-7dec-11d0-a765-00a0c91e6bf6@ch-gva-2

        :param str resource_name: The name of the resource.
        :param ComputeInstanceArgs args: The arguments to use to populate this resource's properties.
        :param pulumi.ResourceOptions opts: Options for the resource.
        """
        ...
    def __init__(__self__, resource_name: str, *args, **kwargs):
        resource_args, opts = _utilities.get_resource_args_opts(ComputeInstanceArgs, pulumi.ResourceOptions, *args, **kwargs)
        if resource_args is not None:
            __self__._internal_init(resource_name, opts, **resource_args.__dict__)
        else:
            __self__._internal_init(resource_name, *args, **kwargs)

    def _internal_init(__self__,
                 resource_name: str,
                 opts: Optional[pulumi.ResourceOptions] = None,
                 anti_affinity_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 block_storage_volume_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 deploy_target_id: Optional[pulumi.Input[str]] = None,
                 destroy_protected: Optional[pulumi.Input[bool]] = None,
                 disk_size: Optional[pulumi.Input[int]] = None,
                 elastic_ip_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ipv6: Optional[pulumi.Input[bool]] = None,
                 labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
                 name: Optional[pulumi.Input[str]] = None,
                 network_interfaces: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ComputeInstanceNetworkInterfaceArgs', 'ComputeInstanceNetworkInterfaceArgsDict']]]]] = None,
                 private: Optional[pulumi.Input[bool]] = None,
                 reverse_dns: Optional[pulumi.Input[str]] = None,
                 security_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
                 ssh_key: Optional[pulumi.Input[str]] = None,
                 state: Optional[pulumi.Input[str]] = None,
                 template_id: Optional[pulumi.Input[str]] = None,
                 type: Optional[pulumi.Input[str]] = None,
                 user_data: Optional[pulumi.Input[str]] = None,
                 zone: Optional[pulumi.Input[str]] = None,
                 __props__=None):
        opts = pulumi.ResourceOptions.merge(_utilities.get_resource_opts_defaults(), opts)
        if not isinstance(opts, pulumi.ResourceOptions):
            raise TypeError('Expected resource options to be a ResourceOptions instance')
        if opts.id is None:
            if __props__ is not None:
                raise TypeError('__props__ is only valid when passed in combination with a valid opts.id to get an existing resource')
            __props__ = ComputeInstanceArgs.__new__(ComputeInstanceArgs)

            __props__.__dict__["anti_affinity_group_ids"] = anti_affinity_group_ids
            __props__.__dict__["block_storage_volume_ids"] = block_storage_volume_ids
            __props__.__dict__["deploy_target_id"] = deploy_target_id
            __props__.__dict__["destroy_protected"] = destroy_protected
            __props__.__dict__["disk_size"] = disk_size
            __props__.__dict__["elastic_ip_ids"] = elastic_ip_ids
            __props__.__dict__["ipv6"] = ipv6
            __props__.__dict__["labels"] = labels
            __props__.__dict__["name"] = name
            __props__.__dict__["network_interfaces"] = network_interfaces
            __props__.__dict__["private"] = private
            __props__.__dict__["reverse_dns"] = reverse_dns
            __props__.__dict__["security_group_ids"] = security_group_ids
            __props__.__dict__["ssh_key"] = ssh_key
            __props__.__dict__["state"] = state
            if template_id is None and not opts.urn:
                raise TypeError("Missing required property 'template_id'")
            __props__.__dict__["template_id"] = template_id
            if type is None and not opts.urn:
                raise TypeError("Missing required property 'type'")
            __props__.__dict__["type"] = type
            __props__.__dict__["user_data"] = user_data
            if zone is None and not opts.urn:
                raise TypeError("Missing required property 'zone'")
            __props__.__dict__["zone"] = zone
            __props__.__dict__["created_at"] = None
            __props__.__dict__["ipv6_address"] = None
            __props__.__dict__["mac_address"] = None
            __props__.__dict__["private_network_ids"] = None
            __props__.__dict__["public_ip_address"] = None
        super(ComputeInstance, __self__).__init__(
            'exoscale:index/computeInstance:ComputeInstance',
            resource_name,
            __props__,
            opts)

    @staticmethod
    def get(resource_name: str,
            id: pulumi.Input[str],
            opts: Optional[pulumi.ResourceOptions] = None,
            anti_affinity_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
            block_storage_volume_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
            created_at: Optional[pulumi.Input[str]] = None,
            deploy_target_id: Optional[pulumi.Input[str]] = None,
            destroy_protected: Optional[pulumi.Input[bool]] = None,
            disk_size: Optional[pulumi.Input[int]] = None,
            elastic_ip_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
            ipv6: Optional[pulumi.Input[bool]] = None,
            ipv6_address: Optional[pulumi.Input[str]] = None,
            labels: Optional[pulumi.Input[Mapping[str, pulumi.Input[str]]]] = None,
            mac_address: Optional[pulumi.Input[str]] = None,
            name: Optional[pulumi.Input[str]] = None,
            network_interfaces: Optional[pulumi.Input[Sequence[pulumi.Input[Union['ComputeInstanceNetworkInterfaceArgs', 'ComputeInstanceNetworkInterfaceArgsDict']]]]] = None,
            private: Optional[pulumi.Input[bool]] = None,
            private_network_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
            public_ip_address: Optional[pulumi.Input[str]] = None,
            reverse_dns: Optional[pulumi.Input[str]] = None,
            security_group_ids: Optional[pulumi.Input[Sequence[pulumi.Input[str]]]] = None,
            ssh_key: Optional[pulumi.Input[str]] = None,
            state: Optional[pulumi.Input[str]] = None,
            template_id: Optional[pulumi.Input[str]] = None,
            type: Optional[pulumi.Input[str]] = None,
            user_data: Optional[pulumi.Input[str]] = None,
            zone: Optional[pulumi.Input[str]] = None) -> 'ComputeInstance':
        """
        Get an existing ComputeInstance resource's state with the given name, id, and optional extra
        properties used to qualify the lookup.

        :param str resource_name: The unique name of the resulting resource.
        :param pulumi.Input[str] id: The unique provider ID of the resource to lookup.
        :param pulumi.ResourceOptions opts: Options for the resource.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] anti_affinity_group_ids: ❗ A list of exoscale*anti*affinity_group (IDs) to attach to the instance (may only be set at creation time).
        :param pulumi.Input[Sequence[pulumi.Input[str]]] block_storage_volume_ids: A list of exoscale*block*storage_volume (ID) to attach to the instance.
        :param pulumi.Input[str] created_at: The instance creation date.
        :param pulumi.Input[str] deploy_target_id: ❗ A deploy target ID.
        :param pulumi.Input[bool] destroy_protected: Mark the instance as protected, the Exoscale API will refuse to delete the instance until the protection is removed (boolean; default: `false`).
        :param pulumi.Input[int] disk_size: The instance disk size (GiB; at least `10`). Can not be decreased after creation. **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] elastic_ip_ids: A list of exoscale*elastic*ip (IDs) to attach to the instance.
        :param pulumi.Input[bool] ipv6: Enable IPv6 on the instance (boolean; default: `false`).
        :param pulumi.Input[str] ipv6_address: The instance (main network interface) IPv6 address (if enabled).
        :param pulumi.Input[Mapping[str, pulumi.Input[str]]] labels: A map of key/value labels.
        :param pulumi.Input[str] mac_address: MAC address
        :param pulumi.Input[str] name: The compute instance name.
        :param pulumi.Input[Sequence[pulumi.Input[Union['ComputeInstanceNetworkInterfaceArgs', 'ComputeInstanceNetworkInterfaceArgsDict']]]] network_interfaces: Private network interfaces (may be specified multiple times). Structure is documented below.
        :param pulumi.Input[bool] private: Whether the instance is private (no public IP addresses; default: false)
        :param pulumi.Input[Sequence[pulumi.Input[str]]] private_network_ids: A list of private networks (IDs) attached to the instance. Please use the `network_interface.*.network_id` argument instead.
        :param pulumi.Input[str] public_ip_address: The instance (main network interface) IPv4 address.
        :param pulumi.Input[str] reverse_dns: Domain name for reverse DNS record.
        :param pulumi.Input[Sequence[pulumi.Input[str]]] security_group_ids: A list of exoscale*security*group (IDs) to attach to the instance.
        :param pulumi.Input[str] ssh_key: The exoscale*ssh*key (name) to authorize in the instance (may only be set at creation time).
        :param pulumi.Input[str] state: The instance state (`running` or `stopped`; default: `running`).
        :param pulumi.Input[str] template_id: ❗ The get_template (ID) to use when creating the instance.
        :param pulumi.Input[str] type: The instance type (`<family>.<size>`, e.g. `standard.medium`; use the [Exoscale CLI](https://github.com/exoscale/cli/) - `exo compute instance-type list` - for the list of available types). **WARNING**: updating this attribute stops/restarts the instance.
        :param pulumi.Input[str] user_data: [cloud-init](https://cloudinit.readthedocs.io/) configuration.
        :param pulumi.Input[str] zone: ❗ The Exoscale [Zone](https://www.exoscale.com/datacenters/) name.
        """
        opts = pulumi.ResourceOptions.merge(opts, pulumi.ResourceOptions(id=id))

        __props__ = _ComputeInstanceState.__new__(_ComputeInstanceState)

        __props__.__dict__["anti_affinity_group_ids"] = anti_affinity_group_ids
        __props__.__dict__["block_storage_volume_ids"] = block_storage_volume_ids
        __props__.__dict__["created_at"] = created_at
        __props__.__dict__["deploy_target_id"] = deploy_target_id
        __props__.__dict__["destroy_protected"] = destroy_protected
        __props__.__dict__["disk_size"] = disk_size
        __props__.__dict__["elastic_ip_ids"] = elastic_ip_ids
        __props__.__dict__["ipv6"] = ipv6
        __props__.__dict__["ipv6_address"] = ipv6_address
        __props__.__dict__["labels"] = labels
        __props__.__dict__["mac_address"] = mac_address
        __props__.__dict__["name"] = name
        __props__.__dict__["network_interfaces"] = network_interfaces
        __props__.__dict__["private"] = private
        __props__.__dict__["private_network_ids"] = private_network_ids
        __props__.__dict__["public_ip_address"] = public_ip_address
        __props__.__dict__["reverse_dns"] = reverse_dns
        __props__.__dict__["security_group_ids"] = security_group_ids
        __props__.__dict__["ssh_key"] = ssh_key
        __props__.__dict__["state"] = state
        __props__.__dict__["template_id"] = template_id
        __props__.__dict__["type"] = type
        __props__.__dict__["user_data"] = user_data
        __props__.__dict__["zone"] = zone
        return ComputeInstance(resource_name, opts=opts, __props__=__props__)

    @property
    @pulumi.getter(name="antiAffinityGroupIds")
    def anti_affinity_group_ids(self) -> pulumi.Output[Optional[Sequence[str]]]:
        """
        ❗ A list of exoscale*anti*affinity_group (IDs) to attach to the instance (may only be set at creation time).
        """
        return pulumi.get(self, "anti_affinity_group_ids")

    @property
    @pulumi.getter(name="blockStorageVolumeIds")
    def block_storage_volume_ids(self) -> pulumi.Output[Optional[Sequence[str]]]:
        """
        A list of exoscale*block*storage_volume (ID) to attach to the instance.
        """
        return pulumi.get(self, "block_storage_volume_ids")

    @property
    @pulumi.getter(name="createdAt")
    def created_at(self) -> pulumi.Output[str]:
        """
        The instance creation date.
        """
        return pulumi.get(self, "created_at")

    @property
    @pulumi.getter(name="deployTargetId")
    def deploy_target_id(self) -> pulumi.Output[Optional[str]]:
        """
        ❗ A deploy target ID.
        """
        return pulumi.get(self, "deploy_target_id")

    @property
    @pulumi.getter(name="destroyProtected")
    def destroy_protected(self) -> pulumi.Output[Optional[bool]]:
        """
        Mark the instance as protected, the Exoscale API will refuse to delete the instance until the protection is removed (boolean; default: `false`).
        """
        return pulumi.get(self, "destroy_protected")

    @property
    @pulumi.getter(name="diskSize")
    def disk_size(self) -> pulumi.Output[int]:
        """
        The instance disk size (GiB; at least `10`). Can not be decreased after creation. **WARNING**: updating this attribute stops/restarts the instance.
        """
        return pulumi.get(self, "disk_size")

    @property
    @pulumi.getter(name="elasticIpIds")
    def elastic_ip_ids(self) -> pulumi.Output[Optional[Sequence[str]]]:
        """
        A list of exoscale*elastic*ip (IDs) to attach to the instance.
        """
        return pulumi.get(self, "elastic_ip_ids")

    @property
    @pulumi.getter
    def ipv6(self) -> pulumi.Output[Optional[bool]]:
        """
        Enable IPv6 on the instance (boolean; default: `false`).
        """
        return pulumi.get(self, "ipv6")

    @property
    @pulumi.getter(name="ipv6Address")
    def ipv6_address(self) -> pulumi.Output[str]:
        """
        The instance (main network interface) IPv6 address (if enabled).
        """
        return pulumi.get(self, "ipv6_address")

    @property
    @pulumi.getter
    def labels(self) -> pulumi.Output[Optional[Mapping[str, str]]]:
        """
        A map of key/value labels.
        """
        return pulumi.get(self, "labels")

    @property
    @pulumi.getter(name="macAddress")
    def mac_address(self) -> pulumi.Output[str]:
        """
        MAC address
        """
        return pulumi.get(self, "mac_address")

    @property
    @pulumi.getter
    def name(self) -> pulumi.Output[str]:
        """
        The compute instance name.
        """
        return pulumi.get(self, "name")

    @property
    @pulumi.getter(name="networkInterfaces")
    def network_interfaces(self) -> pulumi.Output[Optional[Sequence['outputs.ComputeInstanceNetworkInterface']]]:
        """
        Private network interfaces (may be specified multiple times). Structure is documented below.
        """
        return pulumi.get(self, "network_interfaces")

    @property
    @pulumi.getter
    def private(self) -> pulumi.Output[Optional[bool]]:
        """
        Whether the instance is private (no public IP addresses; default: false)
        """
        return pulumi.get(self, "private")

    @property
    @pulumi.getter(name="privateNetworkIds")
    @_utilities.deprecated("""Use the network_interface block instead.""")
    def private_network_ids(self) -> pulumi.Output[Sequence[str]]:
        """
        A list of private networks (IDs) attached to the instance. Please use the `network_interface.*.network_id` argument instead.
        """
        return pulumi.get(self, "private_network_ids")

    @property
    @pulumi.getter(name="publicIpAddress")
    def public_ip_address(self) -> pulumi.Output[str]:
        """
        The instance (main network interface) IPv4 address.
        """
        return pulumi.get(self, "public_ip_address")

    @property
    @pulumi.getter(name="reverseDns")
    def reverse_dns(self) -> pulumi.Output[Optional[str]]:
        """
        Domain name for reverse DNS record.
        """
        return pulumi.get(self, "reverse_dns")

    @property
    @pulumi.getter(name="securityGroupIds")
    def security_group_ids(self) -> pulumi.Output[Optional[Sequence[str]]]:
        """
        A list of exoscale*security*group (IDs) to attach to the instance.
        """
        return pulumi.get(self, "security_group_ids")

    @property
    @pulumi.getter(name="sshKey")
    def ssh_key(self) -> pulumi.Output[Optional[str]]:
        """
        The exoscale*ssh*key (name) to authorize in the instance (may only be set at creation time).
        """
        return pulumi.get(self, "ssh_key")

    @property
    @pulumi.getter
    def state(self) -> pulumi.Output[str]:
        """
        The instance state (`running` or `stopped`; default: `running`).
        """
        return pulumi.get(self, "state")

    @property
    @pulumi.getter(name="templateId")
    def template_id(self) -> pulumi.Output[str]:
        """
        ❗ The get_template (ID) to use when creating the instance.
        """
        return pulumi.get(self, "template_id")

    @property
    @pulumi.getter
    def type(self) -> pulumi.Output[str]:
        """
        The instance type (`<family>.<size>`, e.g. `standard.medium`; use the [Exoscale CLI](https://github.com/exoscale/cli/) - `exo compute instance-type list` - for the list of available types). **WARNING**: updating this attribute stops/restarts the instance.
        """
        return pulumi.get(self, "type")

    @property
    @pulumi.getter(name="userData")
    def user_data(self) -> pulumi.Output[Optional[str]]:
        """
        [cloud-init](https://cloudinit.readthedocs.io/) configuration.
        """
        return pulumi.get(self, "user_data")

    @property
    @pulumi.getter
    def zone(self) -> pulumi.Output[str]:
        """
        ❗ The Exoscale [Zone](https://www.exoscale.com/datacenters/) name.
        """
        return pulumi.get(self, "zone")

