google-cloud-storage 1.37.0 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4978faf0cccd7a12e58085b8a5eb44a0bdfb54446c17e5c377ef66e443a93671
4
- data.tar.gz: 7487e0b96eabba4902ebc21992b651e08261523175d49c4477e820e941757be3
3
+ metadata.gz: 24a6e0506ffc44db974accb0e91b5d9efd1f9898a07b15bb286d8d9428c83ec1
4
+ data.tar.gz: f51a2efcd382bb9bc5b2c04503456eca85cdf400897995a32a3612e56839e6e9
5
5
  SHA512:
6
- metadata.gz: 7e0728273ad8a402031e43930695f11c0f908c7379a2a80c28b68f6278034f8957a47f980161aa490ffa261e16559b699eabd5526f7304176167493e8bf1b7c0
7
- data.tar.gz: 3cebdabf2dbefc4f8f4a23f8c6df43b25770cda527c0fc502e7a2cd8ab9ac9cfa8a82a1fc108c28168becc6e9f9a624a5c588c5ef8657f1f83b2dfafecd9f413
6
+ metadata.gz: 4ccaa608e3aa4e9ffc214885ce11a798d622d216a18a686f80972e6f6b469b6763535871228b6eb75af7c1e1a0b918c2343f15c114f9422925da8c7ae13b5c5e
7
+ data.tar.gz: 2c7b4e5b998be2a49f10077024590d6898384da1dcc44a4e5995cf0a55419be421671fe6e78c669844c79ea1193566dbe303a34f208dd3d29ee0fba900f8b036
data/CHANGELOG.md CHANGED
@@ -1,5 +1,39 @@
1
1
  # Release History
2
2
 
