// Copyright 2026 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.cloud.netapp.v1;

import "google/api/field_behavior.proto";
import "google/api/field_info.proto";
import "google/api/resource.proto";
import "google/cloud/netapp/v1/common.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.NetApp.V1";
option go_package = "cloud.google.com/go/netapp/apiv1/netapppb;netapppb";
option java_multiple_files = true;
option java_outer_classname = "VolumeProto";
option java_package = "com.google.cloud.netapp.v1";
option php_namespace = "Google\\Cloud\\NetApp\\V1";
option ruby_package = "Google::Cloud::NetApp::V1";

// Protocols is an enum of all the supported network protocols for a volume.
enum Protocols {
  // Unspecified protocol
  PROTOCOLS_UNSPECIFIED = 0;

  // NFS V3 protocol
  NFSV3 = 1;

  // NFS V4 protocol
  NFSV4 = 2;

  // SMB protocol
  SMB = 3;

  // ISCSI protocol
  ISCSI = 4;
}

// AccessType is an enum of all the supported access types for a volume.
enum AccessType {
  // Unspecified Access Type
  ACCESS_TYPE_UNSPECIFIED = 0;

  // Read Only
  READ_ONLY = 1;

  // Read Write
  READ_WRITE = 2;

  // None
  READ_NONE = 3;
}

// SMBSettings
// Modifies the behaviour of a SMB volume.
enum SMBSettings {
  // Unspecified default option
  SMB_SETTINGS_UNSPECIFIED = 0;

  // SMB setting encrypt data
  ENCRYPT_DATA = 1;

  // SMB setting browsable
  BROWSABLE = 2;

  // SMB setting notify change
  CHANGE_NOTIFY = 3;

  // SMB setting not to notify change
  NON_BROWSABLE = 4;

  // SMB setting oplocks
  OPLOCKS = 5;

  // SMB setting to show snapshots
  SHOW_SNAPSHOT = 6;

  // SMB setting to show previous versions
  SHOW_PREVIOUS_VERSIONS = 7;

  // SMB setting to access volume based on enumerartion
  ACCESS_BASED_ENUMERATION = 8;

  // Continuously available enumeration
  CONTINUOUSLY_AVAILABLE = 9;
}

// The security style of the volume, can be either UNIX or NTFS.
enum SecurityStyle {
  // SecurityStyle is unspecified
  SECURITY_STYLE_UNSPECIFIED = 0;

  // SecurityStyle uses NTFS
  NTFS = 1;

  // SecurityStyle uses UNIX
  UNIX = 2;
}

// Actions to be restricted for a volume.
enum RestrictedAction {
  // Unspecified restricted action
  RESTRICTED_ACTION_UNSPECIFIED = 0;

  // Prevent volume from being deleted when mounted.
  DELETE = 1;
}

// Message for requesting list of Volumes
message ListVolumesRequest {
  // Required. Parent value for ListVolumesRequest
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "netapp.googleapis.com/Volume"
    }
  ];

  // Requested page size. Server may return fewer items than requested.
  // If unspecified, the server will pick an appropriate default.
  int32 page_size = 2;

  // A token identifying a page of results the server should return.
  string page_token = 3;

  // Filtering results
  string filter = 4;

  // Hint for how to order the results
  string order_by = 5;
}

// Message for response to listing Volumes
message ListVolumesResponse {
  // The list of Volume
  repeated Volume volumes = 1;

  // A token identifying a page of results the server should return.
  string next_page_token = 2;

  // Locations that could not be reached.
  repeated string unreachable = 3;
}

// Message for getting a Volume
message GetVolumeRequest {
  // Required. Name of the volume
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "netapp.googleapis.com/Volume" }
  ];
}

// Message for creating a Volume
message CreateVolumeRequest {
  // Required. Value for parent.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "netapp.googleapis.com/Volume"
    }
  ];

  // Required. Id of the requesting volume. Must be unique within the parent
  // resource. Must contain only letters, numbers and hyphen, with the first
  // character a letter, the last a letter or a number,
  // and a 63 character maximum.
  string volume_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The volume being created.
  Volume volume = 3 [(google.api.field_behavior) = REQUIRED];
}

