fluent-plugin-s3 0.5.11 → 0.6.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c8fc0cbcb10886649237d443f3c2ca2a78157b26
4
- data.tar.gz: 41c079389e44e2f47c8abcfad167b0724060d65d
3
+ metadata.gz: cd565fde9785110e7b4a202ec2b013c79381cbbf
4
+ data.tar.gz: 14fc7296e5f8d4dea3605f2affecc4b224da8af8
5
5
  SHA512:
6
- metadata.gz: 6dece2571ff2d3899f8aa33b87dd8c21762f15eb732bfbf8867dd23760747b88d061113bda9dc060e430fa7d483daa4fd8540d13e2642ca9fd1158ea7c5bc260
7
- data.tar.gz: 479759306f6db9351384e1848e5030f134ef4b8e4a3a99bf9afcb5f87a805e49ed97032fc06701c74469fc20100df75be1e6f7c4dad121eea334c91cf4b813aa
6
+ metadata.gz: 496c9a8350a9ffedc103cea38eeaea77a6bb7dcb7c4fc36c38d1cf927ea95ffd4d4b44d417873b325fbb3816dc958d36e98302efcbdad7b8fdf9d5616c5b6c37
7
+ data.tar.gz: 845cd5d1f2c79fc890c174cea1f855aa92b1fb4f944712ac1c3a253c886c3d48f072330044788e27144dc0a1bc86c062be04c73f9b30b9e50488db51be64bc7b
data/ChangeLog CHANGED
@@ -1,3 +1,8 @@
1
+ Release 0.6.0.pre1 - 2015/09/10
2
+
3
+ * Use AWS SDK v2
4
+
5
+
1
6
  Release 0.5.11 - 2015/08/04
2
7
 
3
8
  * Add acl parameter
