google-gax 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aeba7e008b2cfb90d91a6ac6152f7304e4650e61
4
- data.tar.gz: a0acc832fe6182aacb394cb2c44ba6b257122a19
3
+ metadata.gz: 7ed0b03acfdc65e94f59a9de7d9ef17c82d8de2c
4
+ data.tar.gz: b49bdf5c29d4abea509227477aebe0ad2242ee5d
5
5
  SHA512:
6
- metadata.gz: c703f3bc01fb85d6843736a279f072a20bdfa4f47edd54d1ae567ce1ee17538b4c972d15f1502c692fef94a601edc914351994eb2468eadeaa7bad984e6f707c
7
- data.tar.gz: 3222c245b93925e212d8a75c27ce8f3bddcae520af1d8509eda226973bb28b435655ff34315fbbe0c2b8a32727ad3eaae1d3ccacd6e0cd7c880f0151c881a107
6
+ metadata.gz: 8fd2ba9b1d30101302aae49b74160fc00d509dd065b20e2416e962a8a28c42008694f67ec30e6cc13ff7dc526bb34b8b2a879857ea5dd584525b34999e8e0de0
7
+ data.tar.gz: e632150cec07b9861a0ffe258f3d994cb3f047be303acbcae91844f331afbbc37e311b1c47cd540746b3790efddc4e972fd00ce8dee0af54abac2e11e6ab01ae
@@ -28,6 +28,7 @@
28
28
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
 
30
30
  require 'google/gax/api_callable'
31
+ require 'google/gax/constants'
31
32
  require 'google/gax/errors'
32
33
  require 'google/gax/path_template'
33
34
  require 'google/gax/settings'
@@ -36,279 +37,5 @@ require 'google/gax/version'
36
37
  module Google
37
38
  # Gax defines Google API extensions
38
39
  module Gax
