google-cloud-storage 1.34.1 → 1.41.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.
@@ -38,17 +38,21 @@ module Google
38
38
 
39
39
  ##
40
40
  # Creates a new Service instance.
41
- def initialize project, credentials,
42
- retries: nil, timeout: nil, host: nil, quota_project: nil
41
+ # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
42
+ def initialize project, credentials, retries: nil,
43
+ timeout: nil, open_timeout: nil, read_timeout: nil,
44
+ send_timeout: nil, host: nil, quota_project: nil,
45
+ max_elapsed_time: nil, base_interval: nil, max_interval: nil,
46
+ multiplier: nil
43
47
  @project = project
44
48
  @credentials = credentials
45
49
  @service = API::StorageService.new
46
50
  @service.client_options.application_name = "gcloud-ruby"
47
51
  @service.client_options.application_version = \
48
52
  Google::Cloud::Storage::VERSION
49
- @service.client_options.open_timeout_sec = timeout
50
- @service.client_options.read_timeout_sec = timeout
51
- @service.client_options.send_timeout_sec = timeout
53
+ @service.client_options.open_timeout_sec = (open_timeout || timeout)
54
+ @service.client_options.read_timeout_sec = (read_timeout || timeout)
55
+ @service.client_options.send_timeout_sec = (send_timeout || timeout)
52
56
  @service.client_options.transparent_gzip_decompression = false
53
57
  @service.request_options.retries = retries || 3
54
58
  @service.request_options.header ||= {}
@@ -56,9 +60,14 @@ module Google
56
60
  "gl-ruby/#{RUBY_VERSION} gccl/#{Google::Cloud::Storage::VERSION}"
57
61
  @service.request_options.header["Accept-Encoding"] = "gzip"
58
62
  @service.request_options.quota_project = quota_project if quota_project
63
+ @service.request_options.max_elapsed_time = max_elapsed_time if max_elapsed_time
64
+ @service.request_options.base_interval = base_interval if base_interval
65
+ @service.request_options.max_interval = max_interval if max_interval
66
+ @service.request_options.multiplier = multiplier if multiplier
59
67
  @service.authorization = @credentials.client if @credentials
60
68
  @service.root_url = host if host
61
69
  end
70
+ # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
62
71
 
63
72
  def service
64
73
  return mocked_service if mocked_service
@@ -72,11 +81,11 @@ module Google
72
81
 
73
82
  ##
74
83
  # Retrieves a list of buckets for the given project.
75
- def list_buckets prefix: nil, token: nil, max: nil, user_project: nil
84
+ def list_buckets prefix: nil, token: nil, max: nil, user_project: nil, options: {}
76
85
  execute do
77
86
  service.list_buckets \
78
87
  @project, prefix: prefix, page_token: token, max_results: max,
79
- user_project: user_project(user_project)
88
+ user_project: user_project(user_project), options: options
80
89
  end
81
90
  end
82
91
 
@@ -86,12 +95,14 @@ module Google
86
95
  def get_bucket bucket_name,
87
96
  if_metageneration_match: nil,
88
97
  if_metageneration_not_match: nil,
89
- user_project: nil
98
+ user_project: nil,
99
+ options: {}
90
100
  execute do
91
101
  service.get_bucket bucket_name,
92
102
  if_metageneration_match: if_metageneration_match,
93
103
  if_metageneration_not_match: if_metageneration_not_match,
94
- user_project: user_project(user_project)
104
+ user_project: user_project(user_project),
105
+ options: options
95
106
  end
96
107
  end
97
108
 
@@ -99,13 +110,14 @@ module Google
99
110
  # Creates a new bucket.
100
111
  # Returns Google::Apis::StorageV1::Bucket.
101
112
  def insert_bucket bucket_gapi, acl: nil, default_acl: nil,
102
- user_project: nil
113
+ user_project: nil, options: {}
103
114
  execute do
104
115
  service.insert_bucket \
105
116
  @project, bucket_gapi,
106
117
  predefined_acl: acl,
107
118
  predefined_default_object_acl: default_acl,
108
- user_project: user_project(user_project)
119
+ user_project: user_project(user_project),
120
+ options: options
109
121
  end
110
122
  end
111
123
 
@@ -117,11 +129,17 @@ module Google
117
129
  predefined_default_acl: nil,
118
130
  if_metageneration_match: nil,
119
131
  if_metageneration_not_match: nil,