data/README.rdoc CHANGED
@@ -93,6 +93,9 @@ The {fluent-mixin-config-placeholders}[https://github.com/tagomoris/fluent-mixin
93
93
  - json
94
94
  - text
95
95
  - lzo (Need lzop command)
96
+ - lzma2 (Need xz command)
97
+ - gzip_command (Need gzip command)
98
+ - This compressor uses an external gzip command, hence would result in utilizing CPU cores well compared with `gzip`
96
99
 
97
100
  See 'Use your compression algorithm' section for adding another format.
98
101
 
data/VERSION CHANGED
@@ -1 +1,2 @@
1
- 0.5.11
1
+ 0.6.0.pre1
2
+
@@ -18,10 +18,10 @@ Gem::Specification.new do |gem|
18
18
  gem.require_paths = ['lib']
19
19
 
20
20
  gem.add_dependency "fluentd", [">= 0.10.49", "< 2"]
21
- gem.add_dependency "aws-sdk-v1", "~> 1.38"
21
+ gem.add_dependency "aws-sdk", "~> 2"
22
22
  gem.add_dependency "yajl-ruby", "~> 1.0"
23
23
  gem.add_dependency "fluent-mixin-config-placeholders", ">= 0.3.0"
24
24
  gem.add_development_dependency "rake", ">= 0.9.2"
25
- gem.add_development_dependency "flexmock", ">= 1.2.0"
26
25
  gem.add_development_dependency "test-unit", ">= 3.0.8"
26
+ gem.add_development_dependency "test-unit-rr", ">= 1.0.3"
27
27
  end
@@ -6,7 +6,7 @@ module Fluent
6
6
 
7
7
  def initialize
8
8
  super
9
- require 'aws-sdk-v1'
9
+ require 'aws-sdk-resources'
10
10
  require 'zlib'
11
11
  require 'time'
12
12
  require 'tempfile'
@@ -15,13 +15,32 @@ module Fluent
15
15
  end
16
16
 
17
17
  config_param :path, :string, :default => ""
18
- config_param :use_ssl, :bool, :default => true
19
18
  config_param :use_server_side_encryption, :string, :default => nil
20
19
  config_param :aws_key_id, :string, :default => nil, :secret => true
21
20
  config_param :aws_sec_key, :string, :default => nil, :secret => true
21
+ config_section :assume_role_credentials, :multi => false do
22
+ config_param :role_arn, :string
23
+ config_param :role_session_name, :string
24
+ config_param :policy, :string, :default => nil
25
+ config_param :duration_seconds, :integer, :default => nil
26
+ config_param :external_id, :string, :default => nil
27
+ end
28
+ config_section :instance_profile_credentials, :multi => false do
29
+ config_param :retries, :integer, :default => nil
30
+ config_param :ip_address, :string, :default => nil
31
+ config_param :port, :integer, :default => nil
32
+ config_param :http_open_timeout, :float, :default => nil
33
+ config_param :http_read_timeout, :float, :default => nil
34
+ # config_param :delay, :integer or :proc, :default => nil
35
+ # config_param :http_degub_output, :io, :default => nil
36
+ end
37
+ config_section :shared_credentials, :multi => false do
38
+ config_param :path, :string, :default => nil
39
+ config_param :profile_name, :string, :default => nil
40
+ end
22
41
  config_param :aws_iam_retries, :integer, :default => 5
23
42
  config_param :s3_bucket, :string
24
- config_param :s3_region, :string, :default => nil
43
+ config_param :s3_region, :string, :default => ENV["AWS_REGION"] || "us-east-1"
25
44
  config_param :s3_endpoint, :string, :default => nil
26
45
  config_param :s3_object_key_format, :string, :default => "%{path}%{time_slice}_%{index}.%{file_extension}"
27
46
  config_param :store_as, :string, :default => "gzip"
@@ -29,6 +48,7 @@ module Fluent
29
48
  config_param :check_apikey_on_start, :bool, :default => true
30
49
  config_param :proxy_uri, :string, :default => nil
31
50
  config_param :reduced_redundancy, :bool, :default => false
51
+ config_param :storage_class, :string, :default => "STANDARD"
32
52
  config_param :format, :string, :default => 'out_file'
33
53
  config_param :acl, :string, :default => :private
34
54
 
@@ -68,27 +88,55 @@ module Fluent
68
88
  Time.now.utc.strftime(path)
69
89
  }
70
90
  end
91
+
92
+ @storage_class = "REDUCED_REDUNDANCY" if @reduced_redundancy
71
93
  end
72
94
 
73
95
  def start
74
96
  super
75
97
  options = {}
76
- if @aws_key_id && @aws_sec_key
98
+ credentials_options = {}
99
+ case
100
+ when @aws_key_id && @aws_sec_key
77
101
  options[:access_key_id] = @aws_key_id
78
102
  options[:secret_access_key] = @aws_sec_key
79
- elsif ENV.key? "AWS_ACCESS_KEY_ID"
80
- options[:credential_provider] = AWS::Core::CredentialProviders::ENVProvider.new('AWS')
103
+ when @assume_role_credentials
104
+ c = @assume_role_credentials
105
+ credentials_options[:role_arn] = c.role_arn
106
+ credentials_options[:role_session_name] = c.role_session_name
107
+ credentials_options[:policy] = c.policy if c.policy
108
+ credentials_options[:duration_seconds] = c.duration_seconds if c.duration_seconds
109
+ credentials_options[:external_id] = c.external_id if c.external_id
110
+ options[:credentials] = Aws::AssumeRoleCredentials.new(credentials_options)
111
+ when @instance_profile_credentials
112
+ c = @instance_profile_credentials
113
+ credentials_options[:retries] = c.retries if c.retries
114
+ credentials_options[:ip_address] = c.ip_address if c.ip_address
115
+ credentials_options[:port] = c.port if c.port
116
+ credentials_options[:http_open_timeout] = c.http_open_timeout if c.http_open_timeout
117
+ credentials_options[:http_read_timeout] = c.http_read_timeout if c.http_read_timeout
118
+ options[:credentials] = Aws::InstanceProfileCredentials.new(credentials_options)
119
+ when @shared_credentials
120
+ c = @shared_credentials
121
+ credentials_options[:path] = c.path if c.path
122
+ credentials_options[:profile_name] = c.profile_name if c.profile_name
123
+ options[:credentials] = Aws::SharedCredentials.new(credentials_options)
124
+ when @aws_iam_retries
125
+ $log.warn("'aws_iam_retries' parameter is deprecated. Use 'instance_profile_credentials' instead")
126
+ credentials_options[:retries] = @aws_iam_retries
127
+ options[:credentials] = Aws::InstanceProfileCredentials.new(credentials_options)
81
128
  else
