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

package com.azure.resourcemanager.netapp.fluent.models;

import com.azure.core.annotation.Fluent;
import com.azure.core.util.logging.ClientLogger;
import com.azure.resourcemanager.netapp.models.AvsDataStore;
import com.azure.resourcemanager.netapp.models.EnableSubvolumes;
import com.azure.resourcemanager.netapp.models.EncryptionKeySource;
import com.azure.resourcemanager.netapp.models.FileAccessLogs;
import com.azure.resourcemanager.netapp.models.NetworkFeatures;
import com.azure.resourcemanager.netapp.models.PlacementKeyValuePairs;
import com.azure.resourcemanager.netapp.models.SecurityStyle;
import com.azure.resourcemanager.netapp.models.ServiceLevel;
import com.azure.resourcemanager.netapp.models.SmbAccessBasedEnumeration;
import com.azure.resourcemanager.netapp.models.SmbNonBrowsable;
import com.azure.resourcemanager.netapp.models.VolumePropertiesDataProtection;
import com.azure.resourcemanager.netapp.models.VolumePropertiesExportPolicy;
import com.azure.resourcemanager.netapp.models.VolumeStorageToNetworkProximity;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

/** Volume properties. */
@Fluent
public final class VolumeProperties {
    /*
     * FileSystem ID
     *
     * Unique FileSystem Identifier.
     */
    @JsonProperty(value = "fileSystemId", access = JsonProperty.Access.WRITE_ONLY)
    private String fileSystemId;

    /*
     * Creation Token or File Path
     *
     * A unique file path for the volume. Used when creating mount targets
     */
    @JsonProperty(value = "creationToken", required = true)
    private String creationToken;

    /*
     * serviceLevel
     *
     * The service level of the file system
     */
    @JsonProperty(value = "serviceLevel")
    private ServiceLevel serviceLevel;

    /*
     * usageThreshold
     *
     * Maximum storage quota allowed for a file system in bytes. This is a soft quota used for alerting only. Minimum
     * size is 100 GiB. Upper limit is 100TiB, 500Tib for LargeVolume. Specified in bytes.
     */
    @JsonProperty(value = "usageThreshold", required = true)
    private long usageThreshold;

    /*
     * exportPolicy
     *
     * Set of export policy rules
     */
    @JsonProperty(value = "exportPolicy")
    private VolumePropertiesExportPolicy exportPolicy;

    /*
     * protocolTypes
     *
     * Set of protocol types, default NFSv3, CIFS for SMB protocol
     */
    @JsonProperty(value = "protocolTypes")
    private List<String> protocolTypes;

    /*
     * Azure lifecycle management
     */
    @JsonProperty(value = "provisioningState", access = JsonProperty.Access.WRITE_ONLY)
    private String provisioningState;

    /*
     * Snapshot ID
     *
     * UUID v4 or resource identifier used to identify the Snapshot.
     */
    @JsonProperty(value = "snapshotId")
    private String snapshotId;

    /*
     * If enabled (true) the snapshot the volume was created from will be automatically deleted after the volume create
     * operation has finished.  Defaults to false
     */
    @JsonProperty(value = "deleteBaseSnapshot")
    private Boolean deleteBaseSnapshot;

    /*
     * Backup ID
     *
     * UUID v4 or resource identifier used to identify the Backup.
     */
    @JsonProperty(value = "backupId")
    private String backupId;

    /*
     * Baremetal Tenant ID
     *
     * Unique Baremetal Tenant Identifier.
     */
    @JsonProperty(value = "baremetalTenantId", access = JsonProperty.Access.WRITE_ONLY)
    private String baremetalTenantId;

    /*
     * The Azure Resource URI for a delegated subnet. Must have the delegation Microsoft.NetApp/volumes
     */
    @JsonProperty(value = "subnetId", required = true)
    private String subnetId;

    /*
     * Network features
     *
     * Basic network, or Standard features available to the volume.
     */
    @JsonProperty(value = "networkFeatures")
    private NetworkFeatures networkFeatures;

    /*
     * Network Sibling Set ID
     *
     * Network Sibling Set ID for the the group of volumes sharing networking resources.
     */
    @JsonProperty(value = "networkSiblingSetId", access = JsonProperty.Access.WRITE_ONLY)
    private String networkSiblingSetId;

    /*
     * Storage to Network Proximity
     *
     * Provides storage to network proximity information for the volume.
     */
    @JsonProperty(value = "storageToNetworkProximity", access = JsonProperty.Access.WRITE_ONLY)
    private VolumeStorageToNetworkProximity storageToNetworkProximity;

    /*
     * mountTargets
     *
     * List of mount targets
     */
    @JsonProperty(value = "mountTargets", access = JsonProperty.Access.WRITE_ONLY)
    private List<MountTargetProperties> mountTargets;

    /*
     * What type of volume is this. For destination volumes in Cross Region Replication, set type to DataProtection
     */
    @JsonProperty(value = "volumeType")
    private String volumeType;

    /*
     * DataProtection
     *
     * DataProtection type volumes include an object containing details of the replication
     */
    @JsonProperty(value = "dataProtection")
    private VolumePropertiesDataProtection dataProtection;

    /*
     * Restoring
     */
    @JsonProperty(value = "isRestoring")
    private Boolean isRestoring;