39
- # rubocop:disable Metrics/ParameterLists
40
-
41
- # Encapsulates the call settings for an ApiCallable
42
- # @!attribute [r] timeout
43
- # @return [Numeric]
44
- # @!attribute [r] retry_options
45
- # @return [RetryOptions]
46
- # @!attribute [r] page_descriptor
47
- # @return [PageDescriptor]
48
- # @!attribute [r] page_token
49
- # @return [Object]
50
- # @!attribute [r] bundle_descriptor
51
- # @return [BundleDescriptor]
52
- # @!attribute [r] kwargs
53
- # @return [Hash]
54
- class CallSettings
55
- attr_reader :timeout, :retry_options, :page_descriptor, :page_token,
56
- :bundler, :bundle_descriptor, :kwargs, :errors
57
-
58
- # @param timeout [Numeric] The client-side timeout for API calls. This
59
- # parameter is ignored for retrying calls.
60
- # @param retry_options [RetryOptions] The configuration for retrying upon
61
- # transient error. If set to nil, this call will not retry.
62
- # @param page_descriptor [PageDescriptor] indicates the structure of page
63
- # streaming to be performed. If set to nil, page streaming is not
64
- # performed.
65
- # @param page_token [Object] determines the page token used in the
66
- # page streaming request. If there is no page_descriptor, this has no
67
- # meaning.
68
- # @param bundler orchestrates bundling. If nil, bundling is not
69
- # performed.
70
- # @param bundle_descriptor [BundleDescriptor] indicates the structure of
71
- # the bundle. If nil, bundling is not performed.
72
- # @param kwargs [Hash]
73
- # Additional keyword argments to be passed to the API call.
74
- # @param errors [Array<Exception>]
75
- # Configures the exceptions to wrap with GaxError.
76
- def initialize(timeout: 30, retry_options: nil, page_descriptor: nil,
77
- page_token: nil, bundler: nil, bundle_descriptor: nil,
78
- kwargs: {}, errors: [])
79
- @timeout = timeout
80
- @retry_options = retry_options
81
- @page_descriptor = page_descriptor
82
- @page_token = page_token
83
- @bundler = bundler
84
- @bundle_descriptor = bundle_descriptor
85
- @kwargs = kwargs
86
- @errors = errors
87
- end
88
-
89
- # @return true when it has retry codes.
90
- def retry_codes?
91
- @retry_options && @retry_options.retry_codes
92
- end
93
-
94
- # @return true when it has valid bundler configuration.
95
- def bundler?
96
- @bundler && @bundle_descriptor
97
- end
98
-
99
- # Creates a new CallSetting instance which is based on this but merged
100
- # settings from options.
101
- # @param options [CallOptions, nil] The overriding call settings.
102
- # @return a new merged call settings.
103
- def merge(options)
104
- unless options
105
- return CallSettings.new(timeout: @timeout,
106
- retry_options: @retry_options,
107
- page_descriptor: @page_descriptor,
108
- page_token: @page_token,
109
- bundler: @bundler,
110
- bundle_descriptor: @bundle_descriptor,
111
- kwargs: @kwargs,
112
- errors: @errors)
113
- end
114
-
115
- timeout = if options.timeout == :OPTION_INHERIT
116
- @timeout
117
- else
118
- options.timeout
119
- end
120
- retry_options = if options.retry_options == :OPTION_INHERIT
121
- @retry_options
122
- else
123
- options.retry_options
124
- end
125
- page_token = if options.page_token == :OPTION_INHERIT
126
- @page_token
127
- else
128
- options.page_token
129
- end
130
-
131
- kwargs = @kwargs.dup
132
- kwargs.update(options.kwargs) if options.kwargs != :OPTION_INHERIT
133
-
134
- CallSettings.new(timeout: timeout,
135
- retry_options: retry_options,
136
- page_descriptor: @page_descriptor,
137
- page_token: page_token,
138
- bundler: @bundler,
139
- bundle_descriptor: @bundle_descriptor,
140
- kwargs: kwargs,
141
- errors: @errors)
142
- end
143
- end
144
-
145
- private_constant :CallSettings
146
-
147
- # Encapsulates the overridable settings for a particular API call
148
- # @!attribute [r] timeout
149
- # @return [Numeric, :OPTION_INHERIT]
150
- # @!attribute [r] retry_options
151
- # @return [RetryOptions, :OPTION_INHERIT]
152
- # @!attribute [r] page_token
153
- # @return [Object, :OPTION_INHERIT, :INITIAL_PAGE]
154
- # @!attribute [r] kwargs
155
- # @return [Hash, :OPTION_INHERIT]
156
- class CallOptions
157
- attr_reader :timeout, :retry_options, :page_token, :kwargs
158
-
159
- # @param timeout [Numeric, :OPTION_INHERIT]
160
- # The client-side timeout for API calls.
161
- # @param retry_options [RetryOptions, :OPTION_INHERIT]
162
- # The configuration for retrying upon transient error.
163
- # If set to nil, this call will not retry.
164
- # @param page_token [Object, :OPTION_INHERIT]
165
- # If set and the call is configured for page streaming, page streaming
166
- # is starting with this page_token.
167
- # @param kwargs [Hash, :OPTION_INHERIT]
168
- # Additional keyword argments to be passed to the API call.
169
- def initialize(timeout: :OPTION_INHERIT,
170
- retry_options: :OPTION_INHERIT,
171
- page_token: :OPTION_INHERIT,
172
- kwargs: :OPTION_INHERIT)
173
- @timeout = timeout
174
- @retry_options = retry_options
175
- @page_token = page_token
176
- @kwargs = kwargs
177
- end
178
- end
179
-
180
- # Describes the structure of a page-streaming call.
181
- class PageDescriptor < Struct.new(:request_page_token_field,
182
- :response_page_token_field,
183
- :resource_field)
184
- end
185
-
186
- # Per-call configurable settings for retrying upon transient failure.
187
- class RetryOptions < Struct.new(:retry_codes, :backoff_settings)
188
- # @!attribute retry_codes
189
- # @return [Array<Grpc::Code>] a list of exceptions upon which
190
- # a retry should be attempted.
191
- # @!attribute backoff_settings
192
- # @return [BackoffSettings] configuring the retry exponential
193
- # backoff algorithm.
194
- end
195
-
196
- # Parameters to the exponential backoff algorithm for retrying.
197
- class BackoffSettings < Struct.new(
198
- :initial_retry_delay_millis,
199
- :retry_delay_multiplier,
200
- :max_retry_delay_millis,
201
- :initial_rpc_timeout_millis,
202
- :rpc_timeout_multiplier,
203
- :max_rpc_timeout_millis,
204
- :total_timeout_millis
205
- )
206
- # @!attribute initial_retry_delay_millis
207
- # @return [Numeric] the initial delay time, in milliseconds,
208
- # between the completion of the first failed request and the
209
- # initiation of the first retrying request.
210
- # @!attribute retry_delay_multiplier
211
- # @return [Numeric] the multiplier by which to increase the
212
- # delay time between the completion of failed requests, and
213
- # the initiation of the subsequent retrying request.
214
- # @!attribute max_retry_delay_millis
215
- # @return [Numeric] the maximum delay time, in milliseconds,
216
- # between requests. When this value is reached,
217
- # +retry_delay_multiplier+ will no longer be used to
218
- # increase delay time.
219
- # @!attribute initial_rpc_timeout_millis
220
- # @return [Numeric] the initial timeout parameter to the request.
221
- # @!attribute rpc_timeout_multiplier
222
- # @return [Numeric] the multiplier by which to increase the
223
- # timeout parameter between failed requests.
224
- # @!attribute max_rpc_timeout_millis
225
- # @return [Numeric] the maximum timeout parameter, in
226
- # milliseconds, for a request. When this value is reached,
227
- # +rpc_timeout_multiplier+ will no longer be used to
228
- # increase the timeout.
229
- # @!attribute total_timeout_millis
230
- # @return [Numeric] the total time, in milliseconds, starting
231
- # from when the initial request is sent, after which an
232
- # error will be returned, regardless of the retrying
233
- # attempts made meanwhile.
234
- end
235
-
236
- # Describes the structure of bundled call.
237
- #
238
- # request_discriminator_fields may include '.' as a separator, which is
239
- # used to indicate object traversal. This allows fields in nested objects
240
- # to be used to determine what requests to bundle.
241
- class BundleDescriptor < Struct.new(:bundled_field,
242
- :request_discriminator_fields,
243
- :subresponse_field)
244
- # @!attribute bundled_field
245
- # @return [String] the repeated field in the request message
246
- # that will have its elements aggregated by bundling.
247
- # @!attribute request_discriminator_fields
248
- # @return [Array<String>] a list of fields in the target
249
- # request message class that are used to determine which
250
- # messages should be bundled together.
251
- # @!attribute subresponse_field
252
- # @return [String] an optional field, when present it
253
- # indicates the field in the response message that should be
254
- # used to demultiplex the response into multiple response
255
- # messages.
256
- def initialize(bundled_field, request_discriminator_fields,
257
- subresponse_field: nil)
258
- super(bundled_field, request_discriminator_fields, subresponse_field)
259
- end
260
- end
261
-
262
- # Holds values used to configure bundling.
263
- #
264
- # The xxx_threshold attributes are used to configure when the bundled
265
- # request should be made.
266
- class BundleOptions < Struct.new(:element_count_threshold,
267
- :element_count_limit,
268
- :request_byte_threshold,
269
- :request_byte_limit,
270
- :delay_threshold_millis)
271
- # @!attribute element_count_threshold
272
- # @return [Numeric] the bundled request will be sent once the
273
- # count of outstanding elements in the repeated field
274
- # reaches this value.
275
- # @!attribute element_count_limit
276
- # @return [Numeric] represents a hard limit on the number of
277
- # elements in the repeated field of the bundle; if adding a
278
- # request to a bundle would exceed this value, the bundle is
279
- # sent and the new request is added to a fresh bundle. It is
280
- # invalid for a single request to exceed this limit.
281
- # @!attribute request_byte_threshold
282
- # @return [Numeric] the bundled request will be sent once the
283
- # count of bytes in the request reaches this value. Note
284
- # that this value is pessimistically approximated by summing
285
- # the bytesizes of the elements in the repeated field, and
286
- # therefore may be an under-approximation.
287
- # @!attribute request_byte_limit
288
- # @return [Numeric] represents a hard limit on the size of the
289
- # bundled request; if adding a request to a bundle would
290
- # exceed this value, the bundle is sent and the new request
291
- # is added to a fresh bundle. It is invalid for a single
292
- # request to exceed this limit. Note that this value is
293
- # pessimistically approximated by summing the bytesizes of
294
- # the elements in the repeated field, with a buffer applied
295
- # to correspond to the resulting under-approximation.
296
- # @!attribute delay_threshold_millis
297
- # @return [Numeric] the bundled request will be sent this
298
- # amount of time after the first element in the bundle was
299
- # added to it.
300
- def initialize(element_count_threshold: 0,
301
- element_count_limit: 0,
302
- request_byte_threshold: 0,
303
- request_byte_limit: 0,
304
- delay_threshold_millis: 0)
305
- super(
306
- element_count_threshold,
307
- element_count_limit,
308
- request_byte_threshold,
309
- request_byte_limit,
310
- delay_threshold_millis)
311
- end
312
- end
313
40
  end