// Message for updating a Volume
message UpdateVolumeRequest {
  // Required. Field mask is used to specify the fields to be overwritten in the
  // Volume resource by the update.
  // The fields specified in the update_mask are relative to the resource, not
  // the full request. A field will be overwritten if it is in the mask. If the
  // user does not provide a mask then all fields will be overwritten.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. The volume being updated
  Volume volume = 2 [(google.api.field_behavior) = REQUIRED];
}

// Message for deleting a Volume
message DeleteVolumeRequest {
  // Required. Name of the volume
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "netapp.googleapis.com/Volume" }
  ];

  // If this field is set as true, CCFE will not block the volume resource
  // deletion even if it has any snapshots resource. (Otherwise, the request
  // will only work if the volume has no snapshots.)
  bool force = 2;
}

// RevertVolumeRequest reverts the given volume to the specified snapshot.
message RevertVolumeRequest {
  // Required. The resource name of the volume, in the format of
  // projects/{project_id}/locations/{location}/volumes/{volume_id}.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "netapp.googleapis.com/Volume" }
  ];

  // Required. The snapshot resource ID, in the format 'my-snapshot', where the
  // specified ID is the {snapshot_id} of the fully qualified name like
  // projects/{project_id}/locations/{location_id}/volumes/{volume_id}/snapshots/{snapshot_id}
  string snapshot_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Volume provides a filesystem that you can mount.
