// *** WARNING: this file was generated by pulumi-java-gen. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

package com.pulumi.azure.network.inputs;

import com.pulumi.azure.network.inputs.NetworkInterfaceIpConfigurationArgs;
import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import java.lang.Boolean;
import java.lang.String;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


public final class NetworkInterfaceState extends com.pulumi.resources.ResourceArgs {

    public static final NetworkInterfaceState Empty = new NetworkInterfaceState();

    /**
     * If the Virtual Machine using this Network Interface is part of an Availability Set, then this list will have the union of all DNS servers from all Network Interfaces that are part of the Availability Set.
     * 
     */
    @Import(name="appliedDnsServers")
    private @Nullable Output<List<String>> appliedDnsServers;

    /**
     * @return If the Virtual Machine using this Network Interface is part of an Availability Set, then this list will have the union of all DNS servers from all Network Interfaces that are part of the Availability Set.
     * 
     */
    public Optional<Output<List<String>>> appliedDnsServers() {
        return Optional.ofNullable(this.appliedDnsServers);
    }

    /**
     * A list of IP Addresses defining the DNS Servers which should be used for this Network Interface.
     * 
     * &gt; **Note:** Configuring DNS Servers on the Network Interface will override the DNS Servers defined on the Virtual Network.
     * 
     */
    @Import(name="dnsServers")
    private @Nullable Output<List<String>> dnsServers;

    /**
     * @return A list of IP Addresses defining the DNS Servers which should be used for this Network Interface.
     * 
     * &gt; **Note:** Configuring DNS Servers on the Network Interface will override the DNS Servers defined on the Virtual Network.
     * 
     */
    public Optional<Output<List<String>>> dnsServers() {
        return Optional.ofNullable(this.dnsServers);
    }

    /**
     * Specifies the Edge Zone within the Azure Region where this Network Interface should exist. Changing this forces a new Network Interface to be created.
     * 
     */
    @Import(name="edgeZone")
    private @Nullable Output<String> edgeZone;

    /**
     * @return Specifies the Edge Zone within the Azure Region where this Network Interface should exist. Changing this forces a new Network Interface to be created.
     * 
     */
    public Optional<Output<String>> edgeZone() {
        return Optional.ofNullable(this.edgeZone);
    }

    /**
     * Should Accelerated Networking be enabled? Defaults to `false`.
     * 
     * &gt; **Note:** Only certain Virtual Machine sizes are supported for Accelerated Networking - [more information can be found in this document](https://docs.microsoft.com/azure/virtual-network/create-vm-accelerated-networking-cli).
     * 
     * &gt; **Note:** To use Accelerated Networking in an Availability Set, the Availability Set must be deployed onto an Accelerated Networking enabled cluster.
     * 
     */
    @Import(name="enableAcceleratedNetworking")
    private @Nullable Output<Boolean> enableAcceleratedNetworking;

    /**
     * @return Should Accelerated Networking be enabled? Defaults to `false`.
     * 
     * &gt; **Note:** Only certain Virtual Machine sizes are supported for Accelerated Networking - [more information can be found in this document](https://docs.microsoft.com/azure/virtual-network/create-vm-accelerated-networking-cli).
     * 
     * &gt; **Note:** To use Accelerated Networking in an Availability Set, the Availability Set must be deployed onto an Accelerated Networking enabled cluster.
     * 
     */
    public Optional<Output<Boolean>> enableAcceleratedNetworking() {
        return Optional.ofNullable(this.enableAcceleratedNetworking);
    }

    /**
     * Should IP Forwarding be enabled? Defaults to `false`.
     * 
     */
    @Import(name="enableIpForwarding")
    private @Nullable Output<Boolean> enableIpForwarding;

    /**
     * @return Should IP Forwarding be enabled? Defaults to `false`.
     * 
     */
    public Optional<Output<Boolean>> enableIpForwarding() {
        return Optional.ofNullable(this.enableIpForwarding);
    }

    /**
     * The (relative) DNS Name used for internal communications between Virtual Machines in the same Virtual Network.
     * 
     */
    @Import(name="internalDnsNameLabel")
    private @Nullable Output<String> internalDnsNameLabel;

