// 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.hypercomputecluster.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/field_info.proto";
import "google/api/resource.proto";
import "google/cloud/hypercomputecluster/v1/operation_metadata.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/duration.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option csharp_namespace = "Google.Cloud.HypercomputeCluster.V1";
option go_package = "cloud.google.com/go/hypercomputecluster/apiv1/hypercomputeclusterpb;hypercomputeclusterpb";
option java_multiple_files = true;
option java_outer_classname = "HypercomputeClusterProto";
option java_package = "com.google.cloud.hypercomputecluster.v1";
option php_namespace = "Google\\Cloud\\HypercomputeCluster\\V1";
option ruby_package = "Google::Cloud::HypercomputeCluster::V1";
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/ComputeInstance"
  pattern: "projects/{project}/zones/{zone}/instances/{instance}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/DiskType"
  pattern: "projects/{project}/zones/{zone}/diskTypes/{disk_type}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Image"
  pattern: "projects/{project}/global/images/{image}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Network"
  pattern: "projects/{project}/global/networks/{network}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Reservation"
  pattern: "projects/{project}/zones/{zone}/reservations/{reservation}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/ReservationBlock"
  pattern: "projects/{project}/zones/{zone}/reservations/{reservation}/reservationBlocks/{reservation_block}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/ReservationSubBlock"
  pattern: "projects/{project}/zones/{zone}/reservations/{reservation}/reservationBlocks/{reservation_block}/reservationSubBlocks/{reservation_sub_block}"
};
option (google.api.resource_definition) = {
  type: "compute.googleapis.com/Subnetwork"
  pattern: "projects/{project}/regions/{region}/subnetworks/{subnetwork}"
};
option (google.api.resource_definition) = {
  type: "file.googleapis.com/FileInstance"
  pattern: "projects/{project}/locations/{location}/instances/{instance}"
};
option (google.api.resource_definition) = {
  type: "storage.googleapis.com/Bucket"
  pattern: "projects/{project}/buckets/{bucket}"
};

