qingstor-sdk 2.2.2 → 2.5.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.
@@ -19,6 +19,7 @@ require 'json'
19
19
  require 'net/http'
20
20
 
21
21
  require 'active_support/core_ext/hash/keys'
22
+ require 'active_support/core_ext/object/blank'
22
23
 
23
24
  module QingStor
24
25
  module SDK
@@ -52,17 +53,28 @@ module QingStor
52
53
 
53
54
  def sign
54
55
  check
56
+ if Signer.is_anonymous? input
57
+ Logger.warn 'anonymous api call, skip sign'
58
+ return
59
+ end
55
60
  self.input = Signer.sign input
56
61
  end
57
62
 
58
63
  def sign_query(timeout_seconds)
59
64
  check
65
+ if Signer.is_anonymous? input
66
+ Logger.warn 'anonymous api call, skip sign query'
67
+ return
68
+ end
60
69
  self.input = Signer.sign_query input, Time.now.to_i + timeout_seconds
61
70
  end
62
71
 
63
72
  def build
64
73
  params = input[:request_params].map { |k, v| "#{k}=#{v}" }
65
- query_string = !params.empty? ? "?#{params.join '&'}" : ''
74
+ query_string = params.join '&'
75
+ if query_string && !query_string.empty?
76
+ query_string = "#{input[:request_uri].include?('?') ? '&' : '?'}#{query_string}"
77
+ end
66
78
  self.request_url = "#{input[:request_endpoint]}#{input[:request_uri]}#{query_string}"
67
79
 
68
80
  request = new_http_request input[:request_method], request_url
@@ -77,7 +89,7 @@ module QingStor
77
89
  output['status_code'] = http_response.code.to_i
78
90
 
79
91
  http_response.each_header { |k, v| output[k.tr('-', '_')] = v }
80
- if http_response['Content-Type'] == 'application/json'
92
+ if http_response['Content-Type'].include? 'application/json'
81
93
  unless http_response.body.nil?
82
94
  JSON.parse(http_response.body).each { |k, v| output[k] = v }
83
95
  end
@@ -94,10 +106,11 @@ module QingStor
94
106
  private
95
107
 
96
108
  def check
97
- unless !input[:config][:access_key_id].nil? && !input[:config][:access_key_id].empty?
109
+ # ak and sk should be both set or not set
110
+ if input[:config][:access_key_id].blank? && input[:config][:secret_access_key].present?
98
111
  raise SDKError, 'access key not provided'
99
112
  end
100
- unless !input[:config][:secret_access_key].nil? && !input[:config][:secret_access_key].empty?
113
+ if input[:config][:secret_access_key].blank? && input[:config][:access_key_id].present?
101
114
  raise SDKError, 'secret access key not provided'
102
115
  end
103
116
  end
@@ -18,23 +18,31 @@ require 'base64'
18
18
  require 'cgi'
19
19
  require 'openssl'
20
20
 
21
+ require 'active_support/core_ext/object/blank'
22
+
21
23
  module QingStor
22
24
  module SDK
23
25
  class Signer
24
26
  def self.sign(input)
25
- authorization = "QS #{input[:config][:access_key_id]}:#{signature input}"
26
- input[:request_headers][:Authorization] = authorization
27
+ unless is_anonymous? input
28
+ authorization = "QS #{input[:config][:access_key_id]}:#{signature input}"
29
+ input[:request_headers][:Authorization] = authorization
30
+
31
+ Logger.debug "QingStor request authorization: [#{input[:id]}] #{authorization}"
32
+ end
27
33
 
28
- Logger.debug "QingStor request authorization: [#{input[:id]}] #{authorization}"
29
34
  input
30
35
  end
31
36
 
32
37
  def self.sign_query(input, expires)
33
- input[:request_params][:signature] = query_signature input, expires
34
- input[:request_params][:access_key_id] = input[:config][:access_key_id]
35
- input[:request_params][:expires] = expires
38
+ unless is_anonymous? input
39
+ input[:request_params][:signature] = query_signature input, expires
40
+ input[:request_params][:access_key_id] = input[:config][:access_key_id]
41
+ input[:request_params][:expires] = expires
42
+
43
+ Logger.debug "QingStor query signature: [#{input[:id]}] #{input[:request_params][:signature]}"
44
+ end
36
45
 
37
- Logger.debug "QingStor query signature: [#{input[:id]}] #{input[:request_params][:signature]}"
38
46
  input
39
47
  end
40
48
 
@@ -83,7 +91,7 @@ module QingStor
83
91
  def self.canonicalized_headers(input)
84
92
  h = {}
85
93
  input[:request_headers].each { |k, v| h[k.to_s.strip.downcase] = v.to_s.strip }
86
- h.keys.sort.reject { |k| !k.start_with? 'x-qs-' }.map { |k| "#{k}:#{h[k]}\n" }.join ''
94
+ h.keys.sort.select { |k| k.start_with? 'x-qs-' }.map { |k| "#{k}:#{h[k]}\n" }.join ''
87
95
  end
88
96
 
89
97
  def self.canonicalized_resource(input)
@@ -98,11 +106,20 @@ module QingStor
98
106
  end
99
107
 
100
108
  def self.sub_resource?(key)
101
- %w(
102
- acl cors delete mirror part_number policy stats upload_id uploads
109
+ %w[
110
+ acl append cname cors delete image lifecycle logging mirror
111
+ notification part_number policy position stats upload_id uploads
103
112
  response-expires response-cache-control response-content-type
104
113
  response-content-language response-content-encoding response-content-disposition
105
- ).include? key
114
+ ].include? key
115
+ end
116
+
117
+ def self.is_anonymous?(input)
118
+ if input[:config].nil?
119
+ return true
120
+ end
121
+
122
+ input[:config][:access_key_id].blank? && input[:config][:secret_access_key].blank?
106
123
  end
107
124
  end
108
125
  end
@@ -22,6 +22,7 @@ module QingStor
22
22
  attr_accessor :config, :properties
