right_aws 1.9.0 → 3.1.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.
Files changed (70) hide show
  1. data/History.txt +164 -13
  2. data/Manifest.txt +28 -1
  3. data/README.txt +12 -10
  4. data/Rakefile +56 -29
  5. data/lib/acf/right_acf_interface.rb +343 -172
  6. data/lib/acf/right_acf_invalidations.rb +144 -0
  7. data/lib/acf/right_acf_origin_access_identities.rb +230 -0
  8. data/lib/acf/right_acf_streaming_interface.rb +229 -0
  9. data/lib/acw/right_acw_interface.rb +248 -0
  10. data/lib/as/right_as_interface.rb +698 -0
  11. data/lib/awsbase/right_awsbase.rb +755 -115
  12. data/lib/awsbase/support.rb +2 -78
  13. data/lib/awsbase/version.rb +9 -0
  14. data/lib/ec2/right_ec2.rb +274 -1294
  15. data/lib/ec2/right_ec2_ebs.rb +514 -0
  16. data/lib/ec2/right_ec2_images.rb +444 -0
  17. data/lib/ec2/right_ec2_instances.rb +797 -0
  18. data/lib/ec2/right_ec2_monitoring.rb +70 -0
  19. data/lib/ec2/right_ec2_placement_groups.rb +108 -0
  20. data/lib/ec2/right_ec2_reserved_instances.rb +243 -0
  21. data/lib/ec2/right_ec2_security_groups.rb +496 -0
  22. data/lib/ec2/right_ec2_spot_instances.rb +422 -0
  23. data/lib/ec2/right_ec2_tags.rb +139 -0
  24. data/lib/ec2/right_ec2_vpc.rb +598 -0
  25. data/lib/ec2/right_ec2_vpc2.rb +382 -0
  26. data/lib/ec2/right_ec2_windows_mobility.rb +84 -0
  27. data/lib/elb/right_elb_interface.rb +573 -0
  28. data/lib/emr/right_emr_interface.rb +728 -0
  29. data/lib/iam/right_iam_access_keys.rb +71 -0
  30. data/lib/iam/right_iam_groups.rb +195 -0
  31. data/lib/iam/right_iam_interface.rb +341 -0
  32. data/lib/iam/right_iam_mfa_devices.rb +67 -0
  33. data/lib/iam/right_iam_users.rb +251 -0
  34. data/lib/rds/right_rds_interface.rb +1657 -0
  35. data/lib/right_aws.rb +30 -13
  36. data/lib/route_53/right_route_53_interface.rb +641 -0
  37. data/lib/s3/right_s3.rb +108 -41
  38. data/lib/s3/right_s3_interface.rb +349 -118
  39. data/lib/sdb/active_sdb.rb +388 -54
  40. data/lib/sdb/right_sdb_interface.rb +323 -64
  41. data/lib/sns/right_sns_interface.rb +286 -0
  42. data/lib/sqs/right_sqs.rb +1 -2
  43. data/lib/sqs/right_sqs_gen2.rb +73 -17
  44. data/lib/sqs/right_sqs_gen2_interface.rb +146 -73
  45. data/lib/sqs/right_sqs_interface.rb +12 -22
  46. data/right_aws.gemspec +91 -0
  47. data/test/README.mdown +39 -0
  48. data/test/acf/test_right_acf.rb +11 -19
  49. data/test/awsbase/test_helper.rb +2 -0
  50. data/test/awsbase/test_right_awsbase.rb +11 -0
  51. data/test/ec2/test_right_ec2.rb +32 -1
  52. data/test/elb/test_helper.rb +2 -0
  53. data/test/elb/test_right_elb.rb +43 -0
  54. data/test/rds/test_helper.rb +2 -0
  55. data/test/rds/test_right_rds.rb +120 -0
  56. data/test/route_53/fixtures/a_record.xml +18 -0
  57. data/test/route_53/fixtures/alias_record.xml +18 -0
  58. data/test/route_53/test_helper.rb +2 -0
  59. data/test/route_53/test_right_route_53.rb +141 -0
  60. data/test/s3/test_right_s3.rb +176 -42
  61. data/test/s3/test_right_s3_stubbed.rb +6 -4
  62. data/test/sdb/test_active_sdb.rb +120 -19
  63. data/test/sdb/test_batch_put_attributes.rb +54 -0
  64. data/test/sdb/test_right_sdb.rb +71 -16
  65. data/test/sns/test_helper.rb +2 -0
  66. data/test/sns/test_right_sns.rb +153 -0
  67. data/test/sqs/test_right_sqs.rb +0 -6
  68. data/test/sqs/test_right_sqs_gen2.rb +104 -49
  69. data/test/ts_right_aws.rb +1 -0
  70. metadata +181 -22