message Volume {
  option (google.api.resource) = {
    type: "netapp.googleapis.com/Volume"
    pattern: "projects/{project}/locations/{location}/volumes/{volume}"
    plural: "volumes"
    singular: "volume"
  };

  // Details about a clone volume.
  message CloneDetails {
    // Output only. Specifies the full resource name of the source snapshot from
    // which this volume was cloned. Format:
    // projects/{project}/locations/{location}/volumes/{volume}/snapshots/{snapshot}
    string source_snapshot = 1 [
      (google.api.field_behavior) = OUTPUT_ONLY,
      (google.api.resource_reference) = {
        type: "netapp.googleapis.com/Snapshot"
      }
    ];

    // Output only. Full name of the source volume resource.
    // Format:
    // projects/{project}/locations/{location}/volumes/{volume}
    string source_volume = 2 [
      (google.api.field_behavior) = OUTPUT_ONLY,
      (google.api.resource_reference) = { type: "netapp.googleapis.com/Volume" }
    ];

    // Output only. Shared space in GiB. Determined at volume creation time
    // based on size of source snapshot.
    int64 shared_space_gib = 3 [(google.api.field_behavior) = OUTPUT_ONLY];
  }

  // The volume states
  enum State {
    // Unspecified Volume State
    STATE_UNSPECIFIED = 0;

    // Volume State is Ready
    READY = 1;

    // Volume State is Creating
    CREATING = 2;

    // Volume State is Deleting
    DELETING = 3;

    // Volume State is Updating
    UPDATING = 4;

    // Volume State is Restoring
    RESTORING = 5;

    // Volume State is Disabled
    DISABLED = 6;

    // Volume State is Error
    ERROR = 7;

    // Volume State is Preparing. Note that this is different from CREATING
    // where CREATING means the volume is being created, while PREPARING means
    // the volume is created and now being prepared for the replication.
    PREPARING = 8;

    // Volume State is Read Only
    READ_ONLY = 9;
  }

  // Identifier. Name of the volume
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Output only. State of the volume
  State state = 2 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. State details of the volume
  string state_details = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Create time of the volume
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Share name of the volume
  string share_name = 5 [(google.api.field_behavior) = REQUIRED];

  // Output only. This field is not implemented. The values provided in this
  // field are ignored.
  string psa_range = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. StoragePool name of the volume
  string storage_pool = 7 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "netapp.googleapis.com/StoragePool"
    }
  ];

  // Output only. VPC Network name.
  // Format: projects/{project}/global/networks/{network}
  string network = 8 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];

  // Output only. Service level of the volume
  ServiceLevel service_level = 9 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Required. Capacity in GIB of the volume
  int64 capacity_gib = 10 [(google.api.field_behavior) = REQUIRED];

  // Optional. Export policy of the volume
  ExportPolicy export_policy = 11 [(google.api.field_behavior) = OPTIONAL];

  // Required. Protocols required for the volume
  repeated Protocols protocols = 12 [(google.api.field_behavior) = REQUIRED];

  // Optional. SMB share settings for the volume.
  repeated SMBSettings smb_settings = 13
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Mount options of this volume
  repeated MountOption mount_options = 14
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Default unix style permission (e.g. 777) the mount point will be
  // created with. Applicable for NFS protocol types only.
  string unix_permissions = 15 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Labels as key value pairs
  map<string, string> labels = 16 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Description of the volume
  string description = 17 [(google.api.field_behavior) = OPTIONAL];

  // Optional. SnapshotPolicy for a volume.
  SnapshotPolicy snapshot_policy = 18 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Snap_reserve specifies percentage of volume storage reserved for
  // snapshot storage. Default is 0 percent.
  double snap_reserve = 19 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Snapshot_directory if enabled (true) the volume will contain a
  // read-only .snapshot directory which provides access to each of the volume's
  // snapshots.
  bool snapshot_directory = 20 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Used capacity in GIB of the volume. This is computed
  // periodically and it does not represent the realtime usage.
  int64 used_gib = 21 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Security Style of the Volume
  SecurityStyle security_style = 22 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Flag indicating if the volume is a kerberos volume or not, export
  // policy rules control kerberos security modes (krb5, krb5i, krb5p).
  bool kerberos_enabled = 23 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Flag indicating if the volume is NFS LDAP enabled or not.
  bool ldap_enabled = 24 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Specifies the ActiveDirectory name of a SMB volume.
  string active_directory = 25 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "netapp.googleapis.com/ActiveDirectory"
    }
  ];

  // Optional. Specifies the source of the volume to be created from.
  RestoreParameters restore_parameters = 26
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Specifies the KMS config to be used for volume encryption.
  string kms_config = 27 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "netapp.googleapis.com/KmsConfig"
    }
  ];

  // Output only. Specified the current volume encryption key source.
  EncryptionType encryption_type = 28
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Indicates whether the volume is part of a replication
  // relationship.
  bool has_replication = 29 [(google.api.field_behavior) = OUTPUT_ONLY];

  // BackupConfig of the volume.
  optional BackupConfig backup_config = 30;

  // Optional. List of actions that are restricted on this volume.
  repeated RestrictedAction restricted_actions = 31
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Flag indicating if the volume will be a large capacity volume or
  // a regular volume. This field is used for legacy FILE pools. For Unified
  // pools, use the `large_capacity_config` field instead. This field and
  // `large_capacity_config` are mutually exclusive.
  bool large_capacity = 32 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Flag indicating if the volume will have an IP address per node
  // for volumes supporting multiple IP endpoints. Only the volume with
  // large_capacity will be allowed to have multiple endpoints.
  bool multiple_endpoints = 33 [(google.api.field_behavior) = OPTIONAL];

  // Tiering policy for the volume.
  optional TieringPolicy tiering_policy = 34;

  // Output only. Specifies the replica zone for regional volume.
  string replica_zone = 36 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Specifies the active zone for regional volume.
  string zone = 37 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Size of the volume cold tier data rounded down to the nearest
  // GiB.
  int64 cold_tier_size_gib = 39 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The Hybrid Replication parameters for the volume.
  HybridReplicationParameters hybrid_replication_parameters = 40
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Throughput of the volume (in MiB/s)
  double throughput_mibps = 41 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Cache parameters for the volume.
  CacheParameters cache_parameters = 42
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Total hot tier data rounded down to the nearest GiB used by
  // the Volume. This field is only used for flex Service Level
  int64 hot_tier_size_used_gib = 44 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Block devices for the volume.
  // Currently, only one block device is permitted per Volume.
  repeated BlockDevice block_devices = 45
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Large capacity config for the volume.
  // Enables and configures large capacity for volumes in Unified pools with
  // File protocols. Not applicable for Block protocols in Unified pools.
  // This field and the legacy `large_capacity` boolean field
  // are mutually exclusive.
  LargeCapacityConfig large_capacity_config = 46
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. If this volume is a clone, this field contains details about
  // the clone.
  CloneDetails clone_details = 47 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Configuration for a Large Capacity Volume. A Large Capacity Volume
// supports sizes ranging from 4.8 TiB to 20 PiB, it is composed of multiple
// internal constituents, and must be created in a large capacity pool.
message LargeCapacityConfig {
  // Optional. The number of internal constituents (e.g., FlexVols) for this
  // large volume. The minimum number of constituents is 2.
  int32 constituent_count = 1 [(google.api.field_behavior) = OPTIONAL];
}