23
23
 
24
24
  def initialize(config, properties)
25
+ config.check
25
26
  self.config = config
26
27
  self.properties = properties.deep_symbolize_keys
27
28
  end
@@ -47,9 +48,10 @@ module QingStor
47
48
  request_elements: {
48
49
  },
49
50
  request_body: nil,
51
+
50
52
  status_code: [
51
- 204, # Bucket deleted
52
- ],
53
+ 204
54
+ ]
53
55
  }
54
56
 
55
57
  delete_bucket_input_validate input
@@ -64,6 +66,50 @@ module QingStor
64
66
 
65
67
  public
66
68
 
69
+ # delete_bucket_cname: Delete bucket CNAME setting of the bucket.
70
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/cname/delete_cname.html
71
+ def delete_cname(domain: '')
72
+ request = delete_cname_request domain: domain
73
+ request.send
74
+ end
75
+
76
+ def delete_cname_request(domain: '')
77
+ input = {
78
+ config: config,
79
+ properties: properties,
80
+ api_name: 'DELETE Bucket CNAME',
81
+ request_method: 'DELETE',
82
+ request_uri: '/<bucket-name>?cname',
83
+ request_params: {
84
+ },
85
+ request_headers: {
86
+ },
87
+ request_elements: {
88
+ 'domain' => domain
89
+ },
90
+ request_body: nil,
91
+
92
+ status_code: [
93
+ 204
94
+ ]
95
+ }
96
+
97
+ delete_bucket_cname_input_validate input
98
+ Request.new input
99
+ end
100
+
101
+ private
102
+
103
+ def delete_bucket_cname_input_validate(input)
104
+ input.deep_stringify_keys!
105
+
106
+ unless !input['request_elements']['domain'].nil? && !input['request_elements']['domain'].to_s.empty?
107
+ raise ParameterRequiredError.new('domain', 'DeleteBucketCNAMEInput')
108
+ end
109
+ end
110
+
111
+ public
112
+
67
113
  # delete_bucket_cors: Delete CORS information of the bucket.
68
114
  # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/cors/delete_cors.html
69
115
  def delete_cors
@@ -85,9 +131,10 @@ module QingStor
85
131
  request_elements: {
86
132
  },
87
133
  request_body: nil,
134
+
88
135
  status_code: [
89
- 200, # OK
90
- ],
136
+ 204
137
+ ]
91
138
  }
92
139
 
93
140
  delete_bucket_cors_input_validate input
@@ -123,9 +170,10 @@ module QingStor
123
170
  request_elements: {
124
171
  },
125
172
  request_body: nil,
173
+
126
174
  status_code: [
127
- 204, # No content
128
- ],
175
+ 204
176
+ ]
129
177
  }
130
178
 
131
179
  delete_bucket_external_mirror_input_validate input
@@ -140,6 +188,123 @@ module QingStor
140
188
 
141
189
  public
142
190
 
191
+ # delete_bucket_lifecycle: Delete Lifecycle information of the bucket.
192
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/lifecycle/delete_lifecycle.html
193
+ def delete_lifecycle
194
+ request = delete_lifecycle_request
195
+ request.send
196
+ end
197
+
198
+ def delete_lifecycle_request
199
+ input = {
200
+ config: config,
201
+ properties: properties,
202
+ api_name: 'DELETE Bucket Lifecycle',
203
+ request_method: 'DELETE',
204
+ request_uri: '/<bucket-name>?lifecycle',
205
+ request_params: {
206
+ },
207
+ request_headers: {
208
+ },
209
+ request_elements: {
210
+ },
211
+ request_body: nil,
212
+
213
+ status_code: [
214
+ 204
215
+ ]
216
+ }
217
+
218
+ delete_bucket_lifecycle_input_validate input
219
+ Request.new input
220
+ end
221
+
222
+ private
223
+
224
+ def delete_bucket_lifecycle_input_validate(input)
225
+ input.deep_stringify_keys!
226
+ end
227
+
228
+ public
229
+
230
+ # delete_bucket_logging: Delete bucket logging setting of the bucket.
231
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/logging/delete_logging.html
232
+ def delete_logging
233
+ request = delete_logging_request
234
+ request.send
235
+ end
236
+
237
+ def delete_logging_request
238
+ input = {
239
+ config: config,
240
+ properties: properties,
241
+ api_name: 'DELETE Bucket Logging',
242
+ request_method: 'DELETE',
243
+ request_uri: '/<bucket-name>?logging',
244
+ request_params: {
245
+ },
246
+ request_headers: {
247
+ },
248
+ request_elements: {
249
+ },
250
+ request_body: nil,
251
+
252
+ status_code: [
253
+ 204
254
+ ]
255
+ }
256
+
257
+ delete_bucket_logging_input_validate input
258
+ Request.new input
259
+ end
260
+
261
+ private
262
+
263
+ def delete_bucket_logging_input_validate(input)
264
+ input.deep_stringify_keys!
265
+ end
266
+
267
+ public
268
+
269
+ # delete_bucket_notification: Delete Notification information of the bucket.
270
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/notification/delete_notification.html
271
+ def delete_notification
272
+ request = delete_notification_request
273
+ request.send
274
+ end
275
+
276
+ def delete_notification_request
277
+ input = {
278
+ config: config,
279
+ properties: properties,
280
+ api_name: 'DELETE Bucket Notification',
281
+ request_method: 'DELETE',
282
+ request_uri: '/<bucket-name>?notification',
283
+ request_params: {
284
+ },
285
+ request_headers: {
286
+ },
287
+ request_elements: {
288
+ },
289
+ request_body: nil,
290
+
291
+ status_code: [
292
+ 204
293
+ ]
294
+ }
295
+
296
+ delete_bucket_notification_input_validate input
297
+ Request.new input
298
+ end
299
+
300
+ private
301
+
302
+ def delete_bucket_notification_input_validate(input)
303
+ input.deep_stringify_keys!
304
+ end
305
+
306
+ public
307
+
143
308
  # delete_bucket_policy: Delete policy information of the bucket.
