fluent-plugin-s3 0.5.11 → 0.6.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  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