120
- user_project: nil
132
+ user_project: nil,
133
+ options: {}
121
134
  bucket_gapi ||= Google::Apis::StorageV1::Bucket.new
122
135
  bucket_gapi.acl = [] if predefined_acl
123
136
  bucket_gapi.default_object_acl = [] if predefined_default_acl
124
137
 
138
+ if options[:retries].nil?
139
+ is_idempotent = retry? if_metageneration_match: if_metageneration_match
140
+ options = is_idempotent ? {} : { retries: 0 }
141
+ end
142
+
125
143
  execute do
126
144
  service.patch_bucket bucket_name,
127
145
  bucket_gapi,
@@ -129,7 +147,8 @@ module Google
129
147
  predefined_default_object_acl: predefined_default_acl,
130
148
  if_metageneration_match: if_metageneration_match,
131
149
  if_metageneration_not_match: if_metageneration_not_match,
132
- user_project: user_project(user_project)
150
+ user_project: user_project(user_project),
151
+ options: options
133
152
  end
134
153
  end
135
154
 
@@ -138,119 +157,144 @@ module Google
138
157
  def delete_bucket bucket_name,
139
158
  if_metageneration_match: nil,
140
159
  if_metageneration_not_match: nil,
141
- user_project: nil
160
+ user_project: nil,
161
+ options: {}
142
162
  execute do
143
163
  service.delete_bucket bucket_name,
144
164
  if_metageneration_match: if_metageneration_match,
145
165
  if_metageneration_not_match: if_metageneration_not_match,
146
- user_project: user_project(user_project)
166
+ user_project: user_project(user_project),
167
+ options: options
147
168
  end
148
169
  end
149
170
 
150
171
  ##
151
172
  # Locks retention policy on a bucket.
152
173
  def lock_bucket_retention_policy bucket_name, metageneration,
153
- user_project: nil
174
+ user_project: nil,
175
+ options: {}
154
176
  execute do
155
177
  service.lock_bucket_retention_policy \
156
178
  bucket_name, metageneration,
157
- user_project: user_project(user_project)
179
+ user_project: user_project(user_project),
180
+ options: options
158
181
  end
159
182
  end
160
183
 
161
184
  ##
162
185
  # Retrieves a list of ACLs for the given bucket.
163
- def list_bucket_acls bucket_name, user_project: nil
186
+ def list_bucket_acls bucket_name, user_project: nil, options: {}
164
187
  execute do
165
188
  service.list_bucket_access_controls \
166
- bucket_name, user_project: user_project(user_project)
189
+ bucket_name, user_project: user_project(user_project),
190
+ options: options
167
191
  end
168
192
  end
169
193
 
170
194
  ##
171
195
  # Creates a new bucket ACL.
172
- def insert_bucket_acl bucket_name, entity, role, user_project: nil
196
+ def insert_bucket_acl bucket_name, entity, role, user_project: nil, options: {}
173
197
  params = { entity: entity, role: role }.delete_if { |_k, v| v.nil? }
174
198
  new_acl = Google::Apis::StorageV1::BucketAccessControl.new(**params)
199
+ if options[:retries].nil?
200
+ options = options.merge({ retries: 0 })
201
+ end
175
202
  execute do
176
203
  service.insert_bucket_access_control \
177
- bucket_name, new_acl, user_project: user_project(user_project)
204
+ bucket_name, new_acl, user_project: user_project(user_project),
205
+ options: options
178
206
  end
179
207
  end
180
208
 
181
209
  ##
182
210
  # Permanently deletes a bucket ACL.
183
- def delete_bucket_acl bucket_name, entity, user_project: nil
211
+ def delete_bucket_acl bucket_name, entity, user_project: nil, options: {}
212
+ if options[:retries].nil?
213
+ options = options.merge({ retries: 0 })
214
+ end
184
215
  execute do
185
216
  service.delete_bucket_access_control \
186
- bucket_name, entity, user_project: user_project(user_project)
217
+ bucket_name, entity, user_project: user_project(user_project),
218
+ options: options
187
219
  end
188
220
  end
189
221
 
190
222
  ##
191
223
  # Retrieves a list of default ACLs for the given bucket.
192
- def list_default_acls bucket_name, user_project: nil
224
+ def list_default_acls bucket_name, user_project: nil, options: {}
193
225
  execute do
194
226
  service.list_default_object_access_controls \
195
- bucket_name, user_project: user_project(user_project)
227
+ bucket_name, user_project: user_project(user_project),
228
+ options: options
196
229
  end
