google-cloud-bigtable 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +10 -0
- data/LICENSE +201 -0
- data/README.md +65 -0
- data/lib/google/bigtable/admin/v2/bigtable_instance_admin_pb.rb +139 -0
- data/lib/google/bigtable/admin/v2/bigtable_instance_admin_services_pb.rb +85 -0
- data/lib/google/bigtable/admin/v2/bigtable_table_admin_pb.rb +137 -0
- data/lib/google/bigtable/admin/v2/bigtable_table_admin_services_pb.rb +117 -0
- data/lib/google/bigtable/admin/v2/common_pb.rb +24 -0
- data/lib/google/bigtable/admin/v2/instance_pb.rb +72 -0
- data/lib/google/bigtable/admin/v2/table_pb.rb +88 -0
- data/lib/google/bigtable/v2/bigtable_pb.rb +109 -0
- data/lib/google/bigtable/v2/bigtable_services_pb.rb +67 -0
- data/lib/google/bigtable/v2/data_pb.rb +155 -0
- data/lib/google/cloud/bigtable/admin/credentials.rb +26 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_instance_admin_client.rb +1417 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_instance_admin_client_config.json +123 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_table_admin_client.rb +1079 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_table_admin_client_config.json +109 -0
- data/lib/google/cloud/bigtable/admin/v2/credentials.rb +50 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/bigtable_instance_admin.rb +279 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/bigtable_table_admin.rb +353 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/instance.rb +194 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/table.rb +209 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/iam_policy.rb +62 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/policy.rb +127 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/longrunning/operations.rb +92 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/any.rb +124 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/duration.rb +90 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/empty.rb +28 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/field_mask.rb +223 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/timestamp.rb +106 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/rpc/status.rb +83 -0
- data/lib/google/cloud/bigtable/admin/v2.rb +200 -0
- data/lib/google/cloud/bigtable/admin.rb +196 -0
- data/lib/google/cloud/bigtable/app_profile/job.rb +102 -0
- data/lib/google/cloud/bigtable/app_profile/list.rb +159 -0
- data/lib/google/cloud/bigtable/app_profile.rb +373 -0
- data/lib/google/cloud/bigtable/chunk_processor.rb +253 -0
- data/lib/google/cloud/bigtable/cluster/job.rb +92 -0
- data/lib/google/cloud/bigtable/cluster/list.rb +169 -0
- data/lib/google/cloud/bigtable/cluster.rb +264 -0
- data/lib/google/cloud/bigtable/column_family.rb +280 -0
- data/lib/google/cloud/bigtable/column_range.rb +186 -0
- data/lib/google/cloud/bigtable/convert.rb +75 -0
- data/lib/google/cloud/bigtable/credentials.rb +24 -0
- data/lib/google/cloud/bigtable/errors.rb +35 -0
- data/lib/google/cloud/bigtable/gc_rule.rb +215 -0
- data/lib/google/cloud/bigtable/instance/cluster_map.rb +70 -0
- data/lib/google/cloud/bigtable/instance/job.rb +97 -0
- data/lib/google/cloud/bigtable/instance/list.rb +159 -0
- data/lib/google/cloud/bigtable/instance.rb +921 -0
- data/lib/google/cloud/bigtable/longrunning_job.rb +105 -0
- data/lib/google/cloud/bigtable/mutation_entry.rb +244 -0
- data/lib/google/cloud/bigtable/mutation_operations.rb +338 -0
- data/lib/google/cloud/bigtable/policy.rb +163 -0
- data/lib/google/cloud/bigtable/project.rb +580 -0
- data/lib/google/cloud/bigtable/read_modify_write_rule.rb +129 -0
- data/lib/google/cloud/bigtable/read_operations.rb +345 -0
- data/lib/google/cloud/bigtable/row.rb +125 -0
- data/lib/google/cloud/bigtable/row_filter/chain_filter.rb +539 -0
- data/lib/google/cloud/bigtable/row_filter/condition_filter.rb +108 -0
- data/lib/google/cloud/bigtable/row_filter/interleave_filter.rb +570 -0
- data/lib/google/cloud/bigtable/row_filter/simple_filter.rb +273 -0
- data/lib/google/cloud/bigtable/row_filter.rb +593 -0
- data/lib/google/cloud/bigtable/row_range.rb +174 -0
- data/lib/google/cloud/bigtable/rows_mutator.rb +120 -0
- data/lib/google/cloud/bigtable/rows_reader.rb +196 -0
- data/lib/google/cloud/bigtable/sample_row_key.rb +82 -0
- data/lib/google/cloud/bigtable/service.rb +817 -0
- data/lib/google/cloud/bigtable/table/cluster_state.rb +93 -0
- data/lib/google/cloud/bigtable/table/column_family_map.rb +68 -0
- data/lib/google/cloud/bigtable/table/list.rb +147 -0
- data/lib/google/cloud/bigtable/table.rb +676 -0
- data/lib/google/cloud/bigtable/v2/bigtable_client.rb +579 -0
- data/lib/google/cloud/bigtable/v2/bigtable_client_config.json +65 -0
- data/lib/google/cloud/bigtable/v2/credentials.rb +45 -0
- data/lib/google/cloud/bigtable/v2/doc/google/bigtable/v2/bigtable.rb +286 -0
- data/lib/google/cloud/bigtable/v2/doc/google/bigtable/v2/data.rb +492 -0
- data/lib/google/cloud/bigtable/v2/doc/google/protobuf/any.rb +124 -0
- data/lib/google/cloud/bigtable/v2/doc/google/protobuf/wrappers.rb +89 -0
- data/lib/google/cloud/bigtable/v2/doc/google/rpc/status.rb +83 -0
- data/lib/google/cloud/bigtable/v2.rb +132 -0
- data/lib/google/cloud/bigtable/value_range.rb +175 -0
- data/lib/google/cloud/bigtable/version.rb +22 -0
- data/lib/google/cloud/bigtable.rb +223 -0
- data/lib/google-cloud-bigtable.rb +167 -0
- metadata +283 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
# Copyright 2018 Google LLC
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
module Google
|
|
17
|
+
module Cloud
|
|
18
|
+
module Bigtable
|
|
19
|
+
# # Policy
|
|
20
|
+
#
|
|
21
|
+
# Represents a Cloud IAM Policy for the Bigtable instance resources.
|
|
22
|
+
#
|
|
23
|
+
# A common pattern for updating a resource's metadata, such as its Policy,
|
|
24
|
+
# is to read the current data from the service, update the data locally,
|
|
25
|
+
# and then send the modified data for writing. This pattern may result in
|
|
26
|
+
# a conflict if two or more processes attempt the sequence simultaneously.
|
|
27
|
+
# IAM solves this problem with the {Google::Cloud::Bigtable::Policy#etag}
|
|
28
|
+
# property, which is used to verify whether the policy has changed since
|
|
29
|
+
# the last request. When you make a request to with an `etag` value, Cloud
|
|
30
|
+
# IAM compares the `etag` value in the request with the existing `etag`
|
|
31
|
+
# value associated with the policy. It writes the policy only if the
|
|
32
|
+
# `etag` values match.
|
|
33
|
+
#
|
|
34
|
+
# @see https://cloud.google.com/bigtable/docs/access-control Permissions and roles
|
|
35
|
+
#
|
|
36
|
+
# @attr [String] etag Used to verify whether the policy has changed since
|
|
37
|
+
# the last request. The policy will be written only if the `etag` values
|
|
38
|
+
# match.
|
|
39
|
+
# @attr [Hash{String => Array<String>}] roles The bindings that associate
|
|
40
|
+
# roles with an array of members. See [Understanding
|
|
41
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
|
42
|
+
# listing of primitive and curated roles.
|
|
43
|
+
#
|
|
44
|
+
# @example
|
|
45
|
+
# require "google/cloud/bigtable"
|
|
46
|
+
#
|
|
47
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
48
|
+
# instance = bigtable.instance "my-instance"
|
|
49
|
+
#
|
|
50
|
+
# policy = instance.policy
|
|
51
|
+
# policy.remove("roles/owner", "user:owner@example.com")
|
|
52
|
+
# policy.add("roles/owner", "user:newowner@example.com")
|
|
53
|
+
# policy.roles["roles/viewer"] = ["allUsers"]
|
|
54
|
+
#
|
|
55
|
+
class Policy
|
|
56
|
+
attr_reader :etag, :roles
|
|
57
|
+
|
|
58
|
+
# Creates a Policy instance.
|
|
59
|
+
# @param etag [String]
|
|
60
|
+
# @param roles [Array<String>]
|
|
61
|
+
def initialize etag, roles = nil
|
|
62
|
+
@etag = etag
|
|
63
|
+
@roles = roles
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Convenience method for adding a member to a binding on this policy.
|
|
67
|
+
# See [Understanding
|
|
68
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
|
69
|
+
# listing of primitive and curated roles. See
|
|
70
|
+
# [Binding](https://cloud.google.com/bigtable/docs/access-control)
|
|
71
|
+
# for a listing of values and patterns for members.
|
|
72
|
+
#
|
|
73
|
+
# @param [String] role_name A Cloud IAM role, such as
|
|
74
|
+
# `"roles/bigtable.admin"`.
|
|
75
|
+
# @param [String] member A Cloud IAM identity, such as
|
|
76
|
+
# `"user:owner@example.com"`.
|
|
77
|
+
#
|
|
78
|
+
# @example
|
|
79
|
+
# require "google/cloud/bigtable"
|
|
80
|
+
#
|
|
81
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
82
|
+
# instance = bigtable.instance "my-instance"
|
|
83
|
+
#
|
|
84
|
+
# policy = instance.policy
|
|
85
|
+
# policy.add("roles/owner", "user:newowner@example.com")
|
|
86
|
+
#
|
|
87
|
+
def add role_name, member
|
|
88
|
+
role(role_name) << member
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Convenience method for removing a member from a binding on this
|
|
92
|
+
# policy. See [Understanding
|
|
93
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
|
94
|
+
# listing of primitive and curated roles.See
|
|
95
|
+
# [Binding](https://cloud.google.com/bigtable/docs/access-control)
|
|
96
|
+
# for a listing of values and patterns for members.
|
|
97
|
+
#
|
|
98
|
+
# @param [String] role_name A Cloud IAM role, such as
|
|
99
|
+
# `"roles/Bigtable.admin"`.
|
|
100
|
+
# @param [String] member A Cloud IAM identity, such as
|
|
101
|
+
# `"user:owner@example.com"`.
|
|
102
|
+
#
|
|
103
|
+
# @example
|
|
104
|
+
# require "google/cloud/Bigtable"
|
|
105
|
+
#
|
|
106
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
107
|
+
# instance = bigtable.instance "my-instance"
|
|
108
|
+
#
|
|
109
|
+
# policy = instance.policy
|
|
110
|
+
# policy.remove("roles/owner", "user:newowner@example.com")
|
|
111
|
+
#
|
|
112
|
+
def remove role_name, member
|
|
113
|
+
role(role_name).delete member
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# Convenience method returning the array of members bound to a role in
|
|
117
|
+
# this policy, or an empty array if no value is present for the role in
|
|
118
|
+
# {#roles}. See [Understanding
|
|
119
|
+
# Roles](https://cloud.google.com/iam/docs/understanding-roles) for a
|
|
120
|
+
# listing of primitive and curated roles. See
|
|
121
|
+
# [Binding](https://cloud.google.com/bigtable/docs/access-control)
|
|
122
|
+
# for a listing of values and patterns for members.
|
|
123
|
+
#
|
|
124
|
+
# @return [Array<String>] The members strings, or an empty array.
|
|
125
|
+
#
|
|
126
|
+
# @example
|
|
127
|
+
# require "google/cloud/Bigtable"
|
|
128
|
+
#
|
|
129
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
130
|
+
# instance = bigtable.instance "my-instance"
|
|
131
|
+
#
|
|
132
|
+
# policy = instance.policy
|
|
133
|
+
# policy.role("roles/viewer") << "user:viewer@example.com"
|
|
134
|
+
#
|
|
135
|
+
def role role_name
|
|
136
|
+
roles[role_name] ||= []
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# @private
|
|
140
|
+
# Convert the Policy to a Google::Iam::V1::Policy object.
|
|
141
|
+
def to_grpc
|
|
142
|
+
bindings = roles.keys.map do |role_name|
|
|
143
|
+
next if roles[role_name].empty?
|
|
144
|
+
Google::Iam::V1::Binding.new(
|
|
145
|
+
role: role_name,
|
|
146
|
+
members: roles[role_name]
|
|
147
|
+
)
|
|
148
|
+
end
|
|
149
|
+
Google::Iam::V1::Policy.new(etag: etag, bindings: bindings)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# @private
|
|
153
|
+
# New Policy from a Google::Iam::V1::Policy object.
|
|
154
|
+
def self.from_grpc grpc
|
|
155
|
+
roles = grpc.bindings.each_with_object({}) do |binding, memo|
|
|
156
|
+
memo[binding.role] = binding.members.to_a
|
|
157
|
+
end
|
|
158
|
+
new(grpc.etag, roles)
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
end
|
|
@@ -0,0 +1,580 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Copyright 2018 Google LLC
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
require "google/cloud/bigtable/errors"
|
|
19
|
+
require "google/cloud/bigtable/longrunning_job"
|
|
20
|
+
require "google/cloud/bigtable/convert"
|
|
21
|
+
require "google/cloud/bigtable/service"
|
|
22
|
+
require "google/cloud/bigtable/instance"
|
|
23
|
+
require "google/cloud/bigtable/cluster"
|
|
24
|
+
require "google/cloud/bigtable/table"
|
|
25
|
+
|
|
26
|
+
module Google
|
|
27
|
+
module Cloud
|
|
28
|
+
module Bigtable
|
|
29
|
+
# # Project
|
|
30
|
+
#
|
|
31
|
+
# Projects are top-level containers in Google Cloud Platform. They store
|
|
32
|
+
# information about billing and authorized users, and they contain
|
|
33
|
+
# Cloud Bigtable data. Each project has a friendly name and a unique ID.
|
|
34
|
+
#
|
|
35
|
+
# Google::Cloud::Bigtable::Project is the main object for interacting with
|
|
36
|
+
# Cloud Bigtable.
|
|
37
|
+
#
|
|
38
|
+
# {Google::Cloud::Bigtable::Cluster}, {Google::Cloud::Bigtable::Instance}
|
|
39
|
+
# objects are created, accessed, and managed by Google::Cloud::Bigtable::Project.
|
|
40
|
+
#
|
|
41
|
+
# See {Google::Cloud::Bigtable.new} and {Google::Cloud#bigtable}.
|
|
42
|
+
#
|
|
43
|
+
# @example Obtaining an instance and the clusters from a project.
|
|
44
|
+
# require "google/cloud"
|
|
45
|
+
#
|
|
46
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
47
|
+
#
|
|
48
|
+
# instance = bigtable.instance("my-instance")
|
|
49
|
+
# clusters = bigtable.clusters # All clusters in the project
|
|
50
|
+
#
|
|
51
|
+
class Project
|
|
52
|
+
# @private
|
|
53
|
+
# The Service object
|
|
54
|
+
attr_accessor :service
|
|
55
|
+
|
|
56
|
+
# @private
|
|
57
|
+
# Creates a new Bigtable Project instance.
|
|
58
|
+
# @param service [Google::Cloud::Bigtable::Service]
|
|
59
|
+
|
|
60
|
+
def initialize service
|
|
61
|
+
@service = service
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# The identifier for the Cloud Bigtable project.
|
|
65
|
+
#
|
|
66
|
+
# @return [String] Project id.
|
|
67
|
+
#
|
|
68
|
+
# @example
|
|
69
|
+
# require "google/cloud"
|
|
70
|
+
#
|
|
71
|
+
# bigtable = Google::Cloud::Bigtable.new(
|
|
72
|
+
# project_id: "my-project",
|
|
73
|
+
# credentials: "/path/to/keyfile.json"
|
|
74
|
+
# )
|
|
75
|
+
#
|
|
76
|
+
# bigtable.project_id #=> "my-project"
|
|
77
|
+
|
|
78
|
+
def project_id
|
|
79
|
+
ensure_service!
|
|
80
|
+
service.project_id
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Retrieves the list of Bigtable instances for the project.
|
|
84
|
+
#
|
|
85
|
+
# @param token [String] The `token` value returned by the last call to
|
|
86
|
+
# `instances`; indicates that this is a continuation of a call,
|
|
87
|
+
# and that the system should return the next page of data.
|
|
88
|
+
# @return [Array<Google::Cloud::Bigtable::Instance>] The list of instances.
|
|
89
|
+
# (See {Google::Cloud::Bigtable::Instance::List})
|
|
90
|
+
#
|
|
91
|
+
# @example
|
|
92
|
+
# require "google/cloud/bigtable"
|
|
93
|
+
#
|
|
94
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
95
|
+
#
|
|
96
|
+
# instances = bigtable.instances
|
|
97
|
+
# instances.all do |instance|
|
|
98
|
+
# puts instance.instance_id
|
|
99
|
+
# end
|
|
100
|
+
|
|
101
|
+
def instances token: nil
|
|
102
|
+
ensure_service!
|
|
103
|
+
grpc = service.list_instances(token: token)
|
|
104
|
+
Instance::List.from_grpc(grpc, service)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# Get existing Bigtable instance.
|
|
108
|
+
#
|
|
109
|
+
# @param instance_id [String] Existing instance id.
|
|
110
|
+
# @return [Google::Cloud::Bigtable::Instance, nil]
|
|
111
|
+
#
|
|
112
|
+
# @example
|
|
113
|
+
# require "google/cloud/bigtable"
|
|
114
|
+
#
|
|
115
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
116
|
+
#
|
|
117
|
+
# instance = bigtable.instance("my-instance")
|
|
118
|
+
#
|
|
119
|
+
# if instance
|
|
120
|
+
# puts instance.instance_id
|
|
121
|
+
# end
|
|
122
|
+
|
|
123
|
+
def instance instance_id
|
|
124
|
+
ensure_service!
|
|
125
|
+
grpc = service.get_instance(instance_id)
|
|
126
|
+
Instance.from_grpc(grpc, service)
|
|
127
|
+
rescue Google::Cloud::NotFoundError
|
|
128
|
+
nil
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Create a Bigtable instance.
|
|
132
|
+
#
|
|
133
|
+
# @see https://cloud.google.com/compute/docs/regions-zones for cluster zone locations
|
|
134
|
+
#
|
|
135
|
+
# @param instance_id [String] The unique identifier for the instance,
|
|
136
|
+
# which cannot be changed after the instance is created. Values are of
|
|
137
|
+
# the form `[a-z][-a-z0-9]*[a-z0-9]` and must be between 6 and 30
|
|
138
|
+
# characters in length. Required.
|
|
139
|
+
# @param display_name [String] The descriptive name for this instance as it
|
|
140
|
+
# appears in UIs. Must be unique per project and between 4 and 30
|
|
141
|
+
# characters in length.
|
|
142
|
+
# @param type [Symbol] The type of the instance.
|
|
143
|
+
# Valid values are `:DEVELOPMENT` or `:PRODUCTION`.
|
|
144
|
+
# Default `:PRODUCTION` instance will created if left blank.
|
|
145
|
+
# @param labels [Hash{String=>String}] labels Cloud Labels are a flexible and lightweight
|
|
146
|
+
# mechanism for organizing cloud resources into groups that reflect a
|
|
147
|
+
# customer's organizational needs and deployment strategies. Cloud
|
|
148
|
+
# Labels can be used to filter collections of resources. They can be
|
|
149
|
+
# used to control how resource metrics are aggregated. And they can be
|
|
150
|
+
# used as arguments to policy management rules (e.g. route, firewall,
|
|
151
|
+
# load balancing, etc.).
|
|
152
|
+
#
|
|
153
|
+
# * Label keys must be between 1 and 63 characters long and must
|
|
154
|
+
# conform to the following regular expression:
|
|
155
|
+
# `[a-z]([-a-z0-9]*[a-z0-9])?`.
|
|
156
|
+
# * Label values must be between 0 and 63 characters long and must
|
|
157
|
+
# conform to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
|
|
158
|
+
# * No more than 64 labels can be associated with a given resource.
|
|
159
|
+
# @param clusters [Hash{String => Google::Cloud::Bigtable::Cluster}]
|
|
160
|
+
# (See {Google::Cloud::Bigtable::Instance::ClusterMap})
|
|
161
|
+
# If passed as an empty use code block to add clusters.
|
|
162
|
+
# Minimum one cluster must be specified.
|
|
163
|
+
# @yield [clusters] A block for adding clusters.
|
|
164
|
+
# @yieldparam [Hash{String => Google::Cloud::Bigtable::Cluster}]
|
|
165
|
+
# Cluster map of cluster name and cluster object.
|
|
166
|
+
# (See {Google::Cloud::Bigtable::Instance::ClusterMap})
|
|
167
|
+
# @return [Google::Cloud::Bigtable::Instance::Job]
|
|
168
|
+
# The job representing the long-running, asynchronous processing of
|
|
169
|
+
# an instance create operation.
|
|
170
|
+
#
|
|
171
|
+
# @example Create development instance.
|
|
172
|
+
# require "google/cloud/bigtable"
|
|
173
|
+
#
|
|
174
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
175
|
+
#
|
|
176
|
+
# job = bigtable.create_instance(
|
|
177
|
+
# "my-instance",
|
|
178
|
+
# display_name: "Instance for user data",
|
|
179
|
+
# type: :DEVELOPMENT,
|
|
180
|
+
# labels: { "env" => "dev"}
|
|
181
|
+
# ) do |clusters|
|
|
182
|
+
# clusters.add("test-cluster", "us-east1-b", nodes: 1)
|
|
183
|
+
# end
|
|
184
|
+
#
|
|
185
|
+
# job.done? #=> false
|
|
186
|
+
#
|
|
187
|
+
# # Reload job until completion.
|
|
188
|
+
# job.wait_until_done
|
|
189
|
+
# job.done? #=> true
|
|
190
|
+
#
|
|
191
|
+
# if job.error?
|
|
192
|
+
# status = job.error
|
|
193
|
+
# else
|
|
194
|
+
# instance = job.instance
|
|
195
|
+
# end
|
|
196
|
+
#
|
|
197
|
+
# @example Create production instance.
|
|
198
|
+
# require "google/cloud/bigtable"
|
|
199
|
+
#
|
|
200
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
201
|
+
#
|
|
202
|
+
# job = bigtable.create_instance(
|
|
203
|
+
# "my-instance",
|
|
204
|
+
# display_name: "Instance for user data",
|
|
205
|
+
# labels: { "env" => "dev"}
|
|
206
|
+
# ) do |clusters|
|
|
207
|
+
# clusters.add("test-cluster", "us-east1-b", nodes: 3, storage_type: :SSD)
|
|
208
|
+
# end
|
|
209
|
+
#
|
|
210
|
+
# job.done? #=> false
|
|
211
|
+
#
|
|
212
|
+
# # To block until the operation completes.
|
|
213
|
+
# job.wait_until_done
|
|
214
|
+
# job.done? #=> true
|
|
215
|
+
#
|
|
216
|
+
# if job.error?
|
|
217
|
+
# status = job.error
|
|
218
|
+
# else
|
|
219
|
+
# instance = job.instance
|
|
220
|
+
# end
|
|
221
|
+
|
|
222
|
+
def create_instance \
|
|
223
|
+
instance_id,
|
|
224
|
+
display_name: nil,
|
|
225
|
+
type: nil,
|
|
226
|
+
labels: nil,
|
|
227
|
+
clusters: nil
|
|
228
|
+
labels = Hash[labels.map { |k, v| [String(k), String(v)] }] if labels
|
|
229
|
+
|
|
230
|
+
instance_attrs = {
|
|
231
|
+
display_name: display_name,
|
|
232
|
+
type: type,
|
|
233
|
+
labels: labels
|
|
234
|
+
}.delete_if { |_, v| v.nil? }
|
|
235
|
+
instance = Google::Bigtable::Admin::V2::Instance.new(instance_attrs)
|
|
236
|
+
clusters ||= Instance::ClusterMap.new
|
|
237
|
+
yield clusters if block_given?
|
|
238
|
+
|
|
239
|
+
clusters.each_value do |cluster|
|
|
240
|
+
unless cluster.location == "".freeze
|
|
241
|
+
cluster.location = service.location_path(cluster.location)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
grpc = service.create_instance(
|
|
246
|
+
instance_id,
|
|
247
|
+
instance,
|
|
248
|
+
clusters.to_h
|
|
249
|
+
)
|
|
250
|
+
Instance::Job.from_grpc(grpc, service)
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
# List all clusters in project.
|
|
254
|
+
#
|
|
255
|
+
# @param token [String] The `token` value returned by the last call to
|
|
256
|
+
# `clusters`; indicates that this is a continuation of a call,
|
|
257
|
+
# and that the system should return the next page of data.
|
|
258
|
+
# @return [Array<Google::Cloud::Bigtable::Cluster>]
|
|
259
|
+
# (See {Google::Cloud::Bigtable::Cluster::List})
|
|
260
|
+
# @example
|
|
261
|
+
# require "google/cloud/bigtable"
|
|
262
|
+
#
|
|
263
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
264
|
+
#
|
|
265
|
+
# bigtable.clusters.all do |cluster|
|
|
266
|
+
# puts cluster.cluster_id
|
|
267
|
+
# puts cluster.ready?
|
|
268
|
+
# end
|
|
269
|
+
|
|
270
|
+
def clusters token: nil
|
|
271
|
+
ensure_service!
|
|
272
|
+
grpc = service.list_clusters("-", token: token)
|
|
273
|
+
Cluster::List.from_grpc(grpc, service, instance_id: "-")
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# List all tables for given instance.
|
|
277
|
+
#
|
|
278
|
+
# @param instance_id [String] Existing instance Id.
|
|
279
|
+
# @return [Array<Google::Cloud::Bigtable::Table>]
|
|
280
|
+
# (See {Google::Cloud::Bigtable::Table::List})
|
|
281
|
+
#
|
|
282
|
+
# @example Get tables
|
|
283
|
+
# require "google/cloud/bigtable"
|
|
284
|
+
#
|
|
285
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
286
|
+
#
|
|
287
|
+
# bigtable.tables("my-instance").all do |table|
|
|
288
|
+
# puts table.name
|
|
289
|
+
# puts table.column_families
|
|
290
|
+
# end
|
|
291
|
+
|
|
292
|
+
def tables instance_id
|
|
293
|
+
ensure_service!
|
|
294
|
+
grpc = service.list_tables(instance_id)
|
|
295
|
+
Table::List.from_grpc(grpc, service)
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
# Get table information.
|
|
299
|
+
#
|
|
300
|
+
#
|
|
301
|
+
# @param instance_id [String] Existing instance Id.
|
|
302
|
+
# @param table_id [String] Existing table Id.
|
|
303
|
+
# @param view [Symbol] Optional. Table view type. Default `:SCHEMA_VIEW`
|
|
304
|
+
# Valid view types are.
|
|
305
|
+
# * `:NAME_ONLY` - Only populates `name`
|
|
306
|
+
# * `:SCHEMA_VIEW` - Only populates `name` and fields related to the table's schema
|
|
307
|
+
# * `:REPLICATION_VIEW` - Only populates `name` and fields related to the table's replication state.
|
|
308
|
+
# * `:FULL` - Populates all fields
|
|
309
|
+
# @param perform_lookup [Boolean]
|
|
310
|
+
# Get table object without verifying that the table resource exists.
|
|
311
|
+
# Calls made on this object will raise errors if the table does not exist.
|
|
312
|
+
# Default value is `false`. Optional.
|
|
313
|
+
# It helps to reduce admin apis calls.
|
|
314
|
+
# @param app_profile_id [String] The unique identifier for the app profile. Optional.
|
|
315
|
+
# It is used only in data operations.
|
|
316
|
+
# This value specifies routing for replication. If not specified, the
|
|
317
|
+
# "default" application profile will be used.
|
|
318
|
+
# @return [Google::Cloud::Bigtable::Table, nil]
|
|
319
|
+
#
|
|
320
|
+
# @example Get table with schema only view
|
|
321
|
+
# require "google/cloud/bigtable"
|
|
322
|
+
#
|
|
323
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
324
|
+
#
|
|
325
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true, view: :SCHEMA_VIEW)
|
|
326
|
+
# if table
|
|
327
|
+
# p table.name
|
|
328
|
+
# p table.column_families
|
|
329
|
+
# end
|
|
330
|
+
#
|
|
331
|
+
# @example Get table object without calling get table admin api.
|
|
332
|
+
# require "google/cloud/bigtable"
|
|
333
|
+
#
|
|
334
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
335
|
+
#
|
|
336
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
337
|
+
#
|
|
338
|
+
# @example Get table with all fields. Clusters states, column families
|
|
339
|
+
# require "google/cloud/bigtable"
|
|
340
|
+
#
|
|
341
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
342
|
+
#
|
|
343
|
+
# table = bigtable.table("my-instance", "my-table", view: :FULL, perform_lookup: true)
|
|
344
|
+
# iftruee
|
|
345
|
+
# puts table.name
|
|
346
|
+
# p table.column_families
|
|
347
|
+
# p table.cluster_states
|
|
348
|
+
# end
|
|
349
|
+
#
|
|
350
|
+
# @example Mutate rows
|
|
351
|
+
# require "google/cloud/bigtable"
|
|
352
|
+
#
|
|
353
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
354
|
+
#
|
|
355
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
356
|
+
#
|
|
357
|
+
# entry = table.new_mutation_entry("user-1")
|
|
358
|
+
# entry.set_cell(
|
|
359
|
+
# "cf-1",
|
|
360
|
+
# "field-1",
|
|
361
|
+
# "XYZ"
|
|
362
|
+
# timestamp: Time.now.to_i * 1000 # Time stamp in milli seconds.
|
|
363
|
+
# ).delete_from_column("cf2", "field02")
|
|
364
|
+
#
|
|
365
|
+
# table.mutate_row(entry)
|
|
366
|
+
# @example Read rows using app profile routing
|
|
367
|
+
# require "google/cloud/bigtable"
|
|
368
|
+
#
|
|
369
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
370
|
+
#
|
|
371
|
+
# table = bigtable.table("my-instance", "my-table", app_profile_id: "my-app-profile")
|
|
372
|
+
#
|
|
373
|
+
# table.read_rows(limit: 5).each do |row|
|
|
374
|
+
# row
|
|
375
|
+
# end
|
|
376
|
+
|
|
377
|
+
def table \
|
|
378
|
+
instance_id,
|
|
379
|
+
table_id,
|
|
380
|
+
view: nil,
|
|
381
|
+
perform_lookup: nil,
|
|
382
|
+
app_profile_id: nil
|
|
383
|
+
ensure_service!
|
|
384
|
+
|
|
385
|
+
table = if perform_lookup
|
|
386
|
+
grpc = service.get_table(instance_id, table_id, view: view)
|
|
387
|
+
Table.from_grpc(grpc, service, view: view)
|
|
388
|
+
else
|
|
389
|
+
Table.from_path(
|
|
390
|
+
service.table_path(instance_id, table_id),
|
|
391
|
+
service
|
|
392
|
+
)
|
|
393
|
+
end
|
|
394
|
+
|
|
395
|
+
table.app_profile_id = app_profile_id
|
|
396
|
+
table
|
|
397
|
+
rescue Google::Cloud::NotFoundError
|
|
398
|
+
nil
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
# Creates a new table in the specified instance.
|
|
402
|
+
# The table can be created with a full set of initial column families,
|
|
403
|
+
# specified in the request.
|
|
404
|
+
#
|
|
405
|
+
# @param instance_id [String]
|
|
406
|
+
# The unique Id of the instance in which to create the table.
|
|
407
|
+
# @param table_id [String]
|
|
408
|
+
# The name by which the new table should be referred to within the parent
|
|
409
|
+
# instance, e.g., +foobar+
|
|
410
|
+
# @param column_families [Hash{String => Google::Cloud::Bigtable::ColumnFamily}]
|
|
411
|
+
# (See {Google::Cloud::Bigtable::Table::ColumnFamilyMap})
|
|
412
|
+
# If passed as an empty use code block to add column families.
|
|
413
|
+
# @param granularity [Symbol]
|
|
414
|
+
# The granularity at which timestamps are stored in this table.
|
|
415
|
+
# Timestamps not matching the granularity will be rejected.
|
|
416
|
+
# Valid values are `:MILLIS`.
|
|
417
|
+
# If unspecified, the value will be set to `:MILLIS`
|
|
418
|
+
# @param initial_splits [Array<String>]
|
|
419
|
+
# The optional list of row keys that will be used to initially split the
|
|
420
|
+
# table into several tablets (tablets are similar to HBase regions).
|
|
421
|
+
# Given two split keys, +s1+ and +s2+, three tablets will be created,
|
|
422
|
+
# spanning the key ranges: +[, s1), [s1, s2), [s2, )+.
|
|
423
|
+
#
|
|
424
|
+
# Example:
|
|
425
|
+
#
|
|
426
|
+
# * Row keys := ["a", "apple", "custom", "customer_1", "customer_2",+
|
|
427
|
+
# +"other", "zz"]
|
|
428
|
+
# * initial_split_keys := +["apple", "customer_1", "customer_2", "other"]+
|
|
429
|
+
# * Key assignment:
|
|
430
|
+
# * Tablet 1 : +[, apple) => {"a"}.+
|
|
431
|
+
# * Tablet 2 : +[apple, customer_1) => {"apple", "custom"}.+
|
|
432
|
+
# * Tablet 3 : +[customer_1, customer_2) => {"customer_1"}.+
|
|
433
|
+
# * Tablet 4 : +[customer_2, other) => {"customer_2"}.+
|
|
434
|
+
# * Tablet 5 : +[other, ) => {"other", "zz"}.+
|
|
435
|
+
# A hash of the same form as `Google::Bigtable::Admin::V2::CreateTableRequest::Split`
|
|
436
|
+
# can also be provided.
|
|
437
|
+
# @yield [column_families] A block for adding column_families.
|
|
438
|
+
# @yieldparam [Hash{String => Google::Cloud::Bigtable::ColumnFamily}]
|
|
439
|
+
# Map of family name and column family object.
|
|
440
|
+
# (See {Google::Cloud::Bigtable::Instance::ColumnFamilyMap})
|
|
441
|
+
# GC Rules for column family see {Google::Cloud::Bigtable::GcRule})
|
|
442
|
+
#
|
|
443
|
+
# @return [Google::Cloud::Bigtable::Table]
|
|
444
|
+
#
|
|
445
|
+
# @example Create table without column family
|
|
446
|
+
# require "google/cloud/bigtable"
|
|
447
|
+
#
|
|
448
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
449
|
+
#
|
|
450
|
+
# table = bigtable.create_table("my-instance", "my-table")
|
|
451
|
+
# puts table.name
|
|
452
|
+
#
|
|
453
|
+
# @example Create table with column families and initial splits.
|
|
454
|
+
# require "google/cloud/bigtable"
|
|
455
|
+
#
|
|
456
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
457
|
+
#
|
|
458
|
+
# initial_splits = ["user-00001", "user-100000", "others"]
|
|
459
|
+
# table = bigtable.create_table("my-instance", "my-table", initial_splits: initial_splits) do |column_families|
|
|
460
|
+
# column_families.add('cf1', Google::Cloud::Bigtable::GcRule.max_versions(5))
|
|
461
|
+
# column_families.add('cf2', Google::Cloud::Bigtable::GcRule.max_age(600))
|
|
462
|
+
#
|
|
463
|
+
# gc_rule = Google::Cloud::Bigtable::GcRule.union(
|
|
464
|
+
# Google::Cloud::Bigtable::GcRule.max_age(1800),
|
|
465
|
+
# Google::Cloud::Bigtable::GcRule.max_versions(3)
|
|
466
|
+
# )
|
|
467
|
+
# column_families.add('cf3', gc_rule)
|
|
468
|
+
# end
|
|
469
|
+
#
|
|
470
|
+
# p table
|
|
471
|
+
|
|
472
|
+
def create_table \
|
|
473
|
+
instance_id,
|
|
474
|
+
table_id,
|
|
475
|
+
column_families: nil,
|
|
476
|
+
granularity: nil,
|
|
477
|
+
initial_splits: nil,
|
|
478
|
+
&block
|
|
479
|
+
ensure_service!
|
|
480
|
+
Table.create(
|
|
481
|
+
service,
|
|
482
|
+
instance_id,
|
|
483
|
+
table_id,
|
|
484
|
+
column_families: column_families,
|
|
485
|
+
granularity: granularity,
|
|
486
|
+
initial_splits: initial_splits,
|
|
487
|
+
&block
|
|
488
|
+
)
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
# Permanently deletes a specified table and all of its data.
|
|
492
|
+
#
|
|
493
|
+
# @param instance_id [String]
|
|
494
|
+
# The unique Id of the instance in which table is exists.
|
|
495
|
+
# @param table_id [String]
|
|
496
|
+
# The unique name of the table to be deleted.
|
|
497
|
+
# e.g., +foobar+
|
|
498
|
+
#
|
|
499
|
+
# @example Create table with column families and initial splits.
|
|
500
|
+
# require "google/cloud/bigtable"
|
|
501
|
+
#
|
|
502
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
503
|
+
#
|
|
504
|
+
# bigtable.delete_table("my-instance", "my-table")
|
|
505
|
+
#
|
|
506
|
+
def delete_table instance_id, table_id
|
|
507
|
+
service.delete_table(instance_id, table_id)
|
|
508
|
+
true
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
# Performs a series of column family modifications on the specified table.
|
|
512
|
+
# Either all or none of the modifications will occur before this method
|
|
513
|
+
# returns, but data requests received prior to that point may see a table
|
|
514
|
+
# where only some modifications have taken effect.
|
|
515
|
+
#
|
|
516
|
+
# @param instance_id [String]
|
|
517
|
+
# The unique Id of the instance in which table is exists.
|
|
518
|
+
# @param table_id [String]
|
|
519
|
+
# The unique Id of the table whose families should be modified.
|
|
520
|
+
# @param modifications [Array<Google::Bigtable::Admin::V2::ModifyColumnFamiliesRequest::Modification> | Google::Bigtable::Admin::V2::ModifyColumnFamiliesRequest::Modification]
|
|
521
|
+
# Modifications to be atomically applied to the specified table's families.
|
|
522
|
+
# Entries are applied in order, meaning that earlier modifications can be
|
|
523
|
+
# masked by later ones (in the case of repeated updates to the same family,
|
|
524
|
+
# for example).
|
|
525
|
+
# @return [Google::Cloud::Bigtable::Table] Table with updated column families.
|
|
526
|
+
#
|
|
527
|
+
# @example
|
|
528
|
+
# require "google/cloud/bigtable"
|
|
529
|
+
#
|
|
530
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
531
|
+
#
|
|
532
|
+
# modifications = []
|
|
533
|
+
# modifications << Google::Cloud::Bigtable::ColumnFamily.create_modification(
|
|
534
|
+
# "cf1", Google::Cloud::Bigtable::GcRule.max_age(600))
|
|
535
|
+
# )
|
|
536
|
+
#
|
|
537
|
+
# modifications << Google::Cloud::Bigtable::ColumnFamily.update_modification(
|
|
538
|
+
# "cf2", Google::Cloud::Bigtable::GcRule.max_versions(5)
|
|
539
|
+
# )
|
|
540
|
+
#
|
|
541
|
+
# gc_rule_1 = Google::Cloud::Bigtable::GcRule.max_versions(3)
|
|
542
|
+
# gc_rule_2 = Google::Cloud::Bigtable::GcRule.max_age(600)
|
|
543
|
+
# modifications << Google::Cloud::Bigtable::ColumnFamily.update_modification(
|
|
544
|
+
# "cf3", Google::Cloud::Bigtable::GcRule.union(gc_rule_1, gc_rule_2)
|
|
545
|
+
# )
|
|
546
|
+
#
|
|
547
|
+
# max_age_gc_rule = Google::Cloud::Bigtable::GcRule.max_age(300)
|
|
548
|
+
# modifications << Google::Cloud::Bigtable::ColumnFamily.update_modification(
|
|
549
|
+
# "cf4", Google::Cloud::Bigtable::GcRule.union(max_version_gc_rule)
|
|
550
|
+
# )
|
|
551
|
+
#
|
|
552
|
+
# modifications << Google::Cloud::Bigtable::ColumnFamily.drop_modification("cf5")
|
|
553
|
+
#
|
|
554
|
+
# table = bigtable.modify_column_families("my-instance", "my-table", modifications)
|
|
555
|
+
#
|
|
556
|
+
# p table.column_families
|
|
557
|
+
|
|
558
|
+
def modify_column_families instance_id, table_id, modifications
|
|
559
|
+
ensure_service!
|
|
560
|
+
Table.modify_column_families(
|
|
561
|
+
service,
|
|
562
|
+
instance_id,
|
|
563
|
+
table_id,
|
|
564
|
+
modifications
|
|
565
|
+
)
|
|
566
|
+
end
|
|
567
|
+
|
|
568
|
+
protected
|
|
569
|
+
|
|
570
|
+
# @private
|
|
571
|
+
#
|
|
572
|
+
# Raise an error unless an active connection to the service is
|
|
573
|
+
# available.
|
|
574
|
+
def ensure_service!
|
|
575
|
+
raise "Must have active connection to service" unless service
|
|
576
|
+
end
|
|
577
|
+
end
|
|
578
|
+
end
|
|
579
|
+
end
|
|
580
|
+
end
|