// Copyright (c) 2015, Google Inc.
//
// 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.bigtable.admin.cluster.v1;

import "google.golang.org/cloud/bigtable/internal/cluster_data_proto/bigtable_cluster_data.proto";
import "google.golang.org/cloud/bigtable/internal/cluster_service_proto/bigtable_cluster_service_messages.proto";
import "google/protobuf/empty.proto";

option java_multiple_files = true;
option java_outer_classname = "BigtableClusterServicesProto";
option java_package = "com.google.bigtable.admin.cluster.v1";


// Service for managing zonal Cloud Bigtable resources.
service BigtableClusterService {
  // Lists the supported zones for the given project.
  rpc ListZones(ListZonesRequest) returns (ListZonesResponse) {
  }

  // Gets information about a particular cluster.
  rpc GetCluster(GetClusterRequest) returns (Cluster) {
  }

  // Lists all clusters in the given project, along with any zones for which
  // cluster information could not be retrieved.
  rpc ListClusters(ListClustersRequest) returns (ListClustersResponse) {
  }

  // Creates a cluster and begins preparing it to begin serving. The returned
  // cluster embeds as its "current_operation" a long-running operation which
  // can be used to track the progress of turning up the new cluster.
  // Immediately upon completion of this request:
  //  * The cluster will be readable via the API, with all requested attributes
  //    but no allocated resources.
  // Until completion of the embedded operation:
  //  * Cancelling the operation will render the cluster immediately unreadable
  //    via the API.
  //  * All other attempts to modify or delete the cluster will be rejected.
  // Upon completion of the embedded operation:
  //  * Billing for all successfully-allocated resources will begin (some types
  //    may have lower than the requested levels).
  //  * New tables can be created in the cluster.
  //  * The cluster's allocated resource levels will be readable via the API.
  // The embedded operation's "metadata" field type is
  // [CreateClusterMetadata][google.bigtable.admin.cluster.v1.CreateClusterMetadata] The embedded operation's "response" field type is
  // [Cluster][google.bigtable.admin.cluster.v1.Cluster], if successful.
  rpc CreateCluster(CreateClusterRequest) returns (Cluster) {
  }

  // Updates a cluster, and begins allocating or releasing resources as
  // requested. The returned cluster embeds as its "current_operation" a
  // long-running operation which can be used to track the progress of updating
  // the cluster.
  // Immediately upon completion of this request:
  //  * For resource types where a decrease in the cluster's allocation has been
  //    requested, billing will be based on the newly-requested level.
  // Until completion of the embedded operation:
  //  * Cancelling the operation will set its metadata's "cancelled_at_time",
  //    and begin restoring resources to their pre-request values. The operation
  //    is guaranteed to succeed at undoing all resource changes, after which
  //    point it will terminate with a CANCELLED status.
  //  * All other attempts to modify or delete the cluster will be rejected.
  //  * Reading the cluster via the API will continue to give the pre-request
  //    resource levels.
  // Upon completion of the embedded operation:
  //  * Billing will begin for all successfully-allocated resources (some types
  //    may have lower than the requested levels).
  //  * All newly-reserved resources will be available for serving the cluster's
  //    tables.
  //  * The cluster's new resource levels will be readable via the API.
  // [UpdateClusterMetadata][google.bigtable.admin.cluster.v1.UpdateClusterMetadata] The embedded operation's "response" field type is
  // [Cluster][google.bigtable.admin.cluster.v1.Cluster], if successful.
  rpc UpdateCluster(Cluster) returns (Cluster) {
  }

  // Marks a cluster and all of its tables for permanent deletion in 7 days.
  // Immediately upon completion of the request:
  //  * Billing will cease for all of the cluster's reserved resources.
  //  * The cluster's "delete_time" field will be set 7 days in the future.
  // Soon afterward:
  //  * All tables within the cluster will become unavailable.
  // Prior to the cluster's "delete_time":
  //  * The cluster can be recovered with a call to UndeleteCluster.
  //  * All other attempts to modify or delete the cluster will be rejected.
  // At the cluster's "delete_time":
  //  * The cluster and *all of its tables* will immediately and irrevocably
  //    disappear from the API, and their data will be permanently deleted.
  rpc DeleteCluster(DeleteClusterRequest) returns (google.protobuf.Empty) {
  }

  // Cancels the scheduled deletion of an cluster and begins preparing it to
  // resume serving. The returned operation will also be embedded as the
  // cluster's "current_operation".
  // Immediately upon completion of this request:
  //  * The cluster's "delete_time" field will be unset, protecting it from
  //    automatic deletion.
  // Until completion of the returned operation:
  //  * The operation cannot be cancelled.
  // Upon completion of the returned operation:
  //  * Billing for the cluster's resources will resume.
  //  * All tables within the cluster will be available.
  // [UndeleteClusterMetadata][google.bigtable.admin.cluster.v1.UndeleteClusterMetadata] The embedded operation's "response" field type is
  // [Cluster][google.bigtable.admin.cluster.v1.Cluster], if successful.
}