    /**
     * @return The (relative) DNS Name used for internal communications between Virtual Machines in the same Virtual Network.
     * 
     */
    public Optional<Output<String>> internalDnsNameLabel() {
        return Optional.ofNullable(this.internalDnsNameLabel);
    }

    /**
     * Even if `internal_dns_name_label` is not specified, a DNS entry is created for the primary NIC of the VM. This DNS name can be constructed by concatenating the VM name with the value of `internal_domain_name_suffix`.
     * 
     */
    @Import(name="internalDomainNameSuffix")
    private @Nullable Output<String> internalDomainNameSuffix;

    /**
     * @return Even if `internal_dns_name_label` is not specified, a DNS entry is created for the primary NIC of the VM. This DNS name can be constructed by concatenating the VM name with the value of `internal_domain_name_suffix`.
     * 
     */
    public Optional<Output<String>> internalDomainNameSuffix() {
        return Optional.ofNullable(this.internalDomainNameSuffix);
    }

    /**
     * One or more `ip_configuration` blocks as defined below.
     * 
     */
    @Import(name="ipConfigurations")
    private @Nullable Output<List<NetworkInterfaceIpConfigurationArgs>> ipConfigurations;

    /**
     * @return One or more `ip_configuration` blocks as defined below.
     * 
     */
    public Optional<Output<List<NetworkInterfaceIpConfigurationArgs>>> ipConfigurations() {
        return Optional.ofNullable(this.ipConfigurations);
    }

    /**
     * The location where the Network Interface should exist. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="location")
    private @Nullable Output<String> location;

    /**
     * @return The location where the Network Interface should exist. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> location() {
        return Optional.ofNullable(this.location);
    }

    /**
     * The Media Access Control (MAC) Address of the Network Interface.
     * 
     */
    @Import(name="macAddress")
    private @Nullable Output<String> macAddress;

    /**
     * @return The Media Access Control (MAC) Address of the Network Interface.
     * 
     */
    public Optional<Output<String>> macAddress() {
        return Optional.ofNullable(this.macAddress);
    }

    /**
     * The name of the Network Interface. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="name")
    private @Nullable Output<String> name;

    /**
     * @return The name of the Network Interface. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> name() {
        return Optional.ofNullable(this.name);
    }

    /**
     * The Static IP Address which should be used.
     * 
     */
    @Import(name="privateIpAddress")
    private @Nullable Output<String> privateIpAddress;

    /**
     * @return The Static IP Address which should be used.
     * 
     */
    public Optional<Output<String>> privateIpAddress() {
        return Optional.ofNullable(this.privateIpAddress);
    }

    /**
     * The private IP addresses of the network interface.
     * 
     */
    @Import(name="privateIpAddresses")
    private @Nullable Output<List<String>> privateIpAddresses;

    /**
     * @return The private IP addresses of the network interface.
     * 
     */
    public Optional<Output<List<String>>> privateIpAddresses() {
        return Optional.ofNullable(this.privateIpAddresses);
    }

    /**
     * The name of the Resource Group in which to create the Network Interface. Changing this forces a new resource to be created.
     * 
     */
    @Import(name="resourceGroupName")
    private @Nullable Output<String> resourceGroupName;

    /**
     * @return The name of the Resource Group in which to create the Network Interface. Changing this forces a new resource to be created.
     * 
     */
    public Optional<Output<String>> resourceGroupName() {
        return Optional.ofNullable(this.resourceGroupName);
    }

    /**
     * A mapping of tags to assign to the resource.
     * 
     */
    @Import(name="tags")
    private @Nullable Output<Map<String,String>> tags;

    /**
     * @return A mapping of tags to assign to the resource.
     * 
     */
    public Optional<Output<Map<String,String>>> tags() {
        return Optional.ofNullable(this.tags);
    }

    /**
     * The ID of the Virtual Machine which this Network Interface is connected to.
     * 
     */
    @Import(name="virtualMachineId")
    private @Nullable Output<String> virtualMachineId;

    /**
     * @return The ID of the Virtual Machine which this Network Interface is connected to.
     * 
     */
    public Optional<Output<String>> virtualMachineId() {
        return Optional.ofNullable(this.virtualMachineId);
    }

    private NetworkInterfaceState() {}