    /*
     * If enabled (true) the volume will contain a read-only snapshot directory which provides access to each of the
     * volume's snapshots (default to true).
     */
    @JsonProperty(value = "snapshotDirectoryVisible")
    private Boolean snapshotDirectoryVisible;

    /*
     * Describe if a volume is KerberosEnabled. To be use with swagger version 2020-05-01 or later
     */
    @JsonProperty(value = "kerberosEnabled")
    private Boolean kerberosEnabled;

    /*
     * The security style of volume, default unix, defaults to ntfs for dual protocol or CIFS protocol
     */
    @JsonProperty(value = "securityStyle")
    private SecurityStyle securityStyle;

    /*
     * Enables encryption for in-flight smb3 data. Only applicable for SMB/DualProtocol volume. To be used with swagger
     * version 2020-08-01 or later
     */
    @JsonProperty(value = "smbEncryption")
    private Boolean smbEncryption;

    /*
     * smbAccessBasedEnumeration
     *
     * Enables access based enumeration share property for SMB Shares. Only applicable for SMB/DualProtocol volume
     */
    @JsonProperty(value = "smbAccessBasedEnumeration")
    private SmbAccessBasedEnumeration smbAccessBasedEnumeration;

    /*
     * smbNonBrowsable
     *
     * Enables non browsable property for SMB Shares. Only applicable for SMB/DualProtocol volume
     */
    @JsonProperty(value = "smbNonBrowsable")
    private SmbNonBrowsable smbNonBrowsable;

    /*
     * Enables continuously available share property for smb volume. Only applicable for SMB volume
     */
    @JsonProperty(value = "smbContinuouslyAvailable")
    private Boolean smbContinuouslyAvailable;

    /*
     * Maximum throughput in MiB/s that can be achieved by this volume and this will be accepted as input only for
     * manual qosType volume
     */
    @JsonProperty(value = "throughputMibps")
    private Float throughputMibps;

    /*
     * Source of key used to encrypt data in volume. Applicable if NetApp account has encryption.keySource =
     * 'Microsoft.KeyVault'. Possible values (case-insensitive) are: 'Microsoft.NetApp, Microsoft.KeyVault'
     */
    @JsonProperty(value = "encryptionKeySource")
    private EncryptionKeySource encryptionKeySource;

    /*
     * The resource ID of private endpoint for KeyVault. It must reside in the same VNET as the volume. Only applicable
     * if encryptionKeySource = 'Microsoft.KeyVault'.
     */
    @JsonProperty(value = "keyVaultPrivateEndpointResourceId")
    private String keyVaultPrivateEndpointResourceId;

    /*
     * Specifies whether LDAP is enabled or not for a given NFS volume.
     */
    @JsonProperty(value = "ldapEnabled")
    private Boolean ldapEnabled;

    /*
     * Specifies whether Cool Access(tiering) is enabled for the volume.
     */
    @JsonProperty(value = "coolAccess")
    private Boolean coolAccess;

    /*
     * Specifies the number of days after which data that is not accessed by clients will be tiered.
     */
    @JsonProperty(value = "coolnessPeriod")
    private Integer coolnessPeriod;

    /*
     * UNIX permissions for NFS volume accepted in octal 4 digit format. First digit selects the set user ID(4), set
     * group ID (2) and sticky (1) attributes. Second digit selects permission for the owner of the file: read (4),
     * write (2) and execute (1). Third selects permissions for other users in the same group. the fourth for other
     * users not in the group. 0755 - gives read/write/execute permissions to owner and read/execute to group and other
     * users.
     */
    @JsonProperty(value = "unixPermissions")
    private String unixPermissions;

    /*
     * When a volume is being restored from another volume's snapshot, will show the percentage completion of this
     * cloning process. When this value is empty/null there is no cloning process currently happening on this volume.
     * This value will update every 5 minutes during cloning.
     */
    @JsonProperty(value = "cloneProgress", access = JsonProperty.Access.WRITE_ONLY)
    private Integer cloneProgress;

    /*
     * Flag indicating whether file access logs are enabled for the volume, based on active diagnostic settings present
     * on the volume.
     */
    @JsonProperty(value = "fileAccessLogs", access = JsonProperty.Access.WRITE_ONLY)
    private FileAccessLogs fileAccessLogs;

    /*
     * avsDataStore
     *
     * Specifies whether the volume is enabled for Azure VMware Solution (AVS) datastore purpose
     */
    @JsonProperty(value = "avsDataStore")
    private AvsDataStore avsDataStore;

    /*
     * dataStoreResourceId
     *
     * Data store resource unique identifier
     */
    @JsonProperty(value = "dataStoreResourceId", access = JsonProperty.Access.WRITE_ONLY)
    private List<String> dataStoreResourceId;

    /*
     * Specifies if default quota is enabled for the volume.
     */
    @JsonProperty(value = "isDefaultQuotaEnabled")
    private Boolean isDefaultQuotaEnabled;

    /*
     * Default user quota for volume in KiBs. If isDefaultQuotaEnabled is set, the minimum value of 4 KiBs applies .
     */
    @JsonProperty(value = "defaultUserQuotaInKiBs")
    private Long defaultUserQuotaInKiBs;