@@ -0,0 +1,18 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ChangeResourceRecordSetsRequest xmlns="https://route53.amazonaws.com/doc/2011-05-05/">
3
+ <ChangeBatch>
4
+ <Changes>
5
+ <Change>
6
+ <Action>CREATE</Action>
7
+ <ResourceRecordSet>
8
+ <Name>right-aws.example.com.</Name>
9
+ <Type>A</Type>
10
+ <AliasTarget>
11
+ <HostedZoneId>Z1234567890123</HostedZoneId>
12
+ <DNSName>example-load-balancer-1111111111.us-east-1.elb.amazonaws.com.</DNSName>
13
+ </AliasTarget>
14
+ </ResourceRecordSet>
15
+ </Change>
16
+ </Changes>
17
+ </ChangeBatch>
18
+ </ChangeResourceRecordSetsRequest>
@@ -0,0 +1,2 @@
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../../lib/right_aws'
@@ -0,0 +1,141 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestRoute53 < Test::Unit::TestCase
4
+
5
+ STDOUT.sync = true
6
+ BALANCER_NAME = 'right-aws-test-lb'
7
+
8
+ def setup
9
+ @r53 = Rightscale::Route53Interface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :logger => Logger.new('/dev/null'))
10
+ @zone_config = {:name => "right-aws.example.com.", :config => {:comment => 'a comment'}}
11
+
12
+ @elb = Rightscale::ElbInterface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key, :logger => Logger.new('/dev/null'))
13
+ end
14
+
15
+ def teardown
16
+ @r53.list_hosted_zones.each do |zone|
17
+ next unless zone[:name] == @zone_config[:name]
18
+ zone_id = zone[:aws_id]
19
+ puts zone_id
20
+ records = @r53.list_resource_record_sets(zone_id)
21
+ # The NS and SOA records are provided by AWS and must not be deleted
22
+ records.reject! { |rr| %w[NS SOA].include? rr[:type] }
23
+ if records.any?
24
+ response = @r53.delete_resource_record_sets(zone_id, records)
25
+ puts response.inspect
26
+ end
27
+ puts @r53.delete_hosted_zone(zone_id).inspect
28
+ end
29
+ # Uncomment to shut down at the end of the day.
30
+ # @elb.delete_load_balancer BALANCER_NAME
31
+ end
32
+
33
+ def test_00_list_hosted_zones
34
+ items = @r53.list_hosted_zones
35
+ assert items.is_a?(Array)
36
+ end
37
+
38
+ def test_create_and_delete_zone
39
+ response = @r53.create_hosted_zone(@zone_config)
40
+ assert_equal response[:name], @zone_config[:name]
41
+ assert response[:aws_id].is_a?(String)
42
+ assert response[:name_servers].is_a?(Array)
43
+
44
+ response2 = @r53.delete_hosted_zone(response[:aws_id])
45
+ assert_equal response2[:status], 'PENDING'
46
+ end
47
+
48
+ def test_add_and_remove_A_record
49
+ zone = @r53.create_hosted_zone(@zone_config)
50
+ zone_id = zone[:aws_id]
51
+ # add
52
+ a_record = { :name => 'host.right-aws.example.com.', :type => 'A', :ttl => 600, :resource_records => ['10.0.0.1'] }
53
+ response = @r53.create_resource_record_sets(zone_id, [a_record.dup]) # .dup since it will get :action => :create
54
+ assert_equal response[:status], 'PENDING'
55
+
56
+ # It should be there now
57
+ records = @r53.list_resource_record_sets(zone_id)
58
+ assert records.is_a?(Array)
59
+ assert records.detect { |rr| rr == a_record }, "Could not find '#{a_record.inspect}' in '#{records.inspect}'"
60
+
61
+ # remove
62
+ response = @r53.delete_resource_record_sets(zone_id, [a_record.dup])
63
+ assert_equal response[:status], 'PENDING'
64
+
65
+ # It should not be there anymore
66
+ records = @r53.list_resource_record_sets(zone_id)
67
+ assert records.is_a?(Array)
68
+ assert ! records.detect { |rr| rr == a_record }, "Record '#{a_record.inspect}' is still in '#{records.inspect}'"
69
+
70
+ @r53.delete_hosted_zone(zone_id)
71
+ end
72
+
73
+ def test_add_and_remove_Alias_record
74
+ lb = find_or_create_load_balancer
75
+
76
+ zone = @r53.create_hosted_zone(@zone_config)
77
+ zone_id = zone[:aws_id]
78
+
79
+ # add
80
+ alias_target = { :hosted_zone_id => lb[:canonical_hosted_zone_name_id], :dns_name => lb[:dns_name] }
81
+ alias_record = { :name => 'right-aws.example.com', :type => 'A', :alias_target => alias_target }
82
+ response = @r53.create_resource_record_sets(zone_id, [alias_record.dup]) # .dup since it will get :action => :create
83
+ assert_equal response[:status], 'PENDING'
84
+
85
+ # It should be there now
86
+ records = @r53.list_resource_record_sets(zone_id)
87
+ assert records.is_a?(Array)
88
+ record = records.detect { |rr| rr[:alias_target] }
89
+ assert record, "Could not find '#{alias_record.inspect}' in '#{records.inspect}'"
90
+ # AWS adds final dots to names
91
+ assert_equal "#{alias_record[:name]}.", record[:name]
92
+ assert_equal "#{alias_target[:dns_name]}.", record[:alias_target][:dns_name]
93
+
94
+ # remove
95
+ response = @r53.delete_resource_record_sets(zone_id, [alias_record.dup])
96
+ assert_equal response[:status], 'PENDING'
97
+
98
+ # It should not be there anymore
99
+ records = @r53.list_resource_record_sets(zone_id)
100
+ assert records.is_a?(Array)
101
+ record = records.detect { |rr| rr[:alias_target] }
102
+ assert ! record, "Record '#{alias_record.inspect}' is still in '#{records.inspect}'"
103
+
104
+ @r53.delete_hosted_zone(zone_id)
105
+ end
106
+
107
+ def find_or_create_load_balancer
108
+ unless @elb.describe_load_balancers.detect { |lb| lb[:load_balancer_name] == BALANCER_NAME }
109
+ @elb.create_load_balancer(BALANCER_NAME, %w[us-east-1b], [])
110
+ puts "WARNING: Started load balancer. Remember to shut it down (see teardown)."
111
+ puts "NOTE: Tests might not pass during first few seconds after load balancer is created."
112
+ end
113
+ @elb.describe_load_balancers.detect { |lb| lb[:load_balancer_name] == BALANCER_NAME }
114
+ end
115
+
116
+ def test_rr_sets_to_xml
117
+ a_record = { :name => 'host.right-aws.example.com.', :type => 'A', :ttl => 600, :resource_records => ['10.0.0.1'], :action => :create }
118
+ expected = load_fixture('a_record.xml')
119
+ assert_equal expected, @r53.resource_record_sets_to_xml([a_record], '')
120
+
121
+ # Note final full stop
122
+ alias_target = { :hosted_zone_id => 'Z1234567890123', :dns_name => 'example-load-balancer-1111111111.us-east-1.elb.amazonaws.com.' }
123
+ alias_record = { :name => 'right-aws.example.com.', :type => 'A', :alias_target => alias_target, :action => :create }
124
+ expected = load_fixture('alias_record.xml')
125
+ assert_same_lines expected, @r53.resource_record_sets_to_xml([alias_record], '')
126
+ end
127
+
128
+ def load_fixture (name)
129
+ File.read(File.join(File.dirname(__FILE__), 'fixtures', name))
130
+ end
131
+
132
+ def assert_same_lines (expected, actual)
133
+ expected = expected.split "\n"
134
+ actual = actual.split "\n"
135
+ previous = []
136
+ while e = expected.shift and a = actual.shift
137
+ assert_equal e, a, "After:\n#{previous.join("\n")}"
138
+ previous << e
139
+ end
140
+ end
141
+ end
@@ -3,24 +3,28 @@ require File.dirname(__FILE__) + '/test_helper.rb'
3
3
  class TestS3 < Test::Unit::TestCase
