google-cloud-pubsub 1.10.0 → 2.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/AUTHENTICATION.md +2 -1
  3. data/CHANGELOG.md +41 -0
  4. data/OVERVIEW.md +26 -58
  5. data/lib/google-cloud-pubsub.rb +14 -13
  6. data/lib/google/cloud/pubsub.rb +15 -18
  7. data/lib/google/cloud/pubsub/async_publisher.rb +2 -3
  8. data/lib/google/cloud/pubsub/credentials.rb +2 -2
  9. data/lib/google/cloud/pubsub/message.rb +1 -1
  10. data/lib/google/cloud/pubsub/project.rb +1 -1
  11. data/lib/google/cloud/pubsub/received_message.rb +4 -4
  12. data/lib/google/cloud/pubsub/service.rb +102 -256
  13. data/lib/google/cloud/pubsub/subscriber.rb +3 -3
  14. data/lib/google/cloud/pubsub/subscriber/stream.rb +1 -2
  15. data/lib/google/cloud/pubsub/subscription.rb +19 -10
  16. data/lib/google/cloud/pubsub/subscription/push_config.rb +55 -31
  17. data/lib/google/cloud/pubsub/topic.rb +49 -15
  18. data/lib/google/cloud/pubsub/version.rb +1 -1
  19. metadata +8 -79
  20. data/lib/google/cloud/pubsub/v1.rb +0 -17
  21. data/lib/google/cloud/pubsub/v1/credentials.rb +0 -41
  22. data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/iam_policy.rb +0 -21
  23. data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/options.rb +0 -21
  24. data/lib/google/cloud/pubsub/v1/doc/google/iam/v1/policy.rb +0 -21
  25. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/duration.rb +0 -91
  26. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/empty.rb +0 -29
  27. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/field_mask.rb +0 -222
  28. data/lib/google/cloud/pubsub/v1/doc/google/protobuf/timestamp.rb +0 -113
  29. data/lib/google/cloud/pubsub/v1/doc/google/pubsub/v1/pubsub.rb +0 -833
  30. data/lib/google/cloud/pubsub/v1/doc/google/type/expr.rb +0 -19
  31. data/lib/google/cloud/pubsub/v1/publisher_client.rb +0 -928
  32. data/lib/google/cloud/pubsub/v1/publisher_client_config.json +0 -120
  33. data/lib/google/cloud/pubsub/v1/subscriber_client.rb +0 -1466
  34. data/lib/google/cloud/pubsub/v1/subscriber_client_config.json +0 -153
  35. data/lib/google/pubsub/v1/pubsub_pb.rb +0 -269
  36. data/lib/google/pubsub/v1/pubsub_services_pb.rb +0 -215
@@ -18,17 +18,15 @@ require "google/cloud/pubsub/credentials"
18
18
  require "google/cloud/pubsub/convert"
19
19
  require "google/cloud/pubsub/version"
20
20
  require "google/cloud/pubsub/v1"
21
- require "google/gax/errors"
22
21
  require "securerandom"
23
22
 
24
23
  module Google
25
24
  module Cloud
26
25
  module PubSub
27
26
  ##
28
- # @private Represents the GAX Pub/Sub service, including all the API
29
- # methods.
27
+ # @private Represents the Pub/Sub service API, including IAM mixins.
30
28
  class Service
31
- attr_accessor :project, :credentials, :host, :timeout, :client_config
29
+ attr_accessor :project, :credentials, :host, :timeout
32
30
  ###
33
31
  # The same client_id is used across all streaming pull connections that are created by this client. This is
34
32
  # intentional, as it indicates to the server that any guarantees, such as message ordering, made for a stream
@@ -38,44 +36,25 @@ module Google
38
36
 
39
37
  ##
40
38
  # Creates a new Service instance.
41
- def initialize project, credentials, host: nil, timeout: nil,
42
- client_config: nil
39
+ def initialize project, credentials, host: nil, timeout: nil
43
40
  @project = project