    private NetworkInterfaceState(NetworkInterfaceState $) {
        this.appliedDnsServers = $.appliedDnsServers;
        this.dnsServers = $.dnsServers;
        this.edgeZone = $.edgeZone;
        this.enableAcceleratedNetworking = $.enableAcceleratedNetworking;
        this.enableIpForwarding = $.enableIpForwarding;
        this.internalDnsNameLabel = $.internalDnsNameLabel;
        this.internalDomainNameSuffix = $.internalDomainNameSuffix;
        this.ipConfigurations = $.ipConfigurations;
        this.location = $.location;
        this.macAddress = $.macAddress;
        this.name = $.name;
        this.privateIpAddress = $.privateIpAddress;
        this.privateIpAddresses = $.privateIpAddresses;
        this.resourceGroupName = $.resourceGroupName;
        this.tags = $.tags;
        this.virtualMachineId = $.virtualMachineId;
    }

    public static Builder builder() {
        return new Builder();
    }
    public static Builder builder(NetworkInterfaceState defaults) {
        return new Builder(defaults);
    }

    public static final class Builder {
        private NetworkInterfaceState $;

        public Builder() {
            $ = new NetworkInterfaceState();
        }

        public Builder(NetworkInterfaceState defaults) {
            $ = new NetworkInterfaceState(Objects.requireNonNull(defaults));
        }

        /**
         * @param appliedDnsServers If the Virtual Machine using this Network Interface is part of an Availability Set, then this list will have the union of all DNS servers from all Network Interfaces that are part of the Availability Set.
         * 
         * @return builder
         * 
         */
        public Builder appliedDnsServers(@Nullable Output<List<String>> appliedDnsServers) {
            $.appliedDnsServers = appliedDnsServers;
            return this;
        }

        /**
         * @param appliedDnsServers If the Virtual Machine using this Network Interface is part of an Availability Set, then this list will have the union of all DNS servers from all Network Interfaces that are part of the Availability Set.
         * 
         * @return builder
         * 
         */
        public Builder appliedDnsServers(List<String> appliedDnsServers) {
            return appliedDnsServers(Output.of(appliedDnsServers));
        }

        /**
         * @param appliedDnsServers If the Virtual Machine using this Network Interface is part of an Availability Set, then this list will have the union of all DNS servers from all Network Interfaces that are part of the Availability Set.
         * 
         * @return builder
         * 
         */
        public Builder appliedDnsServers(String... appliedDnsServers) {
            return appliedDnsServers(List.of(appliedDnsServers));
        }

        /**
         * @param dnsServers A list of IP Addresses defining the DNS Servers which should be used for this Network Interface.
         * 
         * &gt; **Note:** Configuring DNS Servers on the Network Interface will override the DNS Servers defined on the Virtual Network.
         * 
         * @return builder
         * 
         */
        public Builder dnsServers(@Nullable Output<List<String>> dnsServers) {
            $.dnsServers = dnsServers;
            return this;
        }

        /**
         * @param dnsServers A list of IP Addresses defining the DNS Servers which should be used for this Network Interface.
         * 
         * &gt; **Note:** Configuring DNS Servers on the Network Interface will override the DNS Servers defined on the Virtual Network.
         * 
         * @return builder
         * 
         */
        public Builder dnsServers(List<String> dnsServers) {
            return dnsServers(Output.of(dnsServers));
        }

        /**
         * @param dnsServers A list of IP Addresses defining the DNS Servers which should be used for this Network Interface.
         * 
         * &gt; **Note:** Configuring DNS Servers on the Network Interface will override the DNS Servers defined on the Virtual Network.
         * 
         * @return builder
         * 
         */
        public Builder dnsServers(String... dnsServers) {
            return dnsServers(List.of(dnsServers));
        }

        /**
         * @param edgeZone Specifies the Edge Zone within the Azure Region where this Network Interface should exist. Changing this forces a new Network Interface to be created.
         * 
         * @return builder
         * 
         */
        public Builder edgeZone(@Nullable Output<String> edgeZone) {
            $.edgeZone = edgeZone;
            return this;
        }

        /**
         * @param edgeZone Specifies the Edge Zone within the Azure Region where this Network Interface should exist. Changing this forces a new Network Interface to be created.
         * 
         * @return builder
         * 
         */
        public Builder edgeZone(String edgeZone) {
            return edgeZone(Output.of(edgeZone));
        }

