// *** 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.VpnGatewayConnectionVpnLinkCustomBgpAddressArgs;
import com.pulumi.azure.network.inputs.VpnGatewayConnectionVpnLinkIpsecPolicyArgs;
import com.pulumi.core.Output;
import com.pulumi.core.annotations.Import;
import java.lang.Boolean;
import java.lang.Integer;
import java.lang.String;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Nullable;


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

    public static final VpnGatewayConnectionVpnLinkArgs Empty = new VpnGatewayConnectionVpnLinkArgs();

    /**
     * The expected connection bandwidth in MBPS. Defaults to `10`.
     * 
     */
    @Import(name="bandwidthMbps")
    private @Nullable Output<Integer> bandwidthMbps;

    /**
     * @return The expected connection bandwidth in MBPS. Defaults to `10`.
     * 
     */
    public Optional<Output<Integer>> bandwidthMbps() {
        return Optional.ofNullable(this.bandwidthMbps);
    }

    /**
     * Should the BGP be enabled? Defaults to `false`. Changing this forces a new VPN Gateway Connection to be created.
     * 
     */
    @Import(name="bgpEnabled")
    private @Nullable Output<Boolean> bgpEnabled;

    /**
     * @return Should the BGP be enabled? Defaults to `false`. Changing this forces a new VPN Gateway Connection to be created.
     * 
     */
    public Optional<Output<Boolean>> bgpEnabled() {
        return Optional.ofNullable(this.bgpEnabled);
    }

    /**
     * The connection mode of this VPN Link. Possible values are `Default`, `InitiatorOnly` and `ResponderOnly`. Defaults to `Default`.
     * 
     */
    @Import(name="connectionMode")
    private @Nullable Output<String> connectionMode;

    /**
     * @return The connection mode of this VPN Link. Possible values are `Default`, `InitiatorOnly` and `ResponderOnly`. Defaults to `Default`.
     * 
     */
    public Optional<Output<String>> connectionMode() {
        return Optional.ofNullable(this.connectionMode);
    }

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

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

    /**
     * A list of the egress NAT Rule Ids.
     * 
     */
    @Import(name="egressNatRuleIds")
    private @Nullable Output<List<String>> egressNatRuleIds;

    /**
     * @return A list of the egress NAT Rule Ids.
     * 
     */
    public Optional<Output<List<String>>> egressNatRuleIds() {
        return Optional.ofNullable(this.egressNatRuleIds);
    }

    /**
     * A list of the ingress NAT Rule Ids.
     * 
     */
    @Import(name="ingressNatRuleIds")
    private @Nullable Output<List<String>> ingressNatRuleIds;

    /**
     * @return A list of the ingress NAT Rule Ids.
     * 
     */
    public Optional<Output<List<String>>> ingressNatRuleIds() {
        return Optional.ofNullable(this.ingressNatRuleIds);
    }

    /**
     * One or more `ipsec_policy` blocks as defined above.
     * 
     */
    @Import(name="ipsecPolicies")
    private @Nullable Output<List<VpnGatewayConnectionVpnLinkIpsecPolicyArgs>> ipsecPolicies;

    /**
     * @return One or more `ipsec_policy` blocks as defined above.
     * 
     */
    public Optional<Output<List<VpnGatewayConnectionVpnLinkIpsecPolicyArgs>>> ipsecPolicies() {
        return Optional.ofNullable(this.ipsecPolicies);
    }

    /**
     * Whether to use local Azure IP to initiate connection? Defaults to `false`.
     * 
     */
    @Import(name="localAzureIpAddressEnabled")
    private @Nullable Output<Boolean> localAzureIpAddressEnabled;

    /**
     * @return Whether to use local Azure IP to initiate connection? Defaults to `false`.
     * 
     */
    public Optional<Output<Boolean>> localAzureIpAddressEnabled() {
        return Optional.ofNullable(this.localAzureIpAddressEnabled);
    }

    /**
     * The name which should be used for this VPN Link Connection.
     * 
     */
    @Import(name="name", required=true)
    private Output<String> name;

    /**
     * @return The name which should be used for this VPN Link Connection.
     * 
     */
    public Output<String> name() {
        return this.name;
    }

    /**
     * Whether to enable policy-based traffic selectors? Defaults to `false`.
     * 
     */
    @Import(name="policyBasedTrafficSelectorEnabled")
    private @Nullable Output<Boolean> policyBasedTrafficSelectorEnabled;

    /**
     * @return Whether to enable policy-based traffic selectors? Defaults to `false`.
     * 
     */
    public Optional<Output<Boolean>> policyBasedTrafficSelectorEnabled() {
        return Optional.ofNullable(this.policyBasedTrafficSelectorEnabled);
    }

    /**
     * The protocol used for this VPN Link Connection. Possible values are `IKEv1` and `IKEv2`. Defaults to `IKEv2`.
     * 
     */
    @Import(name="protocol")
    private @Nullable Output<String> protocol;

    /**
     * @return The protocol used for this VPN Link Connection. Possible values are `IKEv1` and `IKEv2`. Defaults to `IKEv2`.
     * 
     */
    public Optional<Output<String>> protocol() {
        return Optional.ofNullable(this.protocol);
    }

    /**
     * Should the rate limit be enabled? Defaults to `false`.
     * 
     */
    @Import(name="ratelimitEnabled")
    private @Nullable Output<Boolean> ratelimitEnabled;

    /**
     * @return Should the rate limit be enabled? Defaults to `false`.
     * 
     */
    public Optional<Output<Boolean>> ratelimitEnabled() {
        return Optional.ofNullable(this.ratelimitEnabled);
    }

    /**
     * Routing weight for this VPN Link Connection. Defaults to `0`.
     * 
     */
    @Import(name="routeWeight")
    private @Nullable Output<Integer> routeWeight;

    /**
     * @return Routing weight for this VPN Link Connection. Defaults to `0`.
     * 
     */
    public Optional<Output<Integer>> routeWeight() {
        return Optional.ofNullable(this.routeWeight);
    }

    /**
     * SharedKey for this VPN Link Connection.
     * 
     */
    @Import(name="sharedKey")
    private @Nullable Output<String> sharedKey;

    /**
     * @return SharedKey for this VPN Link Connection.
     * 
     */
    public Optional<Output<String>> sharedKey() {
        return Optional.ofNullable(this.sharedKey);
    }

    /**
     * The ID of the connected VPN Site Link. Changing this forces a new VPN Gateway Connection to be created.
     * 
     */
    @Import(name="vpnSiteLinkId", required=true)
    private Output<String> vpnSiteLinkId;

    /**
     * @return The ID of the connected VPN Site Link. Changing this forces a new VPN Gateway Connection to be created.
     * 
     */
    public Output<String> vpnSiteLinkId() {
        return this.vpnSiteLinkId;
    }

    private VpnGatewayConnectionVpnLinkArgs() {}

    private VpnGatewayConnectionVpnLinkArgs(VpnGatewayConnectionVpnLinkArgs $) {
        this.bandwidthMbps = $.bandwidthMbps;
        this.bgpEnabled = $.bgpEnabled;
        this.connectionMode = $.connectionMode;
        this.customBgpAddresses = $.customBgpAddresses;
        this.egressNatRuleIds = $.egressNatRuleIds;
        this.ingressNatRuleIds = $.ingressNatRuleIds;
        this.ipsecPolicies = $.ipsecPolicies;
        this.localAzureIpAddressEnabled = $.localAzureIpAddressEnabled;
        this.name = $.name;
        this.policyBasedTrafficSelectorEnabled = $.policyBasedTrafficSelectorEnabled;
        this.protocol = $.protocol;
        this.ratelimitEnabled = $.ratelimitEnabled;
        this.routeWeight = $.routeWeight;
        this.sharedKey = $.sharedKey;
        this.vpnSiteLinkId = $.vpnSiteLinkId;
    }

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

    public static final class Builder {
        private VpnGatewayConnectionVpnLinkArgs $;

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

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

        /**
         * @param bandwidthMbps The expected connection bandwidth in MBPS. Defaults to `10`.
         * 
         * @return builder
         * 
         */
        public Builder bandwidthMbps(@Nullable Output<Integer> bandwidthMbps) {
            $.bandwidthMbps = bandwidthMbps;
            return this;
        }

        /**
         * @param bandwidthMbps The expected connection bandwidth in MBPS. Defaults to `10`.
         * 
         * @return builder
         * 
         */
        public Builder bandwidthMbps(Integer bandwidthMbps) {
            return bandwidthMbps(Output.of(bandwidthMbps));
        }

        /**
         * @param bgpEnabled Should the BGP be enabled? Defaults to `false`. Changing this forces a new VPN Gateway Connection to be created.
         * 
         * @return builder
         * 
         */
        public Builder bgpEnabled(@Nullable Output<Boolean> bgpEnabled) {
            $.bgpEnabled = bgpEnabled;
            return this;
        }

        /**
         * @param bgpEnabled Should the BGP be enabled? Defaults to `false`. Changing this forces a new VPN Gateway Connection to be created.
         * 
         * @return builder
         * 
         */
        public Builder bgpEnabled(Boolean bgpEnabled) {
            return bgpEnabled(Output.of(bgpEnabled));
        }

        /**
         * @param connectionMode The connection mode of this VPN Link. Possible values are `Default`, `InitiatorOnly` and `ResponderOnly`. Defaults to `Default`.
         * 
         * @return builder
         * 
         */
        public Builder connectionMode(@Nullable Output<String> connectionMode) {
            $.connectionMode = connectionMode;
            return this;
        }

        /**
         * @param connectionMode The connection mode of this VPN Link. Possible values are `Default`, `InitiatorOnly` and `ResponderOnly`. Defaults to `Default`.
         * 
         * @return builder
         * 
         */
        public Builder connectionMode(String connectionMode) {
            return connectionMode(Output.of(connectionMode));
        }

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

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

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

        /**
         * @param egressNatRuleIds A list of the egress NAT Rule Ids.
         * 
         * @return builder
         * 
         */
        public Builder egressNatRuleIds(@Nullable Output<List<String>> egressNatRuleIds) {
            $.egressNatRuleIds = egressNatRuleIds;
            return this;
        }

        /**
         * @param egressNatRuleIds A list of the egress NAT Rule Ids.
         * 
         * @return builder
         * 
         */
        public Builder egressNatRuleIds(List<String> egressNatRuleIds) {
            return egressNatRuleIds(Output.of(egressNatRuleIds));
        }

        /**
         * @param egressNatRuleIds A list of the egress NAT Rule Ids.
         * 
         * @return builder
         * 
         */
        public Builder egressNatRuleIds(String... egressNatRuleIds) {
            return egressNatRuleIds(List.of(egressNatRuleIds));
        }

        /**
         * @param ingressNatRuleIds A list of the ingress NAT Rule Ids.
         * 
         * @return builder
         * 
         */
        public Builder ingressNatRuleIds(@Nullable Output<List<String>> ingressNatRuleIds) {
            $.ingressNatRuleIds = ingressNatRuleIds;
            return this;
        }

        /**
         * @param ingressNatRuleIds A list of the ingress NAT Rule Ids.
         * 
         * @return builder
         * 
         */
        public Builder ingressNatRuleIds(List<String> ingressNatRuleIds) {
            return ingressNatRuleIds(Output.of(ingressNatRuleIds));
        }

        /**
         * @param ingressNatRuleIds A list of the ingress NAT Rule Ids.
         * 
         * @return builder
         * 
         */
        public Builder ingressNatRuleIds(String... ingressNatRuleIds) {
            return ingressNatRuleIds(List.of(ingressNatRuleIds));
        }

        /**
         * @param ipsecPolicies One or more `ipsec_policy` blocks as defined above.
         * 
         * @return builder
         * 
         */
        public Builder ipsecPolicies(@Nullable Output<List<VpnGatewayConnectionVpnLinkIpsecPolicyArgs>> ipsecPolicies) {
            $.ipsecPolicies = ipsecPolicies;
            return this;
        }

        /**
         * @param ipsecPolicies One or more `ipsec_policy` blocks as defined above.
         * 
         * @return builder
         * 
         */
        public Builder ipsecPolicies(List<VpnGatewayConnectionVpnLinkIpsecPolicyArgs> ipsecPolicies) {
            return ipsecPolicies(Output.of(ipsecPolicies));
        }

        /**
         * @param ipsecPolicies One or more `ipsec_policy` blocks as defined above.
         * 
         * @return builder
         * 
         */
        public Builder ipsecPolicies(VpnGatewayConnectionVpnLinkIpsecPolicyArgs... ipsecPolicies) {
            return ipsecPolicies(List.of(ipsecPolicies));
        }

        /**
         * @param localAzureIpAddressEnabled Whether to use local Azure IP to initiate connection? Defaults to `false`.
         * 
         * @return builder
         * 
         */
        public Builder localAzureIpAddressEnabled(@Nullable Output<Boolean> localAzureIpAddressEnabled) {
            $.localAzureIpAddressEnabled = localAzureIpAddressEnabled;
            return this;
        }

        /**
         * @param localAzureIpAddressEnabled Whether to use local Azure IP to initiate connection? Defaults to `false`.
         * 
         * @return builder
         * 
         */
        public Builder localAzureIpAddressEnabled(Boolean localAzureIpAddressEnabled) {
            return localAzureIpAddressEnabled(Output.of(localAzureIpAddressEnabled));
        }

        /**
         * @param name The name which should be used for this VPN Link Connection.
         * 
         * @return builder
         * 
         */
        public Builder name(Output<String> name) {
            $.name = name;
            return this;
        }

        /**
         * @param name The name which should be used for this VPN Link Connection.
         * 
         * @return builder
         * 
         */
        public Builder name(String name) {
            return name(Output.of(name));
        }

        /**
         * @param policyBasedTrafficSelectorEnabled Whether to enable policy-based traffic selectors? Defaults to `false`.
         * 
         * @return builder
         * 
         */
        public Builder policyBasedTrafficSelectorEnabled(@Nullable Output<Boolean> policyBasedTrafficSelectorEnabled) {
            $.policyBasedTrafficSelectorEnabled = policyBasedTrafficSelectorEnabled;
            return this;
        }

        /**
         * @param policyBasedTrafficSelectorEnabled Whether to enable policy-based traffic selectors? Defaults to `false`.
         * 
         * @return builder
         * 
         */
        public Builder policyBasedTrafficSelectorEnabled(Boolean policyBasedTrafficSelectorEnabled) {
            return policyBasedTrafficSelectorEnabled(Output.of(policyBasedTrafficSelectorEnabled));
        }

        /**
         * @param protocol The protocol used for this VPN Link Connection. Possible values are `IKEv1` and `IKEv2`. Defaults to `IKEv2`.
         * 
         * @return builder
         * 
         */
        public Builder protocol(@Nullable Output<String> protocol) {
            $.protocol = protocol;
            return this;
        }

        /**
         * @param protocol The protocol used for this VPN Link Connection. Possible values are `IKEv1` and `IKEv2`. Defaults to `IKEv2`.
         * 
         * @return builder
         * 
         */
        public Builder protocol(String protocol) {
            return protocol(Output.of(protocol));
        }

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

        /**
         * @param ratelimitEnabled Should the rate limit be enabled? Defaults to `false`.
         * 
         * @return builder
         * 
         */
        public Builder ratelimitEnabled(Boolean ratelimitEnabled) {
            return ratelimitEnabled(Output.of(ratelimitEnabled));
        }

        /**
         * @param routeWeight Routing weight for this VPN Link Connection. Defaults to `0`.
         * 
         * @return builder
         * 
         */
        public Builder routeWeight(@Nullable Output<Integer> routeWeight) {
            $.routeWeight = routeWeight;
            return this;
        }

        /**
         * @param routeWeight Routing weight for this VPN Link Connection. Defaults to `0`.
         * 
         * @return builder
         * 
         */
        public Builder routeWeight(Integer routeWeight) {
            return routeWeight(Output.of(routeWeight));
        }

        /**
         * @param sharedKey SharedKey for this VPN Link Connection.
         * 
         * @return builder
         * 
         */
        public Builder sharedKey(@Nullable Output<String> sharedKey) {
            $.sharedKey = sharedKey;
            return this;
        }

        /**
         * @param sharedKey SharedKey for this VPN Link Connection.
         * 
         * @return builder
         * 
         */
        public Builder sharedKey(String sharedKey) {
            return sharedKey(Output.of(sharedKey));
        }

        /**
         * @param vpnSiteLinkId The ID of the connected VPN Site Link. Changing this forces a new VPN Gateway Connection to be created.
         * 
         * @return builder
         * 
         */
        public Builder vpnSiteLinkId(Output<String> vpnSiteLinkId) {
            $.vpnSiteLinkId = vpnSiteLinkId;
            return this;
        }

        /**
         * @param vpnSiteLinkId The ID of the connected VPN Site Link. Changing this forces a new VPN Gateway Connection to be created.
         * 
         * @return builder
         * 
         */
        public Builder vpnSiteLinkId(String vpnSiteLinkId) {
            return vpnSiteLinkId(Output.of(vpnSiteLinkId));
        }

        public VpnGatewayConnectionVpnLinkArgs build() {
            $.name = Objects.requireNonNull($.name, "expected parameter 'name' to be non-null");
            $.vpnSiteLinkId = Objects.requireNonNull($.vpnSiteLinkId, "expected parameter 'vpnSiteLinkId' to be non-null");
            return $;
        }
    }

}