82
- options[:credential_provider] = AWS::Core::CredentialProviders::EC2Provider.new({:retries => @aws_iam_retries})
129
+ # Use default credentials
130
+ # See http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html
83
131
  end
84
132
  options[:region] = @s3_region if @s3_region
85
- options[:s3_endpoint] = @s3_endpoint if @s3_endpoint
86
- options[:proxy_uri] = @proxy_uri if @proxy_uri
87
- options[:use_ssl] = @use_ssl
133
+ options[:endpoint] = @s3_endpoint if @s3_endpoint
134
+ options[:http_proxy] = @proxy_uri if @proxy_uri
88
135
  options[:s3_server_side_encryption] = @use_server_side_encryption.to_sym if @use_server_side_encryption
89
136
 
90
- @s3 = AWS::S3.new(options)
91
- @bucket = @s3.buckets[@s3_bucket]
137
+ s3_client = Aws::S3::Client.new(options)
138
+ @s3 = Aws::S3::Resource.new(:client => s3_client)
139
+ @bucket = @s3.bucket(@s3_bucket)
92
140
 
93
141
  check_apikeys if @check_apikey_on_start
94
142
  ensure_bucket
@@ -120,14 +168,15 @@ module Fluent
120
168
 
121
169
  i += 1
122
170
  previous_path = s3path
123
- end while @bucket.objects[s3path].exists?
171
+ end while @bucket.object(s3path).exists?
124
172
 
125
173
  tmp = Tempfile.new("s3-")
126
174
  begin
127
175
  @compressor.compress(chunk, tmp)
128
- @bucket.objects[s3path].write(Pathname.new(tmp.path), {:content_type => @compressor.content_type,
129
- :reduced_redundancy => @reduced_redundancy,
130
- :acl => @acl})
176
+ tmp.rewind
177
+ @bucket.object(s3path).put(:body => tmp,
178
+ :content_type => @compressor.content_type,
179
+ :storage_class => @storage_class)
131
180
  ensure
132
181
  tmp.close(true) rescue nil
133
182
  end
@@ -139,7 +188,7 @@ module Fluent
139
188
  if !@bucket.exists?
140
189
  if @auto_create_bucket
141
190
  log.info "Creating bucket #{@s3_bucket} on #{@s3_endpoint}"
142
- @s3.buckets.create(@s3_bucket)
191
+ @s3.create_bucket(:bucket => @s3_bucket)
143
192
  else
144
193
  raise "The specified bucket does not exist: bucket = #{@s3_bucket}"
145
194
  end
@@ -147,8 +196,8 @@ module Fluent
147
196
  end
148
197
 
149
198
  def check_apikeys
150
- @bucket.empty?
151
- rescue AWS::S3::Errors::NoSuchBucket
199
+ @bucket.objects.first
200
+ rescue Aws::S3::Errors::NoSuchBucket
152
201
  # ignore NoSuchBucket Error because ensure_bucket checks it.
153
202
  rescue => e
154
203
  raise "can't call S3 API. Please check your aws_key_id / aws_sec_key or s3_region configuration. error = #{e.inspect}"
@@ -204,9 +253,9 @@ module Fluent
204
253
  def compress(chunk, tmp)