44
41
  @credentials = credentials
45
- @host = host || V1::PublisherClient::SERVICE_ADDRESS
42
+ @host = host
46
43
  @timeout = timeout
47
- @client_config = client_config || {}
48
44
  @client_id = SecureRandom.uuid.freeze
49
45
  end
50
46
 
51
- def channel
52
- require "grpc"
53
- GRPC::Core::Channel.new host, chan_args, chan_creds
54
- end
55
-
56
- def chan_args
57
- { "grpc.max_send_message_length" => -1,
58
- "grpc.max_receive_message_length" => -1,
59
- "grpc.keepalive_time_ms" => 300_000,
60
- "grpc.service_config_disable_resolution" => 1 }
61
- end
62
-
63
- def chan_creds
64
- return credentials if insecure?
65
- require "grpc"
66
- GRPC::Core::ChannelCredentials.new.compose GRPC::Core::CallCredentials.new credentials.client.updater_proc
67
- end
68
-
69
47
  def subscriber
70
48
  return mocked_subscriber if mocked_subscriber
71
49
  @subscriber ||= begin
72
- V1::SubscriberClient.new(
73
- credentials: channel,
74
- timeout: timeout,
75
- client_config: client_config,
76
- lib_name: "gccl",
77
- lib_version: Google::Cloud::PubSub::VERSION
78
- )
50
+ V1::Subscriber::Client.new do |config|
51
+ config.credentials = credentials if credentials
52
+ config.timeout = timeout if timeout
53
+ config.endpoint = host if host
54
+ config.lib_name = "gccl"
55
+ config.lib_version = Google::Cloud::PubSub::VERSION
56
+ config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}" }
57
+ end
79
58
  end
80
59
  end
81
60
  attr_accessor :mocked_subscriber
@@ -83,20 +62,32 @@ module Google
83
62
  def publisher
84
63
  return mocked_publisher if mocked_publisher
85
64
  @publisher ||= begin
86
- V1::PublisherClient.new(
87
- credentials: channel,
88
- timeout: timeout,
89
- client_config: client_config,
90
- lib_name: "gccl",
91
- lib_version: Google::Cloud::PubSub::VERSION
92
- )
65
+ V1::Publisher::Client.new do |config|
66
+ config.credentials = credentials if credentials
67
+ config.timeout = timeout if timeout
68
+ config.endpoint = host if host
69
+ config.lib_name = "gccl"
70
+ config.lib_version = Google::Cloud::PubSub::VERSION
71
+ config.metadata = { "google-cloud-resource-prefix": "projects/#{@project}" }
72
+ end
93
73
  end
94
74
  end
95
75
  attr_accessor :mocked_publisher
96
76
 
97
- def insecure?
98
- credentials == :this_channel_is_insecure
77
+ def iam
78
+ return mocked_iam if mocked_iam
79
+ @iam ||= begin
80
+ V1::IAMPolicy::Client.new do |config|
81
+ config.credentials = credentials if credentials
82
+ config.timeout = timeout if timeout
83
+ config.endpoint = host if host
84
+ config.lib_name = "gccl"
85
+ config.lib_version = Google::Cloud::PubSub::VERSION
86
+ config.metadata = { "google-cloud-resource-prefix" => "projects/#{@project}" }
87
+ end
88
+ end
99
89
  end
90
+ attr_accessor :mocked_iam
100
91
 
101
92
  ##
102
93
  # Gets the configuration of a topic.
@@ -105,30 +96,17 @@ module Google
105
96
  # If other attributes are added in the future,
106
97
  # they will be returned here.
107
98
  def get_topic topic_name, options = {}
108
- execute do
109
- publisher.get_topic topic_path(topic_name, options),
110
- options: default_options
111
- end
99
+ publisher.get_topic topic: topic_path(topic_name, options)
112
100
  end
113
101
 
114
102
  ##
115
103
  # Lists matching topics.
116
104
  def list_topics options = {}