// Defines the export policy for the volume.
message ExportPolicy {
  // Required. List of export policy rules
  repeated SimpleExportPolicyRule rules = 1
      [(google.api.field_behavior) = REQUIRED];
}

// An export policy rule describing various export options.
message SimpleExportPolicyRule {
  // `SquashMode` defines how remote user privileges are restricted when
  // accessing an NFS export. It controls how user identities (like root) are
  // mapped to anonymous users to limit access and enforce security.
  enum SquashMode {
    // Defaults to `NO_ROOT_SQUASH`.
    SQUASH_MODE_UNSPECIFIED = 0;

    // The root user (UID 0) retains full access. Other users are
    // unaffected.
    NO_ROOT_SQUASH = 1;

    // The root user (UID 0) is squashed to anonymous user ID. Other users are
    // unaffected.
    ROOT_SQUASH = 2;

    // All users are squashed to anonymous user ID.
    ALL_SQUASH = 3;
  }

  // Comma separated list of allowed clients IP addresses
  optional string allowed_clients = 1;

  // Whether Unix root access will be granted.
  optional string has_root_access = 2;

  // Access type (ReadWrite, ReadOnly, None)
  optional AccessType access_type = 3;

  // NFS V3 protocol.
  optional bool nfsv3 = 4;

  // NFS V4 protocol.
  optional bool nfsv4 = 5;

  // If enabled (true) the rule defines a read only access for clients matching
  // the 'allowedClients' specification. It enables nfs clients to mount using
  // 'authentication' kerberos security mode.
  optional bool kerberos_5_read_only = 6;

  // If enabled (true) the rule defines read and write access for clients
  // matching the 'allowedClients' specification. It enables nfs clients to
  // mount using 'authentication' kerberos security mode. The
  // 'kerberos5ReadOnly' value be ignored if this is enabled.
  optional bool kerberos_5_read_write = 7;

  // If enabled (true) the rule defines a read only access for clients matching
  // the 'allowedClients' specification. It enables nfs clients to mount using
  // 'integrity' kerberos security mode.
  optional bool kerberos_5i_read_only = 8;

  // If enabled (true) the rule defines read and write access for clients
  // matching the 'allowedClients' specification. It enables nfs clients to
  // mount using 'integrity' kerberos security mode. The 'kerberos5iReadOnly'
  // value be ignored if this is enabled.
  optional bool kerberos_5i_read_write = 9;

  // If enabled (true) the rule defines a read only access for clients matching
  // the 'allowedClients' specification. It enables nfs clients to mount using
  // 'privacy' kerberos security mode.
  optional bool kerberos_5p_read_only = 10;

  // If enabled (true) the rule defines read and write access for clients
  // matching the 'allowedClients' specification. It enables nfs clients to
  // mount using 'privacy' kerberos security mode. The 'kerberos5pReadOnly'
  // value be ignored if this is enabled.
  optional bool kerberos_5p_read_write = 11;

  // Optional. Defines how user identity squashing is applied for this export
  // rule. This field is the preferred way to configure squashing behavior and
  // takes precedence over `has_root_access` if both are provided.
  optional SquashMode squash_mode = 12 [(google.api.field_behavior) = OPTIONAL];

  // Optional. An integer representing the anonymous user ID. Range is 0 to
  // `4294967295`. Required when `squash_mode` is `ROOT_SQUASH` or `ALL_SQUASH`.
  optional int64 anon_uid = 13 [(google.api.field_behavior) = OPTIONAL];
}

// Snapshot Policy for a volume.
message SnapshotPolicy {
  // If enabled, make snapshots automatically according to the schedules.
  // Default is false.
  optional bool enabled = 1;

  // Hourly schedule policy.
  optional HourlySchedule hourly_schedule = 2;

  // Daily schedule policy.
  optional DailySchedule daily_schedule = 3;

  // Weekly schedule policy.
  optional WeeklySchedule weekly_schedule = 4;

  // Monthly schedule policy.
  optional MonthlySchedule monthly_schedule = 5;
}

// Make a snapshot every hour e.g. at 04:00, 05:00, 06:00.
message HourlySchedule {
  // The maximum number of Snapshots to keep for the hourly schedule
  optional double snapshots_to_keep = 1;

  // Set the minute of the hour to start the snapshot (0-59), defaults to the
  // top of the hour (0).
  optional double minute = 2;
}