205
254
  w = Zlib::GzipWriter.new(tmp)
206
255
  chunk.write_to(w)
207
- w.close
256
+ w.finish
208
257
  ensure
209
- w.close rescue nil
258
+ w.finish rescue nil
210
259
  end
211
260
  end
212
261
 
@@ -221,7 +270,6 @@ module Fluent
221
270
 
222
271
  def compress(chunk, tmp)
223
272
  chunk.write_to(tmp)
224
- tmp.close
225
273
  end
226
274
  end
227
275
 
data/test/test_out_s3.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  require 'fluent/test'
2
2
  require 'fluent/plugin/out_s3'
3
3
 
4
- require 'flexmock/test_unit'
4
+ require 'test/unit/rr'
5
5
  require 'zlib'
6
+ require 'fileutils'
6
7
 
7
8
  class S3OutputTest < Test::Unit::TestCase
8
9
  def setup
9
- require 'aws-sdk-v1'
10
+ require 'aws-sdk-resources'
10
11
  Fluent::Test.setup
11
12
  end
12
13
 
@@ -41,7 +42,6 @@ class S3OutputTest < Test::Unit::TestCase
41
42
  assert_equal 'test_sec_key', d.instance.aws_sec_key
42
43
  assert_equal 'test_bucket', d.instance.s3_bucket
43
44
  assert_equal 'log', d.instance.path
44
- assert d.instance.instance_variable_get(:@use_ssl)
45
45
  assert_equal 'gz', d.instance.instance_variable_get(:@compressor).ext
46
46
  assert_equal 'application/x-gzip', d.instance.instance_variable_get(:@compressor).content_type
47
47
  end
@@ -242,39 +242,21 @@ class S3OutputTest < Test::Unit::TestCase
242
242
  end
243
243
 
244
244
  def test_write_with_custom_s3_object_key_format
245
- # Assert content of event logs which are being sent to S3
246
- s3obj = flexmock(AWS::S3::S3Object)
247
- s3obj.should_receive(:exists?).with_any_args.and_return { false }
248
- s3obj.should_receive(:write).with(
249
- on { |pathname|
250
- data = nil
251
- # Event logs are compressed in GZip
252
- pathname.open { |f|
253
- gz = Zlib::GzipReader.new(f)
254
- data = gz.read
255
- gz.close
256
- }
257
- assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n] +
258
- %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n],
259
- data
260
-
261
- pathname.to_s.match(%r|s3-|)
262
- },
263
- {:content_type => "application/x-gzip", :reduced_redundancy => false, :acl => :private})
264
-
265
- # Assert the key of S3Object, which event logs are stored in
266
- s3obj_col = flexmock(AWS::S3::ObjectCollection)
267
- s3obj_col.should_receive(:[]).with(
268
- on { |key|
269
- key == "log/events/ts=20110102-13/events_0-testing.node.local.gz"
270
- }).
271
- and_return {
272
- s3obj
273
- }
274
-
275
245
  # Partial mock the S3Bucket, not to make an actual connection to Amazon S3
276
- s3bucket, _ = setup_mocks(true)
277
- s3bucket.should_receive(:objects).with_any_args.and_return { s3obj_col }
246
+ setup_mocks(true)
247
+
248
+ # Assert content of event logs which are being sent to S3
249
+ s3obj = stub(Aws::S3::Object.new(:bucket_name => "test_bucket",
250
+ :key => "test",
251
+ :client => @s3_client))
252
+ s3obj.exists? { false }
253
+ s3_test_file_path = "/tmp/s3-test.txt"
254
+ tempfile = File.new(s3_test_file_path, "w")
255
+ mock(Tempfile).new("s3-") { tempfile }
256
+ s3obj.put(:body => tempfile,
257
+ :content_type => "application/x-gzip",
258
+ :storage_class => "STANDARD")
259
+ @s3_bucket.object("log/events/ts=20110102-13/events_0-testing.node.local.gz") { s3obj }
278
260
 