4
4
 
5
5
  RIGHT_OBJECT_TEXT = 'Right test message'
6
-
6
+ INTERFACE = Rightscale::S3Interface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
7
+ CONNECTION = Rightscale::S3.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
8
+
7
9
  def setup
8
- @s3 = Rightscale::S3Interface.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
9
- @bucket = 'right_s3_awesome_test_bucket_00001'
10
- @bucket2 = 'right_s3_awesome_test_bucket_00002'
10
+ @s3 = INTERFACE
11
+ @bucket = 'right_s3_awesome_test_bucket_000B1_officedrop'
12
+ @bucket2 = 'right_s3_awesome_test_bucket_000B2_officedrop'
11
13
  @key1 = 'test/woohoo1/'
12
14
  @key2 = 'test1/key/woohoo2'
13
15
  @key3 = 'test2/A%B@C_D&E?F+G=H"I'
16
+ @key4 = 'test/large_multipart_file_string'
17
+ @key5 = 'test/large_multipart_file_stream'
14
18
  @key1_copy = 'test/woohoo1_2'
15
19
  @key1_new_name = 'test/woohoo1_3'
16
20
  @key2_new_name = 'test1/key/woohoo2_new'
17
- @s = Rightscale::S3.new(TestCredentials.aws_access_key_id, TestCredentials.aws_secret_access_key)
21
+ @s = CONNECTION
18
22
  end