144
309
  # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/policy/delete_policy.html
145
310
  def delete_policy
@@ -161,9 +326,10 @@ module QingStor
161
326
  request_elements: {
162
327
  },
163
328
  request_body: nil,
329
+
164
330
  status_code: [
165
- 204, # No content
166
- ],
331
+ 204
332
+ ]
167
333
  }
168
334
 
169
335
  delete_bucket_policy_input_validate input
@@ -178,6 +344,45 @@ module QingStor
178
344
 
179
345
  public
180
346
 
347
+ # delete_bucket_replication: Delete Replication information of the bucket.
348
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/replication/delete_replication.html
349
+ def delete_replication
350
+ request = delete_replication_request
351
+ request.send
352
+ end
353
+
354
+ def delete_replication_request
355
+ input = {
356
+ config: config,
357
+ properties: properties,
358
+ api_name: 'DELETE Bucket Replication',
359
+ request_method: 'DELETE',
360
+ request_uri: '/<bucket-name>?replication',
361
+ request_params: {
362
+ },
363
+ request_headers: {
364
+ },
365
+ request_elements: {
366
+ },
367
+ request_body: nil,
368
+
369
+ status_code: [
370
+ 204
371
+ ]
372
+ }
373
+
374
+ delete_bucket_replication_input_validate input
375
+ Request.new input
376
+ end
377
+
378
+ private
379
+
380
+ def delete_bucket_replication_input_validate(input)
381
+ input.deep_stringify_keys!
382
+ end
383
+
384
+ public
385
+
181
386
  # delete_multiple_objects: Delete multiple objects from the bucket.
182
387
  # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/delete_multiple.html
183
388
  def delete_multiple_objects(objects: [],
@@ -201,12 +406,13 @@ module QingStor
201
406
  },
202
407
  request_elements: {
203
408
  'objects' => objects,
204
- 'quiet' => quiet,
409
+ 'quiet' => quiet
205
410
  },
206
411
  request_body: nil,
412
+
207
413
  status_code: [
208
- 200, # OK
209
- ],
414
+ 200
415
+ ]
210
416
  }
211
417
 
212
418
  delete_multiple_objects_input_validate input
@@ -218,7 +424,7 @@ module QingStor
218
424
  def delete_multiple_objects_input_validate(input)
219
425
  input.deep_stringify_keys!
220
426
 
221
- unless !input['request_elements']['objects'].nil? && !input['request_elements']['objects'].to_s.empty?
427
+ unless !input['request_elements']['objects'].nil? && !input['request_elements']['objects'].empty?
222
428
  raise ParameterRequiredError.new('objects', 'DeleteMultipleObjectsInput')
223
429
  end
224
430
 
@@ -249,9 +455,10 @@ module QingStor
249
455
  request_elements: {
250
456
  },
251
457
  request_body: nil,
458
+
252
459
  status_code: [
253
- 200, # OK
254
- ],
460
+ 200
461
+ ]
255
462
  }
256
463
 
257
464
  get_bucket_acl_input_validate input
@@ -266,6 +473,57 @@ module QingStor
266
473
 
267
474
  public
268
475
 
476
+ # get_bucket_cname: Get bucket CNAME setting of the bucket.
477
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/cname/get_cname.html
478
+ def get_cname(type: '')
479
+ request = get_cname_request type: type
480
+ request.send
481
+ end
482
+
483
+ def get_cname_request(type: '')
484
+ input = {
485
+ config: config,
486
+ properties: properties,
487
+ api_name: 'GET Bucket CNAME',
488
+ request_method: 'GET',
489
+ request_uri: '/<bucket-name>?cname',
490
+ request_params: {
491
+ 'type' => type
492
+ },
493
+ request_headers: {
494
+ },
495
+ request_elements: {
496
+ },
497
+ request_body: nil,
498
+
499
+ status_code: [
500
+ 200
501
+ ]
502
+ }
503
+
504
+ get_bucket_cname_input_validate input
505
+ Request.new input
506
+ end
507
+
508
+ private
509
+
510
+ def get_bucket_cname_input_validate(input)
511
+ input.deep_stringify_keys!
512
+
513
+ if input['request_params']['type'] && !input['request_params']['type'].to_s.empty?
514
+ type_valid_values = %w[website normal]
515
+ unless type_valid_values.include? input['request_params']['type'].to_s
516
+ raise ParameterValueNotAllowedError.new(
517
+ 'type',
518
+ input['request_params']['type'],
519
+ type_valid_values,
520
+ )
521
+ end
522
+ end
523
+ end
524
+
525
+ public
526
+
269
527
  # get_bucket_cors: Get CORS information of the bucket.
270
528
  # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/cors/get_cors.html
271
529
  def get_cors
@@ -287,9 +545,10 @@ module QingStor
287
545
  request_elements: {
288
546
  },
289
547
  request_body: nil,
548
+
290
549
  status_code: [
291
- 200, # OK
292
- ],
550
+ 200
551
+ ]
293
552
  }
294
553
 
295
554
  get_bucket_cors_input_validate input
@@ -325,9 +584,10 @@ module QingStor
325
584
  request_elements: {
326
585
  },
327
586
  request_body: nil,
587
+
328
588
  status_code: [
329
- 200, # OK
330
- ],
589
+ 200
590
+ ]
331
591
  }
332
592
 
333
593
  get_bucket_external_mirror_input_validate input
@@ -342,6 +602,123 @@ module QingStor
342
602
 
343
603
  public
344
604
 