    /*
     * Default group quota for volume in KiBs. If isDefaultQuotaEnabled is set, the minimum value of 4 KiBs applies.
     */
    @JsonProperty(value = "defaultGroupQuotaInKiBs")
    private Long defaultGroupQuotaInKiBs;

    /*
     * Maximum number of files allowed. Needs a service request in order to be changed. Only allowed to be changed if
     * volume quota is more than 4TiB.
     */
    @JsonProperty(value = "maximumNumberOfFiles", access = JsonProperty.Access.WRITE_ONLY)
    private Long maximumNumberOfFiles;

    /*
     * Volume Group Name
     */
    @JsonProperty(value = "volumeGroupName", access = JsonProperty.Access.WRITE_ONLY)
    private String volumeGroupName;

    /*
     * Pool Resource Id used in case of creating a volume through volume group
     */
    @JsonProperty(value = "capacityPoolResourceId")
    private String capacityPoolResourceId;

    /*
     * Proximity placement group associated with the volume
     */
    @JsonProperty(value = "proximityPlacementGroup")
    private String proximityPlacementGroup;

    /*
     * T2 network information
     */
    @JsonProperty(value = "t2Network", access = JsonProperty.Access.WRITE_ONLY)
    private String t2Network;

    /*
     * Volume spec name is the application specific designation or identifier for the particular volume in a volume
     * group for e.g. data, log
     */
    @JsonProperty(value = "volumeSpecName")
    private String volumeSpecName;

    /*
     * Specifies if the volume is encrypted or not. Only available on volumes created or updated after 2022-01-01.
     */
    @JsonProperty(value = "encrypted", access = JsonProperty.Access.WRITE_ONLY)
    private Boolean encrypted;

    /*
     * Volume placement rules
     *
     * Application specific placement rules for the particular volume
     */
    @JsonProperty(value = "placementRules")
    private List<PlacementKeyValuePairs> placementRules;

    /*
     * Flag indicating whether subvolume operations are enabled on the volume
     */
    @JsonProperty(value = "enableSubvolumes")
    private EnableSubvolumes enableSubvolumes;

    /*
     * Provisioned Availability Zone
     *
     * The availability zone where the volume is provisioned. This refers to the logical availability zone where the
     * volume resides.
     */
    @JsonProperty(value = "provisionedAvailabilityZone", access = JsonProperty.Access.WRITE_ONLY)
    private String provisionedAvailabilityZone;

    /*
     * Is Large Volume
     *
     * Specifies whether volume is a Large Volume or Regular Volume.
     */
    @JsonProperty(value = "isLargeVolume")
    private Boolean isLargeVolume;

    /** Creates an instance of VolumeProperties class. */
    public VolumeProperties() {
    }

    /**
     * Get the fileSystemId property: FileSystem ID
     *
     * <p>Unique FileSystem Identifier.
     *
     * @return the fileSystemId value.
     */
    public String fileSystemId() {
        return this.fileSystemId;
    }

    /**
     * Get the creationToken property: Creation Token or File Path
     *
     * <p>A unique file path for the volume. Used when creating mount targets.
     *
     * @return the creationToken value.
     */
    public String creationToken() {
        return this.creationToken;
    }

    /**
     * Set the creationToken property: Creation Token or File Path
     *
     * <p>A unique file path for the volume. Used when creating mount targets.
     *
     * @param creationToken the creationToken value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withCreationToken(String creationToken) {
        this.creationToken = creationToken;
        return this;
    }

    /**
     * Get the serviceLevel property: serviceLevel
     *
     * <p>The service level of the file system.
     *
     * @return the serviceLevel value.
     */
    public ServiceLevel serviceLevel() {
        return this.serviceLevel;
    }

    /**
     * Set the serviceLevel property: serviceLevel
     *
     * <p>The service level of the file system.
     *
     * @param serviceLevel the serviceLevel value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withServiceLevel(ServiceLevel serviceLevel) {
        this.serviceLevel = serviceLevel;
        return this;
    }

    /**
     * Get the usageThreshold property: usageThreshold
     *
     * <p>Maximum storage quota allowed for a file system in bytes. This is a soft quota used for alerting only. Minimum
     * size is 100 GiB. Upper limit is 100TiB, 500Tib for LargeVolume. Specified in bytes.
     *
     * @return the usageThreshold value.
     */
    public long usageThreshold() {
        return this.usageThreshold;
    }

    /**
     * Set the usageThreshold property: usageThreshold
     *
     * <p>Maximum storage quota allowed for a file system in bytes. This is a soft quota used for alerting only. Minimum
     * size is 100 GiB. Upper limit is 100TiB, 500Tib for LargeVolume. Specified in bytes.
     *
     * @param usageThreshold the usageThreshold value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withUsageThreshold(long usageThreshold) {
        this.usageThreshold = usageThreshold;
        return this;
    }

    /**
     * Get the exportPolicy property: exportPolicy
     *
     * <p>Set of export policy rules.
     *
     * @return the exportPolicy value.
     */
    public VolumePropertiesExportPolicy exportPolicy() {
        return this.exportPolicy;
    }

    /**
     * Set the exportPolicy property: exportPolicy
     *
     * <p>Set of export policy rules.
     *
     * @param exportPolicy the exportPolicy value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withExportPolicy(VolumePropertiesExportPolicy exportPolicy) {
        this.exportPolicy = exportPolicy;
        return this;
    }

    /**
     * Get the protocolTypes property: protocolTypes
     *
     * <p>Set of protocol types, default NFSv3, CIFS for SMB protocol.
     *
     * @return the protocolTypes value.
     */
    public List<String> protocolTypes() {
        return this.protocolTypes;
    }