314
41
  end
@@ -36,8 +36,6 @@ require 'google/gax/bundling'
36
36
 
37
37
  module Google
38
38
  module Gax
39
- MILLIS_PER_SECOND = 1000.0
40
-
41
39
  # A class to provide the Enumerable interface for page-streaming method.
42
40
  # PagedEnumerable assumes that the API call returns a message for a page
43
41
  # which holds a list of resources and the token to the next page.
@@ -341,7 +339,6 @@ module Google
341
339
  result = nil
342
340
  now = Time.now
343
341
  deadline = now + total_timeout
344
-
345
342
  loop do
346
343
  begin
347
344
  result = add_timeout_arg(a_func, timeout, kwargs).call(request)
@@ -116,7 +116,7 @@ module Google
116
116
  # The number of bundled elements in the repeated field.
117
117
  # @return [Numeric]
118
118
  def element_count
119
- @inputs.reduce(0) { |a, e| a + e.count }
119
+ @inputs.reduce(0) { |acc, elem| acc + elem.count }
120
120
  end
121
121
 
122
122
  # The size of the request in bytes of the bundled field elements.
@@ -0,0 +1,34 @@
1
+ # Copyright 2016, Google Inc.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are
6
+ # met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ # * Redistributions in binary form must reproduce the above
11
+ # copyright notice, this list of conditions and the following disclaimer
12
+ # in the documentation and/or other materials provided with the
13
+ # distribution.
14
+ # * Neither the name of Google Inc. nor the names of its
15
+ # contributors may be used to endorse or promote products derived from
16
+ # this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ module Google
31
+ module Gax
32
+ MILLIS_PER_SECOND = 1000.0
33
+ end
34
+ end
@@ -0,0 +1,253 @@
1
+ # Copyright 2016, Google Inc.
2
+ # All rights reserved.
3
+ #
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are
6
+ # met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ # * Redistributions in binary form must reproduce the above
11
+ # copyright notice, this list of conditions and the following disclaimer
12
+ # in the documentation and/or other materials provided with the
13
+ # distribution.
14
+ # * Neither the name of Google Inc. nor the names of its
15
+ # contributors may be used to endorse or promote products derived from
16
+ # this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ require 'time'
31
+
32
+ # These must be loaded separate from google/gax to avoid circular dependency.
33
+ require 'google/gax/constants'
34
+ require 'google/gax/settings'
35
+
36
+ module Google
37
+ module Gax
38
+ # A class used to wrap Google::Longrunning::Operation objects. This class
39
+ # provides helper methods to check the status of an Operation
40
+ #
41
+ # @example Checking Operation status
42
+ # require 'google/gax/operation'
43
+ # require 'google/longrunning/operations_client'
44
+ #
45
+ # operations_client = Google::Longrunning::OperationsClient.new
46
+ # op = Google::Gax::Operation.new(
47
+ # api.methodThatReturnsOperation(),
48
+ # operations_client,
49
+ # Google::Example::ResultType,
50
+ # Google::Example::MetadataType
51
+ # )
52
+ #
53
+ # op.done? # => false
54
+ # op.reload! # => operation completed
55
+ #
56
+ # if op.done?
57
+ # results = op.results
58
+ # handle_error(results) if op.error?
59
+ # # Handle results.
60
+ # end
61
+ #
62
+ # @example Working with callbacks
63
+ # require 'google/gax/operation'
64
+ # require 'google/longrunning/operations_client'
65
+ #
66
+ # operations_client = Google::Longrunning::OperationsClient.new
67
+ # op = Google::Gax::Operation.new(
68
+ # api.method_that_returns_operation,
69
+ # operations_client,
70
+ # Google::Example::ResultType,
71
+ # Google::Example::MetadataType
72
+ # )
73
+ #
74
+ # # Register a callback to be run when an operation is done.
75
+ # op.on_done do |operation|
76
+ # raise operation.results.message if operation.error?
77
+ # # process(operation.results)
78
+ # # process(operation.metadata)
79
+ # end
80
+ #
81
+ # # Reload the operation running callbacks if operation completed.
82
+ # op.reload!
83
+ #
84
+ # # Or block until the operation completes, passing a block to be called
85
+ # # on completion.
86
+ # op.wait_until_done do |operation|
87
+ # raise operation.results.message if operation.error?
88
+ # # process(operation.results)
89
+ # # process(operation.rmetadata)
90
+ # end
91
+ #
92
+ # @attribute [r] grpc_op
93
+ # @return [Google::Longrunning::Operation] The wrapped grpc
94
+ # operation object.
95
+ # @attribute [rw] call_options
96
+ # @return [Google::Gax::CallOptions] The call options used when reloading
97
+ # the operation.
98
+ class Operation
99
+ attr_reader :grpc_op
100
+
101
+ attr_accessor :call_options
102
+
103
+ # @param grpc_op [Google::Longrunning::Operation]
104
+ # The inital longrunning operation.
105
+ # @param client [Google::Longrunning::OperationsClient]
106
+ # The client that handles the grpc operations.
107
+ # @param result_type [Class] The class type to be unpacked from the
108
+ # result.
109
+ # @param metadata_type [Class] The class type to be unpacked from the
110
+ # metadata.
111
+ # @param call_options [Google::Gax::CallOptions]
112
+ # The call options that are used when reloading the operation.
113
+ def initialize(grpc_op, client, result_type, metadata_type,
114
+ call_options: nil)
115
+ @grpc_op = grpc_op
116
+ @client = client
117
+ @call_options = call_options
118
+ @result_type = result_type
119
+ @metadata_type = metadata_type
120
+ @callbacks = []
121
+ end
122
+
123
+ # If the operation is done, returns the result, otherwise returns nil.
124
+ # If the operation response is an error, the error will be returned.
125
+ # If a type is provided, the response will be unpacked using the type
126
+ # provided; returning nil if the response is not of the type provided.
127
+ # If the type is not of provided, the response will be unpacked using
128
+ # the response's type_url if the type_url is found in the
129
+ # Google::Protobuf::DescriptorPool.generated_pool.
130
+ # If the type cannot be found the raw response is retuned.
131
+ #
132
+ # @return [Object, Google::Rpc::Status, nil]
133
+ # The result of the operation. If it is an error a Google::Rpc::Status
134
+ # will be returned.
135
+ def results
136
+ return nil unless done?
137
+ return @grpc_op.error if error?
138
+ unpack(@grpc_op.response, @result_type)
139
+ end
140
+
141
+ # Returns the metadata of an operation. If a type is provided,
142
+ # the metadata will be unpacked using the type provided; returning nil
143
+ # if the metadata is not of the type provided.
144
+ # If the type is not of provided, the metadata will be unpacked using
145
+ # the metadata's type_url if the type_url is found in the
146
+ # Google::Protobuf::DescriptorPool.generated_pool.
147
+ # If the type cannot be found the raw metadata is retuned.
148
+ #
149
+ # @return [Object, nil]
150
+ # The metadata of the operation. Can be nil.
151
+ def metadata
152
+ return nil if @grpc_op.metadata.nil?
153
+ unpack(@grpc_op.metadata, @metadata_type)
154
+ end
155
+
156
+ # Checks if the operation is done. This does not send a new api call,
157
+ # but checks the result of the previous api call to see if done.
158
+ #
159
+ # @return [Boolean] Whether the operation is done.
160
+ def done?
161
+ @grpc_op.done
162
+ end
163
+
164
+ # Checks if the operation is done and the result is an error.
165
+ # If the operation is not finished then this will return false.
166
+ #
167
+ # @return [Boolean] Whether an error has been returned.
168
+ def error?
169
+ done? ? @grpc_op.result == :error : false
170
+ end
171
+
172
+ # Cancels the operation.
173
+ def cancel
174
+ @client.cancel_operation(@grpc_op.name)
175
+ end
176
+
177
+ # Reloads the operation object.
178
+ #
179
+ # @return [Google::Gax::Operation]
180
+ # Since this method changes internal state, it returns itself.
181
+ def reload!
182
+ @grpc_op = @client.get_operation(@grpc_op.name, options: @call_options)
183
+ if done?
184
+ @callbacks.each { |proc| proc.call(self) }
185
+ @callbacks.clear
186
+ end
187
+ self
188
+ end
189
+ alias refresh! reload!
190
+
191
+ # Blocking method to wait until the operation has completed or the
192
+ # maximum timeout has been reached. Upon completion, registered callbacks
193
+ # will be called, then - if a block is given - the block will be called.
194
+ #
195
+ # @param backoff_settings [Google::Gax::BackoffSettings]
196
+ # The backoff settings used to manipulate how this method retries
197
+ # checking if the operation is done.
198
+ # @yield operation [Google::Gax::Operation] Yields the finished Operation.
199
+ def wait_until_done!(backoff_settings: nil)
200
+ unless backoff_settings
201
+ backoff_settings = BackoffSettings.new(
202
+ 10 * MILLIS_PER_SECOND,
203
+ 1.3,
204
+ 5 * 60 * MILLIS_PER_SECOND,
205
+ 0,
206
+ 0,
207
+ 0,
208
+ 60 * 60 * MILLIS_PER_SECOND
209
+ )
210
+ end
211
+
212
+ delay = backoff_settings.initial_retry_delay_millis / MILLIS_PER_SECOND
213
+ max_delay = backoff_settings.max_retry_delay_millis / MILLIS_PER_SECOND
214
+ delay_multiplier = backoff_settings.retry_delay_multiplier
215
+ total_timeout =
216
+ backoff_settings.total_timeout_millis / MILLIS_PER_SECOND
217
+ deadline = Time.now + total_timeout
218
+ until done?
219
+ sleep(delay)
220
+ if Time.now >= deadline
221
+ raise RetryError, 'Retry total timeout exceeded with exception'
222
+ end
223
+ delay = [delay * delay_multiplier, max_delay].min
224
+ reload!
225
+ end
226
+ yield(self) if block_given?
227
+ end
228
+
229
+ # Registers a callback to be run when a refreshed operation is marked
230
+ # as done. If the operation has completed prior to a call to this function
231
+ # the callback will be called instead of registered.
232
+ #
233
+ # @yield operation [Google::Gax::Operation] Yields the finished Operation.
234
+ def on_done(&block)
235
+ if done?
236
+ yield(self)
237
+ else
238
+ @callbacks.push(block)
239
+ end
240
+ end
241
+
242
+ # TODO: This is from google/protobuf/well_known_types.rb.
243
+ # Using google/protobuf in gax-ruby is currently causing a dependency
244
+ # conflict with grpc. When grpc depends on google-protobuf v3.1.0
245
+ # remove this function and use Google::Protobuf::Any#unpack.
246
+ def unpack(any_pb, klass)
247
+ type_name = any_pb.type_url.split('/')[-1]
248
+ return klass.decode(any_pb.value) if type_name == klass.descriptor.name
249
+ end
250
+ private :unpack
251
+ end
252
+ end
253
+ end