197
230
  end
198
231
 
199
232
  ##
200
233
  # Creates a new default ACL.
201
- def insert_default_acl bucket_name, entity, role, user_project: nil
234
+ def insert_default_acl bucket_name, entity, role, user_project: nil, options: {}
235
+ if options[:retries].nil?
236
+ options = options.merge({ retries: 0 })
237
+ end
202
238
  param = { entity: entity, role: role }.delete_if { |_k, v| v.nil? }
203
239
  new_acl = Google::Apis::StorageV1::ObjectAccessControl.new(**param)
204
240
  execute do
205
241
  service.insert_default_object_access_control \
206
- bucket_name, new_acl, user_project: user_project(user_project)
242
+ bucket_name, new_acl, user_project: user_project(user_project),
243
+ options: options
207
244
  end
208
245
  end
209
246
 
210
247
  ##
211
248
  # Permanently deletes a default ACL.
212
- def delete_default_acl bucket_name, entity, user_project: nil
249
+ def delete_default_acl bucket_name, entity, user_project: nil, options: {}
250
+ if options[:retries].nil?
251
+ options = options.merge({ retries: 0 })
252
+ end
213
253
  execute do
214
254
  service.delete_default_object_access_control \
215
- bucket_name, entity, user_project: user_project(user_project)
255
+ bucket_name, entity, user_project: user_project(user_project),
256
+ options: options
216
257
  end
217
258
  end
218
259
 
219
260
  ##
220
261
  # Returns Google::Apis::StorageV1::Policy
221
- def get_bucket_policy bucket_name, requested_policy_version: nil, user_project: nil
262
+ def get_bucket_policy bucket_name, requested_policy_version: nil, user_project: nil,
263
+ options: {}
222
264
  # get_bucket_iam_policy(bucket, fields: nil, quota_user: nil,
223
265
  # user_ip: nil, options: nil)
224
266
  execute do
225
267
  service.get_bucket_iam_policy bucket_name, options_requested_policy_version: requested_policy_version,
226
- user_project: user_project(user_project)
268
+ user_project: user_project(user_project), options: options
227
269
  end
228
270
  end
229
271
 
230
272
  ##
231
273
  # Returns Google::Apis::StorageV1::Policy
232
- def set_bucket_policy bucket_name, new_policy, user_project: nil
274
+ def set_bucket_policy bucket_name, new_policy, user_project: nil, options: {}
233
275
  execute do
234
276
  service.set_bucket_iam_policy \
235
- bucket_name, new_policy, user_project: user_project(user_project)
277
+ bucket_name, new_policy, user_project: user_project(user_project), options: options
236
278
  end
237
279
  end
238
280
 
239
281
  ##
240
282
  # Returns Google::Apis::StorageV1::TestIamPermissionsResponse
241
- def test_bucket_permissions bucket_name, permissions, user_project: nil
283
+ def test_bucket_permissions bucket_name, permissions, user_project: nil, options: {}
242
284
  execute do
243
285
  service.test_bucket_iam_permissions \
244
- bucket_name, permissions, user_project: user_project(user_project)
286
+ bucket_name, permissions, user_project: user_project(user_project),
287
+ options: options
245
288
  end
246
289
  end
247
290
 
248
291
  ##
249
292
  # Retrieves a list of Pub/Sub notification subscriptions for a bucket.
250
- def list_notifications bucket_name, user_project: nil
293
+ def list_notifications bucket_name, user_project: nil, options: {}
251
294
  execute do
252
295
  service.list_notifications bucket_name,
253
- user_project: user_project(user_project)
296
+ user_project: user_project(user_project),
297
+ options: options
254
298
  end
255
299
  end
256
300
 
@@ -258,7 +302,7 @@ module Google
258
302
  # Creates a new Pub/Sub notification subscription for a bucket.
259
303
  def insert_notification bucket_name, topic_name, custom_attrs: nil,
260
304
  event_types: nil, prefix: nil, payload: nil,
261
- user_project: nil
305
+ user_project: nil, options: {}
262
306
  params =
263
307
  { custom_attributes: custom_attrs,
264
308
  event_types: event_types(event_types),
@@ -267,41 +311,50 @@ module Google
267
311
  topic: topic_path(topic_name) }.delete_if { |_k, v| v.nil? }
268
312
  new_notification = Google::Apis::StorageV1::Notification.new(**params)
269
313
 
