google-cloud-bigtable 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +19 -0
  3. data/AUTHENTICATION.md +177 -0
  4. data/CHANGELOG.md +223 -0
  5. data/CODE_OF_CONDUCT.md +40 -0
  6. data/CONTRIBUTING.md +188 -0
  7. data/EMULATOR.md +30 -0
  8. data/LICENSE +201 -0
  9. data/LOGGING.md +32 -0
  10. data/OVERVIEW.md +400 -0
  11. data/TROUBLESHOOTING.md +31 -0
  12. data/lib/google-cloud-bigtable.rb +171 -0
  13. data/lib/google/bigtable/admin/v2/bigtable_instance_admin_pb.rb +145 -0
  14. data/lib/google/bigtable/admin/v2/bigtable_instance_admin_services_pb.rb +90 -0
  15. data/lib/google/bigtable/admin/v2/bigtable_table_admin_pb.rb +208 -0
  16. data/lib/google/bigtable/admin/v2/bigtable_table_admin_services_pb.rb +154 -0
  17. data/lib/google/bigtable/admin/v2/common_pb.rb +30 -0
  18. data/lib/google/bigtable/admin/v2/instance_pb.rb +74 -0
  19. data/lib/google/bigtable/admin/v2/table_pb.rb +127 -0
  20. data/lib/google/bigtable/v2/bigtable_pb.rb +113 -0
  21. data/lib/google/bigtable/v2/bigtable_services_pb.rb +68 -0
  22. data/lib/google/bigtable/v2/data_pb.rb +156 -0
  23. data/lib/google/cloud/bigtable.rb +184 -0
  24. data/lib/google/cloud/bigtable/admin.rb +202 -0
  25. data/lib/google/cloud/bigtable/admin/credentials.rb +27 -0
  26. data/lib/google/cloud/bigtable/admin/v2.rb +223 -0
  27. data/lib/google/cloud/bigtable/admin/v2/bigtable_instance_admin_client.rb +1451 -0
  28. data/lib/google/cloud/bigtable/admin/v2/bigtable_instance_admin_client_config.json +139 -0
  29. data/lib/google/cloud/bigtable/admin/v2/bigtable_table_admin_client.rb +1734 -0
  30. data/lib/google/cloud/bigtable/admin/v2/bigtable_table_admin_client_config.json +163 -0
  31. data/lib/google/cloud/bigtable/admin/v2/credentials.rb +51 -0
  32. data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/bigtable_instance_admin.rb +297 -0
  33. data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/bigtable_table_admin.rb +587 -0
  34. data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/instance.rb +193 -0
  35. data/lib/google/cloud/bigtable/admin/v2/doc/google/bigtable/admin/v2/table.rb +303 -0
  36. data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/iam_policy.rb +64 -0
  37. data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/options.rb +33 -0
  38. data/lib/google/cloud/bigtable/admin/v2/doc/google/iam/v1/policy.rb +151 -0
  39. data/lib/google/cloud/bigtable/admin/v2/doc/google/longrunning/operations.rb +51 -0
  40. data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/any.rb +131 -0
  41. data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/duration.rb +91 -0
  42. data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/empty.rb +29 -0
  43. data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/field_mask.rb +222 -0
  44. data/lib/google/cloud/bigtable/admin/v2/doc/google/protobuf/timestamp.rb +113 -0
  45. data/lib/google/cloud/bigtable/admin/v2/doc/google/rpc/status.rb +39 -0
  46. data/lib/google/cloud/bigtable/admin/v2/doc/google/type/expr.rb +45 -0
  47. data/lib/google/cloud/bigtable/app_profile.rb +439 -0
  48. data/lib/google/cloud/bigtable/app_profile/job.rb +99 -0
  49. data/lib/google/cloud/bigtable/app_profile/list.rb +165 -0
  50. data/lib/google/cloud/bigtable/backup.rb +324 -0
  51. data/lib/google/cloud/bigtable/backup/job.rb +87 -0
  52. data/lib/google/cloud/bigtable/backup/list.rb +167 -0
  53. data/lib/google/cloud/bigtable/chunk_processor.rb +241 -0
  54. data/lib/google/cloud/bigtable/cluster.rb +390 -0
  55. data/lib/google/cloud/bigtable/cluster/job.rb +88 -0
  56. data/lib/google/cloud/bigtable/cluster/list.rb +171 -0
  57. data/lib/google/cloud/bigtable/column_family.rb +73 -0
  58. data/lib/google/cloud/bigtable/column_family_map.rb +426 -0
  59. data/lib/google/cloud/bigtable/column_range.rb +194 -0
  60. data/lib/google/cloud/bigtable/convert.rb +83 -0
  61. data/lib/google/cloud/bigtable/credentials.rb +25 -0
  62. data/lib/google/cloud/bigtable/errors.rb +38 -0
  63. data/lib/google/cloud/bigtable/gc_rule.rb +334 -0
  64. data/lib/google/cloud/bigtable/instance.rb +935 -0
  65. data/lib/google/cloud/bigtable/instance/cluster_map.rb +74 -0
  66. data/lib/google/cloud/bigtable/instance/job.rb +98 -0
  67. data/lib/google/cloud/bigtable/instance/list.rb +164 -0
  68. data/lib/google/cloud/bigtable/longrunning_job.rb +122 -0
  69. data/lib/google/cloud/bigtable/mutation_entry.rb +256 -0
  70. data/lib/google/cloud/bigtable/mutation_operations.rb +357 -0
  71. data/lib/google/cloud/bigtable/policy.rb +167 -0
  72. data/lib/google/cloud/bigtable/project.rb +471 -0
  73. data/lib/google/cloud/bigtable/read_modify_write_rule.rb +134 -0
  74. data/lib/google/cloud/bigtable/read_operations.rb +328 -0
  75. data/lib/google/cloud/bigtable/routing_policy.rb +172 -0
  76. data/lib/google/cloud/bigtable/row.rb +136 -0
  77. data/lib/google/cloud/bigtable/row_filter.rb +639 -0
  78. data/lib/google/cloud/bigtable/row_filter/chain_filter.rb +590 -0
  79. data/lib/google/cloud/bigtable/row_filter/condition_filter.rb +114 -0
  80. data/lib/google/cloud/bigtable/row_filter/interleave_filter.rb +621 -0
  81. data/lib/google/cloud/bigtable/row_filter/simple_filter.rb +287 -0
  82. data/lib/google/cloud/bigtable/row_range.rb +179 -0
  83. data/lib/google/cloud/bigtable/rows_mutator.rb +113 -0
  84. data/lib/google/cloud/bigtable/rows_reader.rb +200 -0
  85. data/lib/google/cloud/bigtable/sample_row_key.rb +85 -0
  86. data/lib/google/cloud/bigtable/service.rb +913 -0
  87. data/lib/google/cloud/bigtable/status.rb +76 -0
  88. data/lib/google/cloud/bigtable/table.rb +686 -0
  89. data/lib/google/cloud/bigtable/table/cluster_state.rb +125 -0
  90. data/lib/google/cloud/bigtable/table/list.rb +154 -0
  91. data/lib/google/cloud/bigtable/table/restore_job.rb +117 -0
  92. data/lib/google/cloud/bigtable/v2.rb +146 -0
  93. data/lib/google/cloud/bigtable/v2/bigtable_client.rb +591 -0
  94. data/lib/google/cloud/bigtable/v2/bigtable_client_config.json +83 -0
  95. data/lib/google/cloud/bigtable/v2/credentials.rb +46 -0
  96. data/lib/google/cloud/bigtable/v2/doc/google/bigtable/v2/bigtable.rb +290 -0
  97. data/lib/google/cloud/bigtable/v2/doc/google/bigtable/v2/data.rb +493 -0
  98. data/lib/google/cloud/bigtable/v2/doc/google/protobuf/any.rb +131 -0
  99. data/lib/google/cloud/bigtable/v2/doc/google/protobuf/wrappers.rb +34 -0
  100. data/lib/google/cloud/bigtable/v2/doc/google/rpc/status.rb +39 -0
  101. data/lib/google/cloud/bigtable/value_range.rb +181 -0
  102. data/lib/google/cloud/bigtable/version.rb +22 -0
  103. metadata +337 -0