    /**
     * Set the protocolTypes property: protocolTypes
     *
     * <p>Set of protocol types, default NFSv3, CIFS for SMB protocol.
     *
     * @param protocolTypes the protocolTypes value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withProtocolTypes(List<String> protocolTypes) {
        this.protocolTypes = protocolTypes;
        return this;
    }

    /**
     * Get the provisioningState property: Azure lifecycle management.
     *
     * @return the provisioningState value.
     */
    public String provisioningState() {
        return this.provisioningState;
    }

    /**
     * Get the snapshotId property: Snapshot ID
     *
     * <p>UUID v4 or resource identifier used to identify the Snapshot.
     *
     * @return the snapshotId value.
     */
    public String snapshotId() {
        return this.snapshotId;
    }

    /**
     * Set the snapshotId property: Snapshot ID
     *
     * <p>UUID v4 or resource identifier used to identify the Snapshot.
     *
     * @param snapshotId the snapshotId value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSnapshotId(String snapshotId) {
        this.snapshotId = snapshotId;
        return this;
    }

    /**
     * Get the deleteBaseSnapshot property: If enabled (true) the snapshot the volume was created from will be
     * automatically deleted after the volume create operation has finished. Defaults to false.
     *
     * @return the deleteBaseSnapshot value.
     */
    public Boolean deleteBaseSnapshot() {
        return this.deleteBaseSnapshot;
    }

    /**
     * Set the deleteBaseSnapshot property: If enabled (true) the snapshot the volume was created from will be
     * automatically deleted after the volume create operation has finished. Defaults to false.
     *
     * @param deleteBaseSnapshot the deleteBaseSnapshot value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withDeleteBaseSnapshot(Boolean deleteBaseSnapshot) {
        this.deleteBaseSnapshot = deleteBaseSnapshot;
        return this;
    }

    /**
     * Get the backupId property: Backup ID
     *
     * <p>UUID v4 or resource identifier used to identify the Backup.
     *
     * @return the backupId value.
     */
    public String backupId() {
        return this.backupId;
    }

    /**
     * Set the backupId property: Backup ID
     *
     * <p>UUID v4 or resource identifier used to identify the Backup.
     *
     * @param backupId the backupId value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withBackupId(String backupId) {
        this.backupId = backupId;
        return this;
    }

    /**
     * Get the baremetalTenantId property: Baremetal Tenant ID
     *
     * <p>Unique Baremetal Tenant Identifier.
     *
     * @return the baremetalTenantId value.
     */
    public String baremetalTenantId() {
        return this.baremetalTenantId;
    }

    /**
     * Get the subnetId property: The Azure Resource URI for a delegated subnet. Must have the delegation
     * Microsoft.NetApp/volumes.
     *
     * @return the subnetId value.
     */
    public String subnetId() {
        return this.subnetId;
    }

    /**
     * Set the subnetId property: The Azure Resource URI for a delegated subnet. Must have the delegation
     * Microsoft.NetApp/volumes.
     *
     * @param subnetId the subnetId value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSubnetId(String subnetId) {
        this.subnetId = subnetId;
        return this;
    }

    /**
     * Get the networkFeatures property: Network features
     *
     * <p>Basic network, or Standard features available to the volume.
     *
     * @return the networkFeatures value.
     */
    public NetworkFeatures networkFeatures() {
        return this.networkFeatures;
    }

    /**
     * Set the networkFeatures property: Network features
     *
     * <p>Basic network, or Standard features available to the volume.
     *
     * @param networkFeatures the networkFeatures value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withNetworkFeatures(NetworkFeatures networkFeatures) {
        this.networkFeatures = networkFeatures;
        return this;
    }

    /**
     * Get the networkSiblingSetId property: Network Sibling Set ID
     *
     * <p>Network Sibling Set ID for the the group of volumes sharing networking resources.
     *
     * @return the networkSiblingSetId value.
     */
    public String networkSiblingSetId() {
        return this.networkSiblingSetId;
    }

    /**
     * Get the storageToNetworkProximity property: Storage to Network Proximity
     *
     * <p>Provides storage to network proximity information for the volume.
     *
     * @return the storageToNetworkProximity value.
     */
    public VolumeStorageToNetworkProximity storageToNetworkProximity() {
        return this.storageToNetworkProximity;
    }

    /**
     * Get the mountTargets property: mountTargets
     *
     * <p>List of mount targets.
     *
     * @return the mountTargets value.
     */
    public List<MountTargetProperties> mountTargets() {
        return this.mountTargets;
    }

    /**
     * Get the volumeType property: What type of volume is this. For destination volumes in Cross Region Replication,
     * set type to DataProtection.
     *
     * @return the volumeType value.
     */
    public String volumeType() {
        return this.volumeType;
    }

    /**
     * Set the volumeType property: What type of volume is this. For destination volumes in Cross Region Replication,
     * set type to DataProtection.
     *
     * @param volumeType the volumeType value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withVolumeType(String volumeType) {
        this.volumeType = volumeType;
        return this;
    }

    /**
     * Get the dataProtection property: DataProtection
     *
     * <p>DataProtection type volumes include an object containing details of the replication.
     *
     * @return the dataProtection value.
     */
    public VolumePropertiesDataProtection dataProtection() {
        return this.dataProtection;
    }