314
+ if options[:retries].nil?
315
+ options = options.merge({ retries: 0 })
316
+ end
317
+
270
318
  execute do
271
319
  service.insert_notification \
272
320
  bucket_name, new_notification,
273
- user_project: user_project(user_project)
321
+ user_project: user_project(user_project),
322
+ options: options
274
323
  end
275
324
  end
276
325
 
277
326
  ##
278
327
  # Retrieves a Pub/Sub notification subscription for a bucket.
279
- def get_notification bucket_name, notification_id, user_project: nil
328
+ def get_notification bucket_name, notification_id, user_project: nil, options: {}
280
329
  execute do
281
330
  service.get_notification bucket_name, notification_id,
282
- user_project: user_project(user_project)
331
+ user_project: user_project(user_project),
332
+ options: options
283
333
  end
284
334
  end
285
335
 
286
336
  ##
287
337
  # Deletes a new Pub/Sub notification subscription for a bucket.
288
- def delete_notification bucket_name, notification_id, user_project: nil
338
+ def delete_notification bucket_name, notification_id, user_project: nil, options: {}
289
339
  execute do
290
340
  service.delete_notification bucket_name, notification_id,
291
- user_project: user_project(user_project)
341
+ user_project: user_project(user_project),
342
+ options: options
292
343
  end
293
344
  end
294
345
 
295
346
  ##
296
347
  # Retrieves a list of files matching the criteria.
297
348
  def list_files bucket_name, delimiter: nil, max: nil, token: nil,
298
- prefix: nil, versions: nil, user_project: nil
349
+ prefix: nil, versions: nil, user_project: nil,
350
+ options: {}
299
351
  execute do
300
352
  service.list_objects \
301
353
  bucket_name, delimiter: delimiter, max_results: max,
302
354
  page_token: token, prefix: prefix,
303
355
  versions: versions,
304
- user_project: user_project(user_project)
356
+ user_project: user_project(user_project),
357
+ options: options
305
358
  end
306
359
  end
307
360
 
@@ -329,7 +382,8 @@ module Google
329
382
  if_generation_not_match: nil,
330
383
  if_metageneration_match: nil,
331
384
  if_metageneration_not_match: nil,
