// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
// Code generated by Microsoft (R) AutoRest Code Generator.

package com.azure.resourcemanager.managednetworkfabric.models;

import com.azure.core.management.Region;
import com.azure.core.management.SystemData;
import com.azure.core.util.Context;
import com.azure.resourcemanager.managednetworkfabric.fluent.models.L3IsolationDomainInner;
import java.util.List;
import java.util.Map;

/** An immutable client-side representation of L3IsolationDomain. */
public interface L3IsolationDomain {
    /**
     * Gets the id property: Fully qualified resource Id for the resource.
     *
     * @return the id value.
     */
    String id();

    /**
     * Gets the name property: The name of the resource.
     *
     * @return the name value.
     */
    String name();

    /**
     * Gets the type property: The type of the resource.
     *
     * @return the type value.
     */
    String type();

    /**
     * Gets the location property: The geo-location where the resource lives.
     *
     * @return the location value.
     */
    String location();

    /**
     * Gets the tags property: Resource tags.
     *
     * @return the tags value.
     */
    Map<String, String> tags();

    /**
     * Gets the systemData property: Azure Resource Manager metadata containing createdBy and modifiedBy information.
     *
     * @return the systemData value.
     */
    SystemData systemData();

    /**
     * Gets the networkFabricId property: Network Fabric ARM resource id.
     *
     * @return the networkFabricId value.
     */
    String networkFabricId();

    /**
     * Gets the disabledOnResources property: List of resources the L3 Isolation Domain is disabled on. Can be either
     * entire NetworkFabric or NetworkRack.
     *
     * @return the disabledOnResources value.
     */
    List<String> disabledOnResources();

    /**
     * Gets the administrativeState property: Administrative state of the IsolationDomain. Example: Enabled | Disabled.
     *
     * @return the administrativeState value.
     */
    EnabledDisabledState administrativeState();

    /**
     * Gets the optionBDisabledOnResources property: List of resources the OptionB is disabled on. Can be either entire
     * NetworkFabric or NetworkRack.
     *
     * @return the optionBDisabledOnResources value.
     */
    List<String> optionBDisabledOnResources();

    /**
     * Gets the provisioningState property: Gets the provisioning state of the resource.
     *
     * @return the provisioningState value.
     */
    ProvisioningState provisioningState();

    /**
     * Gets the redistributeConnectedSubnets property: Advertise Connected Subnets. Ex: "True" | "False".
     *
     * @return the redistributeConnectedSubnets value.
     */
    RedistributeConnectedSubnets redistributeConnectedSubnets();

    /**
     * Gets the redistributeStaticRoutes property: Advertise Static Routes. Ex: "True" | "False".
     *
     * @return the redistributeStaticRoutes value.
     */
    RedistributeStaticRoutes redistributeStaticRoutes();

    /**
     * Gets the aggregateRouteConfiguration property: List of Ipv4 and Ipv6 route configurations.
     *
     * @return the aggregateRouteConfiguration value.
     */
    AggregateRouteConfiguration aggregateRouteConfiguration();

    /**
     * Gets the description property: L3 Isolation Domain description.
     *
     * @return the description value.
     */
    String description();

    /**
     * Gets the connectedSubnetRoutePolicy property: Connected Subnet RoutePolicy.
     *
     * @return the connectedSubnetRoutePolicy value.
     */
    L3IsolationDomainPatchPropertiesConnectedSubnetRoutePolicy connectedSubnetRoutePolicy();

    /**
     * Gets the annotation property: Switch configuration description.
     *
     * @return the annotation value.
     */
    String annotation();

    /**
     * Gets the region of the resource.
     *
     * @return the region of the resource.
     */
    Region region();

    /**
     * Gets the name of the resource region.
     *
     * @return the name of the resource region.
     */
    String regionName();

    /**
     * Gets the name of the resource group.
     *
     * @return the name of the resource group.
     */
    String resourceGroupName();

    /**
     * Gets the inner com.azure.resourcemanager.managednetworkfabric.fluent.models.L3IsolationDomainInner object.
     *
     * @return the inner object.
     */
    L3IsolationDomainInner innerModel();

    /** The entirety of the L3IsolationDomain definition. */
    interface Definition
        extends DefinitionStages.Blank,
            DefinitionStages.WithLocation,
            DefinitionStages.WithResourceGroup,
            DefinitionStages.WithCreate {
    }
    /** The L3IsolationDomain definition stages. */
    interface DefinitionStages {
        /** The first stage of the L3IsolationDomain definition. */
        interface Blank extends WithLocation {
        }
        /** The stage of the L3IsolationDomain definition allowing to specify location. */
        interface WithLocation {
            /**
             * Specifies the region for the resource.
             *
             * @param location The geo-location where the resource lives.
             * @return the next definition stage.
             */
            WithResourceGroup withRegion(Region location);