// Service describing handlers for resources
service HypercomputeCluster {
  option (google.api.default_host) = "hypercomputecluster.googleapis.com";
  option (google.api.oauth_scopes) =
      "https://www.googleapis.com/auth/cloud-platform";

  // Lists Clusters in a given project and location.
  rpc ListClusters(ListClustersRequest) returns (ListClustersResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/clusters"
    };
    option (google.api.method_signature) = "parent";
  }

  // Gets details of a single Cluster.
  rpc GetCluster(GetClusterRequest) returns (Cluster) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/clusters/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a new Cluster in a given project and location.
  rpc CreateCluster(CreateClusterRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/clusters"
      body: "cluster"
    };
    option (google.api.method_signature) = "parent,cluster,cluster_id";
    option (google.longrunning.operation_info) = {
      response_type: "Cluster"
      metadata_type: "OperationMetadata"
    };
  }

  // Updates the parameters of a single Cluster.
  rpc UpdateCluster(UpdateClusterRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1/{cluster.name=projects/*/locations/*/clusters/*}"
      body: "cluster"
    };
    option (google.api.method_signature) = "cluster,update_mask";
    option (google.longrunning.operation_info) = {
      response_type: "Cluster"
      metadata_type: "OperationMetadata"
    };
  }

  // Deletes a single Cluster.
  rpc DeleteCluster(DeleteClusterRequest)
      returns (google.longrunning.Operation) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/clusters/*}"
    };
    option (google.api.method_signature) = "name";
    option (google.longrunning.operation_info) = {
      response_type: "google.protobuf.Empty"
      metadata_type: "OperationMetadata"
    };
  }
}

// A collection of virtual machines and connected resources forming a
// high-performance computing cluster capable of running large-scale, tightly
// coupled workloads. A cluster combines a set a compute resources that perform
// computations, storage resources that contain inputs and store outputs, an
// orchestrator that is responsible for assigning jobs to compute resources, and
// network resources that connect everything together.
message Cluster {
  option (google.api.resource) = {
    type: "hypercomputecluster.googleapis.com/Cluster"
    pattern: "projects/{project}/locations/{location}/clusters/{cluster}"
    plural: "clusters"
    singular: "cluster"
  };

  // Identifier. [Relative resource name](https://google.aip.dev/122) of the
  // cluster, in the format
  // `projects/{project}/locations/{location}/clusters/{cluster}`.
  string name = 1 [(google.api.field_behavior) = IDENTIFIER];

  // Optional. User-provided description of the cluster.
  string description = 9 [(google.api.field_behavior) = OPTIONAL];

  // Optional.
  // [Labels](https://cloud.google.com/compute/docs/labeling-resources) applied
  // to the cluster. Labels can be used to organize clusters and to filter them
  // in queries.
  map<string, string> labels = 4 [(google.api.field_behavior) = OPTIONAL];

  // Output only. Time that the cluster was originally created.
  google.protobuf.Timestamp create_time = 2
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Time that the cluster was most recently updated.
  google.protobuf.Timestamp update_time = 3
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Output only. Indicates whether changes to the cluster are currently in
  // flight. If this is `true`, then the current state might not match the
  // cluster's intended state.
  bool reconciling = 10 [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Network resources available to the cluster. Must contain at most
  // one value. Keys specify the ID of the network resource by which it can be
  // referenced elsewhere, and must conform to
  // [RFC-1034](https://datatracker.ietf.org/doc/html/rfc1034) (lower-case,
  // alphanumeric, and at most 63 characters).
  map<string, NetworkResource> network_resources = 11
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Storage resources available to the cluster. Keys specify the ID
  // of the storage resource by which it can be referenced elsewhere, and must
  // conform to [RFC-1034](https://datatracker.ietf.org/doc/html/rfc1034)
  // (lower-case, alphanumeric, and at most 63 characters).
  map<string, StorageResource> storage_resources = 12
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Compute resources available to the cluster. Keys specify the ID
  // of the compute resource by which it can be referenced elsewhere, and must
  // conform to [RFC-1034](https://datatracker.ietf.org/doc/html/rfc1034)
  // (lower-case, alphanumeric, and at most 63 characters).
  map<string, ComputeResource> compute_resources = 13
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Orchestrator that is responsible for scheduling and running jobs
  // on the cluster.
  Orchestrator orchestrator = 8 [(google.api.field_behavior) = OPTIONAL];
}

// Request message for
// [ListClusters][google.cloud.hypercomputecluster.v1.HypercomputeCluster.ListClusters].
message ListClustersRequest {
  // Required. Parent location of the clusters to list, in the format
  // `projects/{project}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "hypercomputecluster.googleapis.com/Cluster"
    }
  ];

  // Optional. Maximum number of clusters to return. The service may return
  // fewer than this value.
  int32 page_size = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. A page token received from a previous `ListClusters` call.
  // Provide this to retrieve the subsequent page. When paginating, all other
  // parameters provided to `ListClusters` must match the call that provided the
  // page token.
  string page_token = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. [Filter](https://google.aip.dev/160) to apply to the returned
  // results.
  string filter = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. How to order the resulting clusters. Must be one of the following
  // strings:
  //
  // * `name`
  // * `name desc`
  // * `create_time`
  // * `create_time desc`
  //
  // If not specified, clusters will be returned in an arbitrary order.
  string order_by = 5 [(google.api.field_behavior) = OPTIONAL];
}

// Response message for
// [ListClusters][google.cloud.hypercomputecluster.v1.HypercomputeCluster.ListClusters].
message ListClustersResponse {
  // Clusters in the specified location.
  repeated Cluster clusters = 1;

  // A token that can be sent as `page_token` to retrieve the next page. If this
  // field is absent, there are no subsequent pages.
  string next_page_token = 2;

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

// Request message for
// [GetCluster][google.cloud.hypercomputecluster.v1.HypercomputeCluster.GetCluster].
message GetClusterRequest {
  // Required. Name of the cluster to retrieve, in the format
  // `projects/{project}/locations/{location}/clusters/{cluster}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "hypercomputecluster.googleapis.com/Cluster"
    }
  ];
}

// Request message for
// [CreateCluster][google.cloud.hypercomputecluster.v1.HypercomputeCluster.CreateCluster].
message CreateClusterRequest {
  // Required. Parent location in which the cluster should be created, in the
  // format `projects/{project}/locations/{location}`.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "hypercomputecluster.googleapis.com/Cluster"
    }
  ];

  // Required. ID of the cluster to create. Must conform to
  // [RFC-1034](https://datatracker.ietf.org/doc/html/rfc1034) (lower-case,
  // alphanumeric, and at most 63 characters).
  string cluster_id = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Cluster to create.
  Cluster cluster = 3 [(google.api.field_behavior) = REQUIRED];

  // Optional. A unique identifier for this request. A random UUID is
  // recommended. This request is idempotent if and only if `request_id` is
  // provided.
  string request_id = 4 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// Request message for
// [UpdateCluster][google.cloud.hypercomputecluster.v1.HypercomputeCluster.UpdateCluster].
message UpdateClusterRequest {
  // Required. Cluster to update.
  Cluster cluster = 2 [(google.api.field_behavior) = REQUIRED];

  // Optional. Mask specifying which fields in the cluster to update. All paths
  // must be specified explicitly - wildcards are not supported. At least one
  // path must be provided.
  google.protobuf.FieldMask update_mask = 1
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. A unique identifier for this request. A random UUID is
  // recommended. This request is idempotent if and only if `request_id` is
  // provided.
  string request_id = 3 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// Request message for
// [DeleteCluster][google.cloud.hypercomputecluster.v1.HypercomputeCluster.DeleteCluster].
message DeleteClusterRequest {
  // Required. Name of the cluster to delete, in the format
  // `projects/{project}/locations/{location}/clusters/{cluster}`.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "hypercomputecluster.googleapis.com/Cluster"
    }
  ];

  // Optional. A unique identifier for this request. A random UUID is
  // recommended. This request is idempotent if and only if `request_id` is
  // provided.
  string request_id = 2 [
    (google.api.field_info).format = UUID4,
    (google.api.field_behavior) = OPTIONAL
  ];
}

// A resource representing a network that connects the various components of a
// cluster together.
message NetworkResource {
  // Reference to the network resource in Google Cloud. Exactly one of these
  // fields will be populated based on the configured type of network resource.
  oneof reference {
    // Reference to a network in Google Compute Engine.
    NetworkReference network = 3;
  }

  // Immutable. Configuration for this network resource, which describes how it
  // should be created or imported. This field only controls how the network
  // resource is initially created or imported. Subsequent changes to the
  // network resource should be made via the resource's API and will not be
  // reflected in the configuration.
  NetworkResourceConfig config = 2 [(google.api.field_behavior) = IMMUTABLE];
}

// A reference to a [VPC network](https://cloud.google.com/vpc/docs/vpc) in
// Google Compute Engine.
message NetworkReference {
  // Output only. Name of the network, in the format
  // `projects/{project}/global/networks/{network}`.
  string network = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];

  // Output only. Name of the particular subnetwork being used by the cluster,
  // in the format
  // `projects/{project}/regions/{region}/subnetworks/{subnetwork}`.
  string subnetwork = 2 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "compute.googleapis.com/Subnetwork"
    }
  ];
}

// Describes how a network resource should be initialized. Each network resource
// can either be imported from an existing Google Cloud resource or initialized
// when the cluster is created.
message NetworkResourceConfig {
  // Particular type of configuration for this network resource.
  oneof config {
    // Optional. Immutable. If set, indicates that a new network should be
    // created.
    NewNetworkConfig new_network = 3 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that an existing network should be
    // imported.
    ExistingNetworkConfig existing_network = 4 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];
  }
}

// When set in a
// [NetworkResourceConfig][google.cloud.hypercomputecluster.v1.NetworkResourceConfig],
// indicates that a new network should be created.
message NewNetworkConfig {
  // Required. Immutable. Name of the network to create, in the format
  // `projects/{project}/global/networks/{network}`.
  string network = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];

  // Optional. Immutable. Description of the network. Maximum of 2048
  // characters.
  string description = 2 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// When set in a
// [NetworkResourceConfig][google.cloud.hypercomputecluster.v1.NetworkResourceConfig],
// indicates that an existing network should be imported.
message ExistingNetworkConfig {
  // Required. Immutable. Name of the network to import, in the format
  // `projects/{project}/global/networks/{network}`.
  string network = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = { type: "compute.googleapis.com/Network" }
  ];

  // Required. Immutable. Particular subnetwork to use, in the format
  // `projects/{project}/regions/{region}/subnetworks/{subnetwork}`.
  string subnetwork = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "compute.googleapis.com/Subnetwork"
    }
  ];
}

// A resource representing a form of persistent storage that is accessible to
// compute resources in the cluster.
message StorageResource {
  // Reference to the storage resource in Google Cloud. Exactly one of these
  // fields will be populated based on the configured type of storage resource.
  oneof reference {
    // Reference to a Filestore instance. Populated if and only if the storage
    // resource was configured to use Filestore.
    FilestoreReference filestore = 1;

    // Reference to a Google Cloud Storage bucket. Populated if and only if the
    // storage resource was configured to use Google Cloud Storage.
    BucketReference bucket = 2;

    // Reference to a Managed Lustre instance. Populated if and only if the
    // storage resource was configured to use Managed Lustre.
    LustreReference lustre = 3;
  }

  // Required. Immutable. Configuration for this storage resource, which
  // describes how it should be created or imported. This field only controls
  // how the storage resource is initially created or imported. Subsequent
  // changes to the storage resource should be made via the resource's API and
  // will not be reflected in the configuration.
  StorageResourceConfig config = 4 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// A reference to a [Filestore](https://cloud.google.com/filestore) instance.
message FilestoreReference {
  // Output only. Name of the Filestore instance, in the format
  // `projects/{project}/locations/{location}/instances/{instance}`
  string filestore = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "file.googleapis.com/FileInstance"
    }
  ];
}

// A reference to a [Google Cloud Storage](https://cloud.google.com/storage)
// bucket.
message BucketReference {
  // Output only. Name of the bucket.
  string bucket = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "storage.googleapis.com/Bucket" }
  ];
}

// A reference to a [Managed
// Lustre](https://cloud.google.com/products/managed-lustre) instance.
message LustreReference {
  // Output only. Name of the Managed Lustre instance, in the format
  // `projects/{project}/locations/{location}/instances/{instance}`
  string lustre = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = { type: "lustre.googleapis.com/Instance" }
  ];
}

// Describes how a storage resource should be initialized. Each storage resource
// can either be imported from an existing Google Cloud resource or initialized
// when the cluster is created.
message StorageResourceConfig {
  // Particular type of configuration for this storage resource.
  oneof config {
    // Optional. Immutable. If set, indicates that a new Filestore instance
    // should be created.
    NewFilestoreConfig new_filestore = 1 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that an existing Filestore
    // instance should be imported.
    ExistingFilestoreConfig existing_filestore = 2 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that a new Cloud Storage bucket
    // should be created.
    NewBucketConfig new_bucket = 3 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that an existing Cloud Storage
    // bucket should be imported.
    ExistingBucketConfig existing_bucket = 4 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that a new Managed Lustre instance
    // should be created.
    NewLustreConfig new_lustre = 5 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that an existing Managed Lustre
    // instance should be imported.
    ExistingLustreConfig existing_lustre = 6 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];
  }
}

// When set in a
// [StorageResourceConfig][google.cloud.hypercomputecluster.v1.StorageResourceConfig],
// indicates that a new [Filestore](https://cloud.google.com/filestore) instance
// should be created.
message NewFilestoreConfig {
  // Available [service
  // tiers](https://cloud.google.com/filestore/docs/service-tiers) for Filestore
  // instances.
  enum Tier {
    // Not set.
    TIER_UNSPECIFIED = 0;

    // Offers expanded capacity and performance scaling capabilities suitable
    // for high-performance computing application requirements.
    ZONAL = 4;

    // Offers features and availability needed for mission-critical,
    // high-performance computing workloads.
    REGIONAL = 6;
  }

  // File access protocol for Filestore instances.
  enum Protocol {
    // Not set.
    PROTOCOL_UNSPECIFIED = 0;

    // NFS 3.0.
    NFSV3 = 1;

    // NFS 4.1.
    NFSV41 = 2;
  }

  // Required. Immutable. Name of the Filestore instance to create, in the
  // format `projects/{project}/locations/{location}/instances/{instance}`
  string filestore = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "file.googleapis.com/FileInstance"
    }
  ];

  // Optional. Immutable. Description of the instance. Maximum of 2048
  // characters.
  string description = 4 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. File system shares on the instance. Exactly one file
  // share must be specified.
  repeated FileShareConfig file_shares = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. Service tier to use for the instance.
  Tier tier = 3 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Optional. Immutable. Access protocol to use for all file shares in the
  // instance. Defaults to NFS V3 if not set.
  Protocol protocol = 5 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.field_behavior) = OPTIONAL,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// Message describing filestore configuration
message FileShareConfig {
  // Required. Size of the filestore in GB. Must be between 1024 and 102400, and
  // must meet scalability requirements described at
  // https://cloud.google.com/filestore/docs/service-tiers.
  int64 capacity_gb = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. Filestore share location
  string file_share = 2 [(google.api.field_behavior) = REQUIRED];
}

// When set in a
// [StorageResourceConfig][google.cloud.hypercomputecluster.v1.StorageResourceConfig],
// indicates that an existing [Filestore](https://cloud.google.com/filestore)
// instance should be imported.
message ExistingFilestoreConfig {
  // Required. Immutable. Name of the Filestore instance to import, in the
  // format `projects/{project}/locations/{location}/instances/{instance}`
  string filestore = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "file.googleapis.com/FileInstance"
    }
  ];
}

// When set in a
// [StorageResourceConfig][google.cloud.hypercomputecluster.v1.StorageResourceConfig],
// indicates that a new [Google Cloud Storage](https://cloud.google.com/storage)
// bucket should be created.
message NewBucketConfig {
  // [Storage class](https://cloud.google.com/storage/docs/storage-classes) for
  // a Cloud Storage bucket.
  enum StorageClass {
    // Not set.
    STORAGE_CLASS_UNSPECIFIED = 0;

    // Best for data that is frequently accessed.
    STANDARD = 1;

    // Low-cost storage for data that is accessed less frequently.
    NEARLINE = 2;

    // Very low-cost storage for infrequently accessed data.
    COLDLINE = 3;

    // Lowest-cost storage for data archiving, online backup, and disaster
    // recovery.
    ARCHIVE = 4;
  }

  // Storage class of the bucket, which can be set automatically or explicitly.
  oneof option {
    // Optional. Immutable. If set, indicates that the bucket should use
    // [Autoclass](https://cloud.google.com/storage/docs/autoclass).
    GcsAutoclassConfig autoclass = 2 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, uses the provided storage class as the
    // bucket's default storage class.
    StorageClass storage_class = 3 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];
  }

  // Required. Immutable. Name of the Cloud Storage bucket to create.
  string bucket = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = { type: "storage.googleapis.com/Bucket" }
  ];

  // Optional. Immutable. If set, indicates that the bucket should use
  // [hierarchical
  // namespaces](https://cloud.google.com/storage/docs/hns-overview).
  GcsHierarchicalNamespaceConfig hierarchical_namespace = 4 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// Message describing Google Cloud Storage autoclass configuration
message GcsAutoclassConfig {
  // Terminal storage class types of the autoclass bucket
  enum TerminalStorageClass {
    // Unspecified terminal storage class
    TERMINAL_STORAGE_CLASS_UNSPECIFIED = 0;
  }

  // Required. Enables Auto-class feature.
  bool enabled = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. Terminal storage class of the autoclass bucket
  TerminalStorageClass terminal_storage_class = 2
      [(google.api.field_behavior) = OPTIONAL];
}

// Message describing Google Cloud Storage hierarchical namespace configuration
message GcsHierarchicalNamespaceConfig {
  // Required. Enables hierarchical namespace setup for the bucket.
  bool enabled = 1 [(google.api.field_behavior) = REQUIRED];
}

// When set in a
// [StorageResourceConfig][google.cloud.hypercomputecluster.v1.StorageResourceConfig],
// indicates that an existing [Google Cloud
// Storage](https://cloud.google.com/storage) bucket should be imported.
message ExistingBucketConfig {
  // Required. Immutable. Name of the Cloud Storage bucket to import.
  string bucket = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = { type: "storage.googleapis.com/Bucket" }
  ];
}

// When set in a
// [StorageResourceConfig][google.cloud.hypercomputecluster.v1.StorageResourceConfig],
// indicates that a new [Managed
// Lustre](https://cloud.google.com/products/managed-lustre) instance should be
// created.
message NewLustreConfig {
  // Required. Immutable. Name of the Managed Lustre instance to create, in the
  // format `projects/{project}/locations/{location}/instances/{instance}`
  string lustre = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Optional. Immutable. Description of the Managed Lustre instance. Maximum of
  // 2048 characters.
  string description = 2 [
    (google.api.field_behavior) = OPTIONAL,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. Filesystem name for this instance. This name is used
  // by client-side tools, including when mounting the instance. Must be 8
  // characters or less and can only contain letters and numbers.
  string filesystem = 3 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. Storage capacity of the instance in gibibytes (GiB).
  // Allowed values are between 18000 and 7632000.
  int64 capacity_gb = 4 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// When set in a
// [StorageResourceConfig][google.cloud.hypercomputecluster.v1.StorageResourceConfig],
// indicates that an existing [Managed
// Lustre](https://cloud.google.com/products/managed-lustre) instance should be
// imported.
message ExistingLustreConfig {
  // Required. Immutable. Name of the Managed Lustre instance to import, in the
  // format `projects/{project}/locations/{location}/instances/{instance}`
  string lustre = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = { type: "lustre.googleapis.com/Instance" }
  ];
}

// A resource defining how virtual machines and accelerators should be
// provisioned for the cluster.
message ComputeResource {
  // Required. Immutable. Configuration for this compute resource, which
  // describes how it should be created at runtime.
  ComputeResourceConfig config = 6 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// Describes how a compute resource should be created at runtime.
message ComputeResourceConfig {
  // Particular type of configuration for this compute resource.
  oneof config {
    // Optional. Immutable. If set, indicates that this resource should use
    // on-demand VMs.
    NewOnDemandInstancesConfig new_on_demand_instances = 1 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that this resource should use spot
    // VMs.
    NewSpotInstancesConfig new_spot_instances = 2 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that this resource should use
    // reserved VMs.
    NewReservedInstancesConfig new_reserved_instances = 3 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];

    // Optional. Immutable. If set, indicates that this resource should use
    // flex-start VMs.
    NewFlexStartInstancesConfig new_flex_start_instances = 5 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE
    ];
  }
}

// When set in a
// [ComputeResourceConfig][google.cloud.hypercomputecluster.v1.ComputeResourceConfig],
// indicates that on-demand (i.e., using the standard provisioning model) VM
// instances should be created.
message NewOnDemandInstancesConfig {
  // Required. Immutable. Name of the zone in which VM instances should run,
  // e.g., `us-central1-a`. Must be in the same region as the cluster, and must
  // match the zone of any other resources specified in the cluster.
  string zone = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. Name of the Compute Engine [machine
  // type](https://cloud.google.com/compute/docs/machine-resource) to use, e.g.
  // `n2-standard-2`.
  string machine_type = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// When set in a
// [ComputeResourceConfig][google.cloud.hypercomputecluster.v1.ComputeResourceConfig],
// indicates that [spot
// VM](https://cloud.google.com/compute/docs/instances/spot) instances should be
// created.
message NewSpotInstancesConfig {
  // Specifies the termination action of the instance
  enum TerminationAction {
    // Not set.
    TERMINATION_ACTION_UNSPECIFIED = 0;

    // Compute Engine stops the Spot VM on preemption.
    STOP = 1;

    // Compute Engine deletes the Spot VM on preemption.
    DELETE = 2;
  }

  // Required. Immutable. Name of the zone in which VM instances should run,
  // e.g., `us-central1-a`. Must be in the same region as the cluster, and must
  // match the zone of any other resources specified in the cluster.
  string zone = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. Name of the Compute Engine [machine
  // type](https://cloud.google.com/compute/docs/machine-resource) to use, e.g.
  // `n2-standard-2`.
  string machine_type = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Optional. Termination action for the instance. If not specified, Compute
  // Engine sets the termination action to DELETE.
  TerminationAction termination_action = 5
      [(google.api.field_behavior) = OPTIONAL];
}

// When set in a
// [ComputeResourceConfig][google.cloud.hypercomputecluster.v1.ComputeResourceConfig],
// indicates that VM instances should be created from a
// [reservation](https://cloud.google.com/compute/docs/instances/reservations-overview).
message NewReservedInstancesConfig {
  // Source of the reservation
  oneof source {
    // Optional. Immutable. Name of the reservation from which VM instances
    // should be created, in the format
    // `projects/{project}/zones/{zone}/reservations/{reservation}`.
    string reservation = 1 [
      (google.api.field_behavior) = OPTIONAL,
      (google.api.field_behavior) = IMMUTABLE,
      (google.api.resource_reference) = {
        type: "compute.googleapis.com/Reservation"
      }
    ];
  }
}

// When set in a
// [ComputeResourceConfig][google.cloud.hypercomputecluster.v1.ComputeResourceConfig],
// indicates that VM instances should be created using [Flex
// Start](https://cloud.google.com/compute/docs/instances/provisioning-models).
message NewFlexStartInstancesConfig {
  // Required. Immutable. Name of the zone in which VM instances should run,
  // e.g., `us-central1-a`. Must be in the same region as the cluster, and must
  // match the zone of any other resources specified in the cluster.
  string zone = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. Name of the Compute Engine [machine
  // type](https://cloud.google.com/compute/docs/machine-resource) to use, e.g.
  // `n2-standard-2`.
  string machine_type = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];

  // Required. Immutable. Specifies the time limit for created instances.
  // Instances will be terminated at the end of this duration.
  google.protobuf.Duration max_duration = 3 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// A [Persistent disk](https://cloud.google.com/compute/docs/disks) used as the
// boot disk for a Compute Engine VM instance.
message BootDisk {
  // Required. Immutable. [Persistent disk
  // type](https://cloud.google.com/compute/docs/disks#disk-types), in the
  // format `projects/{project}/zones/{zone}/diskTypes/{disk_type}`.
  string type = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE,
    (google.api.resource_reference) = {
      type: "compute.googleapis.com/DiskType"
    }
  ];

  // Required. Immutable. Size of the disk in gigabytes. Must be at least 10GB.
  int64 size_gb = 2 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.field_behavior) = IMMUTABLE
  ];
}

// The component responsible for scheduling and running workloads on the
// cluster as well as providing the user interface for interacting with the
// cluster at runtime.
message Orchestrator {
  // Particular type of orchestrator to use in this cluster.
  oneof option {
    // Optional. If set, indicates that the cluster should use Slurm as the
    // orchestrator.
    SlurmOrchestrator slurm = 1 [(google.api.field_behavior) = OPTIONAL];
  }
}

// When set in [Orchestrator][google.cloud.hypercomputecluster.v1.Orchestrator],
// indicates that the cluster should use [Slurm](https://slurm.schedmd.com/) as
// the orchestrator.
message SlurmOrchestrator {
  // Required. Configuration for login nodes, which allow users to access the
  // cluster over SSH.
  SlurmLoginNodes login_nodes = 6 [(google.api.field_behavior) = REQUIRED];

  // Optional. Compute resource configuration for the Slurm nodesets in your
  // cluster. If not specified, the cluster won't create any nodes.
  repeated SlurmNodeSet node_sets = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Configuration for the Slurm partitions in your cluster. Each
  // partition can contain one or more nodesets, and you can submit separate
  // jobs on each partition. If you don't specify at least one partition in your
  // cluster, you can't submit jobs to the cluster.
  repeated SlurmPartition partitions = 2
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Default partition to use for submitted jobs that do not
  // explicitly specify a partition. Required if and only if there is more than
  // one partition, in which case it must match the id of one of the partitions.
  string default_partition = 3 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Slurm [prolog
  // scripts](https://slurm.schedmd.com/prolog_epilog.html), which will be
  // executed by compute nodes before a node begins running a new job. Values
  // must not be empty.
  repeated string prolog_bash_scripts = 4
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Slurm [epilog
  // scripts](https://slurm.schedmd.com/prolog_epilog.html), which will be
  // executed by compute nodes whenever a node finishes running a job. Values
  // must not be empty.
  repeated string epilog_bash_scripts = 5
      [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for Slurm nodesets in the cluster. Nodesets are groups of
// compute nodes used by Slurm that are responsible for running workloads
// submitted to the cluster.
message SlurmNodeSet {
  // Additional configuration for the nodeset. If not set, the nodeset will
  // use
  // [ComputeInstanceSlurmNodeSet][google.cloud.hypercomputecluster.v1.ComputeInstanceSlurmNodeSet]
  // with default values.
  oneof type {
    // Optional. If set, indicates that the nodeset should be backed by Compute
    // Engine instances.
    ComputeInstanceSlurmNodeSet compute_instance = 17
        [(google.api.field_behavior) = OPTIONAL];
  }

  // Required. Identifier for the nodeset, which allows it to be referenced by
  // partitions. Must conform to
  // [RFC-1034](https://datatracker.ietf.org/doc/html/rfc1034) (lower-case,
  // alphanumeric, and at most 63 characters).
  string id = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. ID of the compute resource on which this nodeset will run. Must
  // match a key in the cluster's
  // [compute_resources][google.cloud.hypercomputecluster.v1.Cluster.compute_resources].
  string compute_id = 16 [(google.api.field_behavior) = OPTIONAL];

  // Optional. How [storage
  // resources][google.cloud.hypercomputecluster.v1.StorageResource] should be
  // mounted on each compute node.
  repeated StorageConfig storage_configs = 3
      [(google.api.field_behavior) = OPTIONAL];

  // Optional. Number of nodes to be statically created for this nodeset. The
  // cluster will attempt to ensure that at least this many nodes exist at all
  // times.
  int64 static_node_count = 4 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Controls how many additional nodes a cluster can bring online to
  // handle workloads. Set this value to enable dynamic node creation and limit
  // the number of additional nodes the cluster can bring online. Leave empty if
  // you do not want the cluster to create nodes dynamically, and instead rely
  // only on static nodes.
  int64 max_dynamic_node_count = 5 [(google.api.field_behavior) = OPTIONAL];
}

// When set in a
// [SlurmNodeSet][google.cloud.hypercomputecluster.v1.SlurmNodeSet], indicates
// that the nodeset should be backed by Compute Engine VM instances.
message ComputeInstanceSlurmNodeSet {
  // Optional. [Startup
  // script](https://cloud.google.com/compute/docs/instances/startup-scripts/linux)
  // to be run on each VM instance in the nodeset. Max 256KB.
  string startup_script = 1 [(google.api.field_behavior) = OPTIONAL];

  // Optional.
  // [Labels](https://cloud.google.com/compute/docs/labeling-resources) that
  // should be applied to each VM instance in the nodeset.
  map<string, string> labels = 2 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Boot disk for the compute instance
  BootDisk boot_disk = 3 [(google.api.field_behavior) = OPTIONAL];
}

// Configuration for Slurm partitions in the cluster. Partitions are groups of
// nodesets, and are how clients specify where their workloads should be run.
message SlurmPartition {
  // Required. ID of the partition, which is how users will identify it. Must
  // conform to [RFC-1034](https://datatracker.ietf.org/doc/html/rfc1034)
  // (lower-case, alphanumeric, and at most 63 characters).
  string id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. IDs of the nodesets that make up this partition. Values must
  // match
  // [SlurmNodeSet.id][google.cloud.hypercomputecluster.v1.SlurmNodeSet.id].
  repeated string node_set_ids = 2 [(google.api.field_behavior) = REQUIRED];
}

// Configuration for Slurm [login
// nodes](https://slurm.schedmd.com/quickstart_admin.html#login) in the cluster.
// Login nodes are Compute Engine VM instances that allow users to access the
// cluster over SSH.
message SlurmLoginNodes {
  // Required. Number of login node instances to create.
  int64 count = 3 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the zone in which login nodes should run, e.g.,
  // `us-central1-a`. Must be in the same region as the cluster, and must match
  // the zone of any other resources specified in the cluster.
  string zone = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. Name of the Compute Engine [machine
  // type](https://cloud.google.com/compute/docs/machine-resource) to use for
  // login nodes, e.g. `n2-standard-2`.
  string machine_type = 1 [(google.api.field_behavior) = REQUIRED];

  // Optional. [Startup
  // script](https://cloud.google.com/compute/docs/instances/startup-scripts/linux)
  // to be run on each login node instance. Max 256KB.
  // The script must complete within the system-defined default timeout of 5
  // minutes. For tasks that require more time, consider running them in the
  // background using methods such as `&` or `nohup`.
  string startup_script = 5 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Whether [OS Login](https://cloud.google.com/compute/docs/oslogin)
  // should be enabled on login node instances.
  bool enable_os_login = 6 [(google.api.field_behavior) = OPTIONAL];

  // Optional. Whether login node instances should be assigned [external IP
  // addresses](https://cloud.google.com/compute/docs/ip-addresses#externaladdresses).
  bool enable_public_ips = 7 [(google.api.field_behavior) = OPTIONAL];

  // Optional.
  // [Labels](https://cloud.google.com/compute/docs/labeling-resources) that
  // should be applied to each login node instance.
  map<string, string> labels = 8 [(google.api.field_behavior) = OPTIONAL];

  // Optional. How [storage
  // resources][google.cloud.hypercomputecluster.v1.StorageResource] should be
  // mounted on each login node.
  repeated StorageConfig storage_configs = 12
      [(google.api.field_behavior) = OPTIONAL];

  // Output only. Information about the login node instances that were created
  // in Compute Engine.
  repeated ComputeInstance instances = 10
      [(google.api.field_behavior) = OUTPUT_ONLY];

  // Optional. Boot disk for the login node.
  BootDisk boot_disk = 13 [(google.api.field_behavior) = OPTIONAL];
}

// Description of how a [storage
// resource][google.cloud.hypercomputecluster.v1.StorageResource] should be
// mounted on a VM instance.
message StorageConfig {
  // Required. ID of the storage resource to mount, which must match a key in
  // the cluster's
  // [storage_resources][google.cloud.hypercomputecluster.v1.Cluster.storage_resources].
  string id = 1 [(google.api.field_behavior) = REQUIRED];

  // Required. A directory inside the VM instance's file system where the
  // storage resource should be mounted (e.g., `/mnt/share`).
  string local_mount = 2 [(google.api.field_behavior) = REQUIRED];
}

// Details about a Compute Engine
// [instance](https://cloud.google.com/compute/docs/instances).
message ComputeInstance {
  // Output only. Name of the VM instance, in the format
  // `projects/{project}/zones/{zone}/instances/{instance}`.
  string instance = 1 [
    (google.api.field_behavior) = OUTPUT_ONLY,
    (google.api.resource_reference) = {
      type: "compute.googleapis.com/ComputeInstance"
    }
  ];
}