117
- call_options = default_options
118
- if (token = options[:token])
119
- call_options = Google::Gax::CallOptions.new(
120
- kwargs: default_headers,
121
- page_token: token
122
- )
123
- end
105
+ paged_enum = publisher.list_topics project: project_path(options),
106
+ page_size: options[:max],
107
+ page_token: options[:token]
124
108
 
125
- execute do
126
- paged_enum = publisher.list_topics project_path(options),
127
- page_size: options[:max],
128
- options: call_options
129
-
130
- paged_enum.page.response
131
- end
109
+ paged_enum.response
132
110
  end
133
111
 
134
112
  ##
@@ -140,21 +118,16 @@ module Google
140
118
  }
141
119
  end
142
120
 
143
- execute do
144
- publisher.create_topic \
145
- topic_path(topic_name, options),
146
- labels: labels,
147
- kms_key_name: kms_key_name,
148
- message_storage_policy: message_storage_policy,
149
- options: default_options
150
- end
121
+ publisher.create_topic \
122
+ name: topic_path(topic_name, options),
123
+ labels: labels,
124
+ kms_key_name: kms_key_name,
125
+ message_storage_policy: message_storage_policy
151
126
  end
152
127
 
153
128
  def update_topic topic_obj, *fields
154
129
  mask = Google::Protobuf::FieldMask.new paths: fields.map(&:to_s)
155
- execute do
156
- publisher.update_topic topic_obj, mask, options: default_options
157
- end
130
+ publisher.update_topic topic: topic_obj, update_mask: mask
158
131
  end
159
132
 
160
133
  ##
@@ -163,10 +136,7 @@ module Google
163
136
  # exist. After a topic is deleted, a new topic may be created with the
164
137
  # same name.
165
138
  def delete_topic topic_name
166
- execute do
167
- publisher.delete_topic topic_path(topic_name),
168
- options: default_options
169
- end
139
+ publisher.delete_topic topic: topic_path(topic_name)
170
140
  end
171
141
 
172
142
  ##
@@ -175,101 +145,59 @@ module Google
175
145
  # The messages parameter is an array of arrays.
176
146
  # The first element is the data, second is attributes hash.
177
147
  def publish topic, messages
178
- execute do
179
- publisher.publish topic_path(topic), messages,
180
- options: default_options
181
- end
148
+ publisher.publish topic: topic_path(topic), messages: messages
182
149
  end
183
150
 
184
151
  ##
185
152
  # Gets the details of a subscription.
186
153
  def get_subscription subscription_name, options = {}
187
- subscription = subscription_path subscription_name, options
188
- execute do
189
- subscriber.get_subscription subscription, options: default_options
190
- end
154
+ subscriber.get_subscription subscription: subscription_path(subscription_name, options)
191
155
  end
192
156
 
193
157
  ##
194
158
  # Lists matching subscriptions by project and topic.
195
159
  def list_topics_subscriptions topic, options = {}
196
- call_options = default_options
197
- if (token = options[:token])
198
- call_options = Google::Gax::CallOptions.new(
199
- kwargs: default_headers,
200
- page_token: token
201
- )
202
- end
203
-
204
- execute do
205
- paged_enum = publisher.list_topic_subscriptions \
206
- topic_path(topic, options),
207
- page_size: options[:max],
208
- options: call_options
209
-
210
- paged_enum.page.response
211
- end
160
+ publisher.list_topic_subscriptions topic: topic_path(topic, options),
161
+ page_size: options[:max],
162
+ page_token: options[:token]
212
163
  end
213
164
 
214
165
  ##
215
166
  # Lists matching subscriptions by project.
216
167
  def list_subscriptions options = {}
217
- call_options = default_options
218
- if (token = options[:token])
219
- call_options = Google::Gax::CallOptions.new(
220
- kwargs: default_headers,
221
- page_token: token
222
- )
223
- end
224
-
225
- execute do
226
- paged_enum = subscriber.list_subscriptions project_path(options),
227
- page_size: options[:max],
228
- options: call_options
168
+ paged_enum = subscriber.list_subscriptions project: project_path(options),
169
+ page_size: options[:max],
170
+ page_token: options[:token]
229
171
 