279
261
  # We must use TimeSlicedOutputTestDriver instead of BufferedOutputTestDriver,
280
262
  # to make assertions on chunks' keys
@@ -286,46 +268,38 @@ class S3OutputTest < Test::Unit::TestCase
286
268
 
287
269
  # Finally, the instance of S3Output is initialized and then invoked
288
270
  d.run
271
+ Zlib::GzipReader.open(s3_test_file_path) do |gz|
272
+ data = gz.read
273
+ assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n] +
274
+ %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n],
275
+ data
276
+ end
277
+ FileUtils.rm_f(s3_test_file_path)
289
278
  end
290
279
 
291
280
  def test_write_with_custom_s3_object_key_format_containing_uuid_flush_placeholder
292
- # Assert content of event logs which are being sent to S3
293
- s3obj = flexmock(AWS::S3::S3Object)
294
- s3obj.should_receive(:exists?).with_any_args.and_return { false }
295
- s3obj.should_receive(:write).with(
296
- on { |pathname|
297
- data = nil
298
- # Event logs are compressed in GZip
299
- pathname.open { |f|
300
- gz = Zlib::GzipReader.new(f)
301
- data = gz.read
302
- gz.close
303
- }
304
- assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n] +
305
- %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n],
306
- data
307
-
308
- pathname.to_s.match(%r|s3-|)
309
- },
310
- {:content_type => "application/x-gzip", :reduced_redundancy => false, :acl => :private})
311
-
312
- # Assert the key of S3Object, which event logs are stored in
313
- s3obj_col = flexmock(AWS::S3::ObjectCollection)
314
- s3obj_col.should_receive(:[]).with(
315
- on { |key|
316
- key =~ /.*.[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}.*/
317
- }).
318
- and_return {
319
- s3obj
320
- }
321
-
322
281
  # Partial mock the S3Bucket, not to make an actual connection to Amazon S3
323
- s3bucket, _ = setup_mocks(true)
324
- s3bucket.should_receive(:objects).with_any_args.and_return { s3obj_col }
282
+ setup_mocks(true)
283
+
284
+ uuid = "5755e23f-9b54-42d8-8818-2ea38c6f279e"
285
+ stub(UUIDTools::UUID).random_create{ uuid }
286
+
287
+ # Assert content of event logs which are being sent to S3
288
+ s3obj = stub(Aws::S3::Object.new(:bucket_name => "test_bucket",
289
+ :key => "test",
290
+ :client => @s3_client))
291
+ s3obj.exists? { false }
292
+ s3_test_file_path = "/tmp/s3-test.txt"
293
+ tempfile = File.new(s3_test_file_path, "w")
294
+ mock(Tempfile).new("s3-") { tempfile }
295
+ s3obj.put(:body => tempfile,
296
+ :content_type => "application/x-gzip",
297
+ :storage_class => "STANDARD")
298
+ @s3_bucket.object("log/events/ts=20110102-13/events_0-#{uuid}.gz") { s3obj }
325
299
 
326
300
  # We must use TimeSlicedOutputTestDriver instead of BufferedOutputTestDriver,
327
301
  # to make assertions on chunks' keys
328
- config = CONFIG_TIME_SLICE.clone.gsub(/%{hostname}/,"%{uuid_flush}")
302
+ config = CONFIG_TIME_SLICE.gsub(/%{hostname}/,"%{uuid_flush}")
329
303
  d = create_time_sliced_driver(config)
330
304
 
331
305
  time = Time.parse("2011-01-02 13:14:15 UTC").to_i
@@ -334,22 +308,32 @@ class S3OutputTest < Test::Unit::TestCase
334
308
 
335
309
  # Finally, the instance of S3Output is initialized and then invoked
336
310
  d.run
311
+ Zlib::GzipReader.open(s3_test_file_path) do |gz|
312
+ data = gz.read
313
+ assert_equal %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n] +
314
+ %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n],
315
+ data
316
+ end
317
+ FileUtils.rm_f(s3_test_file_path)
337
318
  end
