// Copyright 2021 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.bigtable.admin.v2; import "google/api/field_behavior.proto"; import "google/api/resource.proto"; import "google/bigtable/admin/v2/common.proto"; option csharp_namespace = "Google.Cloud.Bigtable.Admin.V2"; 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"; option php_namespace = "Google\\Cloud\\Bigtable\\Admin\\V2"; option ruby_package = "Google::Cloud::Bigtable::Admin::V2"; option (google.api.resource_definition) = { type: "cloudkms.googleapis.com/CryptoKey" pattern: "projects/{project}/locations/{location}/keyRings/{key_ring}/cryptoKeys/{crypto_key}" }; // A collection of Bigtable [Tables][google.bigtable.admin.v2.Table] and // the resources that serve them. // All tables in an instance are served from all // [Clusters][google.bigtable.admin.v2.Cluster] in the instance. message Instance { option (google.api.resource) = { type: "bigtable.googleapis.com/Instance" pattern: "projects/{project}/instances/{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; // The instance is meant for development and testing purposes only; it has // no performance or uptime guarantees and is not covered by SLA. // After a development instance is created, it can be upgraded by // updating the instance to type `PRODUCTION`. An instance created // as a production instance cannot be changed to a development instance. // When creating a development instance, `serve_nodes` on the cluster must // not be set. DEVELOPMENT = 2; } // 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 [(google.api.field_behavior) = OUTPUT_ONLY]; // Required. 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 [(google.api.field_behavior) = REQUIRED]; // (`OutputOnly`) // The current state of the instance. State state = 3; // The type of the instance. Defaults to `PRODUCTION`. Type type = 4; // Labels are a flexible and lightweight mechanism for organizing cloud // resources into groups that reflect a customer's organizational needs and // deployment strategies. They can be used to filter resources and aggregate // metrics. // // * Label keys must be between 1 and 63 characters long and must conform to // the regular expression: `[\p{Ll}\p{Lo}][\p{Ll}\p{Lo}\p{N}_-]{0,62}`. // * Label values must be between 0 and 63 characters long and must conform to // the regular expression: `[\p{Ll}\p{Lo}\p{N}_-]{0,63}`. // * No more than 64 labels can be associated with a given resource. // * Keys and values must both be under 128 bytes. map labels = 5; } // 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 { option (google.api.resource) = { type: "bigtable.googleapis.com/Cluster" pattern: "projects/{project}/instances/{instance}/clusters/{cluster}" }; // Cloud Key Management Service (Cloud KMS) settings for a CMEK-protected // cluster. message EncryptionConfig { // Describes the Cloud KMS encryption key that will be used to protect the // destination Bigtable cluster. The requirements for this key are: // 1) The Cloud Bigtable service account associated with the project that // contains this cluster must be granted the // `cloudkms.cryptoKeyEncrypterDecrypter` role on the CMEK key. // 2) Only regional keys can be used and the region of the CMEK key must // match the region of the cluster. // 3) All clusters within an instance must use the same CMEK key. string kms_key_name = 1 [(google.api.resource_reference) = { type: "cloudkms.googleapis.com/CryptoKey" }]; } // 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; } // The unique name of the cluster. Values are of the form // `projects/{project}/instances/{instance}/clusters/[a-z][-a-z0-9]*`. string name = 1 [(google.api.field_behavior) = OUTPUT_ONLY]; // (`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 [(google.api.resource_reference) = { type: "locations.googleapis.com/Location" }]; // The current state of the cluster. State state = 3 [(google.api.field_behavior) = OUTPUT_ONLY]; // Required. The number of nodes allocated to this cluster. More nodes enable // higher throughput and more consistent performance. int32 serve_nodes = 4 [(google.api.field_behavior) = REQUIRED]; // (`CreationOnly`) // The type of storage used by this cluster to serve its // parent instance's tables, unless explicitly overridden. StorageType default_storage_type = 5; // Immutable. The encryption configuration for CMEK-protected clusters. EncryptionConfig encryption_config = 6 [(google.api.field_behavior) = IMMUTABLE]; } // A configuration object describing how Cloud Bigtable should treat traffic // from a particular end user application. message AppProfile { option (google.api.resource) = { type: "bigtable.googleapis.com/AppProfile" pattern: "projects/{project}/instances/{instance}/appProfiles/{app_profile}" }; // Read/write requests are routed to the nearest cluster in the instance, and // will fail over to the nearest cluster that is available in the event of // transient errors or delays. Clusters in a region are considered // equidistant. Choosing this option sacrifices read-your-writes consistency // to improve availability. message MultiClusterRoutingUseAny { // The set of clusters to route to. The order is ignored; clusters will be // tried in order of distance. If left empty, all clusters are eligible. repeated string cluster_ids = 1; } // Unconditionally routes all read/write requests to a specific cluster. // This option preserves read-your-writes consistency but does not improve // availability. message SingleClusterRouting { // The cluster to which read/write requests should be routed. string cluster_id = 1; // Whether or not `CheckAndMutateRow` and `ReadModifyWriteRow` requests are // allowed by this app profile. It is unsafe to send these requests to // the same table/row/column in multiple clusters. bool allow_transactional_writes = 2; } // (`OutputOnly`) // The unique name of the app profile. Values are of the form // `projects/{project}/instances/{instance}/appProfiles/[_a-zA-Z0-9][-_.a-zA-Z0-9]*`. string name = 1; // Strongly validated etag for optimistic concurrency control. Preserve the // value returned from `GetAppProfile` when calling `UpdateAppProfile` to // fail the request if there has been a modification in the mean time. The // `update_mask` of the request need not include `etag` for this protection // to apply. // See [Wikipedia](https://en.wikipedia.org/wiki/HTTP_ETag) and // [RFC 7232](https://tools.ietf.org/html/rfc7232#section-2.3) for more // details. string etag = 2; // Optional long form description of the use case for this AppProfile. string description = 3; // The routing policy for all read/write requests that use this app profile. // A value must be explicitly set. oneof routing_policy { // Use a multi-cluster routing policy. MultiClusterRoutingUseAny multi_cluster_routing_use_any = 5; // Use a single-cluster routing policy. SingleClusterRouting single_cluster_routing = 6; } }