605
+ # get_bucket_lifecycle: Get Lifecycle information of the bucket.
606
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/lifecycle/get_lifecycle.html
607
+ def get_lifecycle
608
+ request = get_lifecycle_request
609
+ request.send
610
+ end
611
+
612
+ def get_lifecycle_request
613
+ input = {
614
+ config: config,
615
+ properties: properties,
616
+ api_name: 'GET Bucket Lifecycle',
617
+ request_method: 'GET',
618
+ request_uri: '/<bucket-name>?lifecycle',
619
+ request_params: {
620
+ },
621
+ request_headers: {
622
+ },
623
+ request_elements: {
624
+ },
625
+ request_body: nil,
626
+
627
+ status_code: [
628
+ 200
629
+ ]
630
+ }
631
+
632
+ get_bucket_lifecycle_input_validate input
633
+ Request.new input
634
+ end
635
+
636
+ private
637
+
638
+ def get_bucket_lifecycle_input_validate(input)
639
+ input.deep_stringify_keys!
640
+ end
641
+
642
+ public
643
+
644
+ # get_bucket_logging: Get bucket logging setting of the bucket.
645
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/logging/get_logging.html
646
+ def get_logging
647
+ request = get_logging_request
648
+ request.send
649
+ end
650
+
651
+ def get_logging_request
652
+ input = {
653
+ config: config,
654
+ properties: properties,
655
+ api_name: 'GET Bucket Logging',
656
+ request_method: 'GET',
657
+ request_uri: '/<bucket-name>?logging',
658
+ request_params: {
659
+ },
660
+ request_headers: {
661
+ },
662
+ request_elements: {
663
+ },
664
+ request_body: nil,
665
+
666
+ status_code: [
667
+ 200
668
+ ]
669
+ }
670
+
671
+ get_bucket_logging_input_validate input
672
+ Request.new input
673
+ end
674
+
675
+ private
676
+
677
+ def get_bucket_logging_input_validate(input)
678
+ input.deep_stringify_keys!
679
+ end
680
+
681
+ public
682
+
683
+ # get_bucket_notification: Get Notification information of the bucket.
684
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/notification/get_notification.html
685
+ def get_notification
686
+ request = get_notification_request
687
+ request.send
688
+ end
689
+
690
+ def get_notification_request
691
+ input = {
692
+ config: config,
693
+ properties: properties,
694
+ api_name: 'GET Bucket Notification',
695
+ request_method: 'GET',
696
+ request_uri: '/<bucket-name>?notification',
697
+ request_params: {
698
+ },
699
+ request_headers: {
700
+ },
701
+ request_elements: {
702
+ },
703
+ request_body: nil,
704
+
705
+ status_code: [
706
+ 200
707
+ ]
708
+ }
709
+
710
+ get_bucket_notification_input_validate input
711
+ Request.new input
712
+ end
713
+
714
+ private
715
+
716
+ def get_bucket_notification_input_validate(input)
717
+ input.deep_stringify_keys!
718
+ end
719
+
720
+ public
721
+
345
722
  # get_bucket_policy: Get policy information of the bucket.
346
723
  # Documentation URL: https://https://docs.qingcloud.com/qingstor/api/bucket/policy/get_policy.html
347
724
  def get_policy
@@ -349,13 +726,52 @@ module QingStor
349
726
  request.send
350
727
  end
351
728
 
352
- def get_policy_request
729
+ def get_policy_request
730
+ input = {
731
+ config: config,
732
+ properties: properties,
733
+ api_name: 'GET Bucket Policy',
734
+ request_method: 'GET',
735
+ request_uri: '/<bucket-name>?policy',
736
+ request_params: {
737
+ },
738
+ request_headers: {
739
+ },
740
+ request_elements: {
741
+ },
742
+ request_body: nil,
743
+
744
+ status_code: [
745
+ 200
746
+ ]
747
+ }
748
+
749
+ get_bucket_policy_input_validate input
750
+ Request.new input
751
+ end
752
+
753
+ private
754
+
755
+ def get_bucket_policy_input_validate(input)
756
+ input.deep_stringify_keys!
757
+ end
758
+
759
+ public
760
+
761
+ # get_bucket_replication: Get Replication information of the bucket.
762
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/replication/get_replication.html
763
+ def get_replication
764
+ request = get_replication_request
765
+ request.send
766
+ end
767
+
768
+ def get_replication_request
353
769
  input = {
354
770
  config: config,
355
771
  properties: properties,
356
- api_name: 'GET Bucket Policy',
772
+ api_name: 'GET Bucket Replication',
357
773
  request_method: 'GET',
358
- request_uri: '/<bucket-name>?policy',
774
+ request_uri: '/<bucket-name>?replication',
359
775
  request_params: {
360
776
  },
361
777
  request_headers: {
@@ -363,18 +779,19 @@ module QingStor
363
779
  request_elements: {
364
780
  },
365
781
  request_body: nil,
782
+
366
783
  status_code: [
367
- 200, # OK
368
- ],
784
+ 200
785
+ ]
369
786
  }
370
787
 
371
- get_bucket_policy_input_validate input
788
+ get_bucket_replication_input_validate input
372
789
  Request.new input
373
790
  end
374
791
 
375
792
  private
376
793
 
377
- def get_bucket_policy_input_validate(input)
794
+ def get_bucket_replication_input_validate(input)
378
795
  input.deep_stringify_keys!
379
796
  end
380
797
 
@@ -401,9 +818,10 @@ module QingStor
401
818
  request_elements: {
402
819
  },
403
820
  request_body: nil,
821
+
404
822
  status_code: [
405
- 200, # OK
406
- ],
823
+ 200
824
+ ]
407
825
  }
408
826
 
409
827
  get_bucket_statistics_input_validate input
@@ -439,9 +857,10 @@ module QingStor
439
857
  request_elements: {
440
858
  },
441
859
  request_body: nil,
860
+
442
861
  status_code: [
443
- 200, # OK
444
- ],
862
+ 200
863
+ ]
445
864
  }
446
865
 
447
866
  head_bucket_input_validate input
@@ -459,20 +878,23 @@ module QingStor
459
878
  # list_multipart_uploads: List multipart uploads in the bucket.
460
879
  # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/list_multipart_uploads.html