        /**
         * @param enableAcceleratedNetworking Should Accelerated Networking be enabled? Defaults to `false`.
         * 
         * &gt; **Note:** Only certain Virtual Machine sizes are supported for Accelerated Networking - [more information can be found in this document](https://docs.microsoft.com/azure/virtual-network/create-vm-accelerated-networking-cli).
         * 
         * &gt; **Note:** To use Accelerated Networking in an Availability Set, the Availability Set must be deployed onto an Accelerated Networking enabled cluster.
         * 
         * @return builder
         * 
         */
        public Builder enableAcceleratedNetworking(@Nullable Output<Boolean> enableAcceleratedNetworking) {
            $.enableAcceleratedNetworking = enableAcceleratedNetworking;
            return this;
        }

        /**
         * @param enableAcceleratedNetworking Should Accelerated Networking be enabled? Defaults to `false`.
         * 
         * &gt; **Note:** Only certain Virtual Machine sizes are supported for Accelerated Networking - [more information can be found in this document](https://docs.microsoft.com/azure/virtual-network/create-vm-accelerated-networking-cli).
         * 
         * &gt; **Note:** To use Accelerated Networking in an Availability Set, the Availability Set must be deployed onto an Accelerated Networking enabled cluster.
         * 
         * @return builder
         * 
         */
        public Builder enableAcceleratedNetworking(Boolean enableAcceleratedNetworking) {
            return enableAcceleratedNetworking(Output.of(enableAcceleratedNetworking));
        }

        /**
         * @param enableIpForwarding Should IP Forwarding be enabled? Defaults to `false`.
         * 
         * @return builder
         * 
         */
        public Builder enableIpForwarding(@Nullable Output<Boolean> enableIpForwarding) {
            $.enableIpForwarding = enableIpForwarding;
            return this;
        }

        /**
         * @param enableIpForwarding Should IP Forwarding be enabled? Defaults to `false`.
         * 
         * @return builder
         * 
         */
        public Builder enableIpForwarding(Boolean enableIpForwarding) {
            return enableIpForwarding(Output.of(enableIpForwarding));
        }

        /**
         * @param internalDnsNameLabel The (relative) DNS Name used for internal communications between Virtual Machines in the same Virtual Network.
         * 
         * @return builder
         * 
         */
        public Builder internalDnsNameLabel(@Nullable Output<String> internalDnsNameLabel) {
            $.internalDnsNameLabel = internalDnsNameLabel;
            return this;
        }

        /**
         * @param internalDnsNameLabel The (relative) DNS Name used for internal communications between Virtual Machines in the same Virtual Network.
         * 
         * @return builder
         * 
         */
        public Builder internalDnsNameLabel(String internalDnsNameLabel) {
            return internalDnsNameLabel(Output.of(internalDnsNameLabel));
        }

        /**
         * @param internalDomainNameSuffix Even if `internal_dns_name_label` is not specified, a DNS entry is created for the primary NIC of the VM. This DNS name can be constructed by concatenating the VM name with the value of `internal_domain_name_suffix`.
         * 
         * @return builder
         * 
         */
        public Builder internalDomainNameSuffix(@Nullable Output<String> internalDomainNameSuffix) {
            $.internalDomainNameSuffix = internalDomainNameSuffix;
            return this;
        }

        /**
         * @param internalDomainNameSuffix Even if `internal_dns_name_label` is not specified, a DNS entry is created for the primary NIC of the VM. This DNS name can be constructed by concatenating the VM name with the value of `internal_domain_name_suffix`.
         * 
         * @return builder
         * 
         */
        public Builder internalDomainNameSuffix(String internalDomainNameSuffix) {
            return internalDomainNameSuffix(Output.of(internalDomainNameSuffix));
        }

        /**
         * @param ipConfigurations One or more `ip_configuration` blocks as defined below.
         * 
         * @return builder
         * 
         */
        public Builder ipConfigurations(@Nullable Output<List<NetworkInterfaceIpConfigurationArgs>> ipConfigurations) {
            $.ipConfigurations = ipConfigurations;
            return this;
        }

        /**
         * @param ipConfigurations One or more `ip_configuration` blocks as defined below.
         * 
         * @return builder
         * 
         */
        public Builder ipConfigurations(List<NetworkInterfaceIpConfigurationArgs> ipConfigurations) {
            return ipConfigurations(Output.of(ipConfigurations));
        }