            /**
             * Specifies the region for the resource.
             *
             * @param location The geo-location where the resource lives.
             * @return the next definition stage.
             */
            WithResourceGroup withRegion(String location);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify parent resource. */
        interface WithResourceGroup {
            /**
             * Specifies resourceGroupName.
             *
             * @param resourceGroupName The name of the resource group. The name is case insensitive.
             * @return the next definition stage.
             */
            WithCreate withExistingResourceGroup(String resourceGroupName);
        }
        /**
         * The stage of the L3IsolationDomain definition which contains all the minimum required properties for the
         * resource to be created, but also allows for any other optional properties to be specified.
         */
        interface WithCreate
            extends DefinitionStages.WithTags,
                DefinitionStages.WithNetworkFabricId,
                DefinitionStages.WithRedistributeConnectedSubnets,
                DefinitionStages.WithRedistributeStaticRoutes,
                DefinitionStages.WithAggregateRouteConfiguration,
                DefinitionStages.WithDescription,
                DefinitionStages.WithConnectedSubnetRoutePolicy,
                DefinitionStages.WithAnnotation {
            /**
             * Executes the create request.
             *
             * @return the created resource.
             */
            L3IsolationDomain create();

            /**
             * Executes the create request.
             *
             * @param context The context to associate with this operation.
             * @return the created resource.
             */
            L3IsolationDomain create(Context context);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify tags. */
        interface WithTags {
            /**
             * Specifies the tags property: Resource tags..
             *
             * @param tags Resource tags.
             * @return the next definition stage.
             */
            WithCreate withTags(Map<String, String> tags);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify networkFabricId. */
        interface WithNetworkFabricId {
            /**
             * Specifies the networkFabricId property: Network Fabric ARM resource id..
             *
             * @param networkFabricId Network Fabric ARM resource id.
             * @return the next definition stage.
             */
            WithCreate withNetworkFabricId(String networkFabricId);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify redistributeConnectedSubnets. */
        interface WithRedistributeConnectedSubnets {
            /**
             * Specifies the redistributeConnectedSubnets property: Advertise Connected Subnets. Ex: "True" | "False"..
             *
             * @param redistributeConnectedSubnets Advertise Connected Subnets. Ex: "True" | "False".
             * @return the next definition stage.
             */
            WithCreate withRedistributeConnectedSubnets(RedistributeConnectedSubnets redistributeConnectedSubnets);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify redistributeStaticRoutes. */
        interface WithRedistributeStaticRoutes {
            /**
             * Specifies the redistributeStaticRoutes property: Advertise Static Routes. Ex: "True" | "False"..
             *
             * @param redistributeStaticRoutes Advertise Static Routes. Ex: "True" | "False".
             * @return the next definition stage.
             */
            WithCreate withRedistributeStaticRoutes(RedistributeStaticRoutes redistributeStaticRoutes);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify aggregateRouteConfiguration. */
        interface WithAggregateRouteConfiguration {
            /**
             * Specifies the aggregateRouteConfiguration property: List of Ipv4 and Ipv6 route configurations..
             *
             * @param aggregateRouteConfiguration List of Ipv4 and Ipv6 route configurations.
             * @return the next definition stage.
             */
            WithCreate withAggregateRouteConfiguration(AggregateRouteConfiguration aggregateRouteConfiguration);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify description. */
        interface WithDescription {
            /**
             * Specifies the description property: L3 Isolation Domain description..
             *
             * @param description L3 Isolation Domain description.
             * @return the next definition stage.
             */
            WithCreate withDescription(String description);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify connectedSubnetRoutePolicy. */
        interface WithConnectedSubnetRoutePolicy {
            /**
             * Specifies the connectedSubnetRoutePolicy property: Connected Subnet RoutePolicy.
             *
             * @param connectedSubnetRoutePolicy Connected Subnet RoutePolicy.
             * @return the next definition stage.
             */
            WithCreate withConnectedSubnetRoutePolicy(
                L3IsolationDomainPatchPropertiesConnectedSubnetRoutePolicy connectedSubnetRoutePolicy);
        }
        /** The stage of the L3IsolationDomain definition allowing to specify annotation. */
        interface WithAnnotation {
            /**
             * Specifies the annotation property: Switch configuration description..
             *
             * @param annotation Switch configuration description.
             * @return the next definition stage.
             */
            WithCreate withAnnotation(String annotation);
        }
    }
    /**
     * Begins update for the L3IsolationDomain resource.
     *
     * @return the stage of resource update.
     */
    L3IsolationDomain.Update update();

    /** The template for L3IsolationDomain update. */
    interface Update
        extends UpdateStages.WithTags,
            UpdateStages.WithRedistributeConnectedSubnets,
            UpdateStages.WithRedistributeStaticRoutes,
            UpdateStages.WithAggregateRouteConfiguration,
            UpdateStages.WithDescription,
            UpdateStages.WithConnectedSubnetRoutePolicy {
        /**
         * Executes the update request.
         *
         * @return the updated resource.
         */
        L3IsolationDomain apply();

        /**
         * Executes the update request.
         *
         * @param context The context to associate with this operation.
         * @return the updated resource.
         */
        L3IsolationDomain apply(Context context);
    }
    /** The L3IsolationDomain update stages. */
    interface UpdateStages {
        /** The stage of the L3IsolationDomain update allowing to specify tags. */
        interface WithTags {
            /**
             * Specifies the tags property: Resource tags.
             *
             * @param tags Resource tags.
             * @return the next definition stage.
             */
            Update withTags(Map<String, String> tags);
        }
        /** The stage of the L3IsolationDomain update allowing to specify redistributeConnectedSubnets. */
        interface WithRedistributeConnectedSubnets {
            /**
             * Specifies the redistributeConnectedSubnets property: Advertise Connected Subnets. Ex: "True" | "False"..
             *
             * @param redistributeConnectedSubnets Advertise Connected Subnets. Ex: "True" | "False".
             * @return the next definition stage.
             */
            Update withRedistributeConnectedSubnets(RedistributeConnectedSubnets redistributeConnectedSubnets);
        }
        /** The stage of the L3IsolationDomain update allowing to specify redistributeStaticRoutes. */
        interface WithRedistributeStaticRoutes {
            /**
             * Specifies the redistributeStaticRoutes property: Advertise Static Routes. Ex: "True" | "False"..
             *
             * @param redistributeStaticRoutes Advertise Static Routes. Ex: "True" | "False".
             * @return the next definition stage.
             */
            Update withRedistributeStaticRoutes(RedistributeStaticRoutes redistributeStaticRoutes);
        }
        /** The stage of the L3IsolationDomain update allowing to specify aggregateRouteConfiguration. */
        interface WithAggregateRouteConfiguration {
            /**
             * Specifies the aggregateRouteConfiguration property: List of Ipv4 and Ipv6 route configurations..
             *
             * @param aggregateRouteConfiguration List of Ipv4 and Ipv6 route configurations.
             * @return the next definition stage.
             */
            Update withAggregateRouteConfiguration(AggregateRouteConfiguration aggregateRouteConfiguration);
        }
        /** The stage of the L3IsolationDomain update allowing to specify description. */
        interface WithDescription {
            /**
             * Specifies the description property: L3 Isolation Domain description..
             *
             * @param description L3 Isolation Domain description.
             * @return the next definition stage.
             */
            Update withDescription(String description);
        }
        /** The stage of the L3IsolationDomain update allowing to specify connectedSubnetRoutePolicy. */
        interface WithConnectedSubnetRoutePolicy {
            /**
             * Specifies the connectedSubnetRoutePolicy property: Connected Subnet RoutePolicy.
             *
             * @param connectedSubnetRoutePolicy Connected Subnet RoutePolicy.
             * @return the next definition stage.
             */
            Update withConnectedSubnetRoutePolicy(
                L3IsolationDomainPatchPropertiesConnectedSubnetRoutePolicy connectedSubnetRoutePolicy);
        }
    }
    /**
     * Refreshes the resource to sync with Azure.
     *
     * @return the refreshed resource.
     */
    L3IsolationDomain refresh();

    /**
     * Refreshes the resource to sync with Azure.
     *
     * @param context The context to associate with this operation.
     * @return the refreshed resource.
     */
    L3IsolationDomain refresh(Context context);

    /**
     * executes enable operation to the underlying resources.
     *
     * <p>Enables racks for this Isolation Domain.
     *
     * @param body Request payload.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void updateAdministrativeState(UpdateAdministrativeState body);

    /**
     * executes enable operation to the underlying resources.
     *
     * <p>Enables racks for this Isolation Domain.
     *
     * @param body Request payload.
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void updateAdministrativeState(UpdateAdministrativeState body, Context context);

    /**
     * Update route targets on CE devices. List the CE network device ARM resource IDs in the request body payload.
     *
     * <p>Update administrative state of option B on CE devices.
     *
     * @param body Request payload.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void updateOptionBAdministrativeState(UpdateAdministrativeState body);

    /**
     * Update route targets on CE devices. List the CE network device ARM resource IDs in the request body payload.
     *
     * <p>Update administrative state of option B on CE devices.
     *
     * @param body Request payload.
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void updateOptionBAdministrativeState(UpdateAdministrativeState body, Context context);

    /**
     * executes clear ARP operation to the underlying resources.
     *
     * <p>Clears ARP tables for this Isolation Domain.
     *
     * @param body Request payload.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void clearArpTable(EnableDisableOnResources body);

    /**
     * executes clear ARP operation to the underlying resources.
     *
     * <p>Clears ARP tables for this Isolation Domain.
     *
     * @param body Request payload.
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void clearArpTable(EnableDisableOnResources body, Context context);

    /**
     * executes ipv6 clear neighbor tables operation to the underlying resources.
     *
     * <p>Clears IPv6 neighbor tables for this Isolation Domain.
     *
     * @param body Request payload.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void clearNeighborTable(EnableDisableOnResources body);

    /**
     * executes ipv6 clear neighbor tables operation to the underlying resources.
     *
     * <p>Clears IPv6 neighbor tables for this Isolation Domain.
     *
     * @param body Request payload.
     * @param context The context to associate with this operation.
     * @throws IllegalArgumentException thrown if parameters fail the validation.
     * @throws com.azure.core.management.exception.ManagementException thrown if the request is rejected by server.
     * @throws RuntimeException all other wrapped checked exceptions if the request fails to be sent.
     */
    void clearNeighborTable(EnableDisableOnResources body, Context context);
}