@@ -0,0 +1,935 @@
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/instance/job"
19
+ require "google/cloud/bigtable/instance/list"
20
+ require "google/cloud/bigtable/instance/cluster_map"
21
+ require "google/cloud/bigtable/app_profile"
22
+ require "google/cloud/bigtable/policy"
23
+ require "google/cloud/bigtable/routing_policy"
24
+
25
+ module Google
26
+ module Cloud
27
+ module Bigtable
28
+ ##
29
+ # # Instance
30
+ #
31
+ # Represents a Bigtable instance. Instances are dedicated Bigtable
32
+ # storage resources that contain Bigtable tables.
33
+ #
34
+ # See {Google::Cloud::Bigtable::Project#instances},
35
+ # {Google::Cloud::Bigtable::Project#instance}, and
36
+ # {Google::Cloud::Bigtable::Project#create_instance}.
37
+ #
38
+ # @example
39
+ # require "google/cloud/bigtable"
40
+ #
41
+ # bigtable = Google::Cloud::Bigtable.new
42
+ #
43
+ # job = bigtable.create_instance(
44
+ # "my-instance",
45
+ # display_name: "Instance for user data",
46
+ # type: :DEVELOPMENT,
47
+ # labels: { "env" => "dev"}
48
+ # ) do |clusters|
49
+ # clusters.add("test-cluster", "us-east1-b") # nodes not allowed
50
+ # end
51
+ #
52
+ # job.done? #=> false
53
+ #
54
+ # # To block until the operation completes.
55
+ # job.wait_until_done!
56
+ # job.done? #=> true
57
+ #
58
+ # if job.error?
59
+ # status = job.error
60
+ # else
61
+ # instance = job.instance
62
+ # end
63
+ #
64
+ class Instance
65
+ # @private
66
+ # The gRPC Service object.
67
+ attr_accessor :service
68
+
69
+ # @private
70
+ #
71
+ # Creates a new Instance instance.
72
+ def initialize grpc, service
73
+ @grpc = grpc
74
+ @service = service
75
+ end
76
+
77
+ ##
78
+ # The unique identifier for the project to which the instance belongs.
79
+ #
80
+ # @return [String]
81
+ #
82
+ def project_id
83
+ @grpc.name.split("/")[1]
84
+ end
85
+
86
+ ##
87
+ # The unique identifier for the instance.
88
+ #
89
+ # @return [String]
90
+ #
91
+ def instance_id
92
+ @grpc.name.split("/")[3]
93
+ end
94
+
95
+ ##
96
+ # The descriptive name for the instance as it appears in UIs. Must be
97
+ # unique per project and between 4 and 30 characters long.
98
+ #
99
+ # @return [String]
100
+ #
101
+ def display_name
102
+ @grpc.display_name
103
+ end
104
+
105
+ ##
106
+ # Updates the descriptive name for the instance as it appears in UIs.
107
+ # Can be changed at any time, but should be kept globally unique
108
+ # to avoid confusion.
109
+ #
110
+ # @param value [String] The descriptive name for the instance.
111
+ #
112
+ def display_name= value
113
+ @grpc.display_name = value
114
+ end
115
+
116
+ ##
117
+ # The full path for the instance resource. Values are of the form
118
+ # `projects/<project_id>/instances/<instance_id>`.
119
+ #
120
+ # @return [String]
121
+ #
122
+ def path
123
+ @grpc.name
124
+ end
125
+
126
+ ##
127
+ # The current instance state. Possible values are `:CREATING`,
128
+ # `:READY`, `:STATE_NOT_KNOWN`.
129
+ #
130
+ # @return [Symbol]
131
+ #
132
+ def state
133
+ @grpc.state
134
+ end
135
+
136
+ ##
137
+ # The instance has been successfully created and can serve requests
138
+ # to its tables.
139
+ #
140
+ # @return [Boolean]
141
+ #
142
+ def ready?
143
+ state == :READY
144
+ end
145
+
146
+ ##
147
+ # The instance is currently being created and may be destroyed if the
148
+ # creation process encounters an error.
149
+ #
150
+ # @return [Boolean]
151
+ #
152
+ def creating?
153
+ state == :CREATING
154
+ end
155
+
156
+ ##
157
+ # Instance type. Possible values include `:DEVELOPMENT` and `:PRODUCTION`.
158
+ #
159
+ # @return [Symbol]
160
+ #
161
+ def type
162
+ @grpc.type
163
+ end
164
+
165
+ ##
166
+ # The instance is meant for development and testing purposes only; it has
167
+ # no performance or uptime guarantees and is not covered by SLA.
168
+ # After a development instance is created, it can be upgraded by
169
+ # updating the instance to type `:PRODUCTION`. An instance created
170
+ # as a production instance cannot be changed to a development instance.
171
+ # When creating a development instance, `nodes` on the cluster must
172
+ # not be set. (See {#create_cluster}.)
173
+ #
174
+ # @return [Boolean]
175
+ #
176
+ def development?
177
+ type == :DEVELOPMENT
178
+ end
179
+
180
+ ##
181
+ # An instance meant for production use. Requires that `nodes` must be set
182
+ # on the cluster. (See {#create_cluster}.)
183
+ #
184
+ # @return [Boolean]
185
+ #
186
+ def production?
187
+ type == :PRODUCTION
188
+ end
189
+
190
+ ##
191
+ # Sets the instance type.
192
+ #
193
+ # Valid values are `:DEVELOPMENT` and `:PRODUCTION`.
194
+ # After a development instance is created, it can be upgraded
195
+ # by updating the instance to type `:PRODUCTION`.
196
+ # An instance created as a production instance cannot be changed to a
197
+ # development instance.
198
+ #
199
+ # @param instance_type [Symbol]
200
+ #
201
+ # @example
202
+ # require "google/cloud/bigtable"
203
+ #
204
+ # bigtable = Google::Cloud::Bigtable.new
205
+ #
206
+ # instance = bigtable.instance("my-instance")
207
+ #
208
+ # instance.development? # true
209
+ # instance.type = :PRODUCTION
210
+ # instance.development? # false
211
+ # instance.production? # true
212
+ #
213
+ def type= instance_type
214
+ @grpc.type = instance_type
215
+ end
216
+
217
+ ##
218
+ # Gets the Cloud Labels for the instance.
219
+ #
220
+ # Cloud Labels are a flexible and lightweight mechanism for organizing
221
+ # cloud resources into groups that reflect a customer's organizational
222
+ # needs and deployment strategies. Cloud Labels can be used to filter
223
+ # collections of resources, to control how resource
224
+ # metrics are aggregated, and as arguments to policy
225
+ # management rules (e.g., route, firewall, load balancing, etc.).
226
+ #
227
+ # * Label keys must be between 1 and 63 characters long and must conform
228
+ # to the following regular expression: `[a-z]([-a-z0-9]*[a-z0-9])?`.
229
+ # * Label values must be between 0 and 63 characters long and must
230
+ # conform to the regular expression `([a-z]([-a-z0-9]*[a-z0-9])?)?`.
231
+ # * No more than 64 labels can be associated with a given resource.
232
+ #
233
+ # @return [Hash{String=>String}] The label keys and values in a hash.
234
+ #
235
+ def labels
236
+ @grpc.labels
237
+ end
238
+
239
+ ##
240
+ # Sets the Cloud Labels for the instance.
241
+ #
242
+ # @param labels [Hash{String=>String}] The Cloud Labels.
243
+ #
244
+ def labels= labels
245
+ labels ||= {}
246
+ @grpc.labels = Google::Protobuf::Map.new(
247
+ :string, :string,
248
+ Hash[labels.map { |k, v| [String(k), String(v)] }]
249
+ )
250
+ end
251
+
252
+ ##
253
+ # Updates the instance.
254
+ #
255
+ # Updatable attributes are:
256
+ # * `display_name` - The descriptive name for the instance.
257
+ # * `type` - `:DEVELOPMENT` type instance can be upgraded to `:PRODUCTION` instance.
258
+ # An instance created as a production instance cannot be changed to a development instance.
259
+ # * `labels` - Cloud Labels are a flexible and lightweight mechanism for organizing cloud resources.
260
+ #
261
+ # @return [Google::Cloud::Bigtable::Instance::Job]
262
+ # The job representing the long-running, asynchronous processing of
263
+ # an instance update operation.
264
+ #
265
+ # @example
266
+ # require "google/cloud/bigtable"
267
+ #
268
+ # bigtable = Google::Cloud::Bigtable.new
269
+ #
270
+ # instance = bigtable.instance("my-instance")
271
+ # instance.display_name = "My app dev instance" # Set display name
272
+ # instance.labels = { env: "dev", data: "users" }
273
+ # job = instance.save
274
+ #
275
+ # job.done? #=> false
276
+ #
277
+ # # Reload job until completion.
278
+ # job.wait_until_done!
279
+ # job.done? #=> true
280
+ #
281
+ # if job.error?
282
+ # puts job.error
283
+ # else
284
+ # instance = job.instance
285
+ # puts instance.name
286
+ # puts instance.labels
287
+ # end
288
+ #
289
+ def save
290
+ ensure_service!
291
+ update_mask = Google::Protobuf::FieldMask.new paths: ["labels", "display_name", "type"]
292
+ grpc = service.partial_update_instance @grpc, update_mask
293
+ Instance::Job.from_grpc grpc, service
294
+ end
295
+ alias update save
296
+
297
+ ##
298
+ # Reloads instance data.
299
+ #
300
+ # @return [Google::Cloud::Bigtable::Instance]
301
+ #
302
+ def reload!
303
+ @grpc = service.get_instance instance_id
304
+ self
305
+ end
306
+
307
+ ##
308
+ # Permanently deletes the instance from the project.
309
+ #
310
+ # @return [Boolean] Returns `true` if the instance was deleted.
311
+ #
312
+ # @example
313
+ # require "google/cloud/bigtable"
314
+ #
315
+ # bigtable = Google::Cloud::Bigtable.new
316
+ #
317
+ # instance = bigtable.instance("my-instance")
318
+ # instance.delete
319
+ #
320
+ def delete
321
+ ensure_service!
322
+ service.delete_instance instance_id
323
+ true
324
+ end
325
+
326
+ ##
327
+ # Lists the clusters in the instance.
328
+ #
329
+ # See {Google::Cloud::Bigtable::Cluster#delete} and
330
+ # {Google::Cloud::Bigtable::Cluster#save}.
331
+ #
332
+ # @param token [String] The `token` value returned by the last call to
333
+ # `clusters`; indicates that this is a continuation of a call
334
+ # and that the system should return the next page of data.
335
+ # @return [Array<Google::Cloud::Bigtable::Cluster>]
336
+ # See({Google::Cloud::Bigtable::Cluster::List})
337
+ #
338
+ # @example
339
+ # require "google/cloud/bigtable"
340
+ #
341
+ # bigtable = Google::Cloud::Bigtable.new
342
+ #
343
+ # instance = bigtable.instance("my-instance")
344
+ #
345
+ # instance.clusters.all do |cluster|
346
+ # puts cluster.cluster_id
347
+ # end
348
+ #
349
+ def clusters token: nil
350
+ ensure_service!
351
+ grpc = service.list_clusters instance_id, token: token
352
+ Cluster::List.from_grpc grpc, service, instance_id: instance_id
353
+ end
354
+
355
+ ##
356
+ # Gets a cluster in the instance.
357
+ #
358
+ # See {Google::Cloud::Bigtable::Cluster#delete} and
359
+ # {Google::Cloud::Bigtable::Cluster#save}.
360
+ #
361
+ # @param cluster_id [String] The unique ID of the requested cluster.
362
+ # @return [Google::Cloud::Bigtable::Cluster, nil]
363
+ #
364
+ # @example
365
+ # require "google/cloud/bigtable"
366
+ #
367
+ # bigtable = Google::Cloud::Bigtable.new
368
+ #
369
+ # instance = bigtable.instance("my-instance")
370
+ #
371
+ # cluster = instance.cluster("my-instance-cluster")
372
+ # puts cluster.cluster_id
373
+ #
374
+ def cluster cluster_id
375
+ ensure_service!
376
+ grpc = service.get_cluster instance_id, cluster_id
377
+ Cluster.from_grpc grpc, service
378
+ rescue Google::Cloud::NotFoundError
379
+ nil
380
+ end
381
+
382
+ ##
383
+ # Creates a cluster in the instance.
384
+ #
385
+ # @param cluster_id [String]
386
+ # The ID to be used when referring to the new cluster within its instance.
387
+ # @param location [String]
388
+ # The location where this cluster's nodes and storage reside. For best
389
+ # performance, clients should be located as close as possible to this
390
+ # cluster. Example: "us-east-1b"
391
+ # @param nodes [Integer] The number of nodes allocated to this cluster.
392
+ # More nodes enable higher throughput and more consistent performance.
393
+ # @param storage_type [Symbol] Storage type.
394
+ # The type of storage used by this cluster to serve its
395
+ # parent instance's tables.
396
+ # Valid types are:
397
+ # * `:SSD` - Flash (SSD) storage.
398
+ # * `:HDD` - Magnetic drive (HDD).
399
+ # @return [Google::Cloud::Bigtable::Cluster::Job]
400
+ #
401
+ # @example
402
+ # require "google/cloud/bigtable"
403
+ #
404
+ # bigtable = Google::Cloud::Bigtable.new
405
+ #
406
+ # instance = bigtable.instance("my-instance")
407
+ # job = instance.create_cluster(
408
+ # "my-new-cluster",
409
+ # "us-east-1b",
410
+ # nodes: 3,
411
+ # storage_type: :SSD
412
+ # )
413
+ #
414
+ # job.done? #=> false
415
+ #
416
+ # # To block until the operation completes.
417
+ # job.wait_until_done!
418
+ # job.done? #=> true
419
+ #
420
+ # if job.error?
421
+ # status = job.error
422
+ # else
423
+ # cluster = job.cluster
424
+ # end
425
+ #
426
+ def create_cluster cluster_id, location, nodes: nil, storage_type: nil
427
+ ensure_service!
428
+ attrs = {
429
+ serve_nodes: nodes,
430
+ default_storage_type: storage_type,
431
+ location: location
432
+ }.delete_if { |_, v| v.nil? }
433
+
434
+ cluster = Google::Bigtable::Admin::V2::Cluster.new attrs
435
+ grpc = service.create_cluster instance_id, cluster_id, cluster
436
+ Cluster::Job.from_grpc grpc, service
437
+ end
438
+
439
+ ##
440
+ # Lists all tables in the instance.
441
+ #
442
+ # See {Google::Cloud::Bigtable::Table#delete} and
443
+ # {Google::Cloud::Bigtable::Table#save}.
444
+ #
445
+ # @return [Array<Google::Cloud::Bigtable::Table>]
446
+ # (See {Google::Cloud::Bigtable::Table::List})
447
+ #
448
+ # @example
449
+ # require "google/cloud/bigtable"
450
+ #
451
+ # bigtable = Google::Cloud::Bigtable.new
452
+ #
453
+ # instance = bigtable.instance("my-instance")
454
+ #
455
+ # # Default name-only view
456
+ # instance.tables.all do |table|
457
+ # puts table.name
458
+ # end
459
+ #
460
+ def tables
461
+ ensure_service!
462
+ grpc = service.list_tables instance_id
463
+ Table::List.from_grpc grpc, service
464
+ end
465
+
466
+ ##
467
+ # Gets metadata information of a table in the instance.
468
+ #
469
+ # @param view [Symbol]
470
+ # The view to be applied to the returned tables' fields.
471
+ # Defaults to `SCHEMA_VIEW` if unspecified.
472
+ # Valid view types are.
473
+ # * `:NAME_ONLY` - Only populates `name`
474
+ # * `:SCHEMA_VIEW` - Only populates `name` and fields related to the table's schema
475
+ # * `:REPLICATION_VIEW` - Only populates `name` and fields related to the table's replication state.
476
+ # * `:FULL` - Populates all fields
477
+ # @param perform_lookup [Boolean] Creates table object without verifying
478
+ # that the table resource exists.
479
+ # Calls made on this object will raise errors if the table
480
+ # does not exist. Default value is `false`. Optional.
481
+ # Helps to reduce admin API calls.
482
+ # @param app_profile_id [String] The unique identifier for the app profile. Optional.
483
+ # Used only in data operations.
484
+ # This value specifies routing for replication. If not specified, the
485
+ # "default" application profile will be used.
486
+ # @return [Google::Cloud::Bigtable::Table]
487
+ #
488
+ # @example
489
+ # require "google/cloud/bigtable"
490
+ #
491
+ # bigtable = Google::Cloud::Bigtable.new
492
+ #
493
+ # instance = bigtable.instance("my-instance")
494
+ #
495
+ # table = instance.table("my-table", perform_lookup: true)
496
+ # puts table.name
497
+ # puts table.column_families
498
+ #
499
+ # # Name-only view
500
+ # table = instance.table("my-table", view: :NAME_ONLY, perform_lookup: true)
501
+ # puts table.name
502
+ #
503
+ # @example Mutate rows.
504
+ # require "google/cloud/bigtable"
505
+ #
506
+ # bigtable = Google::Cloud::Bigtable.new
507
+ #
508
+ # table = bigtable.table("my-instance", "my-table")
509
+ #
510
+ # entry = table.new_mutation_entry("user-1")
511
+ # entry.set_cell(
512
+ # "cf-1",
513
+ # "field-1",
514
+ # "XYZ",
515
+ # timestamp: (Time.now.to_f * 1000000).round(-3) # microseconds
516
+ # ).delete_cells("cf2", "field02")
517
+ #
518
+ # table.mutate_row(entry)
519
+ #
520
+ def table table_id, view: nil, perform_lookup: nil, app_profile_id: nil
521
+ ensure_service!
522
+
523
+ table = if perform_lookup
524
+ grpc = service.get_table instance_id, table_id, view: view
525
+ Table.from_grpc grpc, service, view: view
526
+ else
527
+ Table.from_path service.table_path(instance_id, table_id), service
528
+ end
529
+
530
+ table.app_profile_id = app_profile_id
531
+ table
532
+ rescue Google::Cloud::NotFoundError
533
+ nil
534
+ end
535
+
536
+ ##
537
+ # Creates a new table in the instance.
538
+ #
539
+ # The table can be created with a full set of initial column families,
540
+ # specified in the request.
541
+ #
542
+ # @param name [String]
543
+ # The name by which the new table should be referred to within the parent
544
+ # instance.
545
+ # @param column_families [Google::Cloud::Bigtable::ColumnFamilyMap]
546
+ # An object containing the column families for the table, mapped by
547
+ # column family name.
548
+ # @param granularity [Symbol]
549
+ # The granularity at which timestamps are stored in this table.
550
+ # Timestamps not matching the granularity will be rejected.
551
+ # Valid value is `:MILLIS`.
552
+ # If unspecified, the value will be set to `:MILLIS`.
553
+ # @param initial_splits [Array<String>]
554
+ # The optional list of row keys that will be used to initially split the
555
+ # table into several tablets (tablets are similar to HBase regions).
556
+ # Given two split keys, `s1` and `s2`, three tablets will be created,
557
+ # spanning the key ranges: `[, s1), [s1, s2), [s2, )`.
558
+ #
559
+ # Example:
560
+ #
561
+ # * Row keys := `["a", "apple", "custom", "customer_1", "customer_2", "other", "zz"]`
562
+ # * initial_split_keys := `["apple", "customer_1", "customer_2", "other"]`
563
+ # * Key assignment:
564
+ # * Tablet 1 : `[, apple) => {"a"}`
565
+ # * Tablet 2 : `[apple, customer_1) => {"apple", "custom"}`
566
+ # * Tablet 3 : `[customer_1, customer_2) => {"customer_1"}`
567
+ # * Tablet 4 : `[customer_2, other) => {"customer_2"}`
568
+ # * Tablet 5 : `[other, ) => {"other", "zz"}`
569
+ # A hash in the form of `Google::Bigtable::Admin::V2::CreateTableRequest::Split`
570
+ # can also be provided.
571
+ # @yield [column_families] A block for adding column families.
572
+ # @yieldparam [Google::Cloud::Bigtable::ColumnFamilyMap] column_families
573
+ # A mutable object containing the column families for the table,
574
+ # mapped by column family name.
575
+ #
576
+ # @return [Google::Cloud::Bigtable::Table]
577
+ #
578
+ # @example Create a table without column families.
579
+ # require "google/cloud/bigtable"
580
+ #
581
+ # bigtable = Google::Cloud::Bigtable.new
582
+ #
583
+ # instance = bigtable.instance("my-instance")
584
+ #
585
+ # table = instance.create_table("my-table")
586
+ # puts table.name
587
+ #
588
+ # @example Create a table with initial splits and column families.
589
+ # require "google/cloud/bigtable"
590
+ #
591
+ # bigtable = Google::Cloud::Bigtable.new
592
+ #
593
+ # instance = bigtable.instance("my-instance")
594
+ #
595
+ # initial_splits = ["user-00001", "user-100000", "others"]
596
+ # table = instance.create_table("my-table", initial_splits: initial_splits) do |cfm|
597
+ # cfm.add('cf1', gc_rule: Google::Cloud::Bigtable::GcRule.max_versions(5))
598
+ # cfm.add('cf2', gc_rule: Google::Cloud::Bigtable::GcRule.max_age(600))
599
+ #
600
+ # gc_rule = Google::Cloud::Bigtable::GcRule.union(
601
+ # Google::Cloud::Bigtable::GcRule.max_age(1800),
602
+ # Google::Cloud::Bigtable::GcRule.max_versions(3)
603
+ # )
604
+ # cfm.add('cf3', gc_rule: gc_rule)
605
+ # end
606
+ #
607
+ # puts table
608
+ #
609
+ def create_table name, column_families: nil, granularity: nil, initial_splits: nil, &block
610
+ ensure_service!
611
+ Table.create(
612
+ service,
613
+ instance_id,
614
+ name,
615
+ column_families: column_families,
616
+ granularity: granularity,
617
+ initial_splits: initial_splits,
618
+ &block
619
+ )
620
+ end
621
+
622
+ ##
623
+ # Creates an app profile for the instance with a routing policy.
624
+ # Only one routing policy can applied to the app profile. The policy can be
625
+ # multi-cluster routing or single cluster routing.
626
+ #
627
+ # @param name [String] Unique ID of the app profile.
628
+ # @param routing_policy [Google::Cloud::Bigtable::RoutingPolicy]
629
+ # The routing policy for all read/write requests that use this app
630
+ # profile. A value must be explicitly set.
631
+ #
632
+ # Routing Policies:
633
+ # * {Google::Cloud::Bigtable::MultiClusterRoutingUseAny} - Read/write
634
+ # requests may be routed to any cluster in the instance and will
635
+ # fail over to another cluster in the event of transient errors or
636
+ # delays. Choosing this option sacrifices read-your-writes
637
+ # consistency to improve availability.
638
+ # * {Google::Cloud::Bigtable::SingleClusterRouting} - Unconditionally
639
+ # routes all read/write requests to a specific cluster. This option
640
+ # preserves read-your-writes consistency but does not improve
641
+ # availability. Value contains `cluster_id` and optional field
642
+ # `allow_transactional_writes`.
643
+ # @param description [String] Description of the use case for this app profile.
644
+ # @param etag [String]
645
+ # Strongly validated etag for optimistic concurrency control. Preserve the
646
+ # value returned from `GetAppProfile` when calling `UpdateAppProfile` to
647
+ # fail the request if there has been a modification in the meantime. The
648
+ # `update_mask` of the request need not include `etag` for this protection
649
+ # to apply.
650
+ # See [Wikipedia](https://en.wikipedia.org/wiki/HTTP_ETag) and
651
+ # [RFC 7232](https://tools.ietf.org/html/rfc7232#section-2.3) for more details.
652
+ # @param ignore_warnings [Boolean]
653
+ # If true, ignore safety checks when creating the app profile.
654
+ # Default value is `false`.
655
+ # @return [Google::Cloud::Bigtable::AppProfile]
656
+ #
657
+ # @example Create an app profile with a single cluster routing policy.
658
+ # require "google/cloud/bigtable"
659
+ #
660
+ # bigtable = Google::Cloud::Bigtable.new
661
+ #
662
+ # instance = bigtable.instance("my-instance")
663
+ #
664
+ # routing_policy = Google::Cloud::Bigtable::AppProfile.single_cluster_routing(
665
+ # "my-instance-cluster-1",
666
+ # allow_transactional_writes: true
667
+ # )
668
+ #
669
+ # app_profile = instance.create_app_profile(
670
+ # "my-app-profile",
671
+ # routing_policy,
672
+ # description: "App profile for user data instance"
673
+ # )
674
+ # puts app_profile.name
675
+ #
676
+ # @example Create an app profile with multi-cluster routing policy.
677
+ # require "google/cloud/bigtable"
678
+ #
679
+ # bigtable = Google::Cloud::Bigtable.new
680
+ #
681
+ # instance = bigtable.instance("my-instance")
682
+ #
683
+ # routing_policy = Google::Cloud::Bigtable::AppProfile.multi_cluster_routing
684
+ #
685
+ # app_profile = instance.create_app_profile(
686
+ # "my-app-profile",
687
+ # routing_policy,
688
+ # description: "App profile for user data instance"
689
+ # )
690
+ # puts app_profile.name
691
+ #
692
+ # @example Create app profile and ignore warnings.
693
+ # require "google/cloud/bigtable"
694
+ #
695
+ # bigtable = Google::Cloud::Bigtable.new
696
+ #
697
+ # instance = bigtable.instance("my-instance")
698
+ #
699
+ # routing_policy = Google::Cloud::Bigtable::AppProfile.multi_cluster_routing
700
+ #
701
+ # app_profile = instance.create_app_profile(
702
+ # "my-app-profile",
703
+ # routing_policy,
704
+ # description: "App profile for user data instance",
705
+ # ignore_warnings: true
706
+ # )
707
+ # puts app_profile.name
708
+ #
709
+ def create_app_profile name, routing_policy, description: nil, etag: nil, ignore_warnings: false
710
+ ensure_service!
711
+ routing_policy_grpc = routing_policy.to_grpc
712
+ if routing_policy_grpc.is_a? Google::Bigtable::Admin::V2::AppProfile::MultiClusterRoutingUseAny
713
+ multi_cluster_routing = routing_policy_grpc
714
+ else
715
+ single_cluster_routing = routing_policy_grpc
716
+ end
717
+
718
+ app_profile_attrs = {
719
+ multi_cluster_routing_use_any: multi_cluster_routing,
720
+ single_cluster_routing: single_cluster_routing,
721
+ description: description,
722
+ etag: etag
723
+ }.delete_if { |_, v| v.nil? }
724
+
725
+ grpc = service.create_app_profile(
726
+ instance_id,
727
+ name,
728
+ Google::Bigtable::Admin::V2::AppProfile.new(app_profile_attrs),
729
+ ignore_warnings: ignore_warnings
730
+ )
731
+ AppProfile.from_grpc grpc, service
732
+ end
733
+
734
+ ##
735
+ # Gets an app profile in the instance.
736
+ #
737
+ # See {Google::Cloud::Bigtable::AppProfile#delete} and
738
+ # {Google::Cloud::Bigtable::AppProfile#save}.
739
+ #
740
+ # @param app_profile_id [String] The unique name of the requested app profile.
741
+ # @return [Google::Cloud::Bigtable::AppProfile, nil]
742
+ #
743
+ # @example
744
+ # require "google/cloud/bigtable"
745
+ #
746
+ # bigtable = Google::Cloud::Bigtable.new
747
+ #
748
+ # instance = bigtable.instance("my-instance")
749
+ #
750
+ # app_profile = instance.app_profile("my-app-profile")
751
+ #
752
+ # if app_profile
753
+ # puts app_profile.name
754
+ # end
755
+ #
756
+ def app_profile app_profile_id
757
+ ensure_service!
758
+ grpc = service.get_app_profile instance_id, app_profile_id
759
+ AppProfile.from_grpc grpc, service
760
+ rescue Google::Cloud::NotFoundError
761
+ nil
762
+ end
763
+
764
+ ##
765
+ # Lists all app profiles in the instance.
766
+ #
767
+ # See {Google::Cloud::Bigtable::AppProfile#delete} and
768
+ # {Google::Cloud::Bigtable::AppProfile#save}.
769
+ #
770
+ # @return [Array<Google::Cloud::Bigtable::AppProfile>]
771
+ # (See {Google::Cloud::Bigtable::AppProfile::List})
772
+ #
773
+ # @example
774
+ # require "google/cloud/bigtable"
775
+ #
776
+ # bigtable = Google::Cloud::Bigtable.new
777
+ #
778
+ # instance = bigtable.instance("my-instance")
779
+ #
780
+ # instance.app_profiles.all do |app_profile|
781
+ # puts app_profile.name
782
+ # end
783
+ #
784
+ def app_profiles
785
+ ensure_service!
786
+ grpc = service.list_app_profiles instance_id
787
+ AppProfile::List.from_grpc grpc, service
788
+ end
789
+
790
+ ##
791
+ # Gets the [Cloud IAM](https://cloud.google.com/iam/) access control
792
+ # policy for the instance.
793
+ #
794
+ # @see https://cloud.google.com/bigtable/docs/access-control
795
+ #
796
+ # @yield [policy] A block for updating the policy. The latest policy
797
+ # will be read from the Bigtable service and passed to the block. After
798
+ # the block completes, the modified policy will be written to the
799
+ # service.
800
+ # @yieldparam [Policy] policy the current Cloud IAM Policy for this
801
+ # instance.
802
+ #
803
+ # @return [Policy] The current Cloud IAM Policy for the instance.
804
+ #
805
+ # @example
806
+ # require "google/cloud/bigtable"
807
+ #
808
+ # bigtable = Google::Cloud::Bigtable.new
809
+ #
810
+ # instance = bigtable.instance("my-instance")
811
+ # policy = instance.policy
812
+ #
813
+ # @example Update the policy by passing a block.
814
+ # require "google/cloud/bigtable"
815
+ #
816
+ # bigtable = Google::Cloud::Bigtable.new
817
+ # instance = bigtable.instance("my-instance")
818
+ #
819
+ # instance.policy do |p|
820
+ # p.add("roles/owner", "user:owner@example.com")
821
+ # end # 2 API calls
822
+ #
823
+ def policy
824
+ ensure_service!
825
+ grpc = service.get_instance_policy instance_id
826
+ policy = Policy.from_grpc grpc
827
+ return policy unless block_given?
828
+ yield policy
829
+ update_policy policy
830
+ end
831
+
832
+ ##
833
+ # Updates the [Cloud IAM](https://cloud.google.com/iam/) access control
834
+ # policy for the instance. The policy should be read from {#policy}.
835
+ # See {Google::Cloud::Bigtable::Policy} for an explanation of the policy
836
+ # `etag` property and how to modify policies.
837
+ #
838
+ # You can also update the policy by passing a block to {#policy}, which
839
+ # will call this method internally after the block completes.
840
+ #
841
+ # @param new_policy [Policy] a new or modified Cloud IAM Policy for this
842
+ # instance
843
+ #
844
+ # @return [Policy] The policy returned by the API update operation.
845
+ #
846
+ # @example
847
+ # require "google/cloud/bigtable"
848
+ #
849
+ # bigtable = Google::Cloud::Bigtable.new
850
+ #
851
+ # instance = bigtable.instance("my-instance")
852
+ #
853
+ # policy = instance.policy
854
+ # policy.add("roles/owner", "user:owner@example.com")
855
+ # updated_policy = instance.update_policy(policy)
856
+ #
857
+ # puts updated_policy.roles
858
+ #
859
+ def update_policy new_policy
860
+ ensure_service!
861
+ grpc = service.set_instance_policy instance_id, new_policy.to_grpc
862
+ Policy.from_grpc grpc
863
+ end
864
+ alias policy= update_policy
865
+
866
+ ##
867
+ # Tests the specified permissions against the [Cloud
868
+ # IAM](https://cloud.google.com/iam/) access control policy.
869
+ #
870
+ # @see https://cloud.google.com/iam/docs/managing-policies Managing Policies
871
+ # @see https://cloud.google.com/bigtable/docs/access-control Access Control
872
+ #
873
+ # @param permissions [String, Array<String>] permissions The set of permissions to
874
+ # check access for. Permissions with wildcards (such as `*` or
875
+ # `bigtable.*`) are not allowed.
876
+ # See [Access Control](https://cloud.google.com/bigtable/docs/access-control).
877
+ #
878
+ # Some of the permissions that can be checked on a instance are:
879
+ # * bigtable.instances.create
880
+ # * bigtable.instances.list
881
+ # * bigtable.instances.get
882
+ # * bigtable.tables.create
883
+ # * bigtable.tables.delete
884
+ # * bigtable.tables.get
885
+ # * bigtable.tables.list
886
+ #
887
+ # @return [Array<String>] The permissions that are configured for the policy.
888
+ #
889
+ # @example
890
+ # require "google/cloud/bigtable"
891
+ #
892
+ # bigtable = Google::Cloud::Bigtable.new
893
+ #
894
+ # instance = bigtable.instance("my-instance")
895
+ #
896
+ # permissions = instance.test_iam_permissions(
897
+ # "bigtable.instances.get",
898
+ # "bigtable.instances.update"
899
+ # )
900
+ # permissions.include? "bigtable.instances.get" #=> true
901
+ # permissions.include? "bigtable.instances.update" #=> false
902
+ #
903
+ def test_iam_permissions *permissions
904
+ ensure_service!
905
+ grpc = service.test_instance_permissions instance_id, permissions.flatten
906
+ grpc.permissions.to_a
907
+ end
908
+
909
+ # @private
910
+ #
911
+ # Creates a new Instance instance from a
912
+ # Google::Bigtable::Admin::V2::Instance.
913
+ #
914
+ # @param grpc [Google::Bigtable::Admin::V2::Instance]
915
+ # @param service [Google::Cloud::Bigtable::Service]
916
+ # @return [Google::Cloud::Bigtable::Instance]
917
+ #
918
+ def self.from_grpc grpc, service
919
+ new grpc, service
920
+ end
921
+
922
+ protected
923
+
924
+ # @private
925
+ #
926
+ # Raise an error unless an active connection to the service is
927
+ # available.
928
+ #
929
+ def ensure_service!
930
+ raise "Must have active connection to service" unless service
931
+ end
932
+ end
933
+ end
934
+ end
935
+ end