461
880
  def list_multipart_uploads(delimiter: '',
881
+ key_marker: '',
462
882
  limit: nil,
463
- marker: '',
464
- prefix: '')
465
- request = list_multipart_uploads_request delimiter: delimiter,
466
- limit: limit,
467
- marker: marker,
468
- prefix: prefix
883
+ prefix: '',
884
+ upload_id_marker: '')
885
+ request = list_multipart_uploads_request delimiter: delimiter,
886
+ key_marker: key_marker,
887
+ limit: limit,
888
+ prefix: prefix,
889
+ upload_id_marker: upload_id_marker
469
890
  request.send
470
891
  end
471
892
 
472
893
  def list_multipart_uploads_request(delimiter: '',
894
+ key_marker: '',
473
895
  limit: nil,
474
- marker: '',
475
- prefix: '')
896
+ prefix: '',
897
+ upload_id_marker: '')
476
898
  input = {
477
899
  config: config,
478
900
  properties: properties,
@@ -480,19 +902,21 @@ module QingStor
480
902
  request_method: 'GET',
481
903
  request_uri: '/<bucket-name>?uploads',
482
904
  request_params: {
483
- 'delimiter' => delimiter,
484
- 'limit' => limit,
485
- 'marker' => marker,
486
- 'prefix' => prefix,
905
+ 'delimiter' => delimiter,
906
+ 'key_marker' => key_marker,
907
+ 'limit' => limit,
908
+ 'prefix' => prefix,
909
+ 'upload_id_marker' => upload_id_marker
487
910
  },
488
911
  request_headers: {
489
912
  },
490
913
  request_elements: {
491
914
  },
492
915
  request_body: nil,
916
+
493
917
  status_code: [
494
- 200, # OK
495
- ],
918
+ 200
919
+ ]
496
920
  }
497
921
 
498
922
  list_multipart_uploads_input_validate input
@@ -534,16 +958,17 @@ module QingStor
534
958
  'delimiter' => delimiter,
535
959
  'limit' => limit,
536
960
  'marker' => marker,
537
- 'prefix' => prefix,
961
+ 'prefix' => prefix
538
962
  },
539
963
  request_headers: {
540
964
  },
541
965
  request_elements: {
542
966
  },
543
967
  request_body: nil,
968
+
544
969
  status_code: [
545
- 200, # OK
546
- ],
970
+ 200
971
+ ]
547
972
  }
548
973
 
549
974
  list_objects_input_validate input
@@ -579,9 +1004,10 @@ module QingStor
579
1004
  request_elements: {
580
1005
  },
581
1006
  request_body: nil,
1007
+
582
1008
  status_code: [
583
- 201, # Bucket created
584
- ],
1009
+ 201
1010
+ ]
585
1011
  }
586
1012
 
587
1013
  put_bucket_input_validate input
@@ -615,12 +1041,13 @@ module QingStor
615
1041
  request_headers: {
616
1042
  },
617
1043
  request_elements: {
618
- 'acl' => acl,
1044
+ 'acl' => acl
619
1045
  },
620
1046
  request_body: nil,
1047
+
621
1048
  status_code: [
622
- 200, # OK
623
- ],
1049
+ 200
1050
+ ]
624
1051
  }
625
1052
 
626
1053
  put_bucket_acl_input_validate input
@@ -632,10 +1059,6 @@ module QingStor
632
1059
  def put_bucket_acl_input_validate(input)
633
1060
  input.deep_stringify_keys!
634
1061
 
635
- unless !input['request_elements']['acl'].nil? && !input['request_elements']['acl'].to_s.empty?
636
- raise ParameterRequiredError.new('acl', 'PutBucketACLInput')
637
- end
638
-
639
1062
  input['request_elements']['acl'].each do |x|
640
1063
  unless x['grantee'].nil?
641
1064
 
@@ -644,7 +1067,7 @@ module QingStor
644
1067
  end
645
1068
 
646
1069
  if x['grantee']['type'] && !x['grantee']['type'].to_s.empty?
647
- type_valid_values = %w(user group)
1070
+ type_valid_values = %w[user group]
648
1071
  unless type_valid_values.include? x['grantee']['type'].to_s
649
1072
  raise ParameterValueNotAllowedError.new(
650
1073
  'type',
@@ -656,15 +1079,19 @@ module QingStor
656
1079
 
657
1080
  end
658
1081
 
659
- raise ParameterRequiredError.new('grantee', 'acl') if x['grantee'].nil?
1082
+ if x['grantee'].nil?
1083
+ raise ParameterRequiredError.new('grantee', 'acl')
1084
+ end
660
1085
 
661
1086
  unless !x['permission'].nil? && !x['permission'].to_s.empty?
662
1087
  raise ParameterRequiredError.new('permission', 'acl')
663
1088
  end
664
1089
 
665
1090
  next unless x['permission'] && !x['permission'].to_s.empty?
666
- permission_valid_values = %w(READ WRITE FULL_CONTROL)
1091
+
1092
+ permission_valid_values = %w[READ WRITE FULL_CONTROL]
667
1093
  next if permission_valid_values.include? x['permission'].to_s
1094
+
668
1095
  raise ParameterValueNotAllowedError.new(
669
1096
  'permission',
670
1097
  x['permission'],
@@ -675,6 +1102,65 @@ module QingStor
675
1102
 
676
1103
  public
677
1104
 
1105
+ # put_bucket_cname: Set bucket CNAME of the bucket.
1106
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/cname/put_cname.html
1107
+ def put_cname(domain: '',
1108
+ type: '')
1109
+ request = put_cname_request domain: domain,
1110
+ type: type
1111
+ request.send
1112
+ end
1113
+
1114
+ def put_cname_request(domain: '',
1115
+ type: '')
1116
+ input = {
1117
+ config: config,
1118
+ properties: properties,
1119
+ api_name: 'PUT Bucket CNAME',
1120
+ request_method: 'PUT',
1121
+ request_uri: '/<bucket-name>?cname',
1122
+ request_params: {
1123
+ },
1124
+ request_headers: {
1125
+ },
1126
+ request_elements: {
1127
+ 'domain' => domain,
1128
+ 'type' => type
1129
+ },
1130
+ request_body: nil,
1131
+
1132
+ status_code: [
1133
+ 200
1134
+ ]
1135
+ }
1136
+
1137
+ put_bucket_cname_input_validate input
1138
+ Request.new input
1139
+ end
1140
+
1141
+ private
1142
+
1143
+ def put_bucket_cname_input_validate(input)
1144
+ input.deep_stringify_keys!
1145
+
1146
+ unless !input['request_elements']['domain'].nil? && !input['request_elements']['domain'].to_s.empty?
1147
+ raise ParameterRequiredError.new('domain', 'PutBucketCNAMEInput')
1148
+ end
1149
+
1150
+ if input['request_elements']['type'] && !input['request_elements']['type'].to_s.empty?
1151
+ type_valid_values = %w[normal website]
1152
+ unless type_valid_values.include? input['request_elements']['type'].to_s
1153
+ raise ParameterValueNotAllowedError.new(
1154
+ 'type',
1155
+ input['request_elements']['type'],
1156
+ type_valid_values,
1157
+ )
1158
+ end
1159
+ end
1160
+ end
1161
+
1162
+ public
1163
+
678
1164
  # put_bucket_cors: Set CORS information of the bucket.
679
1165
  # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/cors/put_cors.html
680
1166
  def put_cors(cors_rules: [])
@@ -694,12 +1180,13 @@ module QingStor
694
1180
  request_headers: {
695
1181
  },
696
1182
  request_elements: {
697
- 'cors_rules' => cors_rules,
1183
+ 'cors_rules' => cors_rules
698
1184
  },
699
1185
  request_body: nil,
1186
+
700
1187
  status_code: [
701
- 200, # OK
702
- ],
1188
+ 200
1189
+ ]
703
1190
  }
