// Copyright 2016 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.v2;

import "google/api/annotations.proto";
import "google/bigtable/admin/v2/common.proto";

option go_package = "google.golang.org/genproto/googleapis/bigtable/admin/v2;admin";
option java_multiple_files = true;
option java_outer_classname = "InstanceProto";
option java_package = "com.google.bigtable.admin.v2";


// A collection of Bigtable [Tables][google.bigtable.admin.v2.Table] and
// the resources that serve them.
// All tables in an instance are served from a single
// [Cluster][google.bigtable.admin.v2.Cluster].
message Instance {
  // Possible states of an instance.
  enum State {
    // The state of the instance could not be determined.
    STATE_NOT_KNOWN = 0;

    // The instance has been successfully created and can serve requests
    // to its tables.
    READY = 1;

    // The instance is currently being created, and may be destroyed
    // if the creation process encounters an error.
    CREATING = 2;
  }

  // The type of the instance.
  enum Type {
    // The type of the instance is unspecified. If set when creating an
    // instance, a `PRODUCTION` instance will be created. If set when updating
    // an instance, the type will be left unchanged.
    TYPE_UNSPECIFIED = 0;

    // An instance meant for production use. `serve_nodes` must be set
    // on the cluster.
    PRODUCTION = 1;
  }

  // (`OutputOnly`)
  // The unique name of the instance. Values are of the form
  // `projects/<project>/instances/[a-z][a-z0-9\\-]+[a-z0-9]`.
  string name = 1;

  // The descriptive name for this instance as it appears in UIs.
  // Can be changed at any time, but should be kept globally unique
  // to avoid confusion.
  string display_name = 2;

  // (`OutputOnly`)
  // The current state of the instance.
  State state = 3;

  // The type of the instance. Defaults to `PRODUCTION`.
  Type type = 4;
}

// A resizable group of nodes in a particular cloud location, capable
// of serving all [Tables][google.bigtable.admin.v2.Table] in the parent
// [Instance][google.bigtable.admin.v2.Instance].
message Cluster {
  // Possible states of a cluster.
  enum State {
    // The state of the cluster could not be determined.
    STATE_NOT_KNOWN = 0;

    // The cluster has been successfully created and is ready to serve requests.
    READY = 1;

    // The cluster is currently being created, and may be destroyed
    // if the creation process encounters an error.
    // A cluster may not be able to serve requests while being created.
    CREATING = 2;

    // The cluster is currently being resized, and may revert to its previous
    // node count if the process encounters an error.
    // A cluster is still capable of serving requests while being resized,
    // but may exhibit performance as if its number of allocated nodes is
    // between the starting and requested states.
    RESIZING = 3;

    // The cluster has no backing nodes. The data (tables) still
    // exist, but no operations can be performed on the cluster.
    DISABLED = 4;
  }

  // (`OutputOnly`)
  // The unique name of the cluster. Values are of the form
  // `projects/<project>/instances/<instance>/clusters/[a-z][-a-z0-9]*`.
  string name = 1;

  // (`CreationOnly`)
  // The location where this cluster's nodes and storage reside. For best
  // performance, clients should be located as close as possible to this cluster.
  // Currently only zones are supported, so values should be of the form
  // `projects/<project>/locations/<zone>`.
  string location = 2;

  // (`OutputOnly`)
  // The current state of the cluster.
  State state = 3;

  // The number of nodes allocated to this cluster. More nodes enable higher
  // throughput and more consistent performance.
  int32 serve_nodes = 4;

  // (`CreationOnly`)
  // The type of storage used by this cluster to serve its
  // parent instance's tables, unless explicitly overridden.
  StorageType default_storage_type = 5;
}