332
- user_project: nil
385
+ user_project: nil,
386
+ options: {}
333
387
  params = {
334
388
  cache_control: cache_control,
335
389
  content_type: content_type,
@@ -347,6 +401,13 @@ module Google
347
401
  file_obj = Google::Apis::StorageV1::Object.new(**params)
348
402
  content_type ||= mime_type_for(path || Pathname(source).to_path)
349
403
 
404
+ if options[:retries].nil?
405
+ is_idempotent = retry? if_generation_match: if_generation_match
406
+ options = is_idempotent ? key_options(key) : key_options(key).merge(retries: 0)
407
+ else
408
+ options = key_options(key).merge options
409
+ end
410
+
350
411
  execute do
351
412
  service.insert_object bucket_name,
352
413
  file_obj,
@@ -361,7 +422,7 @@ module Google
361
422
  if_metageneration_not_match: if_metageneration_not_match,
362
423
  kms_key_name: kms_key,
363
424
  user_project: user_project(user_project),
364
- options: key_options(key)
425
+ options: options
365
426
  end
366
427
  end
367
428
 
@@ -375,7 +436,8 @@ module Google
375
436
  if_metageneration_match: nil,
376
437
  if_metageneration_not_match: nil,
377
438
  key: nil,
378
- user_project: nil
439
+ user_project: nil,
440
+ options: {}
379
441
  execute do
380
442
  service.get_object \
381
443
  bucket_name, file_path,
@@ -385,7 +447,7 @@ module Google
385
447
  if_metageneration_match: if_metageneration_match,
386
448
  if_metageneration_not_match: if_metageneration_not_match,
387
449
  user_project: user_project(user_project),
388
- options: key_options(key)
450
+ options: key_options(key).merge(options)
389
451
  end
390
452
  end
391
453
 
@@ -410,8 +472,17 @@ module Google
410
472
  if_source_metageneration_match: nil,
411
473
  if_source_metageneration_not_match: nil,
412
474
  token: nil,
413
- user_project: nil
475
+ user_project: nil,
476
+ options: {}
414
477
  key_options = rewrite_key_options source_key, destination_key
478
+
479
+ if options[:retries].nil?
480
+ is_idempotent = retry? if_generation_match: if_generation_match
481
+ options = is_idempotent ? key_options : key_options.merge(retries: 0)
482
+ else
483
+ options = key_options.merge options
484
+ end
485
+
415
486
  execute do
416
487
  service.rewrite_object source_bucket_name,
417
488
  source_file_path,
@@ -431,7 +502,7 @@ module Google
431
502
  if_source_metageneration_not_match: if_source_metageneration_not_match,
432
503
  rewrite_token: token,
433
504
  user_project: user_project(user_project),
434
- options: key_options
505
+ options: options
435
506
  end
436
507
  end
437
508
 
@@ -446,12 +517,20 @@ module Google
446
517
  if_source_generation_match: nil,
447
518
  if_generation_match: nil,
448
519
  if_metageneration_match: nil,
449
- user_project: nil
520
+ user_project: nil,
521
+ options: {}
450
522
 
451
523
  source_objects = compose_file_source_objects source_files, if_source_generation_match
452
524
  compose_req = Google::Apis::StorageV1::ComposeRequest.new source_objects: source_objects,
453
525
  destination: destination_gapi
454
526
 
527
+ if options[:retries].nil?
528
+ is_idempotent = retry? if_generation_match: if_generation_match
529
+ options = is_idempotent ? key_options(key) : key_options(key).merge(retries: 0)
530
+ else
531
+ options = key_options.merge options
532
+ end
533
+
455
534
  execute do
456
535
  service.compose_object bucket_name,
457
536
  destination_path,
@@ -460,7 +539,7 @@ module Google
460
539
  if_generation_match: if_generation_match,
461
540
  if_metageneration_match: if_metageneration_match,
462
541
  user_project: user_project(user_project),
463
- options: key_options(key)
542
+ options: options
464
543
  end
465
544
  end
466
545
 
@@ -474,12 +553,12 @@ module Google
474
553
  # Apis::StorageV1::StorageService and Apis::Core::DownloadCommand at
475
554
  # the end of this file.
476
555
  def download_file bucket_name, file_path, target_path, generation: nil,
477
- key: nil, range: nil, user_project: nil
478
- options = key_options key
556
+ key: nil, range: nil, user_project: nil, options: {}
557
+ options = key_options(key).merge(options)
479
558
  options = range_header options, range
480
559
 
481
560
  execute do
482
- service.get_object_with_response \
561
+ service.get_object \
483
562
  bucket_name, file_path,
484
563
  download_dest: target_path, generation: generation,
485
564
  user_project: user_project(user_project),
@@ -498,8 +577,15 @@ module Google
498
577
  if_metageneration_match: nil,
499
578
  if_metageneration_not_match: nil,
500
579
  predefined_acl: nil,
501
- user_project: nil
580
+ user_project: nil,
581
+ options: {}
502
582
  file_gapi ||= Google::Apis::StorageV1::Object.new
583
+
584
+ if options[:retries].nil?
585
+ is_idempotent = retry? if_metageneration_match: if_metageneration_match
586
+ options = is_idempotent ? {} : { retries: 0 }
587
+ end
588
+
503
589
  execute do
504
590
  service.patch_object bucket_name,
505
591
  file_path,
@@ -510,7 +596,8 @@ module Google
510
596
  if_metageneration_match: if_metageneration_match,
511
597
  if_metageneration_not_match: if_metageneration_not_match,
512
598
  predefined_acl: predefined_acl,
513
- user_project: user_project(user_project)
599
+ user_project: user_project(user_project),
600
+ options: options
514
601
  end
515
602
  end
516
603
 
@@ -523,7 +610,14 @@ module Google
523
610
  if_generation_not_match: nil,
524
611
  if_metageneration_match: nil,
525
612
  if_metageneration_not_match: nil,
526
- user_project: nil
613
+ user_project: nil,
614
+ options: {}
615
+
616
+ if options[:retries].nil?
617
+ is_idempotent = retry? generation: generation, if_generation_match: if_generation_match
618
+ options = is_idempotent ? {} : { retries: 0 }
619
+ end
620
+
527
621
  execute do
528
622
  service.delete_object bucket_name, file_path,
529
623
  generation: generation,
@@ -531,40 +625,51 @@ module Google
531
625
  if_generation_not_match: if_generation_not_match,
532
626
  if_metageneration_match: if_metageneration_match,
533
627
  if_metageneration_not_match: if_metageneration_not_match,
534
- user_project: user_project(user_project)
628
+ user_project: user_project(user_project),
629
+ options: options
535
630
  end
536
631
  end
537
632
 
538
633
  ##
539
634
  # Retrieves a list of ACLs for the given file.
540
- def list_file_acls bucket_name, file_name, user_project: nil
635
+ def list_file_acls bucket_name, file_name, user_project: nil, options: {}
541
636
  execute do
542
637
  service.list_object_access_controls \
543
- bucket_name, file_name, user_project: user_project(user_project)
638
+ bucket_name, file_name, user_project: user_project(user_project),
639
+ options: options
544
640
  end
545
641
  end
546
642
 
547
643
  ##
548
644
  # Creates a new file ACL.
549
645
  def insert_file_acl bucket_name, file_name, entity, role,
550
- generation: nil, user_project: nil
646
+ generation: nil, user_project: nil,
647
+ options: {}
648
+ if options[:retries].nil?
649
+ options = options.merge({ retries: 0 })
650
+ end
551
651
  params = { entity: entity, role: role }.delete_if { |_k, v| v.nil? }
552
652
  new_acl = Google::Apis::StorageV1::ObjectAccessControl.new(**params)
553
653
  execute do
554
654
  service.insert_object_access_control \
555
655
  bucket_name, file_name, new_acl,
556
- generation: generation, user_project: user_project(user_project)
656
+ generation: generation, user_project: user_project(user_project),
657
+ options: options
557
658
  end
558
659
  end
559
660
 
560
661
  ##
561
662
  # Permanently deletes a file ACL.
562
663
  def delete_file_acl bucket_name, file_name, entity, generation: nil,
563
- user_project: nil
664
+ user_project: nil, options: {}
665
+ if options[:retries].nil?
666
+ options = options.merge({ retries: 0 })
667
+ end
564
668
  execute do
565
669
  service.delete_object_access_control \
566
670
  bucket_name, file_name, entity,
567
- generation: generation, user_project: user_project(user_project)
671
+ generation: generation, user_project: user_project(user_project),
672
+ options: options
568
673
  end
569
674
  end
570
675
 
@@ -572,32 +677,42 @@ module Google
572
677
  # Creates a new HMAC key for the specified service account.
573
678
  # Returns Google::Apis::StorageV1::HmacKey.
574
679
  def create_hmac_key service_account_email, project_id: nil,
575
- user_project: nil
680
+ user_project: nil, options: {}
681
+
682
+ if options[:retries].nil?
683
+ options = options.merge({ retries: 0 })
684
+ end
685
+
576
686
  execute do
577
687
  service.create_project_hmac_key \
578
688
  (project_id || @project), service_account_email,
579
- user_project: user_project(user_project)
689
+ user_project: user_project(user_project),
690
+ options: options
580
691
  end
581
692
  end
582
693
 
583
694
  ##
584
695
  # Deletes an HMAC key. Key must be in the INACTIVE state.
585
- def delete_hmac_key access_id, project_id: nil, user_project: nil
696
+ def delete_hmac_key access_id, project_id: nil, user_project: nil,
697
+ options: {}
586
698
  execute do
587
699
  service.delete_project_hmac_key \
588
700
  (project_id || @project), access_id,
589
- user_project: user_project(user_project)
701
+ user_project: user_project(user_project),
702
+ options: options
590
703
  end
591
704
  end
592
705
 
593
706
  ##
594
707
  # Retrieves an HMAC key's metadata.
595
708
  # Returns Google::Apis::StorageV1::HmacKeyMetadata.
596
- def get_hmac_key access_id, project_id: nil, user_project: nil
709
+ def get_hmac_key access_id, project_id: nil, user_project: nil,
710
+ options: {}
597
711
  execute do
598
712
  service.get_project_hmac_key \
599
713
  (project_id || @project), access_id,
600
- user_project: user_project(user_project)
714
+ user_project: user_project(user_project),
715
+ options: options
601
716
  end
602
717
  end
603
718
 
@@ -606,14 +721,15 @@ module Google
606
721
  # Returns Google::Apis::StorageV1::HmacKeysMetadata.
607
722
  def list_hmac_keys max: nil, token: nil, service_account_email: nil,
608
723
  project_id: nil, show_deleted_keys: nil,
609
- user_project: nil
724
+ user_project: nil, options: {}
610
725
  execute do
611
726
  service.list_project_hmac_keys \
612
727
  (project_id || @project),
613
728
  max_results: max, page_token: token,
614
729
  service_account_email: service_account_email,
615
730
  show_deleted_keys: show_deleted_keys,
616
- user_project: user_project(user_project)
731
+ user_project: user_project(user_project),
732
+ options: options
617
733
  end
618
734
  end
619
735
 
@@ -622,11 +738,44 @@ module Google
622
738
  # for valid states.
623
739
  # Returns Google::Apis::StorageV1::HmacKeyMetadata.
624
740
  def update_hmac_key access_id, hmac_key_metadata_object,
625
- project_id: nil, user_project: nil
741
+ project_id: nil, user_project: nil,
742
+ options: {}
626
743
  execute do
627
744
  service.update_project_hmac_key \
628
745
  (project_id || @project), access_id, hmac_key_metadata_object,
629
- user_project: user_project(user_project)
746
+ user_project: user_project(user_project),
747
+ options: options
748
+ end
749
+ end
750
+
751
+ ##
752
+ # Updates a bucket, including its ACL metadata.
753
+ def update_bucket bucket_name,
754
+ bucket_gapi = nil,
755
+ predefined_acl: nil,
756
+ predefined_default_acl: nil,
757
+ if_metageneration_match: nil,
758
+ if_metageneration_not_match: nil,
759
+ user_project: nil,
760
+ options: {}
761
+ bucket_gapi ||= Google::Apis::StorageV1::Bucket.new
762
+ bucket_gapi.acl = [] if predefined_acl
763
+ bucket_gapi.default_object_acl = [] if predefined_default_acl
764
+
765
+ if options[:retries].nil?
766
+ is_idempotent = retry? if_metageneration_match: if_metageneration_match
767
+ options = is_idempotent ? {} : { retries: 0 }
768
+ end
769
+
770
+ execute do
771
+ service.update_bucket bucket_name,
772
+ bucket_gapi,
773
+ predefined_acl: predefined_acl,
774
+ predefined_default_object_acl: predefined_default_acl,
775
+ if_metageneration_match: if_metageneration_match,
776
+ if_metageneration_not_match: if_metageneration_not_match,
777
+ user_project: user_project(user_project),
778
+ options: options
630
779
  end
631
780
  end
632
781
 
@@ -762,163 +911,11 @@ module Google
762
911
  rescue Google::Apis::Error => e
763
912
  raise Google::Cloud::Error.from_error(e)
764
913
  end
765
- end
766
- end
767
- end
768
-
769
- # rubocop:disable all
770
-
771
- # @private
772
- #
773
- # IMPORTANT: These monkey-patches of Apis::StorageV1::StorageService and
774
- # Apis::Core::DownloadCommand must be verified and updated (if needed) for
775
- # every upgrade of google-api-client.
776
- #
777
- # The purpose of these modifications is to provide access to response headers
778
- # (in particular, the Content-Encoding header) for the #download_file method,
779
- # above. If google-api-client is modified to expose response headers to its
780
- # clients, this code should be removed, and #download_file updated to use that
781
- # solution instead.
782
- #
783
- module Apis
784
- # @private
785
- module StorageV1
786
- # @private
787
- class StorageService
788
- # Returns a two-element array containing:
789
- # * The `result` that is the usual return type of #get_object.
790
- # * The `http_resp` from DownloadCommand#execute_once.
791
- def get_object_with_response(bucket, object, generation: nil, if_generation_match: nil, if_generation_not_match: nil, if_metageneration_match: nil, if_metageneration_not_match: nil, projection: nil, user_project: nil, fields: nil, quota_user: nil, user_ip: nil, download_dest: nil, options: nil, &block)
792
- if download_dest.nil?
793
- command = make_simple_command(:get, 'b/{bucket}/o/{object}', options)
794
- else
795
- command = make_download_command(:get, 'b/{bucket}/o/{object}', options)
796
- command.download_dest = download_dest
797
- end
798
- command.response_representation = Google::Apis::StorageV1::Object::Representation
799
- command.response_class = Google::Apis::StorageV1::Object
800
- command.params['bucket'] = bucket unless bucket.nil?
801
- command.params['object'] = object unless object.nil?
802
- command.query['generation'] = generation unless generation.nil?
803
- command.query['ifGenerationMatch'] = if_generation_match unless if_generation_match.nil?
804
- command.query['ifGenerationNotMatch'] = if_generation_not_match unless if_generation_not_match.nil?
805
- command.query['ifMetagenerationMatch'] = if_metageneration_match unless if_metageneration_match.nil?
806
- command.query['ifMetagenerationNotMatch'] = if_metageneration_not_match unless if_metageneration_not_match.nil?
807
- command.query['projection'] = projection unless projection.nil?
808
- command.query['userProject'] = user_project unless user_project.nil?
809
- command.query['fields'] = fields unless fields.nil?
810
- command.query['quotaUser'] = quota_user unless quota_user.nil?
811
- command.query['userIp'] = user_ip unless user_ip.nil?
812
- execute_or_queue_command_with_response(command, &block)
813
- end
814
-
815
- # Returns a two-element array containing:
816
- # * The `result` that is the usual return type of #execute_or_queue_command.
817
- # * The `http_resp` from DownloadCommand#execute_once.
818
- def execute_or_queue_command_with_response(command, &callback)
819
- batch_command = current_batch
820
- if batch_command
821
- raise "Can not combine services in a batch" if Thread.current[:google_api_batch_service] != self
822
- batch_command.add(command, &callback)
823
- nil
824
- else
825
- command.execute_with_response(client, &callback)
826
- end
827
- end
828
- end
829
- end
830
- # @private
831
- module Core
832
- # @private
833
- # Streaming/resumable media download support
834
- class DownloadCommand < ApiCommand
835
- # Returns a two-element array containing:
836
- # * The `result` that is the usual return type of #execute.
837
- # * The `http_resp` from #execute_once.
838
- def execute_with_response(client)
839
- prepare!
840
- begin
841
- Retriable.retriable tries: options.retries + 1,
842
- base_interval: 1,
843
- multiplier: 2,
844
- on: RETRIABLE_ERRORS do |try|
845
- # This 2nd level retriable only catches auth errors, and supports 1 retry, which allows
846
- # auth to be re-attempted without having to retry all sorts of other failures like
847
- # NotFound, etc
848
- auth_tries = (try == 1 && authorization_refreshable? ? 2 : 1)
849
- Retriable.retriable tries: auth_tries,
850
- on: [Google::Apis::AuthorizationError, Signet::AuthorizationError],
851
- on_retry: proc { |*| refresh_authorization } do
852
- execute_once_with_response(client).tap do |result|
853
- if block_given?
854
- yield result, nil
855
- end
856
- end
857
- end
858
- end
859
- rescue => e
860
- if block_given?
861
- yield nil, e
862
- else
863
- raise e
864
- end
865
- end
866
- ensure
867
- release!
868
- end
869
914
 
870
- # Returns a two-element array containing:
871
- # * The `result` that is the usual return type of #execute_once.
872
- # * The `http_resp`.
873
- def execute_once_with_response(client, &block)
874
- request_header = header.dup
875
- apply_request_options(request_header)
876
- download_offset = nil
877
-
878
- if @offset > 0
879
- logger.debug { sprintf('Resuming download from offset %d', @offset) }
880
- request_header[RANGE_HEADER] = sprintf('bytes=%d-', @offset)
881
- end
882
-
883
- http_res = client.get(url.to_s,
884
- query: query,
885
- header: request_header,
886
- follow_redirect: true) do |res, chunk|
887
- status = res.http_header.status_code.to_i
888
- next unless OK_STATUS.include?(status)
889
-
890
- download_offset ||= (status == 206 ? @offset : 0)
891
- download_offset += chunk.bytesize
892
-
893
- if download_offset - chunk.bytesize == @offset
894
- next_chunk = chunk
895
- else
896
- # Oh no! Requested a chunk, but received the entire content
897
- chunk_index = @offset - (download_offset - chunk.bytesize)
898
- next_chunk = chunk.byteslice(chunk_index..-1)
899
- next if next_chunk.nil?
900
- end
901
- # logger.debug { sprintf('Writing chunk (%d bytes, %d total)', chunk.length, bytes_read) }
902
- @download_io.write(next_chunk)
903
-
904
- @offset += next_chunk.bytesize
905
- end
906
-
907
- @download_io.flush
908
-
909
- if @close_io_on_finish
910
- result = nil
911
- else
912
- result = @download_io
913
- end
914
- check_status(http_res.status.to_i, http_res.header, http_res.body)
915
- success([result, http_res], &block)
916
- rescue => e
917
- @download_io.flush
918
- error(e, rethrow: true, &block)
915
+ def retry? query_params
916
+ query_params.any? { |_key, val| !val.nil? }
919
917
  end
920
918
  end
921
919
  end
922
920
  end
923
- # rubocop:enable all
924
921
  end