        /**
         * @param ipConfigurations One or more `ip_configuration` blocks as defined below.
         * 
         * @return builder
         * 
         */
        public Builder ipConfigurations(NetworkInterfaceIpConfigurationArgs... ipConfigurations) {
            return ipConfigurations(List.of(ipConfigurations));
        }

        /**
         * @param location The location where the Network Interface should exist. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder location(@Nullable Output<String> location) {
            $.location = location;
            return this;
        }

        /**
         * @param location The location where the Network Interface should exist. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder location(String location) {
            return location(Output.of(location));
        }

        /**
         * @param macAddress The Media Access Control (MAC) Address of the Network Interface.
         * 
         * @return builder
         * 
         */
        public Builder macAddress(@Nullable Output<String> macAddress) {
            $.macAddress = macAddress;
            return this;
        }

        /**
         * @param macAddress The Media Access Control (MAC) Address of the Network Interface.
         * 
         * @return builder
         * 
         */
        public Builder macAddress(String macAddress) {
            return macAddress(Output.of(macAddress));
        }

        /**
         * @param name The name of the Network Interface. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder name(@Nullable Output<String> name) {
            $.name = name;
            return this;
        }

        /**
         * @param name The name of the Network Interface. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder name(String name) {
            return name(Output.of(name));
        }

        /**
         * @param privateIpAddress The Static IP Address which should be used.
         * 
         * @return builder
         * 
         */
        public Builder privateIpAddress(@Nullable Output<String> privateIpAddress) {
            $.privateIpAddress = privateIpAddress;
            return this;
        }

        /**
         * @param privateIpAddress The Static IP Address which should be used.
         * 
         * @return builder
         * 
         */
        public Builder privateIpAddress(String privateIpAddress) {
            return privateIpAddress(Output.of(privateIpAddress));
        }

        /**
         * @param privateIpAddresses The private IP addresses of the network interface.
         * 
         * @return builder
         * 
         */
        public Builder privateIpAddresses(@Nullable Output<List<String>> privateIpAddresses) {
            $.privateIpAddresses = privateIpAddresses;
            return this;
        }

        /**
         * @param privateIpAddresses The private IP addresses of the network interface.
         * 
         * @return builder
         * 
         */
        public Builder privateIpAddresses(List<String> privateIpAddresses) {
            return privateIpAddresses(Output.of(privateIpAddresses));
        }

        /**
         * @param privateIpAddresses The private IP addresses of the network interface.
         * 
         * @return builder
         * 
         */
        public Builder privateIpAddresses(String... privateIpAddresses) {
            return privateIpAddresses(List.of(privateIpAddresses));
        }

        /**
         * @param resourceGroupName The name of the Resource Group in which to create the Network Interface. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder resourceGroupName(@Nullable Output<String> resourceGroupName) {
            $.resourceGroupName = resourceGroupName;
            return this;
        }

        /**
         * @param resourceGroupName The name of the Resource Group in which to create the Network Interface. Changing this forces a new resource to be created.
         * 
         * @return builder
         * 
         */
        public Builder resourceGroupName(String resourceGroupName) {
            return resourceGroupName(Output.of(resourceGroupName));
        }

        /**
         * @param tags A mapping of tags to assign to the resource.
         * 
         * @return builder
         * 
         */
        public Builder tags(@Nullable Output<Map<String,String>> tags) {
            $.tags = tags;
            return this;
        }

        /**
         * @param tags A mapping of tags to assign to the resource.
         * 
         * @return builder
         * 
         */
        public Builder tags(Map<String,String> tags) {
            return tags(Output.of(tags));
        }

        /**
         * @param virtualMachineId The ID of the Virtual Machine which this Network Interface is connected to.
         * 
         * @return builder
         * 
         */
        public Builder virtualMachineId(@Nullable Output<String> virtualMachineId) {
            $.virtualMachineId = virtualMachineId;
            return this;
        }

        /**
         * @param virtualMachineId The ID of the Virtual Machine which this Network Interface is connected to.
         * 
         * @return builder
         * 
         */
        public Builder virtualMachineId(String virtualMachineId) {
            return virtualMachineId(Output.of(virtualMachineId));
        }

        public NetworkInterfaceState build() {
            return $;
        }
    }

}