3
+ ### 1.42.0 (2022-09-21)
4
+
5
+ #### Features
6
+
7
+ * send invocation_id header in all requests ([#19161](https://github.com/googleapis/google-cloud-ruby/issues/19161))
8
+
9
+ ### 1.41.0 (2022-09-16)
10
+
11
+ #### Features
12
+
13
+ * add retry support for non-idempotent operations ([#19134](https://github.com/googleapis/google-cloud-ruby/issues/19134))
14
+ #### Bug Fixes
15
+
16
+ * Correct options checks in retry operations ([#19135](https://github.com/googleapis/google-cloud-ruby/issues/19135))
17
+ * Update api for bucket update ([#19110](https://github.com/googleapis/google-cloud-ruby/issues/19110))
18
+
19
+ ### 1.40.0 (2022-09-13)
20
+
21
+ #### Features
22
+
23
+ * Update all patch bucket helper methods to accept preconditions ([#19117](https://github.com/googleapis/google-cloud-ruby/issues/19117))
24
+
25
+ ### 1.39.0 (2022-08-24)
26
+
27
+ #### Features
28
+
29
+ * add support for conditional idempotent operations ([#18834](https://github.com/googleapis/google-cloud-ruby/issues/18834))
30
+
31
+ ### 1.38.0 (2022-07-31)
32
+
33
+ #### Features
34
+
35
+ * Add support for dual region gcs buckets ([#18862](https://github.com/googleapis/google-cloud-ruby/issues/18862))
36
+
3
37
  ### 1.37.0 (2022-06-30)
4
38
 
5
39
  #### Features
data/OVERVIEW.md CHANGED
@@ -563,6 +563,38 @@ require "google/cloud/storage"
563
563
  storage = Google::Cloud::Storage.new retries: 10, timeout: 120
564
564
  ```
565
565
 
566
+ The library by default retries all API requests which are always idempotent on a
567
+ "transient" error.
568
+
569
+ For API requests which are idempotent only if the some conditions are satisfied
570
+ (For ex. a file has the same "generation"), the library retries only if the
571
+ condition is specified.
572
+
573
+ Rather than using this default behaviour, you may choose to disable the retries
574
+ on your own.
575
+
576
+ You can pass `retries` as `0` to disable retries for all operations regardless
577
+ of their idempotencies.
578
+
579
+ ```ruby
580
+ require "google/cloud/storage"
581
+
582
+ storage = Google::Cloud::Storage.new retries: 0
583
+ ```
584
+
585
+ You can also disable retries for a particular operation by passing `retries` as
586
+ `0` in the `options` field.
587
+
588
+ ```ruby
589
+ require "google/cloud/storage"
590
+
591
+ storage = Google::Cloud::Storage.new
592
+ service = storage.service
593
+ service.get_bucket bucket_name, options: {retries: 0}
594
+ ```
595
+
596
+ For those API requests which are never idempotent, the library passes retries=0 by default, suppressing any retries.
597
+
566
598
  See the [Storage status and error
567
599
  codes](https://cloud.google.com/storage/docs/json_api/v1/status-codes)
568
600
  for a list of error conditions.
@@ -349,8 +349,8 @@ module Google
349
349
  #
350
350
  # bucket.acl.auth!
351
351
  #
352
- def auth!
353
- update_predefined_acl! "authenticatedRead"
352
+ def auth! if_metageneration_match: nil
353
+ update_predefined_acl! "authenticatedRead", if_metageneration_match: if_metageneration_match
354
354
  end
355
355
  alias authenticatedRead! auth!
356
356
  alias auth_read! auth!
@@ -370,8 +370,8 @@ module Google
370
370
  #
371
371
  # bucket.acl.private!
372
372
  #
373
- def private!
374
- update_predefined_acl! "private"
373
+ def private! if_metageneration_match: nil
374
+ update_predefined_acl! "private", if_metageneration_match: if_metageneration_match
375
375
  end
376
376
 
377
377
  ##
@@ -387,8 +387,8 @@ module Google
387
387
  #
388
388
  # bucket.acl.project_private!
389
389
  #
390
- def project_private!
391
- update_predefined_acl! "projectPrivate"
390
+ def project_private! if_metageneration_match: nil
391
+ update_predefined_acl! "projectPrivate", if_metageneration_match: if_metageneration_match
392
392
  end
393
393
  alias projectPrivate! project_private!
394
394
 
@@ -405,8 +405,8 @@ module Google
405
405
  #
406
406
  # bucket.acl.public!
407
407
  #
408
- def public!
409
- update_predefined_acl! "publicRead"
408
+ def public! if_metageneration_match: nil
409
+ update_predefined_acl! "publicRead", if_metageneration_match: if_metageneration_match
410
410
  end
411
411
  alias publicRead! public!
412
412
  alias public_read! public!
@@ -423,8 +423,8 @@ module Google
423
423
  #
424
424
  # bucket.acl.public_write!
425
425
  #
426
- def public_write!
427
- update_predefined_acl! "publicReadWrite"
426
+ def public_write! if_metageneration_match: nil
427
+ update_predefined_acl! "publicReadWrite", if_metageneration_match: if_metageneration_match
428
428
  end
429
429
  alias publicReadWrite! public_write!
430
430
 
@@ -437,9 +437,10 @@ module Google
437
437
  self
438
438
  end
439
439
 
440
- def update_predefined_acl! acl_role
440
+ def update_predefined_acl! acl_role, if_metageneration_match: nil
441
441
  @service.patch_bucket @bucket, predefined_acl: acl_role,
442
- user_project: user_project
442
+ user_project: user_project,
443
+ if_metageneration_match: if_metageneration_match
443
444
  clear!
444
445
  end
445
446
 
@@ -714,8 +715,8 @@ module Google
714
715
  #
715
716
  # bucket.default_acl.auth!
716
717
  #
717
- def auth!
718
- update_predefined_default_acl! "authenticatedRead"
718
+ def auth! if_metageneration_match: nil
719
+ update_predefined_default_acl! "authenticatedRead", if_metageneration_match: if_metageneration_match
719
720
  end
720
721
  alias authenticatedRead! auth!
721
722
  alias auth_read! auth!
@@ -735,8 +736,8 @@ module Google
735
736
  #
736
737
  # bucket.default_acl.owner_full!
737
738
  #
738
- def owner_full!
739
- update_predefined_default_acl! "bucketOwnerFullControl"
739
+ def owner_full! if_metageneration_match: nil
740
+ update_predefined_default_acl! "bucketOwnerFullControl", if_metageneration_match: if_metageneration_match
740
741
  end
741
742
  alias bucketOwnerFullControl! owner_full!
742
743
 
@@ -753,8 +754,8 @@ module Google
753
754
  #
754
755
  # bucket.default_acl.owner_read!
755
756
  #
756
- def owner_read!
757
- update_predefined_default_acl! "bucketOwnerRead"
757
+ def owner_read! if_metageneration_match: nil
758
+ update_predefined_default_acl! "bucketOwnerRead", if_metageneration_match: if_metageneration_match
758
759
  end
759
760
  alias bucketOwnerRead! owner_read!
760
761
 
@@ -771,8 +772,8 @@ module Google
771
772
  #
772
773
  # bucket.default_acl.private!
773
774
  #
774
- def private!
775
- update_predefined_default_acl! "private"
775
+ def private! if_metageneration_match: nil
776
+ update_predefined_default_acl! "private", if_metageneration_match: if_metageneration_match
776
777
  end
777
778
 
778
779
  ##
@@ -788,8 +789,8 @@ module Google
788
789
  #
789
790
  # bucket.default_acl.project_private!
790
791
  #
791
- def project_private!
792
- update_predefined_default_acl! "projectPrivate"
792
+ def project_private! if_metageneration_match: nil
793
+ update_predefined_default_acl! "projectPrivate", if_metageneration_match: if_metageneration_match
793
794
  end
794
795
  alias projectPrivate! project_private!
795
796
 
@@ -806,8 +807,8 @@ module Google
806
807
  #
807
808
  # bucket.default_acl.public!
808
809
  #
809
- def public!
810
- update_predefined_default_acl! "publicRead"
810
+ def public! if_metageneration_match: nil
811
+ update_predefined_default_acl! "publicRead", if_metageneration_match: if_metageneration_match
811
812
  end
812
813
  alias publicRead! public!
813
814
  alias public_read! public!
@@ -820,9 +821,10 @@ module Google
820
821
  self
821
822
  end
822
823
 
823
- def update_predefined_default_acl! acl_role
824
+ def update_predefined_default_acl! acl_role, if_metageneration_match: nil
824
825
  @service.patch_bucket @bucket, predefined_default_acl: acl_role,
825
- user_project: user_project
826
+ user_project: user_project,
827
+ if_metageneration_match: if_metageneration_match
826
828
  clear!
827
829
  end
828
830
 
@@ -301,6 +301,20 @@ module Google
301
301
  @gapi.location_type
302
302
  end
303
303
 
304
+ ##
305
+ # Returns the list of regional locations for custom dual-region buckets.
306
+ #
307
+ # @return [String, nil] Returns nil if the property has not been set before creation,
308
+ # if the bucket's resource has not been loaded from the server,
309
+ # or if the bucket is not a dual-regions bucket.
310
+
311
+ # @see https://cloud.google.com/storage/docs/json_api/v1/buckets and
312
+ # https://cloud.google.com/storage/docs/locations
313
+ #
314
+ def data_locations
315
+ @gapi.custom_placement_config&.data_locations
316
+ end
317
+
304
318
  ##
305
319
  # The destination bucket name for the bucket's logs.
306
320
  #
@@ -1156,9 +1170,9 @@ module Google
1156
1170
  updater.check_for_mutable_cors!
1157
1171
  updater.check_for_mutable_lifecycle!
1158
1172
  return if updater.updates.empty?
1159
- patch_gapi! updater.updates,
1160
- if_metageneration_match: if_metageneration_match,
1161
- if_metageneration_not_match: if_metageneration_not_match
1173
+ update_gapi! updater.updates,
1174
+ if_metageneration_match: if_metageneration_match,
1175
+ if_metageneration_not_match: if_metageneration_not_match
1162
1176
  end
1163
1177
 
1164
1178
  ##
@@ -2891,6 +2905,26 @@ module Google
2891
2905
  self
2892
2906
  end
2893
2907
 
2908
+ def update_gapi! attributes,
2909
+ if_metageneration_match: nil,
2910
+ if_metageneration_not_match: nil
2911
+ attributes = Array(attributes)
2912
+ attributes.flatten!
2913
+ return if attributes.empty?
2914
+ ensure_service!
2915
+ update_args = Hash[attributes.map do |attr|
2916
+ [attr, @gapi.send(attr)]
2917
+ end]
2918
+ update_gapi = API::Bucket.new(**update_args)
2919
+ @gapi = service.update_bucket name,
2920
+ update_gapi,
2921
+ if_metageneration_match: if_metageneration_match,
2922
+ if_metageneration_not_match: if_metageneration_not_match,
2923
+ user_project: user_project
2924
+ @lazy = nil
2925
+ self
2926
+ end
2927
+
2894
2928
  ##
2895
2929
  # Raise an error if the file is not found.
2896
2930
  def ensure_io_or_file_exists! file
@@ -290,9 +290,9 @@ module Google
290
290
  # access, and allUsers get READER access.
291
291
  # @param [String] location The location of the bucket. Optional.
292
292
  # If not passed, the default location, 'US', will be used.
293
- # If specifying a dual-region location, the regions can be specified
294
- # by joining them with a plus sign, for example 'US-CENTRAL1+US-WEST1'. See:
295
- # [Storage Locaitons](https://cloud.google.com/storage/docs/locations).
293
+ # If specifying a dual-region location, the `customPlacementConfig`
294
+ # property should be set in conjunction. See:
295
+ # [Storage Locations](https://cloud.google.com/storage/docs/locations).
296
296
  # @param [String] logging_bucket The destination bucket for the bucket's
297
297
  # logs. For more information, see [Access
298
298
  # Logs](https://cloud.google.com/storage/docs/access-logs).
@@ -367,6 +367,7 @@ module Google
367
367
  acl: nil,
368
368
  default_acl: nil,
369
369
  location: nil,
370
+ custom_placement_config: nil,
370
371
  storage_class: nil,
371
372
  logging_bucket: nil,
372
373
  logging_prefix: nil,
@@ -377,7 +378,8 @@ module Google
377
378
  user_project: nil
378
379
  params = {
379
380
  name: bucket_name,
380
- location: location
381
+ location: location,
382
+ custom_placement_config: custom_placement_config
381
383
  }.delete_if { |_, v| v.nil? }
382
384
  new_bucket = Google::Apis::StorageV1::Bucket.new(**params)
383
385
  storage_class = storage_class_for storage_class
@@ -64,6 +64,7 @@ module Google
64
64
  @service.request_options.base_interval = base_interval if base_interval
65
65
  @service.request_options.max_interval = max_interval if max_interval
66
66
  @service.request_options.multiplier = multiplier if multiplier
67
+ @service.request_options.add_invocation_id_header = true
67
68
  @service.authorization = @credentials.client if @credentials
68
69
  @service.root_url = host if host
69
70
  end
@@ -81,11 +82,11 @@ module Google
81
82
 
82
83
  ##
83
84
  # Retrieves a list of buckets for the given project.
84
- def list_buckets prefix: nil, token: nil, max: nil, user_project: nil
85
+ def list_buckets prefix: nil, token: nil, max: nil, user_project: nil, options: {}
85
86
  execute do
86
87
  service.list_buckets \
87
88
  @project, prefix: prefix, page_token: token, max_results: max,
88
- user_project: user_project(user_project)
89
+ user_project: user_project(user_project), options: options
89
90
  end
90
91
  end
91
92
 
@@ -95,12 +96,14 @@ module Google
95
96
  def get_bucket bucket_name,
96
97
  if_metageneration_match: nil,
97
98
  if_metageneration_not_match: nil,
98
- user_project: nil
99
+ user_project: nil,
100
+ options: {}
99
101
  execute do
100
102
  service.get_bucket bucket_name,
101
103
  if_metageneration_match: if_metageneration_match,
102
104
  if_metageneration_not_match: if_metageneration_not_match,
103
- user_project: user_project(user_project)
105
+ user_project: user_project(user_project),
106
+ options: options
104
107
  end
105
108
  end
106
109
 
@@ -108,13 +111,14 @@ module Google
108
111
  # Creates a new bucket.
109
112
  # Returns Google::Apis::StorageV1::Bucket.
110
113
  def insert_bucket bucket_gapi, acl: nil, default_acl: nil,
111
- user_project: nil
114
+ user_project: nil, options: {}
112
115
  execute do
113
116
  service.insert_bucket \
114
117
  @project, bucket_gapi,
115
118
  predefined_acl: acl,
116
119
  predefined_default_object_acl: default_acl,
117
- user_project: user_project(user_project)
120
+ user_project: user_project(user_project),
121
+ options: options
118
122
  end
119
123
  end
120
124
 
@@ -126,11 +130,17 @@ module Google
126
130
  predefined_default_acl: nil,
127
131
  if_metageneration_match: nil,
128
132
  if_metageneration_not_match: nil,
129
- user_project: nil
133
+ user_project: nil,
134
+ options: {}
130
135
  bucket_gapi ||= Google::Apis::StorageV1::Bucket.new
131
136
  bucket_gapi.acl = [] if predefined_acl
132
137
  bucket_gapi.default_object_acl = [] if predefined_default_acl
133
138
 
139
+ if options[:retries].nil?
140
+ is_idempotent = retry? if_metageneration_match: if_metageneration_match
141
+ options = is_idempotent ? {} : { retries: 0 }
142
+ end
143
+
134
144
  execute do
135
145
  service.patch_bucket bucket_name,
136
146
  bucket_gapi,
@@ -138,7 +148,8 @@ module Google
138
148
  predefined_default_object_acl: predefined_default_acl,
139
149
  if_metageneration_match: if_metageneration_match,
140
150
  if_metageneration_not_match: if_metageneration_not_match,
141
- user_project: user_project(user_project)
151
+ user_project: user_project(user_project),
152
+ options: options
142
153
  end
143
154
  end
144
155
 
@@ -147,119 +158,144 @@ module Google
147
158
  def delete_bucket bucket_name,
148
159
  if_metageneration_match: nil,
149
160
  if_metageneration_not_match: nil,
150
- user_project: nil
161
+ user_project: nil,
162
+ options: {}
151
163
  execute do
152
164
  service.delete_bucket bucket_name,
153
165
  if_metageneration_match: if_metageneration_match,
154
166
  if_metageneration_not_match: if_metageneration_not_match,
155
- user_project: user_project(user_project)
167
+ user_project: user_project(user_project),
168
+ options: options
156
169
  end
157
170
  end
158
171
 
159
172
  ##
160
173
  # Locks retention policy on a bucket.
161
174
  def lock_bucket_retention_policy bucket_name, metageneration,
162
- user_project: nil
175
+ user_project: nil,
176
+ options: {}
163
177
  execute do
164
178
  service.lock_bucket_retention_policy \
165
179
  bucket_name, metageneration,
166
- user_project: user_project(user_project)
180
+ user_project: user_project(user_project),
181
+ options: options
167
182
  end
168
183
  end
169
184
 
170
185
  ##
171
186
  # Retrieves a list of ACLs for the given bucket.
172
- def list_bucket_acls bucket_name, user_project: nil
187
+ def list_bucket_acls bucket_name, user_project: nil, options: {}
173
188
  execute do
174
189
  service.list_bucket_access_controls \
175
- bucket_name, user_project: user_project(user_project)
190
+ bucket_name, user_project: user_project(user_project),
191
+ options: options
176
192
  end
177
193
  end
178
194
 
179
195
  ##
180
196
  # Creates a new bucket ACL.
181
- def insert_bucket_acl bucket_name, entity, role, user_project: nil
197
+ def insert_bucket_acl bucket_name, entity, role, user_project: nil, options: {}
182
198
  params = { entity: entity, role: role }.delete_if { |_k, v| v.nil? }
183
199
  new_acl = Google::Apis::StorageV1::BucketAccessControl.new(**params)
200
+ if options[:retries].nil?
201
+ options = options.merge({ retries: 0 })
202
+ end
184
203
  execute do
185
204
  service.insert_bucket_access_control \
186
- bucket_name, new_acl, user_project: user_project(user_project)
205
+ bucket_name, new_acl, user_project: user_project(user_project),
206
+ options: options
187
207
  end
188
208
  end
189
209
 
190
210
  ##
191
211
  # Permanently deletes a bucket ACL.
192
- def delete_bucket_acl bucket_name, entity, user_project: nil
212
+ def delete_bucket_acl bucket_name, entity, user_project: nil, options: {}
213
+ if options[:retries].nil?
214
+ options = options.merge({ retries: 0 })
215
+ end
193
216
  execute do
194
217
  service.delete_bucket_access_control \
195
- bucket_name, entity, user_project: user_project(user_project)
218
+ bucket_name, entity, user_project: user_project(user_project),
219
+ options: options
196
220
  end
197
221
  end
198
222
 
199
223
  ##
200
224
  # Retrieves a list of default ACLs for the given bucket.
201
- def list_default_acls bucket_name, user_project: nil
225
+ def list_default_acls bucket_name, user_project: nil, options: {}
202
226
  execute do
203
227
  service.list_default_object_access_controls \
204
- bucket_name, user_project: user_project(user_project)
228
+ bucket_name, user_project: user_project(user_project),
229
+ options: options
205
230
  end
206
231
  end
207
232
 
208
233
  ##
209
234
  # Creates a new default ACL.
210
- def insert_default_acl bucket_name, entity, role, user_project: nil
235
+ def insert_default_acl bucket_name, entity, role, user_project: nil, options: {}
236
+ if options[:retries].nil?
237
+ options = options.merge({ retries: 0 })
238
+ end
211
239
  param = { entity: entity, role: role }.delete_if { |_k, v| v.nil? }
212
240
  new_acl = Google::Apis::StorageV1::ObjectAccessControl.new(**param)
213
241
  execute do
214
242
  service.insert_default_object_access_control \
215
- bucket_name, new_acl, user_project: user_project(user_project)
243
+ bucket_name, new_acl, user_project: user_project(user_project),
244
+ options: options
216
245
  end
217
246
  end
218
247
 
219
248
  ##
220
249
  # Permanently deletes a default ACL.
221
- def delete_default_acl bucket_name, entity, user_project: nil
250
+ def delete_default_acl bucket_name, entity, user_project: nil, options: {}
251
+ if options[:retries].nil?
252
+ options = options.merge({ retries: 0 })
253
+ end
222
254
  execute do
223
255
  service.delete_default_object_access_control \
224
- bucket_name, entity, user_project: user_project(user_project)
256
+ bucket_name, entity, user_project: user_project(user_project),
257
+ options: options
225
258
  end
226
259
  end
227
260
 
228
261
  ##
229
262
  # Returns Google::Apis::StorageV1::Policy
230
- def get_bucket_policy bucket_name, requested_policy_version: nil, user_project: nil
263
+ def get_bucket_policy bucket_name, requested_policy_version: nil, user_project: nil,
264
+ options: {}
231
265
  # get_bucket_iam_policy(bucket, fields: nil, quota_user: nil,
232
266
  # user_ip: nil, options: nil)
233
267
  execute do
234
268
  service.get_bucket_iam_policy bucket_name, options_requested_policy_version: requested_policy_version,
235
- user_project: user_project(user_project)
269
+ user_project: user_project(user_project), options: options
236
270
  end
237
271
  end
238
272
 
239
273
  ##
240
274
  # Returns Google::Apis::StorageV1::Policy
241
- def set_bucket_policy bucket_name, new_policy, user_project: nil
275
+ def set_bucket_policy bucket_name, new_policy, user_project: nil, options: {}
242
276
  execute do
243
277
  service.set_bucket_iam_policy \
244
- bucket_name, new_policy, user_project: user_project(user_project)
278
+ bucket_name, new_policy, user_project: user_project(user_project), options: options
245
279
  end
246
280
  end
247
281
 
248
282
  ##
249
283
  # Returns Google::Apis::StorageV1::TestIamPermissionsResponse
250
- def test_bucket_permissions bucket_name, permissions, user_project: nil
284
+ def test_bucket_permissions bucket_name, permissions, user_project: nil, options: {}
251
285
  execute do
252
286
  service.test_bucket_iam_permissions \
253
- bucket_name, permissions, user_project: user_project(user_project)
287
+ bucket_name, permissions, user_project: user_project(user_project),
288
+ options: options
254
289
  end
255
290
  end
256
291
 
257
292
  ##
258
293
  # Retrieves a list of Pub/Sub notification subscriptions for a bucket.
259
- def list_notifications bucket_name, user_project: nil
294
+ def list_notifications bucket_name, user_project: nil, options: {}
260
295
  execute do
261
296
  service.list_notifications bucket_name,
262
- user_project: user_project(user_project)
297
+ user_project: user_project(user_project),
298
+ options: options
263
299
  end
264
300
  end
265
301
 
@@ -267,7 +303,7 @@ module Google
267
303
  # Creates a new Pub/Sub notification subscription for a bucket.
268
304
  def insert_notification bucket_name, topic_name, custom_attrs: nil,
269
305
  event_types: nil, prefix: nil, payload: nil,
270
- user_project: nil
306
+ user_project: nil, options: {}
271
307
  params =
272
308
  { custom_attributes: custom_attrs,
273
309
  event_types: event_types(event_types),
@@ -276,41 +312,50 @@ module Google
276
312
  topic: topic_path(topic_name) }.delete_if { |_k, v| v.nil? }
277
313
  new_notification = Google::Apis::StorageV1::Notification.new(**params)
278
314
 
315
+ if options[:retries].nil?
316
+ options = options.merge({ retries: 0 })
317
+ end
318
+
279
319
  execute do
280
320
  service.insert_notification \
281
321
  bucket_name, new_notification,
282
- user_project: user_project(user_project)
322
+ user_project: user_project(user_project),
323
+ options: options
283
324
  end
284
325
  end
285
326
 
286
327
  ##
287
328
  # Retrieves a Pub/Sub notification subscription for a bucket.
288
- def get_notification bucket_name, notification_id, user_project: nil
329
+ def get_notification bucket_name, notification_id, user_project: nil, options: {}
289
330
  execute do
290
331
  service.get_notification bucket_name, notification_id,
291
- user_project: user_project(user_project)
332
+ user_project: user_project(user_project),
333
+ options: options
292
334
  end
293
335
  end
294
336
 
295
337
  ##
296
338
  # Deletes a new Pub/Sub notification subscription for a bucket.
297
- def delete_notification bucket_name, notification_id, user_project: nil
339
+ def delete_notification bucket_name, notification_id, user_project: nil, options: {}
298
340
  execute do
299
341
  service.delete_notification bucket_name, notification_id,
300
- user_project: user_project(user_project)
342
+ user_project: user_project(user_project),
343
+ options: options
301
344
  end
302
345
  end
303
346
 
304
347
  ##
305
348
  # Retrieves a list of files matching the criteria.
306
349
  def list_files bucket_name, delimiter: nil, max: nil, token: nil,
307
- prefix: nil, versions: nil, user_project: nil
350
+ prefix: nil, versions: nil, user_project: nil,
351
+ options: {}
308
352
  execute do
309
353
  service.list_objects \
310
354
  bucket_name, delimiter: delimiter, max_results: max,
311
355
  page_token: token, prefix: prefix,
312
356
  versions: versions,
313
- user_project: user_project(user_project)
357
+ user_project: user_project(user_project),
358
+ options: options
314
359
  end
315
360
  end
316
361
 
@@ -338,7 +383,8 @@ module Google
338
383
  if_generation_not_match: nil,
339
384
  if_metageneration_match: nil,
340
385
  if_metageneration_not_match: nil,
341
- user_project: nil
386
+ user_project: nil,
387
+ options: {}
342
388
  params = {
343
389
  cache_control: cache_control,
344
390
  content_type: content_type,
@@ -356,6 +402,13 @@ module Google
356
402
  file_obj = Google::Apis::StorageV1::Object.new(**params)
357
403
  content_type ||= mime_type_for(path || Pathname(source).to_path)
358
404
 
405
+ if options[:retries].nil?
406
+ is_idempotent = retry? if_generation_match: if_generation_match
407
+ options = is_idempotent ? key_options(key) : key_options(key).merge(retries: 0)
408
+ else
409
+ options = key_options(key).merge options
410
+ end
411
+
359
412
  execute do
360
413
  service.insert_object bucket_name,
361
414
  file_obj,
@@ -370,7 +423,7 @@ module Google
370
423
  if_metageneration_not_match: if_metageneration_not_match,
371
424
  kms_key_name: kms_key,
372
425
  user_project: user_project(user_project),
373
- options: key_options(key)
426
+ options: options
374
427
  end
375
428
  end
376
429
 
@@ -384,7 +437,8 @@ module Google
384
437
  if_metageneration_match: nil,
385
438
  if_metageneration_not_match: nil,
386
439
  key: nil,
387
- user_project: nil
440
+ user_project: nil,
441
+ options: {}
388
442
  execute do
389
443
  service.get_object \
390
444
  bucket_name, file_path,
@@ -394,7 +448,7 @@ module Google
394
448
  if_metageneration_match: if_metageneration_match,
395
449
  if_metageneration_not_match: if_metageneration_not_match,
396
450
  user_project: user_project(user_project),
397
- options: key_options(key)
451
+ options: key_options(key).merge(options)
398
452
  end
399
453
  end
400
454
 
@@ -419,8 +473,17 @@ module Google
419
473
  if_source_metageneration_match: nil,
420
474
  if_source_metageneration_not_match: nil,
421
475
  token: nil,
422
- user_project: nil
476
+ user_project: nil,
477
+ options: {}
423
478
  key_options = rewrite_key_options source_key, destination_key
479
+
480
+ if options[:retries].nil?
481
+ is_idempotent = retry? if_generation_match: if_generation_match
482
+ options = is_idempotent ? key_options : key_options.merge(retries: 0)
483
+ else
484
+ options = key_options.merge options
485
+ end
486
+
424
487
  execute do
425
488
  service.rewrite_object source_bucket_name,
426
489
  source_file_path,
@@ -440,7 +503,7 @@ module Google
440
503
  if_source_metageneration_not_match: if_source_metageneration_not_match,
441
504
  rewrite_token: token,
442
505
  user_project: user_project(user_project),
443
- options: key_options
506
+ options: options
444
507
  end
445
508
  end
446
509
 
@@ -455,12 +518,20 @@ module Google
455
518
  if_source_generation_match: nil,
456
519
  if_generation_match: nil,
457
520
  if_metageneration_match: nil,
458
- user_project: nil
521
+ user_project: nil,
522
+ options: {}
459
523
 
460
524
  source_objects = compose_file_source_objects source_files, if_source_generation_match
461
525
  compose_req = Google::Apis::StorageV1::ComposeRequest.new source_objects: source_objects,
462
526
  destination: destination_gapi
463
527
 
528
+ if options[:retries].nil?
529
+ is_idempotent = retry? if_generation_match: if_generation_match
530
+ options = is_idempotent ? key_options(key) : key_options(key).merge(retries: 0)
531
+ else
532
+ options = key_options.merge options
533
+ end
534
+
464
535
  execute do
465
536
  service.compose_object bucket_name,
466
537
  destination_path,
@@ -469,7 +540,7 @@ module Google
469
540
  if_generation_match: if_generation_match,
470
541
  if_metageneration_match: if_metageneration_match,
471
542
  user_project: user_project(user_project),
472
- options: key_options(key)
543
+ options: options
473
544
  end
474
545
  end
475
546
 
@@ -483,12 +554,12 @@ module Google
483
554
  # Apis::StorageV1::StorageService and Apis::Core::DownloadCommand at
484
555
  # the end of this file.
485
556
  def download_file bucket_name, file_path, target_path, generation: nil,
486
- key: nil, range: nil, user_project: nil
487
- options = key_options key
557
+ key: nil, range: nil, user_project: nil, options: {}
558
+ options = key_options(key).merge(options)
488
559
  options = range_header options, range
489
560
 
490
561
  execute do
491
- service.get_object_with_response \
562
+ service.get_object \
492
563
  bucket_name, file_path,
493
564
  download_dest: target_path, generation: generation,
494
565
  user_project: user_project(user_project),
@@ -507,8 +578,15 @@ module Google
507
578
  if_metageneration_match: nil,
508
579
  if_metageneration_not_match: nil,
509
580
  predefined_acl: nil,
510
- user_project: nil
581
+ user_project: nil,
582
+ options: {}
511
583
  file_gapi ||= Google::Apis::StorageV1::Object.new
584
+
585
+ if options[:retries].nil?
586
+ is_idempotent = retry? if_metageneration_match: if_metageneration_match
587
+ options = is_idempotent ? {} : { retries: 0 }
588
+ end
589
+
512
590
  execute do
513
591
  service.patch_object bucket_name,
514
592
  file_path,
@@ -519,7 +597,8 @@ module Google
519
597
  if_metageneration_match: if_metageneration_match,
520
598
  if_metageneration_not_match: if_metageneration_not_match,
521
599
  predefined_acl: predefined_acl,
522
- user_project: user_project(user_project)
600
+ user_project: user_project(user_project),
601
+ options: options
523
602
  end
524
603
  end
525
604
 
@@ -532,7 +611,14 @@ module Google
532
611
  if_generation_not_match: nil,
533
612
  if_metageneration_match: nil,
534
613
  if_metageneration_not_match: nil,
535
- user_project: nil
614
+ user_project: nil,
615
+ options: {}
616
+
617
+ if options[:retries].nil?
618
+ is_idempotent = retry? generation: generation, if_generation_match: if_generation_match
619
+ options = is_idempotent ? {} : { retries: 0 }
620
+ end
621
+
536
622
  execute do
537
623
  service.delete_object bucket_name, file_path,
538
624
  generation: generation,
@@ -540,40 +626,51 @@ module Google
540
626
  if_generation_not_match: if_generation_not_match,
541
627
  if_metageneration_match: if_metageneration_match,
542
628
  if_metageneration_not_match: if_metageneration_not_match,
543
- user_project: user_project(user_project)
629
+ user_project: user_project(user_project),
630
+ options: options
544
631
  end
545
632
  end
546
633
 
547
634
  ##
548
635
  # Retrieves a list of ACLs for the given file.
549
- def list_file_acls bucket_name, file_name, user_project: nil
636
+ def list_file_acls bucket_name, file_name, user_project: nil, options: {}
550
637
  execute do
551
638
  service.list_object_access_controls \
552
- bucket_name, file_name, user_project: user_project(user_project)
639
+ bucket_name, file_name, user_project: user_project(user_project),
640
+ options: options
553
641
  end
554
642
  end
555
643
 
556
644
  ##
557
645
  # Creates a new file ACL.
558
646
  def insert_file_acl bucket_name, file_name, entity, role,
559
- generation: nil, user_project: nil
647
+ generation: nil, user_project: nil,
648
+ options: {}
649
+ if options[:retries].nil?
650
+ options = options.merge({ retries: 0 })
651
+ end
560
652
  params = { entity: entity, role: role }.delete_if { |_k, v| v.nil? }
561
653
  new_acl = Google::Apis::StorageV1::ObjectAccessControl.new(**params)
562
654
  execute do
563
655
  service.insert_object_access_control \
564
656
  bucket_name, file_name, new_acl,
565
- generation: generation, user_project: user_project(user_project)
657
+ generation: generation, user_project: user_project(user_project),
658
+ options: options
566
659
  end
567
660
  end
568
661
 
569
662
  ##
570
663
  # Permanently deletes a file ACL.
571
664
  def delete_file_acl bucket_name, file_name, entity, generation: nil,
572
- user_project: nil
665
+ user_project: nil, options: {}
666
+ if options[:retries].nil?
667
+ options = options.merge({ retries: 0 })
668
+ end
573
669
  execute do
574
670
  service.delete_object_access_control \
575
671
  bucket_name, file_name, entity,
576
- generation: generation, user_project: user_project(user_project)
672
+ generation: generation, user_project: user_project(user_project),
673
+ options: options
577
674
  end
578
675
  end
579
676
 
@@ -581,32 +678,42 @@ module Google
581
678
  # Creates a new HMAC key for the specified service account.
582
679
  # Returns Google::Apis::StorageV1::HmacKey.
583
680
  def create_hmac_key service_account_email, project_id: nil,
584
- user_project: nil
681
+ user_project: nil, options: {}
682
+
683
+ if options[:retries].nil?
684
+ options = options.merge({ retries: 0 })
685
+ end
686
+
585
687
  execute do
586
688
  service.create_project_hmac_key \
587
689
  (project_id || @project), service_account_email,
588
- user_project: user_project(user_project)
690
+ user_project: user_project(user_project),
691
+ options: options
589
692
  end
590
693
  end
591
694
 
592
695
  ##
593
696
  # Deletes an HMAC key. Key must be in the INACTIVE state.
594
- def delete_hmac_key access_id, project_id: nil, user_project: nil
697
+ def delete_hmac_key access_id, project_id: nil, user_project: nil,
698
+ options: {}
595
699
  execute do
596
700
  service.delete_project_hmac_key \
597
701
  (project_id || @project), access_id,
598
- user_project: user_project(user_project)
702
+ user_project: user_project(user_project),
703
+ options: options
599
704
  end
600
705
  end
601
706
 
602
707
  ##
603
708
  # Retrieves an HMAC key's metadata.
604
709
  # Returns Google::Apis::StorageV1::HmacKeyMetadata.
605
- def get_hmac_key access_id, project_id: nil, user_project: nil
710
+ def get_hmac_key access_id, project_id: nil, user_project: nil,
711
+ options: {}
606
712
  execute do
607
713
  service.get_project_hmac_key \
608
714
  (project_id || @project), access_id,
609
- user_project: user_project(user_project)
715
+ user_project: user_project(user_project),
716
+ options: options
610
717
  end
611
718
  end
612
719
 
@@ -615,14 +722,15 @@ module Google
615
722
  # Returns Google::Apis::StorageV1::HmacKeysMetadata.
616
723
  def list_hmac_keys max: nil, token: nil, service_account_email: nil,
617
724
  project_id: nil, show_deleted_keys: nil,
618
- user_project: nil
725
+ user_project: nil, options: {}
619
726
  execute do
620
727
  service.list_project_hmac_keys \
621
728
  (project_id || @project),
622
729
  max_results: max, page_token: token,
623
730
  service_account_email: service_account_email,
624
731
  show_deleted_keys: show_deleted_keys,
625
- user_project: user_project(user_project)
732
+ user_project: user_project(user_project),
733
+ options: options
626
734
  end
627
735
  end
628
736
 
@@ -631,11 +739,44 @@ module Google
631
739
  # for valid states.
632
740
  # Returns Google::Apis::StorageV1::HmacKeyMetadata.
633
741
  def update_hmac_key access_id, hmac_key_metadata_object,
634
- project_id: nil, user_project: nil
742
+ project_id: nil, user_project: nil,
743
+ options: {}
635
744
  execute do
636
745
  service.update_project_hmac_key \
637
746
  (project_id || @project), access_id, hmac_key_metadata_object,
638
- user_project: user_project(user_project)
747
+ user_project: user_project(user_project),
748
+ options: options
749
+ end
750
+ end
751
+
752
+ ##
753
+ # Updates a bucket, including its ACL metadata.
754
+ def update_bucket bucket_name,
755
+ bucket_gapi = nil,
756
+ predefined_acl: nil,
757
+ predefined_default_acl: nil,
758
+ if_metageneration_match: nil,
759
+ if_metageneration_not_match: nil,
760
+ user_project: nil,
761
+ options: {}
762
+ bucket_gapi ||= Google::Apis::StorageV1::Bucket.new
763
+ bucket_gapi.acl = [] if predefined_acl
764
+ bucket_gapi.default_object_acl = [] if predefined_default_acl
765
+
766
+ if options[:retries].nil?
767
+ is_idempotent = retry? if_metageneration_match: if_metageneration_match
768
+ options = is_idempotent ? {} : { retries: 0 }
769
+ end
770
+
771
+ execute do
772
+ service.update_bucket bucket_name,
773
+ bucket_gapi,
774
+ predefined_acl: predefined_acl,
775
+ predefined_default_object_acl: predefined_default_acl,
776
+ if_metageneration_match: if_metageneration_match,
777
+ if_metageneration_not_match: if_metageneration_not_match,
778
+ user_project: user_project(user_project),
779
+ options: options
639
780
  end
640
781
  end
641
782
 
@@ -771,163 +912,11 @@ module Google
771
912
  rescue Google::Apis::Error => e
772
913
  raise Google::Cloud::Error.from_error(e)
773
914
  end
774
- end
775
- end
776
- end
777
-
778
- # rubocop:disable all
779
-
780
- # @private
781
- #
782
- # IMPORTANT: These monkey-patches of Apis::StorageV1::StorageService and
783
- # Apis::Core::DownloadCommand must be verified and updated (if needed) for
784
- # every upgrade of google-api-client.
785
- #
786
- # The purpose of these modifications is to provide access to response headers
787
- # (in particular, the Content-Encoding header) for the #download_file method,
788
- # above. If google-api-client is modified to expose response headers to its
789
- # clients, this code should be removed, and #download_file updated to use that
790
- # solution instead.
791
- #
792
- module Apis
793
- # @private
794
- module StorageV1
795
- # @private
796
- class StorageService
797
- # Returns a two-element array containing:
798
- # * The `result` that is the usual return type of #get_object.
799
- # * The `http_resp` from DownloadCommand#execute_once.
800
- 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)
801
- if download_dest.nil?
802
- command = make_simple_command(:get, 'b/{bucket}/o/{object}', options)
803
- else
804
- command = make_download_command(:get, 'b/{bucket}/o/{object}', options)
805
- command.download_dest = download_dest
806
- end
807
- command.response_representation = Google::Apis::StorageV1::Object::Representation
808
- command.response_class = Google::Apis::StorageV1::Object
809
- command.params['bucket'] = bucket unless bucket.nil?
810
- command.params['object'] = object unless object.nil?
811
- command.query['generation'] = generation unless generation.nil?
812
- command.query['ifGenerationMatch'] = if_generation_match unless if_generation_match.nil?
813
- command.query['ifGenerationNotMatch'] = if_generation_not_match unless if_generation_not_match.nil?
814
- command.query['ifMetagenerationMatch'] = if_metageneration_match unless if_metageneration_match.nil?
815
- command.query['ifMetagenerationNotMatch'] = if_metageneration_not_match unless if_metageneration_not_match.nil?
816
- command.query['projection'] = projection unless projection.nil?
817
- command.query['userProject'] = user_project unless user_project.nil?
818
- command.query['fields'] = fields unless fields.nil?
819
- command.query['quotaUser'] = quota_user unless quota_user.nil?
820
- command.query['userIp'] = user_ip unless user_ip.nil?
821
- execute_or_queue_command_with_response(command, &block)
822
- end
823
-
824
- # Returns a two-element array containing:
825
- # * The `result` that is the usual return type of #execute_or_queue_command.
826
- # * The `http_resp` from DownloadCommand#execute_once.
827
- def execute_or_queue_command_with_response(command, &callback)
828
- batch_command = current_batch
829
- if batch_command
830
- raise "Can not combine services in a batch" if Thread.current[:google_api_batch_service] != self
831
- batch_command.add(command, &callback)
832
- nil
833
- else
834
- command.execute_with_response(client, &callback)
835
- end
836
- end
837
- end
838
- end
839
- # @private
840
- module Core
841
- # @private
842
- # Streaming/resumable media download support
843
- class DownloadCommand < ApiCommand
844
- # Returns a two-element array containing:
845
- # * The `result` that is the usual return type of #execute.
846
- # * The `http_resp` from #execute_once.
847
- def execute_with_response(client)
848
- prepare!
849
- begin
850
- Retriable.retriable tries: options.retries + 1,
851
- base_interval: 1,
852
- multiplier: 2,
853
- on: RETRIABLE_ERRORS do |try|
854
- # This 2nd level retriable only catches auth errors, and supports 1 retry, which allows
855
- # auth to be re-attempted without having to retry all sorts of other failures like
856
- # NotFound, etc
857
- auth_tries = (try == 1 && authorization_refreshable? ? 2 : 1)
858
- Retriable.retriable tries: auth_tries,
859
- on: [Google::Apis::AuthorizationError, Signet::AuthorizationError],
860
- on_retry: proc { |*| refresh_authorization } do
861
- execute_once_with_response(client).tap do |result|
862
- if block_given?
863
- yield result, nil
864
- end
865
- end
866
- end
867
- end
868
- rescue => e
869
- if block_given?
870
- yield nil, e
871
- else
872
- raise e
873
- end
874
- end
875
- ensure
876
- release!
877
- end
878
915
 
879
- # Returns a two-element array containing:
880
- # * The `result` that is the usual return type of #execute_once.
881
- # * The `http_resp`.
882
- def execute_once_with_response(client, &block)
883
- request_header = header.dup
884
- apply_request_options(request_header)
885
- download_offset = nil
886
-
887
- if @offset > 0
888
- logger.debug { sprintf('Resuming download from offset %d', @offset) }
889
- request_header[RANGE_HEADER] = sprintf('bytes=%d-', @offset)
890
- end
891
-
892
- http_res = client.get(url.to_s,
893
- query: query,
894
- header: request_header,
895
- follow_redirect: true) do |res, chunk|
896
- status = res.http_header.status_code.to_i
897
- next unless OK_STATUS.include?(status)
898
-
899
- download_offset ||= (status == 206 ? @offset : 0)
900
- download_offset += chunk.bytesize
901
-
902
- if download_offset - chunk.bytesize == @offset
903
- next_chunk = chunk
904
- else
905
- # Oh no! Requested a chunk, but received the entire content
906
- chunk_index = @offset - (download_offset - chunk.bytesize)
907
- next_chunk = chunk.byteslice(chunk_index..-1)
908
- next if next_chunk.nil?
909
- end
910
- # logger.debug { sprintf('Writing chunk (%d bytes, %d total)', chunk.length, bytes_read) }
911
- @download_io.write(next_chunk)
912
-
913
- @offset += next_chunk.bytesize
914
- end
915
-
916
- @download_io.flush
917
-
918
- if @close_io_on_finish
919
- result = nil
920
- else
921
- result = @download_io
922
- end
923
- check_status(http_res.status.to_i, http_res.header, http_res.body)
924
- success([result, http_res], &block)
925
- rescue => e
926
- @download_io.flush
927
- error(e, rethrow: true, &block)
916
+ def retry? query_params
917
+ query_params.any? { |_key, val| !val.nil? }
928
918
  end
929
919
  end
930
920
  end
931
921
  end
932
- # rubocop:enable all
933
922
  end
@@ -16,7 +16,7 @@
16
16
  module Google
17
17
  module Cloud
18
18
  module Storage
19
- VERSION = "1.37.0".freeze
19
+ VERSION = "1.42.0".freeze
20
20
  end
21
21
  end
22
22
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: google-cloud-storage
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.37.0
4
+ version: 1.42.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Moore
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-06-30 00:00:00.000000000 Z
12
+ date: 2022-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: google-cloud-core
@@ -45,14 +45,14 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '0.1'
48
+ version: 0.17.0
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '0.1'
55
+ version: 0.17.0
56
56
  - !ruby/object:Gem::Dependency
57
57
  name: googleauth
58
58
  requirement: !ruby/object:Gem::Requirement