230
- paged_enum.page.response
231
- end
172
+ paged_enum.response
232
173
  end
233
174
 
234
175
  ##
235
176
  # Creates a subscription on a given topic for a given subscriber.
236
177
  def create_subscription topic, subscription_name, options = {}
237
- name = subscription_path subscription_name, options
238
- topic = topic_path topic
239
- push_config = if options[:endpoint]
240
- Google::Cloud::PubSub::V1::PushConfig.new \
241
- push_endpoint: options[:endpoint],
242
- attributes: (options[:attributes] || {}).to_h
243
- end
244
- execute do
245
- subscriber.create_subscription \
246
- name, topic,
247
- push_config: push_config,
248
- ack_deadline_seconds: options[:deadline],
249
- retain_acked_messages: options[:retain_acked],
250
- message_retention_duration: Convert.number_to_duration(options[:retention]),
251
- labels: options[:labels],
252
- enable_message_ordering: options[:message_ordering],
253
- filter: options[:filter],
254
- dead_letter_policy: dead_letter_policy(options),
255
- retry_policy: options[:retry_policy],
256
- options: default_options
257
- end
178
+ subscriber.create_subscription \
179
+ name: subscription_path(subscription_name, options),
180
+ topic: topic_path(topic),
181
+ push_config: options[:push_config],
182
+ ack_deadline_seconds: options[:deadline],
183
+ retain_acked_messages: options[:retain_acked],
184
+ message_retention_duration: Convert.number_to_duration(options[:retention]),
185
+ labels: options[:labels],
186
+ enable_message_ordering: options[:message_ordering],
187
+ filter: options[:filter],
188
+ dead_letter_policy: dead_letter_policy(options),
189
+ retry_policy: options[:retry_policy]
258
190
  end
259
191
 
260
192
  def update_subscription subscription_obj, *fields
261
193
  mask = Google::Protobuf::FieldMask.new paths: fields.map(&:to_s)
262
- execute do
263
- subscriber.update_subscription subscription_obj, mask, options: default_options
264
- end
194
+ subscriber.update_subscription subscription: subscription_obj, update_mask: mask
265
195
  end
266
196
 
267
197
  ##
268
198
  # Deletes an existing subscription. All pending messages in the subscription are immediately dropped.
269
199
  def delete_subscription subscription
270
- execute do
271
- subscriber.delete_subscription subscription_path(subscription), options: default_options
272
- end
200
+ subscriber.delete_subscription subscription: subscription_path(subscription)
273
201
  end
274
202
 
275
203
  ##
@@ -277,45 +205,33 @@ module Google
277
205
  # `Pull` and `StreamingPull` requests will raise `FAILED_PRECONDITION`. If the subscription is a push
278
206
  # subscription, pushes to the endpoint will stop.
279
207
  def detach_subscription subscription
280
- execute do
281
- publisher.detach_subscription subscription_path(subscription), options: default_options
282
- end
208
+ publisher.detach_subscription subscription: subscription_path(subscription)
283
209
  end
284
210
 
285
211
  ##
286
212
  # Pulls a single message from the server.
287
213
  def pull subscription, options = {}
288
- subscription = subscription_path subscription, options
289
214
  max_messages = options.fetch(:max, 100).to_i
290
215
  return_immediately = !(!options.fetch(:immediate, true))
291
216
 
292
- execute do
293
- subscriber.pull subscription,
294
- max_messages,
295
- return_immediately: return_immediately,
296
- options: default_options
297
- end
217
+ subscriber.pull subscription: subscription_path(subscription, options),
218
+ max_messages: max_messages,
219
+ return_immediately: return_immediately
298
220
  end
299
221
 
300
222
  def streaming_pull request_enum