704
1191
 
705
1192
  put_bucket_cors_input_validate input
@@ -711,12 +1198,12 @@ module QingStor
711
1198
  def put_bucket_cors_input_validate(input)
712
1199
  input.deep_stringify_keys!
713
1200
 
714
- unless !input['request_elements']['cors_rules'].nil? && !input['request_elements']['cors_rules'].to_s.empty?
1201
+ unless !input['request_elements']['cors_rules'].nil? && !input['request_elements']['cors_rules'].empty?
715
1202
  raise ParameterRequiredError.new('cors_rules', 'PutBucketCORSInput')
716
1203
  end
717
1204
 
718
1205
  input['request_elements']['cors_rules'].each do |x|
719
- unless !x['allowed_methods'].nil? && !x['allowed_methods'].to_s.empty?
1206
+ unless !x['allowed_methods'].nil? && !x['allowed_methods'].empty?
720
1207
  raise ParameterRequiredError.new('allowed_methods', 'cors_rule')
721
1208
  end
722
1209
 
@@ -747,12 +1234,13 @@ module QingStor
747
1234
  request_headers: {
748
1235
  },
749
1236
  request_elements: {
750
- 'source_site' => source_site,
1237
+ 'source_site' => source_site
751
1238
  },
752
1239
  request_body: nil,
1240
+
753
1241
  status_code: [
754
- 200, # OK
755
- ],
1242
+ 200
1243
+ ]
756
1244
  }
757
1245
 
758
1246
  put_bucket_external_mirror_input_validate input
@@ -771,6 +1259,230 @@ module QingStor
771
1259
 
772
1260
  public
773
1261
 