338
319
 
339
320
  def setup_mocks(exists_return = false)
340
- s3bucket = flexmock(AWS::S3::Bucket)
341
- s3bucket.should_receive(:exists?).with_any_args.and_return { exists_return }
342
- s3bucket_col = flexmock(AWS::S3::BucketCollection)
343
- s3bucket_col.should_receive(:[]).with_any_args.and_return { s3bucket }
344
- flexmock(AWS::S3).new_instances do |bucket|
345
- bucket.should_receive(:buckets).with_any_args.and_return { s3bucket_col }
346
- end
347
-
348
- return s3bucket, s3bucket_col
321
+ @s3_client = stub(Aws::S3::Client.new(:stub_responses => true))
322
+ mock(Aws::S3::Client).new(anything).at_least(0) { @s3_client }
323
+ @s3_resource = mock(Aws::S3::Resource.new(:client => @s3_client))
324
+ mock(Aws::S3::Resource).new(:client => @s3_client) { @s3_resource }
325
+ @s3_bucket = mock(Aws::S3::Bucket.new(:name => "test",
326
+ :client => @s3_client))
327
+ @s3_bucket.exists? { exists_return }
328
+ @s3_object = mock(Aws::S3::Object.new(:bucket_name => "test_bucket",
329
+ :key => "test",
330
+ :client => @s3_client))
331
+ @s3_bucket.object(anything).at_least(0) { @s3_object }
332
+ @s3_resource.bucket(anything) { @s3_bucket }
349
333
  end
350
334
 
351
335
  def test_auto_create_bucket_false_with_non_existence_bucket
352
- s3bucket, s3bucket_col = setup_mocks
336
+ setup_mocks
353
337
 
354
338
  config = CONFIG_TIME_SLICE + 'auto_create_bucket false'
355
339
  d = create_time_sliced_driver(config)
@@ -359,73 +343,83 @@ class S3OutputTest < Test::Unit::TestCase
359
343
  end
360
344
 
361
345
  def test_auto_create_bucket_true_with_non_existence_bucket
362
- s3bucket, s3bucket_col = setup_mocks
363
- s3bucket_col.should_receive(:create).with_any_args.and_return { true }
346
+ setup_mocks
347
+ @s3_resource.create_bucket(:bucket => "test_bucket")
364
348
 
365
349
  config = CONFIG_TIME_SLICE + 'auto_create_bucket true'
366
350
  d = create_time_sliced_driver(config)
367
351
  assert_nothing_raised { d.run }
368
352
  end
369
353
 
370
- def test_aws_credential_provider_default
371
- s3bucket, s3bucket_col = setup_mocks
372
- s3bucket_col.should_receive(:create).with_any_args.and_return { true }
373
-
354
+ def test_credentials
374
355
  d = create_time_sliced_driver
375
- assert_nothing_raised { d.run }
376
- assert_equal "AWS::Core::CredentialProviders::DefaultProvider", d.instance.instance_variable_get(:@s3).config.credential_provider.class.to_s
356
+ assert_nothing_raised{ d.run }
357
+ client = d.instance.instance_variable_get(:@s3).client
358
+ credentials = client.config.credentials
359
+ assert_instance_of(Aws::Credentials, credentials)
377
360
  end
378
361
 