// Make a snapshot every day e.g. at 04:00, 05:20, 23:50
message DailySchedule {
  // The maximum number of Snapshots to keep for the hourly schedule
  optional double snapshots_to_keep = 1;

  // Set the minute of the hour to start the snapshot (0-59), defaults to the
  // top of the hour (0).
  optional double minute = 2;

  // Set the hour to start the snapshot (0-23), defaults to midnight (0).
  optional double hour = 3;
}

// Make a snapshot every week e.g. at Monday 04:00, Wednesday 05:20, Sunday
// 23:50
message WeeklySchedule {
  // The maximum number of Snapshots to keep for the hourly schedule
  optional double snapshots_to_keep = 1;

  // Set the minute of the hour to start the snapshot (0-59), defaults to the
  // top of the hour (0).
  optional double minute = 2;

  // Set the hour to start the snapshot (0-23), defaults to midnight (0).
  optional double hour = 3;

  // Set the day or days of the week to make a snapshot. Accepts a comma
  // separated days of the week. Defaults to 'Sunday'.
  optional string day = 4;
}

// Make a snapshot once a month e.g. at 2nd 04:00, 7th 05:20, 24th 23:50
message MonthlySchedule {
  // The maximum number of Snapshots to keep for the hourly schedule
  optional double snapshots_to_keep = 1;

  // Set the minute of the hour to start the snapshot (0-59), defaults to the
  // top of the hour (0).
  optional double minute = 2;

  // Set the hour to start the snapshot (0-23), defaults to midnight (0).
  optional double hour = 3;

  // Set the day or days of the month to make a snapshot (1-31). Accepts a
  // comma separated number of days. Defaults to '1'.
  optional string days_of_month = 4;
}

// View only mount options for a volume.
message MountOption {
  // Export string
  string export = 1;

  // Full export string
  string export_full = 2;

  // Protocol to mount with.
  Protocols protocol = 3;

  // Instructions for mounting
  string instructions = 4;

  // Output only. IP Address.
  string ip_address = 5 [
    (google.api.field_info).format = IPV4,
    (google.api.field_behavior) = OUTPUT_ONLY
  ];
}

// The RestoreParameters if volume is created from a snapshot or backup.
message RestoreParameters {
  // The source that the volume is created from.
  oneof source {
    // Full name of the snapshot resource.
    // Format:
    // projects/{project}/locations/{location}/volumes/{volume}/snapshots/{snapshot}
    string source_snapshot = 1;

    // Full name of the backup resource.
    // Format for standard backup:
    // projects/{project}/locations/{location}/backupVaults/{backup_vault_id}/backups/{backup_id}
    // Format for BackupDR backup:
    // projects/{project}/locations/{location}/backupVaults/{backup_vault}/dataSources/{data_source}/backups/{backup}
    string source_backup = 2 [
      (google.api.resource_reference) = { type: "netapp.googleapis.com/Backup" }
    ];
  }
}

// BackupConfig contains backup related config on a volume.
message BackupConfig {
  // Optional. When specified, schedule backups will be created based on the
  // policy configuration.
  repeated string backup_policies = 1 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "netapp.googleapis.com/BackupPolicy"
    }
  ];

  // Optional. Name of backup vault.
  // Format:
  // projects/{project_id}/locations/{location}/backupVaults/{backup_vault_id}
  string backup_vault = 2 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "netapp.googleapis.com/BackupVault"
    }
  ];

  // Optional. When set to true, scheduled backup is enabled on the volume.
  // This field should be nil when there's no backup policy attached.
  optional bool scheduled_backup_enabled = 3
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Total size of all backups in a chain in bytes = baseline
  // backup size + sum(incremental backup size).
  optional int64 backup_chain_bytes = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Defines tiering policy for the volume.
message TieringPolicy {
  // Tier action for the volume.
  enum TierAction {
    // Unspecified.
    TIER_ACTION_UNSPECIFIED = 0;

    // When tiering is enabled, new cold data will be tiered.
    ENABLED = 1;

    // When paused, tiering won't be performed on new data. Existing data stays
    // tiered until accessed.
    PAUSED = 2;
  }

  // Optional. Flag indicating if the volume has tiering policy enable/pause.
  // Default is PAUSED.
  optional TierAction tier_action = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Time in days to mark the volume's data block as cold and make it
  // eligible for tiering, can be range from 2-183. Default is 31.
  optional int32 cooling_threshold_days = 2
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Flag indicating that the hot tier bypass mode is enabled. Default
  // is false. This is only applicable to Flex service level.
  optional bool hot_tier_bypass_mode_enabled = 3
      [(google.api.field_behavior) = OPTIONAL];
}