19
23
 
20
24
  #---------------------------
21
25
  # Rightscale::S3Interface
22
26
  #---------------------------
23
-
27
+
24
28
  def test_01_create_bucket
25
29
  assert @s3.create_bucket(@bucket), 'Create_bucket fail'
26
30
  end
@@ -32,13 +36,33 @@ class TestS3 < Test::Unit::TestCase
32
36
  def test_03_list_empty_bucket
33
37
  assert_equal 0, @s3.list_bucket(@bucket).size, "#{@bucket} isn't empty, arrgh!"
34
38
  end
35
-
39
+
36
40
  def test_04_put
37
41
  assert @s3.put(@bucket, @key1, RIGHT_OBJECT_TEXT, 'x-amz-meta-family'=>'Woohoo1!'), 'Put bucket fail'
38
42
  assert @s3.put(@bucket, @key2, RIGHT_OBJECT_TEXT, 'x-amz-meta-family'=>'Woohoo2!'), 'Put bucket fail'
39
43
  assert @s3.put(@bucket, @key3, RIGHT_OBJECT_TEXT, 'x-amz-meta-family'=>'Woohoo3!'), 'Put bucket fail'
40
44
  end
41
-
45
+
46
+ def test_04_put_multipart_string
47
+ test_text = ""
48
+ for i in 1..100000
49
+ test_text << "Testing test text #{i}\n"
50
+ end
51
+ assert @s3.store_object_multipart({:bucket => @bucket, :key => @key4, :data => StringIO.new(test_text)}), 'Put bucket multipart fail'
52
+ end
53
+
54
+ def test_04b_store_object_multipart_stream
55
+ rd, wr = IO.pipe
56
+ producer = Thread.new(wr) do |out|
57
+ for i in 1..100000
58
+ out.write("Testing stream text #{i}\n")
59
+ end
60
+ out.close
61
+ end
62
+ assert @s3.store_object_multipart({:bucket => @bucket, :key => @key5, :data => rd , :part_size => (20*1024*1024)}), 'Put bucket multipart fail'
63
+ rd.close
64
+ end
65
+
42
66
  def test_05_get_and_get_object
43
67
  assert_raise(Rightscale::AwsError) { @s3.get(@bucket, 'undefined/key') }
44
68
  data1 = @s3.get(@bucket, @key1)
@@ -47,7 +71,7 @@ class TestS3 < Test::Unit::TestCase
47
71
  assert_equal 'Woohoo1!', data1[:headers]['x-amz-meta-family'], "x-amz-meta-family header must be equal to 'Woohoo1!'"
48
72
  assert_equal RIGHT_OBJECT_TEXT, @s3.get_object(@bucket, @key3), "Get_object text must return '#{RIGHT_OBJECT_TEXT}'"
49
73
  end
50
-
74
+
51
75
  def test_06_head
52
76
  assert_equal 'Woohoo1!', @s3.head(@bucket,@key1)['x-amz-meta-family'], "x-amz-meta-family header must be equal to 'Woohoo1!'"
53
77
  end
