google-cloud-bigtable 1.3.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 +19 -0
- data/AUTHENTICATION.md +177 -0
- data/CHANGELOG.md +223 -0
- data/CODE_OF_CONDUCT.md +40 -0
- data/CONTRIBUTING.md +188 -0
- data/EMULATOR.md +30 -0
- data/LICENSE +201 -0
- data/LOGGING.md +32 -0
- data/OVERVIEW.md +400 -0
- data/TROUBLESHOOTING.md +31 -0
- data/lib/google-cloud-bigtable.rb +171 -0
- data/lib/google/bigtable/admin/v2/bigtable_instance_admin_pb.rb +145 -0
- data/lib/google/bigtable/admin/v2/bigtable_instance_admin_services_pb.rb +90 -0
- data/lib/google/bigtable/admin/v2/bigtable_table_admin_pb.rb +208 -0
- data/lib/google/bigtable/admin/v2/bigtable_table_admin_services_pb.rb +154 -0
- data/lib/google/bigtable/admin/v2/common_pb.rb +30 -0
- data/lib/google/bigtable/admin/v2/instance_pb.rb +74 -0
- data/lib/google/bigtable/admin/v2/table_pb.rb +127 -0
- data/lib/google/bigtable/v2/bigtable_pb.rb +113 -0
- data/lib/google/bigtable/v2/bigtable_services_pb.rb +68 -0
- data/lib/google/bigtable/v2/data_pb.rb +156 -0
- data/lib/google/cloud/bigtable.rb +184 -0
- data/lib/google/cloud/bigtable/admin.rb +202 -0
- data/lib/google/cloud/bigtable/admin/credentials.rb +27 -0
- data/lib/google/cloud/bigtable/admin/v2.rb +223 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_instance_admin_client.rb +1451 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_instance_admin_client_config.json +139 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_table_admin_client.rb +1734 -0
- data/lib/google/cloud/bigtable/admin/v2/bigtable_table_admin_client_config.json +163 -0
- data/lib/google/cloud/bigtable/admin/v2/credentials.rb +51 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/bigtable_instance_admin.rb +297 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/bigtable_table_admin.rb +587 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/instance.rb +193 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/table.rb +303 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/iam_policy.rb +64 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/options.rb +33 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/policy.rb +151 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/longrunning/operations.rb +51 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/any.rb +131 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/duration.rb +91 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/empty.rb +29 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/field_mask.rb +222 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/timestamp.rb +113 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/rpc/status.rb +39 -0
- data/lib/google/cloud/bigtable/admin/v2/doc/google/type/expr.rb +45 -0
- data/lib/google/cloud/bigtable/app_profile.rb +439 -0
- data/lib/google/cloud/bigtable/app_profile/job.rb +99 -0
- data/lib/google/cloud/bigtable/app_profile/list.rb +165 -0
- data/lib/google/cloud/bigtable/backup.rb +324 -0
- data/lib/google/cloud/bigtable/backup/job.rb +87 -0
- data/lib/google/cloud/bigtable/backup/list.rb +167 -0
- data/lib/google/cloud/bigtable/chunk_processor.rb +241 -0
- data/lib/google/cloud/bigtable/cluster.rb +390 -0
- data/lib/google/cloud/bigtable/cluster/job.rb +88 -0
- data/lib/google/cloud/bigtable/cluster/list.rb +171 -0
- data/lib/google/cloud/bigtable/column_family.rb +73 -0
- data/lib/google/cloud/bigtable/column_family_map.rb +426 -0
- data/lib/google/cloud/bigtable/column_range.rb +194 -0
- data/lib/google/cloud/bigtable/convert.rb +83 -0
- data/lib/google/cloud/bigtable/credentials.rb +25 -0
- data/lib/google/cloud/bigtable/errors.rb +38 -0
- data/lib/google/cloud/bigtable/gc_rule.rb +334 -0
- data/lib/google/cloud/bigtable/instance.rb +935 -0
- data/lib/google/cloud/bigtable/instance/cluster_map.rb +74 -0
- data/lib/google/cloud/bigtable/instance/job.rb +98 -0
- data/lib/google/cloud/bigtable/instance/list.rb +164 -0
- data/lib/google/cloud/bigtable/longrunning_job.rb +122 -0
- data/lib/google/cloud/bigtable/mutation_entry.rb +256 -0
- data/lib/google/cloud/bigtable/mutation_operations.rb +357 -0
- data/lib/google/cloud/bigtable/policy.rb +167 -0
- data/lib/google/cloud/bigtable/project.rb +471 -0
- data/lib/google/cloud/bigtable/read_modify_write_rule.rb +134 -0
- data/lib/google/cloud/bigtable/read_operations.rb +328 -0
- data/lib/google/cloud/bigtable/routing_policy.rb +172 -0
- data/lib/google/cloud/bigtable/row.rb +136 -0
- data/lib/google/cloud/bigtable/row_filter.rb +639 -0
- data/lib/google/cloud/bigtable/row_filter/chain_filter.rb +590 -0
- data/lib/google/cloud/bigtable/row_filter/condition_filter.rb +114 -0
- data/lib/google/cloud/bigtable/row_filter/interleave_filter.rb +621 -0
- data/lib/google/cloud/bigtable/row_filter/simple_filter.rb +287 -0
- data/lib/google/cloud/bigtable/row_range.rb +179 -0
- data/lib/google/cloud/bigtable/rows_mutator.rb +113 -0
- data/lib/google/cloud/bigtable/rows_reader.rb +200 -0
- data/lib/google/cloud/bigtable/sample_row_key.rb +85 -0
- data/lib/google/cloud/bigtable/service.rb +913 -0
- data/lib/google/cloud/bigtable/status.rb +76 -0
- data/lib/google/cloud/bigtable/table.rb +686 -0
- data/lib/google/cloud/bigtable/table/cluster_state.rb +125 -0
- data/lib/google/cloud/bigtable/table/list.rb +154 -0
- data/lib/google/cloud/bigtable/table/restore_job.rb +117 -0
- data/lib/google/cloud/bigtable/v2.rb +146 -0
- data/lib/google/cloud/bigtable/v2/bigtable_client.rb +591 -0
- data/lib/google/cloud/bigtable/v2/bigtable_client_config.json +83 -0
- data/lib/google/cloud/bigtable/v2/credentials.rb +46 -0
- data/lib/google/cloud/bigtable/v2/doc/google/bigtable/v2/bigtable.rb +290 -0
- data/lib/google/cloud/bigtable/v2/doc/google/bigtable/v2/data.rb +493 -0
- data/lib/google/cloud/bigtable/v2/doc/google/protobuf/any.rb +131 -0
- data/lib/google/cloud/bigtable/v2/doc/google/protobuf/wrappers.rb +34 -0
- data/lib/google/cloud/bigtable/v2/doc/google/rpc/status.rb +39 -0
- data/lib/google/cloud/bigtable/value_range.rb +181 -0
- data/lib/google/cloud/bigtable/version.rb +22 -0
- metadata +337 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Copyright 2019 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
|
+
##
|
|
20
|
+
# # Status
|
|
21
|
+
#
|
|
22
|
+
# Represents a logical error model from the Bigtable service, containing an
|
|
23
|
+
# error code, an error message, and optional error details.
|
|
24
|
+
#
|
|
25
|
+
# @attr [Integer] code The status code, which should be an enum value of
|
|
26
|
+
# [google.rpc.Code](https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto).
|
|
27
|
+
# @attr [String] description The human-readable description for the status code, which should be an enum value of
|
|
28
|
+
# [google.rpc.Code](https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto). For example,
|
|
29
|
+
# `INVALID_ARGUMENT`.
|
|
30
|
+
# @attr [String] message A developer-facing error message, which should be in English.
|
|
31
|
+
# @attr [Array<String>] details A list of messages that carry the error details.
|
|
32
|
+
#
|
|
33
|
+
# @example
|
|
34
|
+
# require "google/cloud/bigtable"
|
|
35
|
+
#
|
|
36
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
37
|
+
#
|
|
38
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
39
|
+
#
|
|
40
|
+
# entries = []
|
|
41
|
+
# entries << table.new_mutation_entry("row-1").set_cell("cf1", "field1", "XYZ")
|
|
42
|
+
# entries << table.new_mutation_entry("row-2").set_cell("cf1", "field1", "ABC")
|
|
43
|
+
# responses = table.mutate_rows(entries)
|
|
44
|
+
#
|
|
45
|
+
# responses.each do |response|
|
|
46
|
+
# puts response.status.description
|
|
47
|
+
# end
|
|
48
|
+
#
|
|
49
|
+
class Status
|
|
50
|
+
attr_reader :code, :description, :message, :details
|
|
51
|
+
|
|
52
|
+
##
|
|
53
|
+
# @private Creates a Status object.
|
|
54
|
+
def initialize code, description, message, details
|
|
55
|
+
@code = code
|
|
56
|
+
@description = description
|
|
57
|
+
@message = message
|
|
58
|
+
@details = details
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
##
|
|
62
|
+
# @private New Status from a Google::Rpc::Status object.
|
|
63
|
+
def self.from_grpc grpc
|
|
64
|
+
new grpc.code, description_for(grpc.code), grpc.message, grpc.details
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# @private Get a descriptive symbol for a google.rpc.Code integer
|
|
68
|
+
def self.description_for code
|
|
69
|
+
["OK", "CANCELLED", "UNKNOWN", "INVALID_ARGUMENT", "DEADLINE_EXCEEDED", "NOT_FOUND", "ALREADY_EXISTS",
|
|
70
|
+
"PERMISSION_DENIED", "RESOURCE_EXHAUSTED", "FAILED_PRECONDITION", "ABORTED", "OUT_OF_RANGE", "UNIMPLEMENTED",
|
|
71
|
+
"INTERNAL", "UNAVAILABLE", "DATA_LOSS", "UNAUTHENTICATED"][code]
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,686 @@
|
|
|
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/table/list"
|
|
19
|
+
require "google/cloud/bigtable/table/cluster_state"
|
|
20
|
+
require "google/cloud/bigtable/column_family_map"
|
|
21
|
+
require "google/cloud/bigtable/gc_rule"
|
|
22
|
+
require "google/cloud/bigtable/mutation_operations"
|
|
23
|
+
require "google/cloud/bigtable/policy"
|
|
24
|
+
require "google/cloud/bigtable/read_operations"
|
|
25
|
+
|
|
26
|
+
module Google
|
|
27
|
+
module Cloud
|
|
28
|
+
module Bigtable
|
|
29
|
+
##
|
|
30
|
+
# # Table
|
|
31
|
+
#
|
|
32
|
+
# A collection of user data indexed by row, column, and timestamp.
|
|
33
|
+
# Each table is served using the resources of its parent cluster.
|
|
34
|
+
#
|
|
35
|
+
# @example
|
|
36
|
+
# require "google/cloud/bigtable"
|
|
37
|
+
#
|
|
38
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
39
|
+
#
|
|
40
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
41
|
+
#
|
|
42
|
+
# if table.exists?
|
|
43
|
+
# p "Table exists."
|
|
44
|
+
# else
|
|
45
|
+
# p "Table does not exist"
|
|
46
|
+
# end
|
|
47
|
+
#
|
|
48
|
+
class Table
|
|
49
|
+
# @!parse extend MutationOperations
|
|
50
|
+
include MutationOperations
|
|
51
|
+
|
|
52
|
+
# @!parse extend ReadOperations
|
|
53
|
+
include ReadOperations
|
|
54
|
+
|
|
55
|
+
# @private
|
|
56
|
+
# The gRPC Service object.
|
|
57
|
+
attr_accessor :service
|
|
58
|
+
|
|
59
|
+
##
|
|
60
|
+
# @return [String] App profile ID for request routing.
|
|
61
|
+
#
|
|
62
|
+
attr_accessor :app_profile_id
|
|
63
|
+
|
|
64
|
+
# @private
|
|
65
|
+
#
|
|
66
|
+
# Creates a new Table instance.
|
|
67
|
+
def initialize grpc, service, view: nil
|
|
68
|
+
@grpc = grpc
|
|
69
|
+
@service = service
|
|
70
|
+
@view = view || :SCHEMA_VIEW
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
##
|
|
74
|
+
# The unique identifier for the project to which the table belongs.
|
|
75
|
+
#
|
|
76
|
+
# @return [String]
|
|
77
|
+
#
|
|
78
|
+
def project_id
|
|
79
|
+
@grpc.name.split("/")[1]
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
##
|
|
83
|
+
# The unique identifier for the instance to which the table belongs.
|
|
84
|
+
#
|
|
85
|
+
# @return [String]
|
|
86
|
+
#
|
|
87
|
+
def instance_id
|
|
88
|
+
@grpc.name.split("/")[3]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
##
|
|
92
|
+
# The unique identifier for the table.
|
|
93
|
+
#
|
|
94
|
+
# @return [String]
|
|
95
|
+
#
|
|
96
|
+
def name
|
|
97
|
+
@grpc.name.split("/")[5]
|
|
98
|
+
end
|
|
99
|
+
alias table_id name
|
|
100
|
+
|
|
101
|
+
##
|
|
102
|
+
# The full path for the table resource. Values are of the form
|
|
103
|
+
# `projects/<project_id>/instances/<instance_id>/table/<table_id>`.
|
|
104
|
+
#
|
|
105
|
+
# @return [String]
|
|
106
|
+
#
|
|
107
|
+
def path
|
|
108
|
+
@grpc.name
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
##
|
|
112
|
+
# Reloads table data.
|
|
113
|
+
#
|
|
114
|
+
# @param view [Symbol] Table view type.
|
|
115
|
+
# Default view type is `:SCHEMA_VIEW`.
|
|
116
|
+
# Valid view types are:
|
|
117
|
+
#
|
|
118
|
+
# * `:NAME_ONLY` - Only populates `name`.
|
|
119
|
+
# * `:SCHEMA_VIEW` - Only populates `name` and fields related to the table's schema.
|
|
120
|
+
# * `:REPLICATION_VIEW` - Only populates `name` and fields related to the table's replication state.
|
|
121
|
+
# * `:FULL` - Populates all fields.
|
|
122
|
+
#
|
|
123
|
+
# @return [Google::Cloud::Bigtable::Table]
|
|
124
|
+
#
|
|
125
|
+
def reload! view: nil
|
|
126
|
+
@view = view || :SCHEMA_VIEW
|
|
127
|
+
@grpc = service.get_table instance_id, name, view: view
|
|
128
|
+
self
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
##
|
|
132
|
+
# Map from cluster ID to per-cluster table state.
|
|
133
|
+
# If it could not be determined whether or not the table has data in a
|
|
134
|
+
# particular cluster (for example, if its zone is unavailable), then
|
|
135
|
+
# there will be an entry for the cluster with UNKNOWN `replication_status`.
|
|
136
|
+
# Views: `FULL`.
|
|
137
|
+
#
|
|
138
|
+
# @return [Array<Google::Cloud::Bigtable::Table::ClusterState>]
|
|
139
|
+
#
|
|
140
|
+
def cluster_states
|
|
141
|
+
check_view_and_load :REPLICATION_VIEW
|
|
142
|
+
@grpc.cluster_states.map do |name, state_grpc|
|
|
143
|
+
ClusterState.from_grpc state_grpc, name
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
##
|
|
148
|
+
# Returns a frozen object containing the column families configured for
|
|
149
|
+
# the table, mapped by column family name. Reloads the table if
|
|
150
|
+
# necessary to retrieve the column families data, since it is only
|
|
151
|
+
# available in a table with view type `SCHEMA_VIEW` or `FULL`.
|
|
152
|
+
#
|
|
153
|
+
# Also accepts a block for making modifications to the table's column
|
|
154
|
+
# families. After the modifications are completed, the table will be
|
|
155
|
+
# updated with the changes, and the updated column families will be
|
|
156
|
+
# returned.
|
|
157
|
+
#
|
|
158
|
+
# @yield [column_families] A block for modifying the table's column
|
|
159
|
+
# families. Applies multiple column modifications. Performs a series
|
|
160
|
+
# of column family modifications on the specified table. Either all or
|
|
161
|
+
# none of the modifications will occur before this method returns, but
|
|
162
|
+
# data requests received prior to that point may see a table where
|
|
163
|
+
# only some modifications have taken effect.
|
|
164
|
+
# @yieldparam [ColumnFamilyMap] column_families
|
|
165
|
+
# A mutable object containing the column families for the table,
|
|
166
|
+
# mapped by column family name. Any changes made to this object will
|
|
167
|
+
# be stored in API.
|
|
168
|
+
#
|
|
169
|
+
# @return [ColumnFamilyMap] A frozen object containing the
|
|
170
|
+
# column families for the table, mapped by column family name.
|
|
171
|
+
#
|
|
172
|
+
# @example
|
|
173
|
+
# require "google/cloud/bigtable"
|
|
174
|
+
#
|
|
175
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
176
|
+
#
|
|
177
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true)
|
|
178
|
+
#
|
|
179
|
+
# table.column_families.each do |name, cf|
|
|
180
|
+
# puts name
|
|
181
|
+
# puts cf.gc_rule
|
|
182
|
+
# end
|
|
183
|
+
#
|
|
184
|
+
# # Get a column family by name
|
|
185
|
+
# cf1 = table.column_families["cf1"]
|
|
186
|
+
#
|
|
187
|
+
# @example Modify the table's column families
|
|
188
|
+
# require "google/cloud/bigtable"
|
|
189
|
+
#
|
|
190
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
191
|
+
#
|
|
192
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true)
|
|
193
|
+
#
|
|
194
|
+
# table.column_families do |cfm|
|
|
195
|
+
# cfm.add "cf4", gc_rule: Google::Cloud::Bigtable::GcRule.max_age(600)
|
|
196
|
+
# cfm.add "cf5", gc_rule: Google::Cloud::Bigtable::GcRule.max_versions(5)
|
|
197
|
+
#
|
|
198
|
+
# rule_1 = Google::Cloud::Bigtable::GcRule.max_versions(3)
|
|
199
|
+
# rule_2 = Google::Cloud::Bigtable::GcRule.max_age(600)
|
|
200
|
+
# rule_union = Google::Cloud::Bigtable::GcRule.union(rule_1, rule_2)
|
|
201
|
+
# cfm.update "cf2", gc_rule: rule_union
|
|
202
|
+
#
|
|
203
|
+
# cfm.delete "cf3"
|
|
204
|
+
# end
|
|
205
|
+
#
|
|
206
|
+
# puts table.column_families["cf3"] #=> nil
|
|
207
|
+
#
|
|
208
|
+
def column_families
|
|
209
|
+
check_view_and_load :SCHEMA_VIEW
|
|
210
|
+
|
|
211
|
+
if block_given?
|
|
212
|
+
column_families = ColumnFamilyMap.from_grpc @grpc.column_families
|
|
213
|
+
yield column_families
|
|
214
|
+
modifications = column_families.modifications @grpc.column_families
|
|
215
|
+
@grpc = service.modify_column_families instance_id, table_id, modifications if modifications.any?
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
ColumnFamilyMap.from_grpc(@grpc.column_families).freeze
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
##
|
|
222
|
+
# The granularity (e.g. `MILLIS`, `MICROS`) at which timestamps are stored in
|
|
223
|
+
# this table. Timestamps not matching the granularity will be rejected.
|
|
224
|
+
# If unspecified at creation time, the value will be set to `MILLIS`.
|
|
225
|
+
# Views: `SCHEMA_VIEW`, `FULL`.
|
|
226
|
+
#
|
|
227
|
+
# @return [Symbol]
|
|
228
|
+
#
|
|
229
|
+
def granularity
|
|
230
|
+
check_view_and_load :SCHEMA_VIEW
|
|
231
|
+
@grpc.granularity
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
##
|
|
235
|
+
# The table keeps data versioned at a granularity of 1 ms.
|
|
236
|
+
#
|
|
237
|
+
# @return [Boolean]
|
|
238
|
+
#
|
|
239
|
+
def granularity_millis?
|
|
240
|
+
granularity == :MILLIS
|
|
241
|
+
end
|
|
242
|
+
|
|
243
|
+
##
|
|
244
|
+
# Gets the [Cloud IAM](https://cloud.google.com/iam/) access control
|
|
245
|
+
# policy for the table.
|
|
246
|
+
#
|
|
247
|
+
# @see https://cloud.google.com/bigtable/docs/access-control
|
|
248
|
+
#
|
|
249
|
+
# @yield [policy] A block for updating the policy. The latest policy
|
|
250
|
+
# will be read from the Bigtable service and passed to the block. After
|
|
251
|
+
# the block completes, the modified policy will be written to the
|
|
252
|
+
# service.
|
|
253
|
+
# @yieldparam [Policy] policy the current Cloud IAM Policy for this
|
|
254
|
+
# table.
|
|
255
|
+
#
|
|
256
|
+
# @return [Policy] The current Cloud IAM Policy for the table.
|
|
257
|
+
#
|
|
258
|
+
# @example
|
|
259
|
+
# require "google/cloud/bigtable"
|
|
260
|
+
#
|
|
261
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
262
|
+
#
|
|
263
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true)
|
|
264
|
+
# policy = table.policy
|
|
265
|
+
#
|
|
266
|
+
# @example Update the policy by passing a block.
|
|
267
|
+
# require "google/cloud/bigtable"
|
|
268
|
+
#
|
|
269
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
270
|
+
#
|
|
271
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true)
|
|
272
|
+
#
|
|
273
|
+
# table.policy do |p|
|
|
274
|
+
# p.add("roles/owner", "user:owner@example.com")
|
|
275
|
+
# end # 2 API calls
|
|
276
|
+
#
|
|
277
|
+
def policy
|
|
278
|
+
ensure_service!
|
|
279
|
+
grpc = service.get_table_policy instance_id, name
|
|
280
|
+
policy = Policy.from_grpc grpc
|
|
281
|
+
return policy unless block_given?
|
|
282
|
+
yield policy
|
|
283
|
+
update_policy policy
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
##
|
|
287
|
+
# Updates the [Cloud IAM](https://cloud.google.com/iam/) access control
|
|
288
|
+
# policy for the table. The policy should be read from {#policy}.
|
|
289
|
+
# See {Google::Cloud::Bigtable::Policy} for an explanation of the policy
|
|
290
|
+
# `etag` property and how to modify policies.
|
|
291
|
+
#
|
|
292
|
+
# You can also update the policy by passing a block to {#policy}, which
|
|
293
|
+
# will call this method internally after the block completes.
|
|
294
|
+
#
|
|
295
|
+
# @param new_policy [Policy] a new or modified Cloud IAM Policy for this
|
|
296
|
+
# table
|
|
297
|
+
#
|
|
298
|
+
# @return [Policy] The policy returned by the API update operation.
|
|
299
|
+
#
|
|
300
|
+
# @example
|
|
301
|
+
# require "google/cloud/bigtable"
|
|
302
|
+
#
|
|
303
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
304
|
+
#
|
|
305
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true)
|
|
306
|
+
#
|
|
307
|
+
# policy = table.policy
|
|
308
|
+
# policy.add("roles/owner", "user:owner@example.com")
|
|
309
|
+
# updated_policy = table.update_policy(policy)
|
|
310
|
+
#
|
|
311
|
+
# puts updated_policy.roles
|
|
312
|
+
#
|
|
313
|
+
def update_policy new_policy
|
|
314
|
+
ensure_service!
|
|
315
|
+
grpc = service.set_table_policy instance_id, name, new_policy.to_grpc
|
|
316
|
+
Policy.from_grpc grpc
|
|
317
|
+
end
|
|
318
|
+
alias policy= update_policy
|
|
319
|
+
|
|
320
|
+
##
|
|
321
|
+
# Tests the specified permissions against the [Cloud
|
|
322
|
+
# IAM](https://cloud.google.com/iam/) access control policy.
|
|
323
|
+
#
|
|
324
|
+
# @see https://cloud.google.com/iam/docs/managing-policies Managing Policies
|
|
325
|
+
# @see https://cloud.google.com/bigtable/docs/access-control Access Control
|
|
326
|
+
#
|
|
327
|
+
# @param permissions [String, Array<String>] permissions The set of permissions to
|
|
328
|
+
# check access for. Permissions with wildcards (such as `*` or
|
|
329
|
+
# `bigtable.*`) are not allowed.
|
|
330
|
+
# See [Access Control](https://cloud.google.com/bigtable/docs/access-control).
|
|
331
|
+
#
|
|
332
|
+
# @return [Array<String>] The permissions that are configured for the policy.
|
|
333
|
+
#
|
|
334
|
+
# @example
|
|
335
|
+
# require "google/cloud/bigtable"
|
|
336
|
+
#
|
|
337
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
338
|
+
#
|
|
339
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true)
|
|
340
|
+
#
|
|
341
|
+
# permissions = table.test_iam_permissions(
|
|
342
|
+
# "bigtable.tables.delete",
|
|
343
|
+
# "bigtable.tables.get"
|
|
344
|
+
# )
|
|
345
|
+
# permissions.include? "bigtable.tables.delete" #=> false
|
|
346
|
+
# permissions.include? "bigtable.tables.get" #=> true
|
|
347
|
+
#
|
|
348
|
+
def test_iam_permissions *permissions
|
|
349
|
+
ensure_service!
|
|
350
|
+
grpc = service.test_table_permissions instance_id, name, permissions.flatten
|
|
351
|
+
grpc.permissions.to_a
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
##
|
|
355
|
+
# Permanently deletes the table from a instance.
|
|
356
|
+
#
|
|
357
|
+
# @return [Boolean] Returns `true` if the table was deleted.
|
|
358
|
+
#
|
|
359
|
+
# @example
|
|
360
|
+
# require "google/cloud/bigtable"
|
|
361
|
+
#
|
|
362
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
363
|
+
#
|
|
364
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
365
|
+
# table.delete
|
|
366
|
+
#
|
|
367
|
+
def delete
|
|
368
|
+
ensure_service!
|
|
369
|
+
service.delete_table instance_id, name
|
|
370
|
+
true
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
##
|
|
374
|
+
# Checks to see if the table exists.
|
|
375
|
+
#
|
|
376
|
+
# @return [Boolean]
|
|
377
|
+
#
|
|
378
|
+
# @example
|
|
379
|
+
# require "google/cloud/bigtable"
|
|
380
|
+
#
|
|
381
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
382
|
+
#
|
|
383
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
384
|
+
#
|
|
385
|
+
# if table.exists?
|
|
386
|
+
# p "Table exists."
|
|
387
|
+
# else
|
|
388
|
+
# p "Table does not exist"
|
|
389
|
+
# end
|
|
390
|
+
#
|
|
391
|
+
# @example Using Cloud Bigtable instance
|
|
392
|
+
# require "google/cloud/bigtable"
|
|
393
|
+
#
|
|
394
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
395
|
+
#
|
|
396
|
+
# instance = bigtable.instance("my-instance")
|
|
397
|
+
# table = instance.table("my-table")
|
|
398
|
+
#
|
|
399
|
+
# if table.exists?
|
|
400
|
+
# p "Table exists."
|
|
401
|
+
# else
|
|
402
|
+
# p "Table does not exist"
|
|
403
|
+
# end
|
|
404
|
+
#
|
|
405
|
+
def exists?
|
|
406
|
+
!service.get_table(instance_id, name, view: :NAME_ONLY).nil?
|
|
407
|
+
rescue Google::Cloud::NotFoundError
|
|
408
|
+
false
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
# @private
|
|
412
|
+
# Creates a table.
|
|
413
|
+
#
|
|
414
|
+
# @param service [Google::Cloud::Bigtable::Service]
|
|
415
|
+
# @param instance_id [String]
|
|
416
|
+
# @param table_id [String]
|
|
417
|
+
# @param column_families [ColumnFamilyMap]
|
|
418
|
+
# @param granularity [Symbol]
|
|
419
|
+
# @param initial_splits [Array<String>]
|
|
420
|
+
# @yield [column_families] A block for adding column_families.
|
|
421
|
+
# @yieldparam [ColumnFamilyMap]
|
|
422
|
+
#
|
|
423
|
+
# @return [Google::Cloud::Bigtable::Table]
|
|
424
|
+
#
|
|
425
|
+
def self.create service, instance_id, table_id, column_families: nil, granularity: nil, initial_splits: nil
|
|
426
|
+
if column_families
|
|
427
|
+
# create an un-frozen and duplicate object
|
|
428
|
+
column_families = ColumnFamilyMap.from_grpc column_families.to_grpc
|
|
429
|
+
end
|
|
430
|
+
column_families ||= ColumnFamilyMap.new
|
|
431
|
+
|
|
432
|
+
yield column_families if block_given?
|
|
433
|
+
|
|
434
|
+
table = Google::Bigtable::Admin::V2::Table.new({
|
|
435
|
+
column_families: column_families.to_grpc_hash,
|
|
436
|
+
granularity: granularity
|
|
437
|
+
}.delete_if { |_, v| v.nil? })
|
|
438
|
+
|
|
439
|
+
grpc = service.create_table instance_id, table_id, table, initial_splits: initial_splits
|
|
440
|
+
from_grpc grpc, service
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
##
|
|
444
|
+
# Generates a consistency token for a table. The token can be used in
|
|
445
|
+
# CheckConsistency to check whether mutations to the table that finished
|
|
446
|
+
# before this call started have been replicated. The tokens will be available
|
|
447
|
+
# for 90 days.
|
|
448
|
+
#
|
|
449
|
+
# @return [String] The generated consistency token
|
|
450
|
+
#
|
|
451
|
+
# @example
|
|
452
|
+
# require "google/cloud/bigtable"
|
|
453
|
+
#
|
|
454
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
455
|
+
#
|
|
456
|
+
# instance = bigtable.instance("my-instance")
|
|
457
|
+
# table = instance.table("my-table")
|
|
458
|
+
#
|
|
459
|
+
# table.generate_consistency_token # "l947XelENinaxJQP0nnrZJjHnAF7YrwW8HCJLotwrF"
|
|
460
|
+
#
|
|
461
|
+
def generate_consistency_token
|
|
462
|
+
ensure_service!
|
|
463
|
+
response = service.generate_consistency_token instance_id, name
|
|
464
|
+
response.consistency_token
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
##
|
|
468
|
+
# Checks replication consistency based on a consistency token. Replication is
|
|
469
|
+
# considered consistent if replication has caught up based on the conditions
|
|
470
|
+
# specified in the token and the check request.
|
|
471
|
+
# @param token [String] Consistency token
|
|
472
|
+
# @return [Boolean] `true` if replication is consistent
|
|
473
|
+
#
|
|
474
|
+
# @example
|
|
475
|
+
# require "google/cloud/bigtable"
|
|
476
|
+
#
|
|
477
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
478
|
+
#
|
|
479
|
+
# instance = bigtable.instance("my-instance")
|
|
480
|
+
# table = instance.table("my-table")
|
|
481
|
+
#
|
|
482
|
+
# token = "l947XelENinaxJQP0nnrZJjHnAF7YrwW8HCJLotwrF"
|
|
483
|
+
#
|
|
484
|
+
# if table.check_consistency(token)
|
|
485
|
+
# puts "Replication is consistent"
|
|
486
|
+
# end
|
|
487
|
+
#
|
|
488
|
+
def check_consistency token
|
|
489
|
+
ensure_service!
|
|
490
|
+
response = service.check_consistency instance_id, name, token
|
|
491
|
+
response.consistent
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
##
|
|
495
|
+
# Wait for replication to check replication consistency.
|
|
496
|
+
# Checks replication consistency by generating a consistency token and
|
|
497
|
+
# making the `check_consistency` API call 5 times (by default).
|
|
498
|
+
# If the response is consistent, returns `true`. Otherwise tries again
|
|
499
|
+
# repeatedly until the timeout. If the check does not succeed by the
|
|
500
|
+
# timeout, returns `false`.
|
|
501
|
+
#
|
|
502
|
+
# @param timeout [Integer]
|
|
503
|
+
# Timeout in seconds. Defaults value is 600 seconds.
|
|
504
|
+
# @param check_interval [Integer]
|
|
505
|
+
# Consistency check interval in seconds. Default is 5 seconds.
|
|
506
|
+
# @return [Boolean] `true` if replication is consistent
|
|
507
|
+
#
|
|
508
|
+
# @example
|
|
509
|
+
# require "google/cloud/bigtable"
|
|
510
|
+
#
|
|
511
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
512
|
+
#
|
|
513
|
+
# table = bigtable.table("my-instance", "my-table", perform_lookup: true)
|
|
514
|
+
#
|
|
515
|
+
# if table.wait_for_replication
|
|
516
|
+
# puts "Replication done"
|
|
517
|
+
# end
|
|
518
|
+
#
|
|
519
|
+
# # With custom timeout and interval
|
|
520
|
+
# if table.wait_for_replication(timeout: 300, check_interval: 10)
|
|
521
|
+
# puts "Replication done"
|
|
522
|
+
# end
|
|
523
|
+
#
|
|
524
|
+
def wait_for_replication timeout: 600, check_interval: 5
|
|
525
|
+
raise InvalidArgumentError, "'check_interval' cannot be greater than timeout" if check_interval > timeout
|
|
526
|
+
token = generate_consistency_token
|
|
527
|
+
status = false
|
|
528
|
+
start_at = Time.now
|
|
529
|
+
|
|
530
|
+
loop do
|
|
531
|
+
status = check_consistency token
|
|
532
|
+
|
|
533
|
+
break if status || (Time.now - start_at) >= timeout
|
|
534
|
+
sleep check_interval
|
|
535
|
+
end
|
|
536
|
+
status
|
|
537
|
+
end
|
|
538
|
+
|
|
539
|
+
##
|
|
540
|
+
# Deletes all rows.
|
|
541
|
+
#
|
|
542
|
+
# @param timeout [Integer] Call timeout in seconds.
|
|
543
|
+
# Use in case of insufficient deadline for DropRowRange, then
|
|
544
|
+
# try again with a longer request deadline.
|
|
545
|
+
# @return [Boolean]
|
|
546
|
+
#
|
|
547
|
+
# @example
|
|
548
|
+
# require "google/cloud/bigtable"
|
|
549
|
+
#
|
|
550
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
551
|
+
#
|
|
552
|
+
# instance = bigtable.instance("my-instance")
|
|
553
|
+
# table = instance.table("my-table")
|
|
554
|
+
# table.delete_all_rows
|
|
555
|
+
#
|
|
556
|
+
# # With timeout
|
|
557
|
+
# table.delete_all_rows(timeout: 120) # 120 seconds.
|
|
558
|
+
#
|
|
559
|
+
def delete_all_rows timeout: nil
|
|
560
|
+
drop_row_range delete_all_data: true, timeout: timeout
|
|
561
|
+
end
|
|
562
|
+
|
|
563
|
+
##
|
|
564
|
+
# Deletes rows using row key prefix.
|
|
565
|
+
#
|
|
566
|
+
# @param prefix [String] Row key prefix (for example, "user").
|
|
567
|
+
# @param timeout [Integer] Call timeout in seconds.
|
|
568
|
+
# @return [Boolean]
|
|
569
|
+
# @example
|
|
570
|
+
# require "google/cloud/bigtable"
|
|
571
|
+
#
|
|
572
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
573
|
+
#
|
|
574
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
575
|
+
#
|
|
576
|
+
# table.delete_rows_by_prefix("user-100")
|
|
577
|
+
#
|
|
578
|
+
# # With timeout
|
|
579
|
+
# table.delete_rows_by_prefix("user-1", timeout: 120) # 120 seconds.
|
|
580
|
+
#
|
|
581
|
+
def delete_rows_by_prefix prefix, timeout: nil
|
|
582
|
+
drop_row_range row_key_prefix: prefix, timeout: timeout
|
|
583
|
+
end
|
|
584
|
+
|
|
585
|
+
##
|
|
586
|
+
# Drops row range by row key prefix or deletes all.
|
|
587
|
+
#
|
|
588
|
+
# @param row_key_prefix [String] Row key prefix (for example, "user").
|
|
589
|
+
# @param delete_all_data [Boolean]
|
|
590
|
+
# @return [Boolean]
|
|
591
|
+
#
|
|
592
|
+
# @example
|
|
593
|
+
# require "google/cloud/bigtable"
|
|
594
|
+
#
|
|
595
|
+
# bigtable = Google::Cloud::Bigtable.new
|
|
596
|
+
#
|
|
597
|
+
# table = bigtable.table("my-instance", "my-table")
|
|
598
|
+
#
|
|
599
|
+
# # Delete rows using row key prefix.
|
|
600
|
+
# table.drop_row_range(row_key_prefix: "user-100")
|
|
601
|
+
#
|
|
602
|
+
# # Delete all data With timeout
|
|
603
|
+
# table.drop_row_range(delete_all_data: true, timeout: 120) # 120 seconds.
|
|
604
|
+
#
|
|
605
|
+
def drop_row_range row_key_prefix: nil, delete_all_data: nil, timeout: nil
|
|
606
|
+
ensure_service!
|
|
607
|
+
service.drop_row_range(
|
|
608
|
+
instance_id,
|
|
609
|
+
name,
|
|
610
|
+
row_key_prefix: row_key_prefix,
|
|
611
|
+
delete_all_data_from_table: delete_all_data,
|
|
612
|
+
timeout: timeout
|
|
613
|
+
)
|
|
614
|
+
true
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
# @private
|
|
618
|
+
# Creates a new Table instance from a Google::Bigtable::Admin::V2::Table.
|
|
619
|
+
#
|
|
620
|
+
# @param grpc [Google::Bigtable::Admin::V2::Table]
|
|
621
|
+
# @param service [Google::Cloud::Bigtable::Service]
|
|
622
|
+
# @param view [Symbol] View type.
|
|
623
|
+
# @return [Google::Cloud::Bigtable::Table]
|
|
624
|
+
#
|
|
625
|
+
def self.from_grpc grpc, service, view: nil
|
|
626
|
+
new grpc, service, view: view
|
|
627
|
+
end
|
|
628
|
+
|
|
629
|
+
# @private
|
|
630
|
+
# Creates a new Table object from table path.
|
|
631
|
+
#
|
|
632
|
+
# @param path [String] Table path.
|
|
633
|
+
# Formatted table path
|
|
634
|
+
# +projects/<project>/instances/<instance>/tables/<table>+
|
|
635
|
+
# @param service [Google::Cloud::Bigtable::Service]
|
|
636
|
+
# @return [Google::Cloud::Bigtable::Table]
|
|
637
|
+
#
|
|
638
|
+
def self.from_path path, service
|
|
639
|
+
grpc = Google::Bigtable::Admin::V2::Table.new name: path
|
|
640
|
+
new grpc, service, view: :NAME_ONLY
|
|
641
|
+
end
|
|
642
|
+
|
|
643
|
+
protected
|
|
644
|
+
|
|
645
|
+
# @private
|
|
646
|
+
# Raises an error unless an active connection to the service is
|
|
647
|
+
# available.
|
|
648
|
+
#
|
|
649
|
+
def ensure_service!
|
|
650
|
+
raise "Must have active connection to service" unless service
|
|
651
|
+
end
|
|
652
|
+
|
|
653
|
+
FIELDS_BY_VIEW = {
|
|
654
|
+
SCHEMA_VIEW: ["granularity", "column_families"],
|
|
655
|
+
REPLICATION_VIEW: ["cluster_states"],
|
|
656
|
+
FULL: ["granularity", "column_families", "cluster_states"]
|
|
657
|
+
}.freeze
|
|
658
|
+
|
|
659
|
+
# @private
|
|
660
|
+
#
|
|
661
|
+
# Checks and reloads table with expected view and sets fields.
|
|
662
|
+
# @param view [Symbol] Expected view type.
|
|
663
|
+
#
|
|
664
|
+
def check_view_and_load view
|
|
665
|
+
ensure_service!
|
|
666
|
+
@loaded_views ||= Set.new [@view]
|
|
667
|
+
|
|
668
|
+
return if @loaded_views.include?(view) || @loaded_views.include?(:FULL)
|
|
669
|
+
|
|
670
|
+
grpc = service.get_table instance_id, table_id, view: view
|
|
671
|
+
@loaded_views << view
|
|
672
|
+
|
|
673
|
+
FIELDS_BY_VIEW[view].each do |field|
|
|
674
|
+
case grpc[field]
|
|
675
|
+
when Google::Protobuf::Map
|
|
676
|
+
@grpc[field].clear
|
|
677
|
+
grpc[field].each { |k, v| @grpc[field][k] = v }
|
|
678
|
+
else
|
|
679
|
+
@grpc[field] = grpc[field]
|
|
680
|
+
end
|
|
681
|
+
end
|
|
682
|
+
end
|
|
683
|
+
end
|
|
684
|
+
end
|
|
685
|
+
end
|
|
686
|
+
end
|