379
- def test_aws_credential_provider_env
380
- s3bucket, s3bucket_col = setup_mocks
381
- s3bucket_col.should_receive(:create).with_any_args.and_return { true }
382
- key = ENV['AWS_ACCESS_KEY_ID']
383
- ENV.replace({'AWS_ACCESS_KEY_ID' => 'my_access_key'})
384
-
385
- config = CONFIG_TIME_SLICE.clone.split("\n").reject{|x| x =~ /.+aws_.+/}.join("\n")
362
+ def test_assume_role_credentials
363
+ expected_credentials = Aws::Credentials.new("test_key", "test_secret")
364
+ mock(Aws::AssumeRoleCredentials).new(:role_arn => "test_arn",
365
+ :role_session_name => "test_session"){
366
+ expected_credentials
367
+ }
368
+ config = CONFIG_TIME_SLICE.split("\n").reject{|x| x =~ /.+aws_.+/}.join("\n")
369
+ config += %[
370
+ <assume_role_credentials>
371
+ role_arn test_arn
372
+ role_session_name test_session
373
+ </assume_role_credentials>
374
+ ]
386
375
  d = create_time_sliced_driver(config)
387
-
388
- assert_equal true, ENV.key?('AWS_ACCESS_KEY_ID')
389
- assert_nothing_raised { d.run }
390
- assert_equal nil, d.instance.aws_key_id
391
- assert_equal nil, d.instance.aws_sec_key
392
- assert_equal "AWS::Core::CredentialProviders::ENVProvider", d.instance.instance_variable_get(:@s3).config.credential_provider.class.to_s
393
-
394
- ENV.replace({'AWS_ACCESS_KEY_ID' => key}) unless key.nil?
376
+ assert_nothing_raised{ d.run }
377
+ client = d.instance.instance_variable_get(:@s3).client
378
+ credentials = client.config.credentials
379
+ assert_equal(expected_credentials, credentials)
395
380
  end
396
381
 
397
- def test_aws_credential_provider_ec2
398
- s3bucket, s3bucket_col = setup_mocks
399
- s3bucket_col.should_receive(:create).with_any_args.and_return { true }
400
- key = ENV['AWS_ACCESS_KEY_ID']
401
- ENV.delete('AWS_ACCESS_KEY_ID')
402
-
403
- config = CONFIG_TIME_SLICE.clone.split("\n").reject{|x| x =~ /.+aws_.+/}.join("\n")
382
+ def test_instance_profile_credentials
383
+ expected_credentials = Aws::Credentials.new("test_key", "test_secret")
384
+ mock(Aws::InstanceProfileCredentials).new({}).returns(expected_credentials)
385
+ config = CONFIG_TIME_SLICE.split("\n").reject{|x| x =~ /.+aws_.+/}.join("\n")
386
+ config += %[
387
+ <instance_profile_credentials>
388
+ </instance_profile_credentials>
389
+ ]
404
390
  d = create_time_sliced_driver(config)
405
-
406
- assert_equal false, ENV.key?('AWS_ACCESS_KEY_ID')
407
- assert_nothing_raised { d.run }
408
- assert_equal nil, d.instance.aws_key_id
409
- assert_equal nil, d.instance.aws_sec_key
410
- assert_equal "AWS::Core::CredentialProviders::EC2Provider", d.instance.instance_variable_get(:@s3).config.credential_provider.class.to_s
411
- assert_equal 5, d.instance.instance_variable_get(:@s3).config.credential_provider.retries
412
-
413
- ENV.replace({'AWS_ACCESS_KEY_ID' => key}) unless key.nil?
391
+ assert_nothing_raised{ d.run }
392
+ client = d.instance.instance_variable_get(:@s3).client
393
+ credentials = client.config.credentials
394
+ assert_equal(expected_credentials, credentials)
414
395
  end
415
396
 
416
- def test_aws_credential_provider_ec2_with_retries
417
- s3bucket, s3bucket_col = setup_mocks
418
- s3bucket_col.should_receive(:create).with_any_args.and_return { true }
419
- key = ENV['AWS_ACCESS_KEY_ID']
420
- ENV.delete('AWS_ACCESS_KEY_ID')
421
-
422
- config = [CONFIG_TIME_SLICE.clone.split("\n").reject{|x| x =~ /.+aws_.+/}, 'aws_iam_retries 7'].join("\n")
397
+ def test_instance_profile_credentials_aws_iam_retries
398
+ expected_credentials = Aws::Credentials.new("test_key", "test_secret")
399
+ mock(Aws::InstanceProfileCredentials).new({}).returns(expected_credentials)
400
+ config = CONFIG_TIME_SLICE.split("\n").reject{|x| x =~ /.+aws_.+/}.join("\n")
401
+ config += %[
402
+ aws_iam_retries 10
403
+ ]
423
404
  d = create_time_sliced_driver(config)