@@ -55,7 +79,7 @@ class TestS3 < Test::Unit::TestCase
55
79
 
56
80
  def test_07_streaming_get
57
81
  resp = String.new
58
- assert_raise(Rightscale::AwsError) do
82
+ assert_raise(Rightscale::AwsError) do
59
83
  @s3.get(@bucket, 'undefined/key') do |chunk|
60
84
  resp += chunk
61
85
  end
@@ -69,15 +93,17 @@ class TestS3 < Test::Unit::TestCase
69
93
  assert_equal @s3.get_object(@bucket, @key1), resp, "Streaming iface must return same as non-streaming"
70
94
  assert_equal 'Woohoo1!', data1[:headers]['x-amz-meta-family'], "x-amz-meta-family header must be equal to 'Woohoo1!'"
71
95
  end
72
-
96
+
73
97
  def test_08_keys
74
98
  keys = @s3.list_bucket(@bucket).map{|b| b[:key]}
75
- assert_equal keys.size, 3, "There should be 3 keys"
99
+ assert_equal keys.size, 5, "There should be 5 keys"
76
100
  assert(keys.include?(@key1))
77
101
  assert(keys.include?(@key2))
78
102
  assert(keys.include?(@key3))
103
+ assert(keys.include?(@key4))
104
+ assert(keys.include?(@key5))
79
105
  end
80
-
106
+
81
107
  def test_09_copy_key
82
108
  #--- test COPY
83
109
  # copy a key
@@ -130,7 +156,7 @@ class TestS3 < Test::Unit::TestCase
130
156
  def test_13_delete_folder
131
157
  assert_equal 1, @s3.delete_folder(@bucket, 'test').size, "Only one key(#{@key1}) must be deleted!"
132
158
  end
133
-
159
+
134
160
  def test_14_delete_bucket
135
161
  assert_raise(Rightscale::AwsError) { @s3.delete_bucket(@bucket) }
136
162
  assert @s3.clear_bucket(@bucket), 'Clear_bucket fail'
@@ -138,9 +164,10 @@ class TestS3 < Test::Unit::TestCase
138
164
  assert @s3.delete_bucket(@bucket)
139
165
  assert !@s3.list_all_my_buckets.map{|bucket| bucket[:name]}.include?(@bucket), "#{@bucket} must not exist"
140
166
  end
141
-
142
-
143
-
167
+
168
+
169
+
170
+
144
171
 
145
172
  #---------------------------
146
173
  # Rightscale::S3 classes
@@ -198,7 +225,7 @@ class TestS3 < Test::Unit::TestCase
198
225
  assert key2.delete
199
226
  assert !key2.exists?
200
227
  end
201
-
228
+
202
229
  def test_23_rename_key
203
230
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
204
231
  # -- 1 -- (key based rename)
@@ -218,7 +245,7 @@ class TestS3 < Test::Unit::TestCase
218
245
  assert bucket.key('test/copy/3').exists?, "'test/copy/3' should exist"
219
246
  assert !bucket.key('test/copy/2').exists?, "'test/copy/2' should not exist"
220
247
  end
221
-
248
+
222
249
  def test_24_copy_key
223
250
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
224
251
  # -- 1 -- (key based copy)
@@ -239,7 +266,7 @@ class TestS3 < Test::Unit::TestCase
239
266
  assert_equal RIGHT_OBJECT_TEXT, bucket.key('test/copy/11').get
240
267
  assert_equal RIGHT_OBJECT_TEXT, bucket.key('test/copy/12').get
241
268
  end
242
-
269
+
243
270
  def test_25_move_key
244
271
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
245
272
  # -- 1 -- (key based copy)
@@ -258,20 +285,20 @@ class TestS3 < Test::Unit::TestCase
258
285
  assert bucket.key('test/copy/22').exists?, "'test/copy/22' should exist"
259
286
  assert_equal RIGHT_OBJECT_TEXT, bucket.key('test/copy/22').get
260
287
  end
261
-
288
+
262
289
  def test_26_save_meta
263
290
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
264
291
  # create a key
265
292
  key = bucket.key('test/copy/30')
266
293
  key.put(RIGHT_OBJECT_TEXT)
267
- assert key.meta_headers.blank?
294
+ assert key.meta_headers.right_blank?
268
295
  # store some meta keys
269
296
  meta = {'family' => 'oops','race' => 'troll'}
