qingstor-sdk 2.2.2 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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