    /**
     * Set the dataProtection property: DataProtection
     *
     * <p>DataProtection type volumes include an object containing details of the replication.
     *
     * @param dataProtection the dataProtection value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withDataProtection(VolumePropertiesDataProtection dataProtection) {
        this.dataProtection = dataProtection;
        return this;
    }

    /**
     * Get the isRestoring property: Restoring.
     *
     * @return the isRestoring value.
     */
    public Boolean isRestoring() {
        return this.isRestoring;
    }

    /**
     * Set the isRestoring property: Restoring.
     *
     * @param isRestoring the isRestoring value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withIsRestoring(Boolean isRestoring) {
        this.isRestoring = isRestoring;
        return this;
    }

    /**
     * Get the snapshotDirectoryVisible property: If enabled (true) the volume will contain a read-only snapshot
     * directory which provides access to each of the volume's snapshots (default to true).
     *
     * @return the snapshotDirectoryVisible value.
     */
    public Boolean snapshotDirectoryVisible() {
        return this.snapshotDirectoryVisible;
    }

    /**
     * Set the snapshotDirectoryVisible property: If enabled (true) the volume will contain a read-only snapshot
     * directory which provides access to each of the volume's snapshots (default to true).
     *
     * @param snapshotDirectoryVisible the snapshotDirectoryVisible value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSnapshotDirectoryVisible(Boolean snapshotDirectoryVisible) {
        this.snapshotDirectoryVisible = snapshotDirectoryVisible;
        return this;
    }

    /**
     * Get the kerberosEnabled property: Describe if a volume is KerberosEnabled. To be use with swagger version
     * 2020-05-01 or later.
     *
     * @return the kerberosEnabled value.
     */
    public Boolean kerberosEnabled() {
        return this.kerberosEnabled;
    }

    /**
     * Set the kerberosEnabled property: Describe if a volume is KerberosEnabled. To be use with swagger version
     * 2020-05-01 or later.
     *
     * @param kerberosEnabled the kerberosEnabled value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withKerberosEnabled(Boolean kerberosEnabled) {
        this.kerberosEnabled = kerberosEnabled;
        return this;
    }

    /**
     * Get the securityStyle property: The security style of volume, default unix, defaults to ntfs for dual protocol or
     * CIFS protocol.
     *
     * @return the securityStyle value.
     */
    public SecurityStyle securityStyle() {
        return this.securityStyle;
    }

    /**
     * Set the securityStyle property: The security style of volume, default unix, defaults to ntfs for dual protocol or
     * CIFS protocol.
     *
     * @param securityStyle the securityStyle value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSecurityStyle(SecurityStyle securityStyle) {
        this.securityStyle = securityStyle;
        return this;
    }

    /**
     * Get the smbEncryption property: Enables encryption for in-flight smb3 data. Only applicable for SMB/DualProtocol
     * volume. To be used with swagger version 2020-08-01 or later.
     *
     * @return the smbEncryption value.
     */
    public Boolean smbEncryption() {
        return this.smbEncryption;
    }

    /**
     * Set the smbEncryption property: Enables encryption for in-flight smb3 data. Only applicable for SMB/DualProtocol
     * volume. To be used with swagger version 2020-08-01 or later.
     *
     * @param smbEncryption the smbEncryption value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSmbEncryption(Boolean smbEncryption) {
        this.smbEncryption = smbEncryption;
        return this;
    }

    /**
     * Get the smbAccessBasedEnumeration property: smbAccessBasedEnumeration
     *
     * <p>Enables access based enumeration share property for SMB Shares. Only applicable for SMB/DualProtocol volume.
     *
     * @return the smbAccessBasedEnumeration value.
     */
    public SmbAccessBasedEnumeration smbAccessBasedEnumeration() {
        return this.smbAccessBasedEnumeration;
    }

    /**
     * Set the smbAccessBasedEnumeration property: smbAccessBasedEnumeration
     *
     * <p>Enables access based enumeration share property for SMB Shares. Only applicable for SMB/DualProtocol volume.
     *
     * @param smbAccessBasedEnumeration the smbAccessBasedEnumeration value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSmbAccessBasedEnumeration(SmbAccessBasedEnumeration smbAccessBasedEnumeration) {
        this.smbAccessBasedEnumeration = smbAccessBasedEnumeration;
        return this;
    }

    /**
     * Get the smbNonBrowsable property: smbNonBrowsable
     *
     * <p>Enables non browsable property for SMB Shares. Only applicable for SMB/DualProtocol volume.
     *
     * @return the smbNonBrowsable value.
     */
    public SmbNonBrowsable smbNonBrowsable() {
        return this.smbNonBrowsable;
    }

    /**
     * Set the smbNonBrowsable property: smbNonBrowsable
     *
     * <p>Enables non browsable property for SMB Shares. Only applicable for SMB/DualProtocol volume.
     *
     * @param smbNonBrowsable the smbNonBrowsable value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSmbNonBrowsable(SmbNonBrowsable smbNonBrowsable) {
        this.smbNonBrowsable = smbNonBrowsable;
        return this;
    }

    /**
     * Get the smbContinuouslyAvailable property: Enables continuously available share property for smb volume. Only
     * applicable for SMB volume.
     *
     * @return the smbContinuouslyAvailable value.
     */
    public Boolean smbContinuouslyAvailable() {
        return this.smbContinuouslyAvailable;
    }