301
- execute do
302
- subscriber.streaming_pull request_enum, options: default_options
303
- end
223
+ subscriber.streaming_pull request_enum
304
224
  end
305
225
 
306
226
  ##
307
227
  # Acknowledges receipt of a message.
308
228
  def acknowledge subscription, *ack_ids
309
- execute do
310
- subscriber.acknowledge subscription_path(subscription), ack_ids,
311
- options: default_options
312
- end
229
+ subscriber.acknowledge subscription: subscription_path(subscription), ack_ids: ack_ids
313
230
  end
314
231
 
315
232
  ##
316
233
  # Modifies the PushConfig for a specified subscription.
317
234
  def modify_push_config subscription, endpoint, attributes
318
- subscription = subscription_path subscription
319
235
  # Convert attributes to strings to match the protobuf definition
320
236
  attributes = Hash[attributes.map { |k, v| [String(k), String(v)] }]
321
237
  push_config = Google::Cloud::PubSub::V1::PushConfig.new(
@@ -323,138 +239,83 @@ module Google
323
239
  attributes: attributes
324
240
  )
325
241
 
326
- execute do
327
- subscriber.modify_push_config subscription, push_config,
328
- options: default_options
329
- end
242
+ subscriber.modify_push_config subscription: subscription_path(subscription),
243
+ push_config: push_config
330
244
  end
331
245
 
332
246
  ##
333
247
  # Modifies the ack deadline for a specific message.
334
248
  def modify_ack_deadline subscription, ids, deadline
335
- execute do
336
- subscriber.modify_ack_deadline subscription_path(subscription),
337
- Array(ids),
338
- deadline, options: default_options
339
- end
249
+ subscriber.modify_ack_deadline subscription: subscription_path(subscription),
250
+ ack_ids: Array(ids),
251
+ ack_deadline_seconds: deadline
340
252
  end
341
253
 
342
254
  ##
343
255
  # Lists snapshots by project.
344
256
  def list_snapshots options = {}
345
- call_options = default_options
346
- if (token = options[:token])
347
- call_options = Google::Gax::CallOptions.new(
348
- kwargs: default_headers,
349
- page_token: token
350
- )
351
- end
257
+ paged_enum = subscriber.list_snapshots project: project_path(options),
258
+ page_size: options[:max],
259
+ page_token: options[:token]
352
260
 
353
- execute do
354
- paged_enum = subscriber.list_snapshots project_path(options),
355
- page_size: options[:max],
356
- options: call_options
357
-
358
- paged_enum.page.response
359
- end
261
+ paged_enum.response
360
262
  end
361
263
 
362
264
  ##
363
265
  # Creates a snapshot on a given subscription.
364
266
  def create_snapshot subscription, snapshot_name, labels: nil
365
- name = snapshot_path snapshot_name
366
- execute do
367
- subscriber.create_snapshot name,
368
- subscription_path(subscription),
369
- labels: labels,
370
- options: default_options
371
- end
267
+ subscriber.create_snapshot name: snapshot_path(snapshot_name),
268
+ subscription: subscription_path(subscription),
269
+ labels: labels
372
270
  end
373
271
 
374
272
  def update_snapshot snapshot_obj, *fields
375
273
  mask = Google::Protobuf::FieldMask.new paths: fields.map(&:to_s)
376
- execute do
377
- subscriber.update_snapshot snapshot_obj, mask, options: default_options
378
- end
274
+ subscriber.update_snapshot snapshot: snapshot_obj, update_mask: mask
379
275
  end
380
276
 
381
277
  ##
382
278
  # Deletes an existing snapshot.
383
279
  # All pending messages in the snapshot are immediately dropped.
384
280
  def delete_snapshot snapshot
385
- execute do
386
- subscriber.delete_snapshot snapshot_path(snapshot),
387
- options: default_options
388
- end
281
+ subscriber.delete_snapshot snapshot: snapshot_path(snapshot)
389
282
  end