// The Hybrid Replication parameters for the volume.
message HybridReplicationParameters {
  // Type of the volume's hybrid replication.
  enum VolumeHybridReplicationType {
    // Unspecified hybrid replication type.
    VOLUME_HYBRID_REPLICATION_TYPE_UNSPECIFIED = 0;

    // Hybrid replication type for migration.
    MIGRATION = 1;

    // Hybrid replication type for continuous replication.
    CONTINUOUS_REPLICATION = 2;

    // New field for reversible OnPrem replication, to be used for data
    // protection.
    ONPREM_REPLICATION = 3;

    // New field for reversible OnPrem replication, to be used for data
    // protection.
    REVERSE_ONPREM_REPLICATION = 4;
  }

  // Required. Desired name for the replication of this volume.
  string replication = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "netapp.googleapis.com/Replication"
    }
  ];

  // Required. Name of the user's local source volume to be peered with the
  // destination volume.
  string peer_volume_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the user's local source cluster to be peered with the
  // destination cluster.
  string peer_cluster_name = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the user's local source vserver svm to be peered with the
  // destination vserver svm.
  string peer_svm_name = 4 [(google.api.field_behavior) = REQUIRED];

  // Required. List of node ip addresses to be peered with.
  repeated string peer_ip_addresses = 5
      [(google.api.field_behavior) = REQUIRED];

  // Optional. Name of source cluster location associated with the Hybrid
  // replication. This is a free-form field for the display purpose only.
  string cluster_location = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Description of the replication.
  string description = 7 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Labels to be added to the replication as the key value pairs.
  map<string, string> labels = 8 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Replication Schedule for the replication created.
  HybridReplicationSchedule replication_schedule = 9
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Type of the hybrid replication.
  VolumeHybridReplicationType hybrid_replication_type = 10
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Constituent volume count for large volume.
  int32 large_volume_constituent_count = 11
      [(google.api.field_behavior) = OPTIONAL];
}