    /**
     * Set the smbContinuouslyAvailable property: Enables continuously available share property for smb volume. Only
     * applicable for SMB volume.
     *
     * @param smbContinuouslyAvailable the smbContinuouslyAvailable value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withSmbContinuouslyAvailable(Boolean smbContinuouslyAvailable) {
        this.smbContinuouslyAvailable = smbContinuouslyAvailable;
        return this;
    }

    /**
     * Get the throughputMibps property: Maximum throughput in MiB/s that can be achieved by this volume and this will
     * be accepted as input only for manual qosType volume.
     *
     * @return the throughputMibps value.
     */
    public Float throughputMibps() {
        return this.throughputMibps;
    }

    /**
     * Set the throughputMibps property: Maximum throughput in MiB/s that can be achieved by this volume and this will
     * be accepted as input only for manual qosType volume.
     *
     * @param throughputMibps the throughputMibps value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withThroughputMibps(Float throughputMibps) {
        this.throughputMibps = throughputMibps;
        return this;
    }

    /**
     * Get the encryptionKeySource property: Source of key used to encrypt data in volume. Applicable if NetApp account
     * has encryption.keySource = 'Microsoft.KeyVault'. Possible values (case-insensitive) are: 'Microsoft.NetApp,
     * Microsoft.KeyVault'.
     *
     * @return the encryptionKeySource value.
     */
    public EncryptionKeySource encryptionKeySource() {
        return this.encryptionKeySource;
    }

    /**
     * Set the encryptionKeySource property: Source of key used to encrypt data in volume. Applicable if NetApp account
     * has encryption.keySource = 'Microsoft.KeyVault'. Possible values (case-insensitive) are: 'Microsoft.NetApp,
     * Microsoft.KeyVault'.
     *
     * @param encryptionKeySource the encryptionKeySource value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withEncryptionKeySource(EncryptionKeySource encryptionKeySource) {
        this.encryptionKeySource = encryptionKeySource;
        return this;
    }

    /**
     * Get the keyVaultPrivateEndpointResourceId property: The resource ID of private endpoint for KeyVault. It must
     * reside in the same VNET as the volume. Only applicable if encryptionKeySource = 'Microsoft.KeyVault'.
     *
     * @return the keyVaultPrivateEndpointResourceId value.
     */
    public String keyVaultPrivateEndpointResourceId() {
        return this.keyVaultPrivateEndpointResourceId;
    }

    /**
     * Set the keyVaultPrivateEndpointResourceId property: The resource ID of private endpoint for KeyVault. It must
     * reside in the same VNET as the volume. Only applicable if encryptionKeySource = 'Microsoft.KeyVault'.
     *
     * @param keyVaultPrivateEndpointResourceId the keyVaultPrivateEndpointResourceId value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withKeyVaultPrivateEndpointResourceId(String keyVaultPrivateEndpointResourceId) {
        this.keyVaultPrivateEndpointResourceId = keyVaultPrivateEndpointResourceId;
        return this;
    }

    /**
     * Get the ldapEnabled property: Specifies whether LDAP is enabled or not for a given NFS volume.
     *
     * @return the ldapEnabled value.
     */
    public Boolean ldapEnabled() {
        return this.ldapEnabled;
    }

    /**
     * Set the ldapEnabled property: Specifies whether LDAP is enabled or not for a given NFS volume.
     *
     * @param ldapEnabled the ldapEnabled value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withLdapEnabled(Boolean ldapEnabled) {
        this.ldapEnabled = ldapEnabled;
        return this;
    }

    /**
     * Get the coolAccess property: Specifies whether Cool Access(tiering) is enabled for the volume.
     *
     * @return the coolAccess value.
     */
    public Boolean coolAccess() {
        return this.coolAccess;
    }

    /**
     * Set the coolAccess property: Specifies whether Cool Access(tiering) is enabled for the volume.
     *
     * @param coolAccess the coolAccess value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withCoolAccess(Boolean coolAccess) {
        this.coolAccess = coolAccess;
        return this;
    }

    /**
     * Get the coolnessPeriod property: Specifies the number of days after which data that is not accessed by clients
     * will be tiered.
     *
     * @return the coolnessPeriod value.
     */
    public Integer coolnessPeriod() {
        return this.coolnessPeriod;
    }

    /**
     * Set the coolnessPeriod property: Specifies the number of days after which data that is not accessed by clients
     * will be tiered.
     *
     * @param coolnessPeriod the coolnessPeriod value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withCoolnessPeriod(Integer coolnessPeriod) {
        this.coolnessPeriod = coolnessPeriod;
        return this;
    }

    /**
     * Get the unixPermissions property: UNIX permissions for NFS volume accepted in octal 4 digit format. First digit
     * selects the set user ID(4), set group ID (2) and sticky (1) attributes. Second digit selects permission for the
     * owner of the file: read (4), write (2) and execute (1). Third selects permissions for other users in the same
     * group. the fourth for other users not in the group. 0755 - gives read/write/execute permissions to owner and
     * read/execute to group and other users.
     *
     * @return the unixPermissions value.
     */
    public String unixPermissions() {
        return this.unixPermissions;
    }