1262
+ # put_bucket_lifecycle: Set Lifecycle information of the bucket.
1263
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/lifecycle/put_lifecycle.html
1264
+ def put_lifecycle(rule: [])
1265
+ request = put_lifecycle_request rule: rule
1266
+ request.send
1267
+ end
1268
+
1269
+ def put_lifecycle_request(rule: [])
1270
+ input = {
1271
+ config: config,
1272
+ properties: properties,
1273
+ api_name: 'PUT Bucket Lifecycle',
1274
+ request_method: 'PUT',
1275
+ request_uri: '/<bucket-name>?lifecycle',
1276
+ request_params: {
1277
+ },
1278
+ request_headers: {
1279
+ },
1280
+ request_elements: {
1281
+ 'rule' => rule
1282
+ },
1283
+ request_body: nil,
1284
+
1285
+ status_code: [
1286
+ 200
1287
+ ]
1288
+ }
1289
+
1290
+ put_bucket_lifecycle_input_validate input
1291
+ Request.new input
1292
+ end
1293
+
1294
+ private
1295
+
1296
+ def put_bucket_lifecycle_input_validate(input)
1297
+ input.deep_stringify_keys!
1298
+
1299
+ unless !input['request_elements']['rule'].nil? && !input['request_elements']['rule'].empty?
1300
+ raise ParameterRequiredError.new('rule', 'PutBucketLifecycleInput')
1301
+ end
1302
+
1303
+ input['request_elements']['rule'].each do |x|
1304
+ unless x['abort_incomplete_multipart_upload'].nil?
1305
+
1306
+ unless !x['abort_incomplete_multipart_upload']['days_after_initiation'].nil? && !x['abort_incomplete_multipart_upload']['days_after_initiation'].to_s.empty?
1307
+ raise ParameterRequiredError.new('days_after_initiation', 'abort_incomplete_multipart_upload')
1308
+ end
1309
+
1310
+ end
1311
+
1312
+ unless x['expiration'].nil?
1313
+
1314
+ end
1315
+
1316
+ unless x['filter'].nil?
1317
+
1318
+ unless !x['filter']['prefix'].nil? && !x['filter']['prefix'].to_s.empty?
1319
+ raise ParameterRequiredError.new('prefix', 'filter')
1320
+ end
1321
+
1322
+ end
1323
+
1324
+ if x['filter'].nil?
1325
+ raise ParameterRequiredError.new('filter', 'rule')
1326
+ end
1327
+
1328
+ unless !x['id'].nil? && !x['id'].to_s.empty?
1329
+ raise ParameterRequiredError.new('id', 'rule')
1330
+ end
1331
+
1332
+ unless !x['status'].nil? && !x['status'].to_s.empty?
1333
+ raise ParameterRequiredError.new('status', 'rule')
1334
+ end
1335
+
1336
+ if x['status'] && !x['status'].to_s.empty?
1337
+ status_valid_values = %w[enabled disabled]
1338
+ unless status_valid_values.include? x['status'].to_s
1339
+ raise ParameterValueNotAllowedError.new(
1340
+ 'status',
1341
+ x['status'],
1342
+ status_valid_values,
1343
+ )
1344
+ end
1345
+ end
1346
+
1347
+ next if x['transition'].nil?
1348
+
1349
+ unless !x['transition']['storage_class'].nil? && !x['transition']['storage_class'].to_s.empty?
1350
+ raise ParameterRequiredError.new('storage_class', 'transition')
1351
+ end
1352
+ end
1353
+ end
1354
+
1355
+ public
1356
+
1357
+ # put_bucket_logging: Set bucket logging of the bucket.
1358
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/logging/put_logging.html
1359
+ def put_logging(target_bucket: '',
1360
+ target_prefix: '')
1361
+ request = put_logging_request target_bucket: target_bucket,
1362
+ target_prefix: target_prefix
1363
+ request.send
1364
+ end
1365
+
1366
+ def put_logging_request(target_bucket: '',
1367
+ target_prefix: '')
1368
+ input = {
1369
+ config: config,
1370
+ properties: properties,
1371
+ api_name: 'PUT Bucket Logging',
1372
+ request_method: 'PUT',
1373
+ request_uri: '/<bucket-name>?logging',
1374
+ request_params: {
1375
+ },
1376
+ request_headers: {
1377
+ },
1378
+ request_elements: {
1379
+ 'target_bucket' => target_bucket,
1380
+ 'target_prefix' => target_prefix
1381
+ },
1382
+ request_body: nil,
1383
+
1384
+ status_code: [
1385
+ 200
1386
+ ]
1387
+ }
1388
+
1389
+ put_bucket_logging_input_validate input
1390
+ Request.new input
1391
+ end
1392
+
1393
+ private
1394
+
1395
+ def put_bucket_logging_input_validate(input)
1396
+ input.deep_stringify_keys!
1397
+
1398
+ unless !input['request_elements']['target_bucket'].nil? && !input['request_elements']['target_bucket'].to_s.empty?
1399
+ raise ParameterRequiredError.new('target_bucket', 'PutBucketLoggingInput')
1400
+ end
1401
+
1402
+ unless !input['request_elements']['target_prefix'].nil? && !input['request_elements']['target_prefix'].to_s.empty?
1403
+ raise ParameterRequiredError.new('target_prefix', 'PutBucketLoggingInput')
1404
+ end
1405
+ end
1406
+
1407
+ public
1408
+
1409
+ # put_bucket_notification: Set Notification information of the bucket.
1410
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/notification/put_notification.html
1411
+ def put_notification(notifications: [])
1412
+ request = put_notification_request notifications: notifications
1413
+ request.send
1414
+ end
1415
+
1416
+ def put_notification_request(notifications: [])
1417
+ input = {
1418
+ config: config,
1419
+ properties: properties,
1420
+ api_name: 'PUT Bucket Notification',
1421
+ request_method: 'PUT',
1422
+ request_uri: '/<bucket-name>?notification',
1423
+ request_params: {
1424
+ },
1425
+ request_headers: {
1426
+ },
1427
+ request_elements: {
1428
+ 'notifications' => notifications
1429
+ },
1430
+ request_body: nil,
1431
+
1432
+ status_code: [
1433
+ 200
1434
+ ]
1435
+ }
1436
+
1437
+ put_bucket_notification_input_validate input
1438
+ Request.new input
1439
+ end
1440
+
1441
+ private
1442
+
1443
+ def put_bucket_notification_input_validate(input)
1444
+ input.deep_stringify_keys!
1445
+
1446
+ unless !input['request_elements']['notifications'].nil? && !input['request_elements']['notifications'].empty?
1447
+ raise ParameterRequiredError.new('notifications', 'PutBucketNotificationInput')
1448
+ end
1449
+
1450
+ input['request_elements']['notifications'].each do |x|
1451
+ unless !x['cloudfunc'].nil? && !x['cloudfunc'].to_s.empty?
1452
+ raise ParameterRequiredError.new('cloudfunc', 'notification')
1453
+ end
1454
+
1455
+ if x['cloudfunc'] && !x['cloudfunc'].to_s.empty?
1456
+ cloudfunc_valid_values = %w[tupu-porn notifier image]
1457
+ unless cloudfunc_valid_values.include? x['cloudfunc'].to_s
1458
+ raise ParameterValueNotAllowedError.new(
1459
+ 'cloudfunc',
1460
+ x['cloudfunc'],
1461
+ cloudfunc_valid_values,
1462
+ )
1463
+ end
1464
+ end
1465
+
1466
+ unless x['cloudfunc_args'].nil?
1467
+
1468
+ unless !x['cloudfunc_args']['action'].nil? && !x['cloudfunc_args']['action'].to_s.empty?
1469
+ raise ParameterRequiredError.new('action', 'cloudfunc_args')
1470
+ end
1471
+
1472
+ end
1473
+
1474
+ unless !x['event_types'].nil? && !x['event_types'].empty?
1475
+ raise ParameterRequiredError.new('event_types', 'notification')
1476
+ end
1477
+
1478
+ unless !x['id'].nil? && !x['id'].to_s.empty?
1479
+ raise ParameterRequiredError.new('id', 'notification')
1480
+ end
1481
+ end
1482
+ end
1483
+
1484
+ public
1485
+
774
1486
  # put_bucket_policy: Set policy information of the bucket.
775
1487
  # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/policy/put_policy.html
776
1488
  def put_policy(statement: [])
