// Copyright 2025 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.batch.v1alpha;

option csharp_namespace = "Google.Cloud.Batch.V1Alpha";
option go_package = "cloud.google.com/go/batch/apiv1alpha/batchpb;batchpb";
option java_multiple_files = true;
option java_outer_classname = "VolumeProto";
option java_package = "com.google.cloud.batch.v1alpha";
option objc_class_prefix = "GCB";
option php_namespace = "Google\\Cloud\\Batch\\V1alpha";
option ruby_package = "Google::Cloud::Batch::V1alpha";

// Volume describes a volume and parameters for it to be mounted to a VM.
message Volume {
  // The source for the volume.
  oneof source {
    // A Network File System (NFS) volume. For example, a
    // Filestore file share.
    NFS nfs = 1;

    // Deprecated: please use device_name instead.
    PD pd = 2 [deprecated = true];

    // A Google Cloud Storage (GCS) volume.
    GCS gcs = 3;

    // Device name of an attached disk volume, which should align with a
    // device_name specified by
    // job.allocation_policy.instances[0].policy.disks[i].device_name or
    // defined by the given instance template in
    // job.allocation_policy.instances[0].instance_template.
    string device_name = 6;
  }

  // The mount path for the volume, e.g. /mnt/disks/share.
  string mount_path = 4;

  // Mount options vary based on the type of storage volume:
  //
  // * For a Cloud Storage bucket, all the mount options provided
  // by
  //   the [`gcsfuse` tool](https://cloud.google.com/storage/docs/gcsfuse-cli)
  //   are supported.
  // * For an existing persistent disk, all mount options provided by the
  //   [`mount` command](https://man7.org/linux/man-pages/man8/mount.8.html)
  //   except writing are supported. This is due to restrictions of
  //   [multi-writer
  //   mode](https://cloud.google.com/compute/docs/disks/sharing-disks-between-vms).
  // * For any other disk or a Network File System (NFS), all the
  //   mount options provided by the `mount` command are supported.
  repeated string mount_options = 5;
}

// Represents an NFS volume.
message NFS {
  // The IP address of the NFS.
  string server = 1;

  // Remote source path exported from the NFS, e.g., "/share".
  string remote_path = 2;
}

// Deprecated: please use device_name instead.
message PD {
  // PD disk name, e.g. pd-1.
  string disk = 1;

  // PD device name, e.g. persistent-disk-1.
  string device = 2;

  // Whether this is an existing PD. Default is false. If false, i.e., new
  // PD, we will format it into ext4 and mount to the given path. If true, i.e.,
  // existing PD, it should be in ext4 format and we will mount it to the given
  // path.
  bool existing = 3 [deprecated = true];
}

// Represents a Google Cloud Storage volume.
message GCS {
  // Remote path, either a bucket name or a subdirectory of a bucket, e.g.:
  // bucket_name, bucket_name/subdirectory/
  string remote_path = 1;
}