405
+ assert_nothing_raised{ d.run }
406
+ client = d.instance.instance_variable_get(:@s3).client
407
+ credentials = client.config.credentials
408
+ assert_equal(expected_credentials, credentials)
409
+ end
424
410
 
425
- config = [CONFIG, 'include_tag_key true', 'include_time_key true'].join("\n")
426
- assert_nothing_raised { d.run }
427
- assert_equal 7, d.instance.instance_variable_get(:@s3).config.credential_provider.retries
428
-
429
- ENV.replace({'AWS_ACCESS_KEY_ID' => key}) unless key.nil?
411
+ def test_shared_credentials
412
+ expected_credentials = Aws::Credentials.new("test_key", "test_secret")
413
+ mock(Aws::SharedCredentials).new({}).returns(expected_credentials)
414
+ config = CONFIG_TIME_SLICE.split("\n").reject{|x| x =~ /.+aws_.+/}.join("\n")
415
+ config += %[
416
+ <shared_credentials>
417
+ </shared_credentials>
418
+ ]
419
+ d = create_time_sliced_driver(config)
420
+ assert_nothing_raised{ d.run }
421
+ client = d.instance.instance_variable_get(:@s3).client
422
+ credentials = client.config.credentials
423
+ assert_equal(expected_credentials, credentials)
430
424
  end
431
425
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-s3
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.11
4
+ version: 0.6.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-08-04 00:00:00.000000000 Z
12
+ date: 2015-09-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: fluentd
@@ -32,19 +32,19 @@ dependencies:
32
32
  - !ruby/object:Gem::Version
33
33
  version: '2'
34
34
  - !ruby/object:Gem::Dependency
35
- name: aws-sdk-v1
35
+ name: aws-sdk
36
36
  requirement: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.38'
40
+ version: '2'
41
41
  type: :runtime
42
42
  prerelease: false
43
43
  version_requirements: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.38'
47
+ version: '2'
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: yajl-ruby
50
50
  requirement: !ruby/object:Gem::Requirement
@@ -88,33 +88,33 @@ dependencies:
88
88
  - !ruby/object:Gem::Version
89
89
  version: 0.9.2
90
90
  - !ruby/object:Gem::Dependency
91
- name: flexmock
91
+ name: test-unit
92
92
  requirement: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: 1.2.0
96
+ version: 3.0.8
97
97
  type: :development
98
98
  prerelease: false
99
99
  version_requirements: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
- version: 1.2.0
103
+ version: 3.0.8
104
104
  - !ruby/object:Gem::Dependency
105
- name: test-unit
105
+ name: test-unit-rr
106
106
  requirement: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - ">="
109
109
  - !ruby/object:Gem::Version
110
- version: 3.0.8
110
+ version: 1.0.3
111
111
  type: :development
112
112
  prerelease: false
113
113
  version_requirements: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - ">="
116
116
  - !ruby/object:Gem::Version
117
- version: 3.0.8
117
+ version: 1.0.3
118
118
  description: Amazon S3 output plugin for Fluentd event collector
119
119
  email: frsyuki@gmail.com
120
120
  executables: []
@@ -150,9 +150,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
150
150
  version: '0'
151
151
  required_rubygems_version: !ruby/object:Gem::Requirement
152
152
  requirements:
153
- - - ">="
153
+ - - ">"
154
154
  - !ruby/object:Gem::Version
155
- version: '0'
155
+ version: 1.3.1
156
156
  requirements: []
157
157
  rubyforge_project:
158
158
  rubygems_version: 2.2.3