270
297
  assert_equal meta, key.save_meta(meta)
271
298
  # reload meta
272
299
  assert_equal meta, key.reload_meta
273
300
  end
274
-
301
+
275
302
  def test_27_clear_delete
276
303
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
277
304
  # add another key
@@ -280,16 +307,16 @@ class TestS3 < Test::Unit::TestCase
280
307
  assert_equal 1, bucket.delete_folder(@key1).size
281
308
  # delete
282
309
  assert_raise(Rightscale::AwsError) { bucket.delete }
283
- bucket.delete(true)
310
+ bucket.delete(:force => true)
284
311
  end
285
312
 
286
313
  # Grantees
287
-
314
+
288
315
  def test_30_create_bucket
289
316
  bucket = @s.bucket(@bucket, true, 'public-read')
290
317
  assert bucket
291
318
  end
292
-
319
+
293
320
  def test_31_list_grantees
294
321
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
295
322
  # get grantees list
@@ -297,10 +324,10 @@ class TestS3 < Test::Unit::TestCase
297
324
  # check that the grantees count equal to 2 (root, AllUsers)
298
325
  assert_equal 2, grantees.size
299
326
  end
300
-
327
+
301
328
  def test_32_grant_revoke_drop
302
329
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
303
- # Take 'AllUsers' grantee
330
+ # Take 'AllUsers' grantee
304
331
  grantee = Rightscale::S3::Grantee.new(bucket,'http://acs.amazonaws.com/groups/global/AllUsers')
305
332
  # Check exists?
306
333
  assert grantee.exists?
@@ -331,9 +358,9 @@ class TestS3 < Test::Unit::TestCase
331
358
  assert !grantee.exists?
332
359
  assert_equal 1, bucket.grantees.size
333
360
  # Delete bucket
334
- bucket.delete(true)
361
+ bucket.delete(:force => true)
335
362
  end
336
-
363
+
337
364
  def test_33_key_grantees
338
365
  # Create bucket
339
366
  bucket = @s.bucket(@bucket, true)
@@ -350,7 +377,7 @@ class TestS3 < Test::Unit::TestCase
350
377
  # Drop grantee
351
378
  assert grantee.drop
352
379
  # Drop bucket
353
- bucket.delete(true)
380
+ bucket.delete(:force => true)
354
381
  end
355
382
 
356
383
  def test_34_bucket_create_put_with_perms
@@ -393,27 +420,134 @@ class TestS3 < Test::Unit::TestCase
393
420
  RightAws::S3Interface.amazon_problems= nil
394
421
  assert_nil(RightAws::S3Interface.amazon_problems)
395
422
  end
396
-
423
+
397
424
  def test_37_access_logging
398
425
  bucket = Rightscale::S3::Bucket.create(@s, @bucket, false)
399
426
  targetbucket = Rightscale::S3::Bucket.create(@s, @bucket2, true)
400
- # Take 'AllUsers' grantee
427
+ # Take 'AllUsers' grantee
401
428
  grantee = Rightscale::S3::Grantee.new(targetbucket,'http://acs.amazonaws.com/groups/s3/LogDelivery')
402
-
429
+
403
430
  assert grantee.grant(['READ_ACP', 'WRITE'])
404
-
431
+
405
432
  assert bucket.enable_logging(:targetbucket => targetbucket, :targetprefix => "loggylogs/")
406
-
407
- assert_equal(bucket.logging_info, {:enabled => true, :targetbucket => @bucket2, :targetprefix => "loggylogs/"})
433
+ sleep 10
434
+
435
+ assert_equal({:enabled => true, :targetbucket => @bucket2, :targetprefix => "loggylogs/"}, bucket.logging_info)
408
436
 
409
437
  assert bucket.disable_logging
410
-
438
+
411
439
  # check 'Drop' method
412
440
  assert grantee.drop