// Cache Parameters for the volume.
message CacheParameters {
  // State of the cache volume indicating the peering status.
  enum CacheState {
    // Default unspecified state.
    CACHE_STATE_UNSPECIFIED = 0;

    // State indicating waiting for cluster peering to be established.
    PENDING_CLUSTER_PEERING = 1;

    // State indicating waiting for SVM peering to be established.
    PENDING_SVM_PEERING = 2;

    // State indicating successful establishment of peering with origin
    // volumes's ONTAP cluster.
    PEERED = 3;

    // Terminal state wherein peering with origin volume's ONTAP cluster
    // has failed.
    ERROR = 4;
  }

  // Required. Name of the origin volume for the cache volume.
  string peer_volume_name = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the origin volume's ONTAP cluster.
  string peer_cluster_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the origin volume's SVM.
  string peer_svm_name = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. List of IC LIF addresses of the origin volume's ONTAP cluster.
  repeated string peer_ip_addresses = 4
      [(google.api.field_behavior) = REQUIRED];

  // Optional. Indicates whether the cache volume has global file lock enabled.
  optional bool enable_global_file_lock = 5
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration of the cache volume.
  CacheConfig cache_config = 6 [(google.api.field_behavior) = OPTIONAL];

  // Output only. State of the cache volume indicating the peering status.
  CacheState cache_state = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Copy-paste-able commands to be used on user's ONTAP to accept
  // peering requests.
  string command = 8 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Expiration time for the peering command to be executed on user's
  // ONTAP.
  google.protobuf.Timestamp peering_command_expiry_time = 9
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Temporary passphrase generated to accept cluster peering
  // command.
  string passphrase = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Detailed description of the current cache state.
  string state_details = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Configuration of the cache volume.
message CacheConfig {
  // State of the prepopulation job indicating how the prepopulation is
  // progressing.
  enum CachePrePopulateState {
    // Default unspecified state.
    CACHE_PRE_POPULATE_STATE_UNSPECIFIED = 0;

    // State representing when the most recent create or update request did not
    // require a prepopulation job.
    NOT_NEEDED = 1;

    // State representing when the most recent update request requested a
    // prepopulation job but it has not yet completed.
    IN_PROGRESS = 2;

    // State representing when the most recent update request requested a
    // prepopulation job and it has completed successfully.
    COMPLETE = 3;

    // State representing when the most recent update request requested a
    // prepopulation job but the prepopulate job failed.
    ERROR = 4;
  }

  // Optional. Pre-populate cache volume with data from the origin volume.
  CachePrePopulate cache_pre_populate = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Flag indicating whether writeback is enabled for the FlexCache
  // volume.
  optional bool writeback_enabled = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Flag indicating whether a CIFS change notification is enabled for
  // the FlexCache volume.
  optional bool cifs_change_notify_enabled = 5
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. State of the prepopulation job indicating how the
  // prepopulation is progressing.
  CachePrePopulateState cache_pre_populate_state = 6
      [(google.api.field_behavior) = OUTPUT_ONLY];
}

// Pre-populate cache volume with data from the origin volume.
message CachePrePopulate {
  // Optional. List of directory-paths to be pre-populated for the FlexCache
  // volume.
  repeated string path_list = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. List of directory-paths to be excluded for pre-population for the
  // FlexCache volume.
  repeated string exclude_path_list = 2
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Flag indicating whether the directories listed with the
  // `path_list` need to be recursively pre-populated.
  optional bool recursion = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Block device represents the device(s) which are stored in the block volume.
message BlockDevice {
  // Optional. User-defined name for the block device, unique within the volume.
  // In case no user input is provided, name will be auto-generated in the
  // backend. The name must meet the following requirements:
  // *   Be between 1 and 255 characters long.
  // *   Contain only uppercase or lowercase letters (A-Z, a-z), numbers (0-9),
  //     and the following special characters: "-", "_", "}", "{", ".".
  // *   Spaces are not allowed.
  optional string name = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A list of host groups that identify hosts that can mount the
  // block volume. Format:
  // `projects/{project_id}/locations/{location}/hostGroups/{host_group_id}`
  // This field can be updated after the block device is created.
  repeated string host_groups = 2 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.resource_reference) = {
      type: "netapp.googleapis.com/HostGroup"
    }
  ];

  // Output only. Device identifier of the block volume. This represents
  // `lun_serial_number` for iSCSI volumes.
  string identifier = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. The size of the block device in GiB.
  // Any value provided for the `size_gib` field during volume creation is
  // ignored. The block device's size is system-managed and will be set to match
  // the parent Volume's `capacity_gib`.
  optional int64 size_gib = 4 [(google.api.field_behavior) = OPTIONAL];

  // Required. Immutable. The OS type of the volume.
  // This field can't be changed after the block device is created.
  OsType os_type = 5 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// RestoreBackupFilesRequest restores files from a backup to a volume.
message RestoreBackupFilesRequest {
  // Required. The volume resource name, in the format
  // `projects/{project_id}/locations/{location}/volumes/{volume_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "netapp.googleapis.com/Volume" }
  ];

  // Required. The backup resource name, in the format
  // `projects/{project_id}/locations/{location}/backupVaults/{backup_vault_id}/backups/{backup_id}`
  string backup = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "netapp.googleapis.com/Backup" }
  ];

  // Required. List of files to be restored, specified by their absolute path in
  // the source volume.
  repeated string file_list = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. Absolute directory path in the destination volume. This is
  // required if the `file_list` is provided.
  string restore_destination_path = 4 [(google.api.field_behavior) = OPTIONAL];
}

// RestoreBackupFilesResponse is the result of RestoreBackupFilesRequest.
message RestoreBackupFilesResponse {}

// EstablishVolumePeeringRequest establishes cluster and svm peerings between
// the source and destination clusters.
message EstablishVolumePeeringRequest {
  // Required. The volume resource name, in the format
  // `projects/{project_id}/locations/{location}/volumes/{volume_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "netapp.googleapis.com/Volume" }
  ];

  // Required. Name of the user's local source cluster to be peered with the
  // destination cluster.
  string peer_cluster_name = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the user's local source vserver svm to be peered with the
  // destination vserver svm.
  string peer_svm_name = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. List of IPv4 ip addresses to be used for peering.
  repeated string peer_ip_addresses = 4
      [(google.api.field_behavior) = OPTIONAL];

  // Required. Name of the user's local source volume to be peered with the
  // destination volume.
  string peer_volume_name = 5 [(google.api.field_behavior) = REQUIRED];
}