390
283
 
391
284
  ##
392
285
  # Adjusts the given subscription to a time or snapshot.
393
286
  def seek subscription, time_or_snapshot
394
- subscription = subscription_path subscription
395
- execute do
396
- if a_time? time_or_snapshot
397
- time = Convert.time_to_timestamp time_or_snapshot
398
- subscriber.seek subscription, time: time, options: default_options
399
- else
400
- time_or_snapshot = time_or_snapshot.name if time_or_snapshot.is_a? Snapshot
401
- subscriber.seek subscription,
402
- snapshot: snapshot_path(time_or_snapshot),
403
- options: default_options
404
- end
287
+ if a_time? time_or_snapshot
288
+ time = Convert.time_to_timestamp time_or_snapshot
289
+ subscriber.seek subscription: subscription, time: time
290
+ else
291
+ time_or_snapshot = time_or_snapshot.name if time_or_snapshot.is_a? Snapshot
292
+ subscriber.seek subscription: subscription_path(subscription),
293
+ snapshot: snapshot_path(time_or_snapshot)
405
294
  end
406
295
  end
407
296
 
408
297
  def get_topic_policy topic_name, options = {}
409
- execute do
410
- publisher.get_iam_policy topic_path(topic_name, options),
411
- options: default_options
412
- end
298
+ iam.get_iam_policy resource: topic_path(topic_name, options)
413
299
  end
414
300
 
415
301
  def set_topic_policy topic_name, new_policy, options = {}
416
- resource = topic_path topic_name, options
417
-
418
- execute do
419
- publisher.set_iam_policy resource, new_policy,
420
- options: default_options
421
- end
302
+ iam.set_iam_policy resource: topic_path(topic_name, options), policy: new_policy
422
303
  end
423
304
 
424
305
  def test_topic_permissions topic_name, permissions, options = {}
425
- resource = topic_path topic_name, options
426
-
427
- execute do
428
- publisher.test_iam_permissions resource, permissions,
429
- options: default_options
430
- end
306
+ iam.test_iam_permissions resource: topic_path(topic_name, options), permissions: permissions
431
307
  end
432
308
 
433
309
  def get_subscription_policy subscription_name, options = {}
434
- resource = subscription_path subscription_name, options
435
-
436
- execute do
437
- subscriber.get_iam_policy resource, options: default_options
438
- end
310
+ iam.get_iam_policy resource: subscription_path(subscription_name, options)
439
311
  end
440
312
 
441
313
  def set_subscription_policy subscription_name, new_policy, options = {}
442
- resource = subscription_path subscription_name, options
443
-
444
- execute do
445
- subscriber.set_iam_policy resource, new_policy,
446
- options: default_options
447
- end
314
+ iam.set_iam_policy resource: subscription_path(subscription_name, options), policy: new_policy
448
315
  end
449
316
 
450
- def test_subscription_permissions subscription_name,
451
- permissions, options = {}
452
- resource = subscription_path subscription_name, options
453
-
454
- execute do
455
- subscriber.test_iam_permissions resource, permissions,
456
- options: default_options
457
- end
317
+ def test_subscription_permissions subscription_name, permissions, options = {}
318
+ iam.test_iam_permissions resource: subscription_path(subscription_name, options), permissions: permissions
458
319
  end
459
320
 
460
321
  def project_path options = {}
@@ -498,21 +359,6 @@ module Google
498
359
  end
499
360
  policy
500
361
  end
501
-
502
- def default_headers
503
- { "google-cloud-resource-prefix" => "projects/#{@project}" }
504
- end
505
-
506
- def default_options
507
- Google::Gax::CallOptions.new kwargs: default_headers
508
- end
509
-
510
- def execute
511
- yield
512
- rescue Google::Gax::GaxError => e
513
- # GaxError wraps BadStatus, but exposes it as #cause
514
- raise Google::Cloud::Error.from_error(e.cause)
515
- end
516
362
  end
517
363
  end
518
364