    /**
     * Set the unixPermissions property: UNIX permissions for NFS volume accepted in octal 4 digit format. First digit
     * selects the set user ID(4), set group ID (2) and sticky (1) attributes. Second digit selects permission for the
     * owner of the file: read (4), write (2) and execute (1). Third selects permissions for other users in the same
     * group. the fourth for other users not in the group. 0755 - gives read/write/execute permissions to owner and
     * read/execute to group and other users.
     *
     * @param unixPermissions the unixPermissions value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withUnixPermissions(String unixPermissions) {
        this.unixPermissions = unixPermissions;
        return this;
    }

    /**
     * Get the cloneProgress property: When a volume is being restored from another volume's snapshot, will show the
     * percentage completion of this cloning process. When this value is empty/null there is no cloning process
     * currently happening on this volume. This value will update every 5 minutes during cloning.
     *
     * @return the cloneProgress value.
     */
    public Integer cloneProgress() {
        return this.cloneProgress;
    }

    /**
     * Get the fileAccessLogs property: Flag indicating whether file access logs are enabled for the volume, based on
     * active diagnostic settings present on the volume.
     *
     * @return the fileAccessLogs value.
     */
    public FileAccessLogs fileAccessLogs() {
        return this.fileAccessLogs;
    }

    /**
     * Get the avsDataStore property: avsDataStore
     *
     * <p>Specifies whether the volume is enabled for Azure VMware Solution (AVS) datastore purpose.
     *
     * @return the avsDataStore value.
     */
    public AvsDataStore avsDataStore() {
        return this.avsDataStore;
    }

    /**
     * Set the avsDataStore property: avsDataStore
     *
     * <p>Specifies whether the volume is enabled for Azure VMware Solution (AVS) datastore purpose.
     *
     * @param avsDataStore the avsDataStore value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withAvsDataStore(AvsDataStore avsDataStore) {
        this.avsDataStore = avsDataStore;
        return this;
    }

    /**
     * Get the dataStoreResourceId property: dataStoreResourceId
     *
     * <p>Data store resource unique identifier.
     *
     * @return the dataStoreResourceId value.
     */
    public List<String> dataStoreResourceId() {
        return this.dataStoreResourceId;
    }

    /**
     * Get the isDefaultQuotaEnabled property: Specifies if default quota is enabled for the volume.
     *
     * @return the isDefaultQuotaEnabled value.
     */
    public Boolean isDefaultQuotaEnabled() {
        return this.isDefaultQuotaEnabled;
    }

    /**
     * Set the isDefaultQuotaEnabled property: Specifies if default quota is enabled for the volume.
     *
     * @param isDefaultQuotaEnabled the isDefaultQuotaEnabled value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withIsDefaultQuotaEnabled(Boolean isDefaultQuotaEnabled) {
        this.isDefaultQuotaEnabled = isDefaultQuotaEnabled;
        return this;
    }

    /**
     * Get the defaultUserQuotaInKiBs property: Default user quota for volume in KiBs. If isDefaultQuotaEnabled is set,
     * the minimum value of 4 KiBs applies .
     *
     * @return the defaultUserQuotaInKiBs value.
     */
    public Long defaultUserQuotaInKiBs() {
        return this.defaultUserQuotaInKiBs;
    }

    /**
     * Set the defaultUserQuotaInKiBs property: Default user quota for volume in KiBs. If isDefaultQuotaEnabled is set,
     * the minimum value of 4 KiBs applies .
     *
     * @param defaultUserQuotaInKiBs the defaultUserQuotaInKiBs value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withDefaultUserQuotaInKiBs(Long defaultUserQuotaInKiBs) {
        this.defaultUserQuotaInKiBs = defaultUserQuotaInKiBs;
        return this;
    }

    /**
     * Get the defaultGroupQuotaInKiBs property: Default group quota for volume in KiBs. If isDefaultQuotaEnabled is
     * set, the minimum value of 4 KiBs applies.
     *
     * @return the defaultGroupQuotaInKiBs value.
     */
    public Long defaultGroupQuotaInKiBs() {
        return this.defaultGroupQuotaInKiBs;
    }

    /**
     * Set the defaultGroupQuotaInKiBs property: Default group quota for volume in KiBs. If isDefaultQuotaEnabled is
     * set, the minimum value of 4 KiBs applies.
     *
     * @param defaultGroupQuotaInKiBs the defaultGroupQuotaInKiBs value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withDefaultGroupQuotaInKiBs(Long defaultGroupQuotaInKiBs) {
        this.defaultGroupQuotaInKiBs = defaultGroupQuotaInKiBs;
        return this;
    }

    /**
     * Get the maximumNumberOfFiles property: Maximum number of files allowed. Needs a service request in order to be
     * changed. Only allowed to be changed if volume quota is more than 4TiB.
     *
     * @return the maximumNumberOfFiles value.
     */
    public Long maximumNumberOfFiles() {
        return this.maximumNumberOfFiles;
    }

    /**
     * Get the volumeGroupName property: Volume Group Name.
     *
     * @return the volumeGroupName value.
     */
    public String volumeGroupName() {
        return this.volumeGroupName;
    }

