// Copyright 2024 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.filestore.v1beta1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/cloud/common/operation_metadata.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";

option csharp_namespace = "Google.Cloud.Filestore.V1Beta1";
option go_package = "cloud.google.com/go/filestore/apiv1beta1/filestorepb;filestorepb";
option java_multiple_files = true;
option java_outer_classname = "CloudFilestoreServiceProto";
option java_package = "com.google.cloud.filestore.v1beta1";
option php_namespace = "Google\\Cloud\\Filestore\\V1beta1";

// Configures and manages Filestore resources.
//
// Filestore Manager v1beta1.
//
// The `file.googleapis.com` service implements the Filestore API and
// defines the following model for managing resources:
// * The service works with a collection of cloud projects, named: `/projects/*`
// * Each project has a collection of available locations, named: `/locations/*`
// * Each location has a collection of instances and backups, named:
// `/instances/*` and `/backups/*` respectively.
// * As such, Filestore instances are resources of the form:
//   `/projects/{project_id}/locations/{location_id}/instances/{instance_id}`
//   backups are resources of the form:
//   `/projects/{project_id}/locations/{location_id}/backup/{backup_id}`
//
// Note that location_id can represent a Google Cloud `zone` or `region`
// depending on the resource. for example: A zonal Filestore instance:
// * `projects/my-project/locations/us-central1-c/instances/my-basic-tier-filer`
// A regional Filestore instance:
// * `projects/my-project/locations/us-central1/instances/my-enterprise-filer`
service CloudFilestoreManager {
  option (google.api.default_host) = "file.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Lists all instances in a project for either a specified location
  // or for all locations.
  rpc ListInstances(ListInstancesRequest) returns (ListInstancesResponse) {
    option (google.api.http) = {
      get: "/v1beta1/{parent=projects/*/locations/*}/instances"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a specific instance.
  rpc GetInstance(GetInstanceRequest) returns (Instance) {
    option (google.api.http) = {
      get: "/v1beta1/{name=projects/*/locations/*/instances/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates an instance.
  // When creating from a backup, the capacity of the new instance needs to be
  // equal to or larger than the capacity of the backup (and also equal to or
  // larger than the minimum capacity of the tier).
  rpc CreateInstance(CreateInstanceRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=projects/*/locations/*}/instances"
      body: "instance"
    };
    option (google.api.method_signature) = "parent,instance,instance_id";
    option (google.longrunning.operation_info) = {
      response_type: "Instance"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Updates the settings of a specific instance.
  rpc UpdateInstance(UpdateInstanceRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1beta1/{instance.name=projects/*/locations/*/instances/*}"
      body: "instance"
    };
    option (google.api.method_signature) = "instance,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Instance"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Restores an existing instance's file share from a backup.
  //
  // The capacity of the instance needs to be equal to or larger than the
  // capacity of the backup (and also equal to or larger than the minimum
  // capacity of the tier).
  rpc RestoreInstance(RestoreInstanceRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta1/{name=projects/*/locations/*/instances/*}:restore"
      body: "*"
    };
    option (google.longrunning.operation_info) = {
      response_type: "Instance"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Revert an existing instance's file system to a specified snapshot.
  rpc RevertInstance(RevertInstanceRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta1/{name=projects/*/locations/*/instances/*}:revert"
      body: "*"
    };
    option (google.longrunning.operation_info) = {
      response_type: "Instance"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Deletes an instance.
  rpc DeleteInstance(DeleteInstanceRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1beta1/{name=projects/*/locations/*/instances/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Lists all snapshots in a project for either a specified location
  // or for all locations.
  rpc ListSnapshots(ListSnapshotsRequest) returns (ListSnapshotsResponse) {
    option (google.api.http) = {
      get: "/v1beta1/{parent=projects/*/locations/*/instances/*}/snapshots"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a specific snapshot.
  rpc GetSnapshot(GetSnapshotRequest) returns (Snapshot) {
    option (google.api.http) = {
      get: "/v1beta1/{name=projects/*/locations/*/instances/*/snapshots/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a snapshot.
  rpc CreateSnapshot(CreateSnapshotRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=projects/*/locations/*/instances/*}/snapshots"
      body: "snapshot"
    };
    option (google.api.method_signature) = "parent,snapshot,snapshot_id";
    option (google.longrunning.operation_info) = {
      response_type: "Snapshot"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Deletes a snapshot.
  rpc DeleteSnapshot(DeleteSnapshotRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1beta1/{name=projects/*/locations/*/instances/*/snapshots/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Updates the settings of a specific snapshot.
  rpc UpdateSnapshot(UpdateSnapshotRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1beta1/{snapshot.name=projects/*/locations/*/instances/*/snapshots/*}"
      body: "snapshot"
    };
    option (google.api.method_signature) = "snapshot,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Snapshot"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Lists all backups in a project for either a specified location or for all
  // locations.
  rpc ListBackups(ListBackupsRequest) returns (ListBackupsResponse) {
    option (google.api.http) = {
      get: "/v1beta1/{parent=projects/*/locations/*}/backups"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a specific backup.
  rpc GetBackup(GetBackupRequest) returns (Backup) {
    option (google.api.http) = {
      get: "/v1beta1/{name=projects/*/locations/*/backups/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a backup.
  rpc CreateBackup(CreateBackupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=projects/*/locations/*}/backups"
      body: "backup"
    };
    option (google.api.method_signature) = "parent,backup,backup_id";
    option (google.longrunning.operation_info) = {
      response_type: "Backup"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Deletes a backup.
  rpc DeleteBackup(DeleteBackupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1beta1/{name=projects/*/locations/*/backups/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Updates the settings of a specific backup.
  rpc UpdateBackup(UpdateBackupRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1beta1/{backup.name=projects/*/locations/*/backups/*}"
      body: "backup"
    };
    option (google.api.method_signature) = "backup,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Backup"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Lists all shares for a specified instance.
  rpc ListShares(ListSharesRequest) returns (ListSharesResponse) {
    option (google.api.http) = {
      get: "/v1beta1/{parent=projects/*/locations/*/instances/*}/shares"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets the details of a specific share.
  rpc GetShare(GetShareRequest) returns (Share) {
    option (google.api.http) = {
      get: "/v1beta1/{name=projects/*/locations/*/instances/*/shares/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a share.
  rpc CreateShare(CreateShareRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1beta1/{parent=projects/*/locations/*/instances/*}/shares"
      body: "share"
    };
    option (google.api.method_signature) = "parent,share,share_id";
    option (google.longrunning.operation_info) = {
      response_type: "Share"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Deletes a share.
  rpc DeleteShare(DeleteShareRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1beta1/{name=projects/*/locations/*/instances/*/shares/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }

  // Updates the settings of a specific share.
  rpc UpdateShare(UpdateShareRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1beta1/{share.name=projects/*/locations/*/instances/*/shares/*}"
      body: "share"
    };
    option (google.api.method_signature) = "share,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Share"
      metadata_type: "google.cloud.common.OperationMetadata"
    };
  }
}

// Network configuration for the instance.
message NetworkConfig {
  // Internet protocol versions supported by Filestore.
  enum AddressMode {
    // Internet protocol not set.
    ADDRESS_MODE_UNSPECIFIED = 0;

    // Use the IPv4 internet protocol.
    MODE_IPV4 = 1;
  }

  // Available connection modes.
  enum ConnectMode {
    // ConnectMode not set.
    CONNECT_MODE_UNSPECIFIED = 0;

    // Connect via direct peering to the Filestore service.
    DIRECT_PEERING = 1;

    // Connect to your Filestore instance using Private Service
    // Access. Private services access provides an IP address range for multiple
    // Google Cloud services, including Filestore.
    PRIVATE_SERVICE_ACCESS = 2;
  }

  // The name of the Google Compute Engine
  // [VPC network](https://cloud.google.com/vpc/docs/vpc) to which the
  // instance is connected.
  string network = 1;

  // Internet protocol versions for which the instance has IP addresses
  // assigned. For this version, only MODE_IPV4 is supported.
  repeated AddressMode modes = 3;

  // Optional, reserved_ip_range can have one of the following two types of
  // values.
  //
  // * CIDR range value when using DIRECT_PEERING connect mode.
  // * [Allocated IP address
  // range](https://cloud.google.com/compute/docs/ip-addresses/reserve-static-internal-ip-address)
  // when using PRIVATE_SERVICE_ACCESS connect mode.
  //
  // When the name of an allocated IP address range is specified, it must be one
  // of the ranges associated with the private service access connection.
  // When specified as a direct CIDR value, it must be a /29 CIDR block for
  // Basic tier, a /24 CIDR block for High Scale tier, or a /26 CIDR block for
  // Enterprise tier in one of the [internal IP address
  // ranges](https://www.arin.net/reference/research/statistics/address_filters/)
  // that identifies the range of IP addresses reserved for this instance. For
  // example, 10.0.0.0/29, 192.168.0.0/24, or 192.168.0.0/26, respectively. The
  // range you specify can't overlap with either existing subnets or assigned IP
  // address ranges for other Filestore instances in the selected VPC
  // network.
  string reserved_ip_range = 4;

  // Output only. IPv4 addresses in the format
  // `{octet1}.{octet2}.{octet3}.{octet4}` or IPv6 addresses in the format
  // `{block1}:{block2}:{block3}:{block4}:{block5}:{block6}:{block7}:{block8}`.
  repeated string ip_addresses = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The network connect mode of the Filestore instance.
  // If not provided, the connect mode defaults to DIRECT_PEERING.
  ConnectMode connect_mode = 6;
}

// File share configuration for the instance.
message FileShareConfig {
  // Required. The name of the file share. Must use 1-16 characters for the
  // basic service tier and 1-63 characters for all other service tiers.
  // Must use lowercase letters, numbers, or underscores `[a-z0-9_]`. Must
  // start with a letter. Immutable.
  string name = 1;

  // File share capacity in gigabytes (GB).
  // Filestore defines 1 GB as 1024^3 bytes.
  int64 capacity_gb = 2;

  // The source that this file share has been restored from. Empty if the file
  // share is created from scratch.
  oneof source {
    // The resource name of the backup, in the format
    // `projects/{project_id}/locations/{location_id}/backups/{backup_id}`, that
    // this file share has been restored from.
    string source_backup = 9 [
      (google.api.resource_reference) = { type: "file.googleapis.com/Backup" }
    ];
  }

  // Nfs Export Options.
  // There is a limit of 10 export options per file share.
  repeated NfsExportOptions nfs_export_options = 8;
}

// NFS export options specifications.
message NfsExportOptions {
  // The access mode.
  enum AccessMode {
    // AccessMode not set.
    ACCESS_MODE_UNSPECIFIED = 0;

    // The client can only read the file share.
    READ_ONLY = 1;

    // The client can read and write the file share (default).
    READ_WRITE = 2;
  }

  // The squash mode.
  enum SquashMode {
    // SquashMode not set.
    SQUASH_MODE_UNSPECIFIED = 0;

    // The Root user has root access to the file share (default).
    NO_ROOT_SQUASH = 1;

    // The Root user has squashed access to the anonymous uid/gid.
    ROOT_SQUASH = 2;
  }

  // The security flavor. In general, a "flavor" represents a designed process
  // or system. A "security flavor" is a system designed for the purpose of
  // authenticating a data originator (client), recipient (server), and the data
  // they transmit between one another.
  enum SecurityFlavor {
    // SecurityFlavor not set.
    SECURITY_FLAVOR_UNSPECIFIED = 0;

    // The user's UNIX user-id and group-ids are transferred "in the clear" (not
    // encrypted) on the network, unauthenticated by the NFS server (default).
    AUTH_SYS = 1;

    // End-user authentication through Kerberos V5.
    KRB5 = 2;

    // krb5 plus integrity protection (data packets are tamper proof).
    KRB5I = 3;

    // krb5i plus privacy protection (data packets are tamper proof and
    // encrypted).
    KRB5P = 4;
  }

  // List of either an IPv4 addresses in the format
  // `{octet1}.{octet2}.{octet3}.{octet4}` or CIDR ranges in the format
  // `{octet1}.{octet2}.{octet3}.{octet4}/{mask size}` which may mount the
  // file share.
  // Overlapping IP ranges are not allowed, both within and across
  // NfsExportOptions. An error will be returned.
  // The limit is 64 IP ranges/addresses for each FileShareConfig among all
  // NfsExportOptions.
  repeated string ip_ranges = 1;

  // Either READ_ONLY, for allowing only read requests on the exported
  // directory, or READ_WRITE, for allowing both read and write requests.
  // The default is READ_WRITE.
  AccessMode access_mode = 2;

  // Either NO_ROOT_SQUASH, for allowing root access on the exported directory,
  // or ROOT_SQUASH, for not allowing root access. The default is
  // NO_ROOT_SQUASH.
  SquashMode squash_mode = 3;

  // An integer representing the anonymous user id with a default value of
  // 65534.
  // Anon_uid may only be set with squash_mode of ROOT_SQUASH.  An error will be
  // returned if this field is specified for other squash_mode settings.
  int64 anon_uid = 4;

  // An integer representing the anonymous group id with a default value of
  // 65534.
  // Anon_gid may only be set with squash_mode of ROOT_SQUASH.  An error will be
  // returned if this field is specified for other squash_mode settings.
  int64 anon_gid = 5;

  // The security flavors allowed for mount operations.
  // The default is AUTH_SYS.
  repeated SecurityFlavor security_flavors = 6;
}

// ManagedActiveDirectoryConfig contains all the parameters for connecting
// to Managed Active Directory.
message ManagedActiveDirectoryConfig {
  // Fully qualified domain name.
  string domain = 1;

  // The computer name is used as a prefix to the mount remote target.
  // Example: if the computer_name is `my-computer`, the mount command will
  // look like: `$mount -o vers=4,sec=krb5
  // my-computer.filestore.<domain>:<share>`.
  string computer = 2;
}

// Directory Services configuration for Kerberos-based authentication.
message DirectoryServicesConfig {
  oneof config {
    // Configuration for Managed Service for Microsoft Active Directory.
    ManagedActiveDirectoryConfig managed_active_directory = 1;
  }
}

// A Filestore instance.
message Instance {
  option (google.api.resource) = {
    type: "file.googleapis.com/Instance"
    pattern: "projects/{project}/locations/{location}/instances/{instance}"
  };

  // The instance state.
  enum State {
    // State not set.
    STATE_UNSPECIFIED = 0;

    // The instance is being created.
    CREATING = 1;

    // The instance is available for use.
    READY = 2;

    // Work is being done on the instance. You can get further details from the
    // `statusMessage` field of the `Instance` resource.
    REPAIRING = 3;

    // The instance is shutting down.
    DELETING = 4;

    // The instance is experiencing an issue and might be unusable. You can get
    // further details from the `statusMessage` field of the `Instance`
    // resource.
    ERROR = 6;

    // The instance is restoring a snapshot or backup to an existing file share
    // and may be unusable during this time.
    RESTORING = 7;

    // The instance is suspended. You can get further details from
    // the `suspension_reasons` field of the `Instance` resource.
    SUSPENDED = 8;

    // The instance is reverting to a snapshot.
    REVERTING = 9;

    // The instance is in the process of becoming suspended.
    SUSPENDING = 10;

    // The instance is in the process of becoming active.
    RESUMING = 11;
  }

  // Available service tiers.
  enum Tier {
    // Not set.
    TIER_UNSPECIFIED = 0;

    // STANDARD tier. BASIC_HDD is the preferred term for this tier.
    STANDARD = 1;

    // PREMIUM tier. BASIC_SSD is the preferred term for this tier.
    PREMIUM = 2;

    // BASIC instances offer a maximum capacity of 63.9 TB.
    // BASIC_HDD is an alias for STANDARD Tier, offering economical
    // performance backed by HDD.
    BASIC_HDD = 3;

    // BASIC instances offer a maximum capacity of 63.9 TB.
    // BASIC_SSD is an alias for PREMIUM Tier, and offers improved
    // performance backed by SSD.
    BASIC_SSD = 4;

    // HIGH_SCALE instances offer expanded capacity and performance scaling
    // capabilities.
    HIGH_SCALE_SSD = 6;

    // ENTERPRISE instances offer the features and availability needed for
    // mission-critical workloads.
    ENTERPRISE = 7;

    // ZONAL instances offer expanded capacity and performance scaling
    // capabilities.
    ZONAL = 8;

    // REGIONAL instances offer the features and availability needed for
    // mission-critical workloads.
    REGIONAL = 9;
  }

  // SuspensionReason contains the possible reasons for a suspension.
  enum SuspensionReason {
    // Not set.
    SUSPENSION_REASON_UNSPECIFIED = 0;

    // The KMS key used by the instance is either revoked or denied access to.
    KMS_KEY_ISSUE = 1;
  }

  // File access protocol.
  enum FileProtocol {
    // FILE_PROTOCOL_UNSPECIFIED serves a "not set" default value when
    // a FileProtocol is a separate field in a message.
    FILE_PROTOCOL_UNSPECIFIED = 0;

    // NFS 3.0.
    NFS_V3 = 1;

    // NFS 4.1.
    NFS_V4_1 = 2;
  }

  // Output only. The resource name of the instance, in the format
  // `projects/{project_id}/locations/{location_id}/instances/{instance_id}`.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The description of the instance (2048 characters or less).
  string description = 2;

  // Output only. The instance state.
  State state = 5 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Additional information about the instance state, if available.
  string status_message = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time when the instance was created.
  google.protobuf.Timestamp create_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // The service tier of the instance.
  Tier tier = 8;

  // Resource labels to represent user provided metadata.
  map<string, string> labels = 9;

  // File system shares on the instance.
  // For this version, only a single file share is supported.
  repeated FileShareConfig file_shares = 10;

  // VPC networks to which the instance is connected.
  // For this version, only a single network is supported.
  repeated NetworkConfig networks = 11;

  // Server-specified ETag for the instance resource to prevent simultaneous
  // updates from overwriting each other.
  string etag = 12;

  // Output only. Reserved for future use.
  google.protobuf.BoolValue satisfies_pzs = 13
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  bool satisfies_pzi = 26 [(google.api.field_behavior) = OUTPUT_ONLY];

  // KMS key name used for data encryption.
  string kms_key_name = 14;

  // Output only. Field indicates all the reasons the instance is in "SUSPENDED"
  // state.
  repeated SuspensionReason suspension_reasons = 15
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The max capacity of the instance.
  int64 max_capacity_gb = 16 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The increase/decrease capacity step size.
  int64 capacity_step_size_gb = 17 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The max number of shares allowed.
  int64 max_share_count = 18;

  // The storage capacity of the instance in gigabytes (GB = 1024^3 bytes).
  // This capacity can be increased up to `max_capacity_gb` GB in multipliers
  // of `capacity_step_size_gb` GB.
  int64 capacity_gb = 19;

  // Indicates whether this instance uses a multi-share configuration with which
  // it can have more than one file-share or none at all. File-shares are added,
  // updated and removed through the separate file-share APIs.
  bool multi_share_enabled = 20;

  // Immutable. The protocol indicates the access protocol for all shares in the
  // instance. This field is immutable and it cannot be changed after the
  // instance has been created. Default value: `NFS_V3`.
  FileProtocol protocol = 21 [(google.api.field_behavior) = IMMUTABLE];

  // Directory Services configuration for Kerberos-based authentication.
  // Should only be set if protocol is "NFS_V4_1".
  DirectoryServicesConfig directory_services = 24;
}

// CreateInstanceRequest creates an instance.
message CreateInstanceRequest {
  // Required. The instance's project and location, in the format
  // `projects/{project_id}/locations/{location}`. In Filestore,
  // locations map to Google Cloud zones, for example **us-west1-b**.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. The ID of the instance to create.
  // The ID must be unique within the specified project and location.
  //
  // This value must start with a lowercase letter followed by up to 62
  // lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
  string instance_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. An [instance resource][google.cloud.filestore.v1beta1.Instance]
  Instance instance = 3 [(google.api.field_behavior) = REQUIRED];
}

// GetInstanceRequest gets the state of an instance.
message GetInstanceRequest {
  // Required. The instance resource name, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];
}

// UpdateInstanceRequest updates the settings of an instance.
message UpdateInstanceRequest {
  // Required. Mask of fields to update.  At least one path must be supplied in
  // this field.  The elements of the repeated paths field may only include
  // these fields:
  //
  // * "description"
  // * "file_shares"
  // * "labels"
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. Only fields specified in update_mask are updated.
  Instance instance = 2 [(google.api.field_behavior) = REQUIRED];
}

// RestoreInstanceRequest restores an existing instance's file share from a
// backup.
message RestoreInstanceRequest {
  // Required. The resource name of the instance, in the format
  // `projects/{project_id}/locations/{location_id}/instances/{instance_id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // Required. Name of the file share in the Filestore instance that the backup
  // is being restored to.
  string file_share = 2 [(google.api.field_behavior) = REQUIRED];

  oneof source {
    // The resource name of the snapshot, in the format
    // `projects/{project_id}/locations/{location_id}/snapshots/{snapshot_id}`.
    string source_snapshot = 3 [
      deprecated = true,
      (google.api.resource_reference) = { type: "file.googleapis.com/Snapshot" }
    ];

    // The resource name of the backup, in the format
    // `projects/{project_id}/locations/{location_id}/backups/{backup_id}`.
    string source_backup = 4 [
      (google.api.resource_reference) = { type: "file.googleapis.com/Backup" }
    ];
  }
}

// RevertInstanceRequest reverts the given instance's file share to the
// specified snapshot.
message RevertInstanceRequest {
  // Required.
  // `projects/{project_id}/locations/{location_id}/instances/{instance_id}`.
  // The resource name of the instance, in the format
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // 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}/instances/{instance_id}/snapshots/{snapshot_id}`
  string target_snapshot_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// DeleteInstanceRequest deletes an instance.
message DeleteInstanceRequest {
  // Required. The instance resource name, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // If set to true, any snapshots of the instance will also be deleted.
  // (Otherwise, the request will only work if the instance has no snapshots.)
  bool force = 2;
}

// ListInstancesRequest lists instances.
message ListInstancesRequest {
  // Required. The project and location for which to retrieve instance
  // information, in the format `projects/{project_id}/locations/{location}`. In
  // Cloud Filestore, locations map to Google Cloud zones, for example
  // **us-west1-b**. To retrieve instance information for all locations, use "-"
  // for the
  // `{location}` value.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The next_page_token value to use if there are additional
  // results to retrieve for this list request.
  string page_token = 3;

  // Sort results. Supported values are "name", "name desc" or "" (unsorted).
  string order_by = 4;

  // List filter.
  string filter = 5;
}

// ListInstancesResponse is the result of ListInstancesRequest.
message ListInstancesResponse {
  // A list of instances in the project for the specified location.
  //
  // If the `{location}` value in the request is "-", the response contains a
  // list of instances from all locations. If any location is unreachable, the
  // response will only return instances in reachable locations and the
  // "unreachable" field will be populated with a list of unreachable locations.
  repeated Instance instances = 1;

  // The token you can use to retrieve the next page of results. Not returned
  // if there are no more results in the list.
  string next_page_token = 2;

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

// A Filestore snapshot.
message Snapshot {
  option (google.api.resource) = {
    type: "file.googleapis.com/Snapshot"
    pattern: "projects/{project}/locations/{location}/instances/{instance}/snapshots/{snapshot}"
  };

  // The snapshot state.
  enum State {
    // State not set.
    STATE_UNSPECIFIED = 0;

    // Snapshot is being created.
    CREATING = 1;

    // Snapshot is available for use.
    READY = 3;

    // Snapshot is being deleted.
    DELETING = 4;
  }

  // Output only. The resource name of the snapshot, in the format
  // `projects/{project_id}/locations/{location_id}/instances/{instance_id}/snapshots/{snapshot_id}`.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // A description of the snapshot with 2048 characters or less.
  // Requests with longer descriptions will be rejected.
  string description = 2;

  // Output only. The snapshot state.
  State state = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time when the snapshot was created.
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Resource labels to represent user provided metadata.
  map<string, string> labels = 5;

  // Output only. The amount of bytes needed to allocate a full copy of the
  // snapshot content
  int64 filesystem_used_bytes = 12 [(google.api.field_behavior) = OUTPUT_ONLY];
}

// CreateSnapshotRequest creates a snapshot.
message CreateSnapshotRequest {
  // Required. The Filestore Instance to create the snapshots of, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // Required. The ID to use for the snapshot.
  // The ID must be unique within the specified instance.
  //
  // This value must start with a lowercase letter followed by up to 62
  // lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
  string snapshot_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. A snapshot resource
  Snapshot snapshot = 3 [(google.api.field_behavior) = REQUIRED];
}

// GetSnapshotRequest gets the state of a snapshot.
message GetSnapshotRequest {
  // Required. The snapshot resource name, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}/snapshots/{snapshot_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Snapshot" }
  ];
}

// DeleteSnapshotRequest deletes a snapshot.
message DeleteSnapshotRequest {
  // Required. The snapshot resource name, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}/snapshots/{snapshot_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Snapshot" }
  ];
}

// UpdateSnapshotRequest updates description and/or labels for a snapshot.
message UpdateSnapshotRequest {
  // Required. Mask of fields to update.  At least one path must be supplied in
  // this field.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = REQUIRED];

  // Required. A snapshot resource
  Snapshot snapshot = 2 [(google.api.field_behavior) = REQUIRED];
}

// ListSnapshotsRequest lists snapshots.
message ListSnapshotsRequest {
  // Required. The instance for which to retrieve snapshot information,
  // in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The next_page_token value to use if there are additional
  // results to retrieve for this list request.
  string page_token = 3;

  // Sort results. Supported values are "name", "name desc" or "" (unsorted).
  string order_by = 4;

  // List filter.
  string filter = 5;
}

// ListSnapshotsResponse is the result of ListSnapshotsRequest.
message ListSnapshotsResponse {
  // A list of snapshots in the project for the specified instance.
  repeated Snapshot snapshots = 1;

  // The token you can use to retrieve the next page of results. Not returned
  // if there are no more results in the list.
  string next_page_token = 2;
}

// A Filestore backup.
message Backup {
  option (google.api.resource) = {
    type: "file.googleapis.com/Backup"
    pattern: "projects/{project}/locations/{location}/backups/{backup}"
  };

  // The backup state.
  enum State {
    // State not set.
    STATE_UNSPECIFIED = 0;

    // Backup is being created.
    CREATING = 1;

    // Backup has been taken and the operation is being finalized. At this
    // point, changes to the file share will not be reflected in the backup.
    FINALIZING = 2;

    // Backup is available for use.
    READY = 3;

    // Backup is being deleted.
    DELETING = 4;

    // Backup is not valid and cannot be used for creating new instances or
    // restoring existing instances.
    INVALID = 5;
  }

  // Output only. The resource name of the backup, in the format
  // `projects/{project_id}/locations/{location_id}/backups/{backup_id}`.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // A description of the backup with 2048 characters or less.
  // Requests with longer descriptions will be rejected.
  string description = 2;

  // Output only. The backup state.
  State state = 3 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time when the backup was created.
  google.protobuf.Timestamp create_time = 4
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Resource labels to represent user provided metadata.
  map<string, string> labels = 5;

  // Output only. Capacity of the source file share when the backup was created.
  int64 capacity_gb = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The size of the storage used by the backup. As backups share
  // storage, this number is expected to change with backup creation/deletion.
  int64 storage_bytes = 7 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The resource name of the source Filestore instance, in the format
  // `projects/{project_id}/locations/{location_id}/instances/{instance_id}`,
  // used to create this backup.
  string source_instance = 8 [
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // Name of the file share in the source Filestore instance that the
  // backup is created from.
  string source_file_share = 9;

  // Output only. The service tier of the source Filestore instance that this
  // backup is created from.
  Instance.Tier source_instance_tier = 10
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Amount of bytes that will be downloaded if the backup is
  // restored
  int64 download_bytes = 11 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  google.protobuf.BoolValue satisfies_pzs = 12
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Reserved for future use.
  bool satisfies_pzi = 14 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Immutable. KMS key name used for data encryption.
  string kms_key_name = 13 [(google.api.field_behavior) = IMMUTABLE];
}

// CreateBackupRequest creates a backup.
message CreateBackupRequest {
  // Required. The backup's project and location, in the format
  // `projects/{project_id}/locations/{location}`. In Filestore,
  // backup locations map to Google Cloud regions, for example **us-west1**.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // Required. A [backup resource][google.cloud.filestore.v1beta1.Backup]
  Backup backup = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the backup.
  // The ID must be unique within the specified project and location.
  //
  // This value must start with a lowercase letter followed by up to 62
  // lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
  string backup_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// DeleteBackupRequest deletes a backup.
message DeleteBackupRequest {
  // Required. The backup resource name, in the format
  // `projects/{project_id}/locations/{location}/backups/{backup_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Backup" }
  ];
}

// UpdateBackupRequest updates description and/or labels for a backup.
message UpdateBackupRequest {
  // Required. A [backup resource][google.cloud.filestore.v1beta1.Backup]
  Backup backup = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Mask of fields to update.  At least one path must be supplied in
  // this field.
  google.protobuf.FieldMask update_mask = 2
      [(google.api.field_behavior) = REQUIRED];
}

// GetBackupRequest gets the state of a backup.
message GetBackupRequest {
  // Required. The backup resource name, in the format
  // `projects/{project_id}/locations/{location}/backups/{backup_id}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Backup" }
  ];
}

// ListBackupsRequest lists backups.
message ListBackupsRequest {
  // Required. The project and location for which to retrieve backup
  // information, in the format `projects/{project_id}/locations/{location}`. In
  // Filestore, backup locations map to Google Cloud regions, for example
  // **us-west1**. To retrieve backup information for all locations, use "-" for
  // the
  // `{location}` value.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "locations.googleapis.com/Location"
    }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The next_page_token value to use if there are additional
  // results to retrieve for this list request.
  string page_token = 3;

  // Sort results. Supported values are "name", "name desc" or "" (unsorted).
  string order_by = 4;

  // List filter.
  string filter = 5;
}

// ListBackupsResponse is the result of ListBackupsRequest.
message ListBackupsResponse {
  // A list of backups in the project for the specified location.
  //
  // If the `{location}` value in the request is "-", the response contains a
  // list of backups from all locations. If any location is unreachable, the
  // response will only return backups in reachable locations and the
  // "unreachable" field will be populated with a list of unreachable
  // locations.
  repeated Backup backups = 1;

  // The token you can use to retrieve the next page of results. Not returned
  // if there are no more results in the list.
  string next_page_token = 2;

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

// A Filestore share.
message Share {
  option (google.api.resource) = {
    type: "file.googleapis.com/Share"
    pattern: "projects/{project}/locations/{location}/instances/{instance}/shares/{share}"
  };

  // The share state.
  enum State {
    // State not set.
    STATE_UNSPECIFIED = 0;

    // Share is being created.
    CREATING = 1;

    // Share is ready for use.
    READY = 3;

    // Share is being deleted.
    DELETING = 4;
  }

  // Output only. The resource name of the share, in the format
  // `projects/{project_id}/locations/{location_id}/instances/{instance_id}/shares/{share_id}`.
  string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY];

  // The mount name of the share. Must be 63 characters or less and consist of
  // uppercase or lowercase letters, numbers, and underscores.
  string mount_name = 2;

  // A description of the share with 2048 characters or less. Requests with
  // longer descriptions will be rejected.
  string description = 3;

  // File share capacity in gigabytes (GB). Filestore defines 1 GB as
  // 1024^3 bytes. Must be greater than 0.
  int64 capacity_gb = 4;

  // Nfs Export Options.
  // There is a limit of 10 export options per file share.
  repeated NfsExportOptions nfs_export_options = 5;

  // Output only. The share state.
  State state = 6 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. The time when the share was created.
  google.protobuf.Timestamp create_time = 7
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Resource labels to represent user provided metadata.
  map<string, string> labels = 8;

  // The source that this Share has been restored from. Empty if the Share is
  // created from scratch.
  oneof source {
    // Immutable. Full name of the Cloud Filestore Backup resource that this
    // Share is restored from, in the format of
    // projects/{project_id}/locations/{location_id}/backups/{backup_id}.
    // Empty, if the Share is created from scratch and not restored from a
    // backup.
    string backup = 9 [
      (google.api.field_behavior) = IMMUTABLE,
      (google.api.resource_reference) = { type: "file.googleapis.com/Backup" }
    ];
  }
}

// CreateShareRequest creates a share.
message CreateShareRequest {
  // Required. The Filestore Instance to create the share for, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // Required. The ID to use for the share.
  // The ID must be unique within the specified instance.
  //
  // This value must start with a lowercase letter followed by up to 62
  // lowercase letters, numbers, or hyphens, and cannot end with a hyphen.
  string share_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. A share resource
  Share share = 3 [(google.api.field_behavior) = REQUIRED];
}

// GetShareRequest gets the state of a share.
message GetShareRequest {
  // Required. The share resource name, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}/shares/{share_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Share" }
  ];
}

// DeleteShareRequest deletes a share.
message DeleteShareRequest {
  // Required. The share resource name, in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}/share/{share_id}`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Share" }
  ];
}

// ListSharesRequest lists shares.
message ListSharesRequest {
  // Required. The instance for which to retrieve share information,
  // in the format
  // `projects/{project_id}/locations/{location}/instances/{instance_id}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = { type: "file.googleapis.com/Instance" }
  ];

  // The maximum number of items to return.
  int32 page_size = 2;

  // The next_page_token value to use if there are additional
  // results to retrieve for this list request.
  string page_token = 3;

  // Sort results. Supported values are "name", "name desc" or "" (unsorted).
  string order_by = 4;

  // List filter.
  string filter = 5;
}

// ListSharesResponse is the result of ListSharesRequest.
message ListSharesResponse {
  // A list of shares in the project for the specified instance.
  repeated Share shares = 1;

  // The token you can use to retrieve the next page of results. Not returned
  // if there are no more results in the list.
  string next_page_token = 2;

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

// UpdateShareRequest updates the settings of a share.
message UpdateShareRequest {
  // Required. A share resource.
  // Only fields specified in update_mask are updated.
  Share share = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Mask of fields to update. At least one path must be supplied in
  // this field. The elements of the repeated paths field may only include these
  // fields:
  //
  // * "description"
  // * "capacity_gb"
  // * "labels"
  // * "nfs_export_options"
  google.protobuf.FieldMask update_mask = 2
      [(google.api.field_behavior) = REQUIRED];
}