413
-
414
- # Delete bucket
415
- bucket.delete(true)
416
- targetbucket.delete(true)
441
+ end
442
+
443
+ def test_40_delete_buckets
444
+ Rightscale::S3::Bucket.create(@s, @bucket, false).delete(:force => true)
445
+ Rightscale::S3::Bucket.create(@s, @bucket2, false).delete(:force => true)
446
+ end
447
+
448
+ def test_41_add_cache_control_response_parameter
449
+ @cache_control = 'max-age=3600'
450
+ perform_request( 'response-cache-control' => @cache_control ) do |response|
451
+ assert_equal response['Cache-Control'], @cache_control
452
+ end
453
+ end
454
+
455
+ def test_42_add_cache_control_and_content_type_and_content_disposition
456
+ @cache_control = 'max-age=3600'
457
+ @content_type = 'text/plain'
458
+ @content_disposition = 'attachment; filename=sample.txt'
459
+ perform_request(
460
+ 'response-cache-control' => @cache_control,
461
+ 'response-content-type' => @content_type,
462
+ 'response-content-disposition' => @content_disposition
463
+ ) do |response|
464
+ assert_equal response['Cache-Control'], @cache_control
465
+ assert_equal response['Content-Type'], @content_type
466
+ assert_equal response['Content-Disposition'], @content_disposition
467
+ end
468
+ end
469
+
470
+ def test_43_add_expires_and_content_type_and_content_disposition
471
+ @expires = 'Sun, 26 Jun 2011 02:58:26 GMT'
472
+ @content_type = 'text/plain'
473
+ @content_disposition = 'attachment; filename=sample.txt'
474
+ perform_request(
475
+ 'response-expires' => @expires,
476
+ 'response-content-type' => @content_type,
477
+ 'response-content-disposition' => @content_disposition
478
+ ) do |response|
479
+ assert_equal response['Expires'], @expires
480
+ assert_equal response['Content-Type'], @content_type
481
+ assert_equal response['Content-Disposition'], @content_disposition
482
+ end
483
+ end
484
+
485
+ def test_44_delete_multiple
486
+ bucket = RightAws::S3::Bucket.create(@s, @bucket, true)
487
+
488
+ key1 = Rightscale::S3::Key.create(bucket, @key1)
489
+ key2 = Rightscale::S3::Key.create(bucket, @key2)
490
+ key3 = Rightscale::S3::Key.create(bucket, @key3)
491
+
492
+ assert @s3.put(@bucket, @key1, RIGHT_OBJECT_TEXT), 'Put bucket fail'
493
+ assert @s3.put(@bucket, @key2, RIGHT_OBJECT_TEXT), 'Put bucket fail'
494
+ assert @s3.put(@bucket, @key3, RIGHT_OBJECT_TEXT), 'Put bucket fail'
495
+
496
+ key1.refresh
497
+ key2.refresh
498
+ key3.refresh
499
+
500
+ assert key1.exists?
501
+ assert key2.exists?
502
+ assert key3.exists?
503
+
504
+ result = @s3.delete_multiple(@bucket, [@key1, @key2, @key3])
505
+ assert result.empty?
506
+
507
+ key1.refresh
508
+ key2.refresh
509
+ key3.refresh
510
+
511
+ assert !key1.exists?
512
+ assert !key2.exists?
513
+ assert !key3.exists?
514
+ end
515
+
516
+ def test_45_delete_multiple_more_than_1000_objects
517
+ n = 1200
518
+ keys = (1..n).map { |i| "key-#{i}"}
519
+
520
+ keys.each do |key|
521
+ assert @s3.put(@bucket, key, RIGHT_OBJECT_TEXT), 'Put bucket fail'
522
+ end
523
+
524
+ result = @s3.delete_multiple(@bucket, keys)
525
+ assert result.empty?
526
+
527
+ keys_after = @s3.list_bucket(@bucket).map { |obj| obj[:key] }
528
+
529
+ keys.each do |key|
530
+ assert !keys_after.include?(key)
531
+ end
532
+ end
533
+
534
+ private
535
+
536
+ def request( uri )
537
+ url = URI.parse( uri )
538
+
539
+ http = Net::HTTP.new(url.host, 80)
540
+ # http.use_ssl = true
541
+ # http.verify_mode = OpenSSL::SSL::VERIFY_PEER
542
+ http.request(Net::HTTP::Get.new( url.request_uri ))
543
+ end
544
+
545
+ def perform_request( headers, &block )
546
+ @s3.create_bucket( @bucket )
547
+ @s3.put( @bucket, @key2, RIGHT_OBJECT_TEXT )
548
+ response = request( @s3.get_link( @bucket, @key2, nil, {}, headers ) )
549
+ block.call( response )
550
+ @s3.force_delete_bucket(@bucket)
417
551
  end
418
552
 
419
553
  end