    /**
     * Get the capacityPoolResourceId property: Pool Resource Id used in case of creating a volume through volume group.
     *
     * @return the capacityPoolResourceId value.
     */
    public String capacityPoolResourceId() {
        return this.capacityPoolResourceId;
    }

    /**
     * Set the capacityPoolResourceId property: Pool Resource Id used in case of creating a volume through volume group.
     *
     * @param capacityPoolResourceId the capacityPoolResourceId value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withCapacityPoolResourceId(String capacityPoolResourceId) {
        this.capacityPoolResourceId = capacityPoolResourceId;
        return this;
    }

    /**
     * Get the proximityPlacementGroup property: Proximity placement group associated with the volume.
     *
     * @return the proximityPlacementGroup value.
     */
    public String proximityPlacementGroup() {
        return this.proximityPlacementGroup;
    }

    /**
     * Set the proximityPlacementGroup property: Proximity placement group associated with the volume.
     *
     * @param proximityPlacementGroup the proximityPlacementGroup value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withProximityPlacementGroup(String proximityPlacementGroup) {
        this.proximityPlacementGroup = proximityPlacementGroup;
        return this;
    }

    /**
     * Get the t2Network property: T2 network information.
     *
     * @return the t2Network value.
     */
    public String t2Network() {
        return this.t2Network;
    }

    /**
     * Get the volumeSpecName property: Volume spec name is the application specific designation or identifier for the
     * particular volume in a volume group for e.g. data, log.
     *
     * @return the volumeSpecName value.
     */
    public String volumeSpecName() {
        return this.volumeSpecName;
    }

    /**
     * Set the volumeSpecName property: Volume spec name is the application specific designation or identifier for the
     * particular volume in a volume group for e.g. data, log.
     *
     * @param volumeSpecName the volumeSpecName value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withVolumeSpecName(String volumeSpecName) {
        this.volumeSpecName = volumeSpecName;
        return this;
    }

    /**
     * Get the encrypted property: Specifies if the volume is encrypted or not. Only available on volumes created or
     * updated after 2022-01-01.
     *
     * @return the encrypted value.
     */
    public Boolean encrypted() {
        return this.encrypted;
    }

    /**
     * Get the placementRules property: Volume placement rules
     *
     * <p>Application specific placement rules for the particular volume.
     *
     * @return the placementRules value.
     */
    public List<PlacementKeyValuePairs> placementRules() {
        return this.placementRules;
    }

    /**
     * Set the placementRules property: Volume placement rules
     *
     * <p>Application specific placement rules for the particular volume.
     *
     * @param placementRules the placementRules value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withPlacementRules(List<PlacementKeyValuePairs> placementRules) {
        this.placementRules = placementRules;
        return this;
    }

    /**
     * Get the enableSubvolumes property: Flag indicating whether subvolume operations are enabled on the volume.
     *
     * @return the enableSubvolumes value.
     */
    public EnableSubvolumes enableSubvolumes() {
        return this.enableSubvolumes;
    }

    /**
     * Set the enableSubvolumes property: Flag indicating whether subvolume operations are enabled on the volume.
     *
     * @param enableSubvolumes the enableSubvolumes value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withEnableSubvolumes(EnableSubvolumes enableSubvolumes) {
        this.enableSubvolumes = enableSubvolumes;
        return this;
    }

    /**
     * Get the provisionedAvailabilityZone property: Provisioned Availability Zone
     *
     * <p>The availability zone where the volume is provisioned. This refers to the logical availability zone where the
     * volume resides.
     *
     * @return the provisionedAvailabilityZone value.
     */
    public String provisionedAvailabilityZone() {
        return this.provisionedAvailabilityZone;
    }

    /**
     * Get the isLargeVolume property: Is Large Volume
     *
     * <p>Specifies whether volume is a Large Volume or Regular Volume.
     *
     * @return the isLargeVolume value.
     */
    public Boolean isLargeVolume() {
        return this.isLargeVolume;
    }

    /**
     * Set the isLargeVolume property: Is Large Volume
     *
     * <p>Specifies whether volume is a Large Volume or Regular Volume.
     *
     * @param isLargeVolume the isLargeVolume value to set.
     * @return the VolumeProperties object itself.
     */
    public VolumeProperties withIsLargeVolume(Boolean isLargeVolume) {
        this.isLargeVolume = isLargeVolume;
        return this;
    }

    /**
     * Validates the instance.
     *
     * @throws IllegalArgumentException thrown if the instance is not valid.
     */
    public void validate() {
        if (creationToken() == null) {
            throw LOGGER
                .logExceptionAsError(
                    new IllegalArgumentException("Missing required property creationToken in model VolumeProperties"));
        }
        if (exportPolicy() != null) {
            exportPolicy().validate();
        }
        if (subnetId() == null) {
            throw LOGGER
                .logExceptionAsError(
                    new IllegalArgumentException("Missing required property subnetId in model VolumeProperties"));
        }
        if (mountTargets() != null) {
            mountTargets().forEach(e -> e.validate());
        }
        if (dataProtection() != null) {
            dataProtection().validate();
        }
        if (placementRules() != null) {
            placementRules().forEach(e -> e.validate());
        }
    }

    private static final ClientLogger LOGGER = new ClientLogger(VolumeProperties.class);
}