@@ -790,12 +1502,13 @@ module QingStor
790
1502
  request_headers: {
791
1503
  },
792
1504
  request_elements: {
793
- 'statement' => statement,
1505
+ 'statement' => statement
794
1506
  },
795
1507
  request_body: nil,
1508
+
796
1509
  status_code: [
797
- 200, # OK
798
- ],
1510
+ 200
1511
+ ]
799
1512
  }
800
1513
 
801
1514
  put_bucket_policy_input_validate input
@@ -807,12 +1520,12 @@ module QingStor
807
1520
  def put_bucket_policy_input_validate(input)
808
1521
  input.deep_stringify_keys!
809
1522
 
810
- unless !input['request_elements']['statement'].nil? && !input['request_elements']['statement'].to_s.empty?
1523
+ unless !input['request_elements']['statement'].nil? && !input['request_elements']['statement'].empty?
811
1524
  raise ParameterRequiredError.new('statement', 'PutBucketPolicyInput')
812
1525
  end
813
1526
 
814
1527
  input['request_elements']['statement'].each do |x|
815
- unless !x['action'].nil? && !x['action'].to_s.empty?
1528
+ unless !x['action'].nil? && !x['action'].empty?
816
1529
  raise ParameterRequiredError.new('action', 'statement')
817
1530
  end
818
1531
 
@@ -845,7 +1558,7 @@ module QingStor
845
1558
  end
846
1559
 
847
1560
  if x['effect'] && !x['effect'].to_s.empty?
848
- effect_valid_values = %w(allow deny)
1561
+ effect_valid_values = %w[allow deny]
849
1562
  unless effect_valid_values.include? x['effect'].to_s
850
1563
  raise ParameterValueNotAllowedError.new(
851
1564
  'effect',
@@ -859,13 +1572,116 @@ module QingStor
859
1572
  raise ParameterRequiredError.new('id', 'statement')
860
1573
  end
861
1574
 
862
- unless !x['user'].nil? && !x['user'].to_s.empty?
1575
+ unless !x['user'].nil? && !x['user'].empty?
863
1576
  raise ParameterRequiredError.new('user', 'statement')
864
1577
  end
865
1578
  end
866
1579
  end
867
1580
 
868
1581
  public
1582
+
1583
+ # put_bucket_replication: Set Replication information of the bucket.
1584
+ # Documentation URL: https://docs.qingcloud.com/qingstor/api/bucket/replication/put_replication.html
1585
+ def put_replication(rules: [])
1586
+ request = put_replication_request rules: rules
1587
+ request.send
1588
+ end
1589
+
1590
+ def put_replication_request(rules: [])
1591
+ input = {
1592
+ config: config,
1593
+ properties: properties,
1594
+ api_name: 'PUT Bucket Replication',
1595
+ request_method: 'PUT',
1596
+ request_uri: '/<bucket-name>?replication',
1597
+ request_params: {
1598
+ },
1599
+ request_headers: {
1600
+ },
1601
+ request_elements: {
1602
+ 'rules' => rules
1603
+ },
1604
+ request_body: nil,
1605
+
1606
+ status_code: [
1607
+ 200
1608
+ ]
1609
+ }
1610
+
1611
+ put_bucket_replication_input_validate input
1612
+ Request.new input
1613
+ end
1614
+
1615
+ private
1616
+
1617
+ def put_bucket_replication_input_validate(input)
1618
+ input.deep_stringify_keys!
1619
+
1620
+ unless !input['request_elements']['rules'].nil? && !input['request_elements']['rules'].empty?
1621
+ raise ParameterRequiredError.new('rules', 'PutBucketReplicationInput')
1622
+ end
1623
+
1624
+ input['request_elements']['rules'].each do |x|
1625
+ if x['delete_marker'] && !x['delete_marker'].to_s.empty?
1626
+ delete_marker_valid_values = %w[enabled disabled]
1627
+ unless delete_marker_valid_values.include? x['delete_marker'].to_s
1628
+ raise ParameterValueNotAllowedError.new(
1629
+ 'delete_marker',
1630
+ x['delete_marker'],
1631
+ delete_marker_valid_values,
1632
+ )
1633
+ end
1634
+ end
1635
+
1636
+ unless x['destination'].nil?
1637
+
1638
+ unless !x['destination']['bucket'].nil? && !x['destination']['bucket'].to_s.empty?
1639
+ raise ParameterRequiredError.new('bucket', 'destination')
1640
+ end
1641
+
1642
+ end
1643
+
1644
+ if x['destination'].nil?
1645
+ raise ParameterRequiredError.new('destination', 'rules')
1646
+ end
1647
+
1648
+ unless x['filters'].nil?
1649
+
1650
+ end
1651
+
1652
+ if x['filters'].nil?
1653
+ raise ParameterRequiredError.new('filters', 'rules')
1654
+ end
1655
+
1656
+ unless !x['id'].nil? && !x['id'].to_s.empty?
1657
+ raise ParameterRequiredError.new('id', 'rules')
1658
+ end
1659
+
1660
+ if x['status'] && !x['status'].to_s.empty?
1661
+ status_valid_values = %w[enabled disabled]
1662
+ unless status_valid_values.include? x['status'].to_s
1663
+ raise ParameterValueNotAllowedError.new(
1664
+ 'status',
1665
+ x['status'],
1666
+ status_valid_values,
1667
+ )
1668
+ end
1669
+ end
1670
+
1671
+ next unless x['sync_marker'] && !x['sync_marker'].to_s.empty?
1672
+
1673
+ sync_marker_valid_values = %w[enabled disabled]
1674
+ next if sync_marker_valid_values.include? x['sync_marker'].to_s
1675
+
1676
+ raise ParameterValueNotAllowedError.new(
1677
+ 'sync_marker',
1678
+ x['sync_marker'],
1679
+ sync_marker_valid_values,
1680
+ )
1681
+ end
1682
+ end
1683
+
1684
+ public
869
1685
  end
870
1686
  end
871
1687
  end