logstash-core 2.1.0.snapshot1-java → 2.1.0.snapshot2-java

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.

Potentially problematic release.


This version of logstash-core might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87d7fb408dd16ba253e9c9db5c6316c708244863
4
- data.tar.gz: 18ae758172b595f6c11ff3bdcffc518c89e8900a
3
+ metadata.gz: df26ae829d2eb22f63fa59c3b1ef2c12e6f6cb08
4
+ data.tar.gz: fb085312c7eb9eab720792dfae8d37940ea3c56a
5
5
  SHA512:
6
- metadata.gz: 02f3a7305e2c7f7abb23a749a3e0f5b7a1c5a178632c8f489216b43a29d09235e4ae2f25083161778e9d4fd119afc2e4651f30e1057359798f9e6bdfa7932d27
7
- data.tar.gz: 845118632a2b521ddc1a986387ea6272ab5b001c5e46ebd4b37dfe36217f73224834e4a4e42d60ffe007fddf5e3009714b7e90ddd0c9be69a6abd15c304d9606
6
+ metadata.gz: d70144723adacaf709e415ff9b68f42ad0d0a623d1268e78a04cc1e5bc24be747575297ed6ebeeb94e70c8cc7ae199b6cc18aacd7ceb1ea29ec1e5dd57db6fa1
7
+ data.tar.gz: 3db5d330c35e1cd0a7b29b29f615ec2753acbee2bfb933f7c40a037d7377bfb05659133567ea320158ae31a6762be3b94e5a9e83bff7624d93fa5a5d00ccb004
@@ -23,7 +23,7 @@ class LogStash::Agent < Clamp::Command
23
23
  option ["-w", "--filterworkers"], "COUNT",
24
24
  I18n.t("logstash.agent.flag.filterworkers"),
25
25
  :attribute_name => :filter_workers,
26
- :default => LogStash::Config::CpuCoreStrategy.fifty_percent, &:to_i
26
+ :default => 0, &:to_i
27
27
 
28
28
  option ["-l", "--log"], "FILE",
29
29
  I18n.t("logstash.agent.flag.log"),
@@ -143,7 +143,7 @@ class LogStash::Agent < Clamp::Command
143
143
  configure_logging(log_file)
144
144
  end
145
145
 
146
- pipeline.configure("filter-workers", filter_workers)
146
+ pipeline.configure("filter-workers", filter_workers) if filter_workers > 0
147
147
 
148
148
  # Stop now if we are only asking for a config test.
149
149
  if config_test?
@@ -106,7 +106,7 @@ class LogStash::Event
106
106
 
107
107
  public
108
108
  def to_s
109
- self.sprintf("#{timestamp.to_iso8601} %{host} %{message}")
109
+ "#{timestamp.to_iso8601} #{self.sprintf("%{host} %{message}")}"
110
110
  end # def to_s
111
111
 
112
112
  public
@@ -46,7 +46,7 @@ class LogStash::Pipeline
46
46
  @filter_to_output = filters? ? SizedQueue.new(20) : @input_to_filter
47
47
 
48
48
  @settings = {
49
- "filter-workers" => LogStash::Config::CpuCoreStrategy.fifty_percent
49
+ "default-filter-workers" => LogStash::Config::CpuCoreStrategy.fifty_percent
50
50
  }
51
51
 
52
52
  # @ready requires thread safety since it is typically polled from outside the pipeline thread
@@ -59,14 +59,32 @@ class LogStash::Pipeline
59
59
  end
60
60
 
61
61
  def configure(setting, value)
62
- if setting == "filter-workers" && value > 1
63
- # Abort if we have any filters that aren't threadsafe
64
- plugins = @filters.select { |f| !f.threadsafe? }.collect { |f| f.class.config_name }
65
- if !plugins.size.zero?
66
- raise LogStash::ConfigurationError, "Cannot use more than 1 filter worker because the following plugins don't work with more than one worker: #{plugins.join(", ")}"
62
+ @settings[setting] = value
63
+ end
64
+
65
+ def safe_filter_worker_count
66
+ default = @settings["default-filter-workers"]
67
+ thread_count = @settings["filter-workers"] #override from args "-w 8" or config
68
+ safe_filters, unsafe_filters = @filters.partition(&:threadsafe?)
69
+ if unsafe_filters.any?
70
+ plugins = unsafe_filters.collect { |f| f.class.config_name }
71
+ case thread_count
72
+ when nil
73
+ # user did not specify a worker thread count
74
+ # warn if the default is multiple
75
+ @logger.warn("Defaulting filter worker threads to 1 because there are some filters that might not work with multiple worker threads",
76
+ :count_was => default, :filters => plugins) if default > 1
77
+ 1 # can't allow the default value to propagate if there are unsafe filters
78
+ when 0, 1
79
+ 1
80
+ else
81
+ @logger.warn("Warning: Manual override - there are filters that might not work with multiple worker threads",
82
+ :worker_threads => thread_count, :filters => plugins)
83
+ thread_count # allow user to force this even if there are unsafe filters
67
84
  end
85
+ else
86
+ thread_count || default
68
87
  end
69
- @settings[setting] = value
70
88
  end
71
89
 
72
90
  def filters?
@@ -149,7 +167,9 @@ class LogStash::Pipeline
149
167
 
150
168
  def start_filters
151
169
  @filters.each(&:register)
152
- to_start = @settings["filter-workers"]
170
+ # dynamically get thread count based on filter threadsafety
171
+ # moved this test to here to allow for future config reloading
172
+ to_start = safe_filter_worker_count
153
173
  @filter_threads = to_start.times.collect do
154
174
  Thread.new { filterworker }
155
175
  end
@@ -20,7 +20,7 @@ module LogStash module Util class DefaultsPrinter
20
20
  @printers.each do |printer|
21
21
  printer.visit(collector)
22
22
  end
23
- "Default settings used: " + collector.join(', ')
23
+ "Settings: " + collector.join(', ')
24
24
  end
25
25
 
26
26
  private
@@ -6,11 +6,23 @@ require "logstash/util"
6
6
  module LogStash module Util class WorkerThreadsDefaultPrinter
7
7
 
8
8
  def initialize(settings)
9
- @setting = settings.fetch('filter-workers', 1)
9
+ @setting = settings.fetch('filter-workers', 0)
10
+ @default = settings.fetch('default-filter-workers', 0)
10
11
  end
11
12
 
12
13
  def visit(collector)
13
- collector.push "Filter workers: #{@setting}"
14
+ visit_setting(collector)
15
+ visit_default(collector)
16
+ end
17
+
18
+ def visit_setting(collector)
19
+ return if @setting == 0
20
+ collector.push("User set filter workers: #{@setting}")
21
+ end
22
+
23
+ def visit_default(collector)
24
+ return if @default == 0
25
+ collector.push "Default filter workers: #{@default}"
14
26
  end
15
27
 
16
28
  end end end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # The version of logstash.
3
- LOGSTASH_VERSION = "2.1.0.snapshot1"
3
+ LOGSTASH_VERSION = "2.1.0.snapshot2"
4
4
 
5
5
  # Note to authors: this should not include dashes because 'gem' barfs if
6
6
  # you include a dash in the version string.
@@ -35,6 +35,7 @@ Gem::Specification.new do |gem|
35
35
 
36
36
  # filetools and rakelib
37
37
  gem.add_runtime_dependency "minitar", "~> 0.5.4"
38
+ gem.add_runtime_dependency "rubyzip", "~> 1.1.7"
38
39
  gem.add_runtime_dependency "thread_safe", "~> 0.3.5" #(Apache 2.0 license)
39
40
 
40
41
  if RUBY_PLATFORM == 'java'
@@ -496,4 +496,22 @@ describe LogStash::Event do
496
496
  subject{LogStash::Event.new(LogStash::Json.load(LogStash::Json.dump(event_hash)))}
497
497
  end
498
498
  end
499
+
500
+
501
+ describe "#to_s" do
502
+ let(:timestamp) { LogStash::Timestamp.new }
503
+ let(:event1) { LogStash::Event.new({ "@timestamp" => timestamp, "host" => "foo", "message" => "bar"}) }
504
+ let(:event2) { LogStash::Event.new({ "host" => "bar", "message" => "foo"}) }
505
+
506
+ it "should cache only one template" do
507
+ expect {
508
+ event1.to_s
509
+ event2.to_s
510
+ }.to change { LogStash::StringInterpolation::CACHE.size }.by(1)
511
+ end
512
+
513
+ it "return the string containing the timestamp, the host and the message" do
514
+ expect(event1.to_s).to eq("#{timestamp.to_iso8601} #{event1["host"]} #{event1["message"]}")
515
+ end
516
+ end
499
517
  end
@@ -53,20 +53,127 @@ class DummyOutput < LogStash::Outputs::Base
53
53
  end
54
54
  end
55
55
 
56
+ class DummyFilter < LogStash::Filters::Base
57
+ config_name "dummyfilter"
58
+ milestone 2
59
+
60
+ def register() end
61
+
62
+ def filter(event) end
63
+
64
+ def threadsafe?() false; end
65
+
66
+ def close() end
67
+ end
68
+
69
+ class DummySafeFilter < LogStash::Filters::Base
70
+ config_name "dummysafefilter"
71
+ milestone 2
72
+
73
+ def register() end
74
+
75
+ def filter(event) end
76
+
77
+ def threadsafe?() true; end
78
+
79
+ def close() end
80
+ end
81
+
56
82
  class TestPipeline < LogStash::Pipeline
57
- attr_reader :outputs
83
+ attr_reader :outputs, :filter_threads, :settings, :logger
58
84
  end
59
85
 
60
86
  describe LogStash::Pipeline do
87
+ let(:worker_thread_count) { 8 }
88
+ let(:safe_thread_count) { 1 }
89
+ let(:override_thread_count) { 42 }
90
+
91
+ describe "defaulting the filter workers based on thread safety" do
92
+ before(:each) do
93
+ allow(LogStash::Plugin).to receive(:lookup).with("input", "dummyinput").and_return(DummyInput)
94
+ allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(DummyCodec)
95
+ allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
96
+ allow(LogStash::Plugin).to receive(:lookup).with("filter", "dummyfilter").and_return(DummyFilter)
97
+ allow(LogStash::Plugin).to receive(:lookup).with("filter", "dummysafefilter").and_return(DummySafeFilter)
98
+ allow(LogStash::Config::CpuCoreStrategy).to receive(:fifty_percent).and_return(worker_thread_count)
99
+ end
100
+
101
+ context "when there are some not threadsafe filters" do
102
+ let(:test_config_with_filters) {
103
+ <<-eos
104
+ input {
105
+ dummyinput {}
106
+ }
107
+
108
+ filter {
109
+ dummyfilter {}
110
+ }
111
+
112
+ output {
113
+ dummyoutput {}
114
+ }
115
+ eos
116
+ }
117
+
118
+ context "when there is no command line -w N set" do
119
+ it "starts one filter thread" do
120
+ msg = "Defaulting filter worker threads to 1 because there are some" +
121
+ " filters that might not work with multiple worker threads"
122
+ pipeline = TestPipeline.new(test_config_with_filters)
123
+ expect(pipeline.logger).to receive(:warn).with(msg,
124
+ {:count_was=>worker_thread_count, :filters=>["dummyfilter"]})
125
+ pipeline.run
126
+ expect(pipeline.filter_threads.size).to eq(safe_thread_count)
127
+ end
128
+ end
129
+
130
+ context "when there is command line -w N set" do
131
+ it "starts multiple filter thread" do
132
+ msg = "Warning: Manual override - there are filters that might" +
133
+ " not work with multiple worker threads"
134
+ pipeline = TestPipeline.new(test_config_with_filters)
135
+ expect(pipeline.logger).to receive(:warn).with(msg,
136
+ {:worker_threads=> override_thread_count, :filters=>["dummyfilter"]})
137
+ pipeline.configure("filter-workers", override_thread_count)
138
+ pipeline.run
139
+ expect(pipeline.filter_threads.size).to eq(override_thread_count)
140
+ end
141
+ end
142
+ end
143
+
144
+ context "when there are threadsafe filters only" do
145
+ let(:test_config_with_filters) {
146
+ <<-eos
147
+ input {
148
+ dummyinput {}
149
+ }
150
+
151
+ filter {
152
+ dummysafefilter {}
153
+ }
61
154
 
62
- context "close" do
155
+ output {
156
+ dummyoutput {}
157
+ }
158
+ eos
159
+ }
63
160
 
64
- before(:each) do
65
- allow(LogStash::Plugin).to receive(:lookup).with("input", "dummyinput").and_return(DummyInput)
66
- allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(DummyCodec)
67
- allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
161
+ it "starts multiple filter threads" do
162
+ pipeline = TestPipeline.new(test_config_with_filters)
163
+ pipeline.run
164
+ expect(pipeline.filter_threads.size).to eq(worker_thread_count)
165
+ end
166
+ end
68
167
  end
69
168
 
169
+ context "close" do
170
+ before(:each) do
171
+ allow(LogStash::Plugin).to receive(:lookup).with("input", "dummyinput").and_return(DummyInput)
172
+ allow(LogStash::Plugin).to receive(:lookup).with("codec", "plain").and_return(DummyCodec)
173
+ allow(LogStash::Plugin).to receive(:lookup).with("output", "dummyoutput").and_return(DummyOutput)
174
+ end
175
+
176
+
70
177
  let(:test_config_without_output_workers) {
71
178
  <<-eos
72
179
  input {
@@ -191,6 +298,5 @@ context "close" do
191
298
  expect(subject[2]["foo"]).to eq("bar")
192
299
  end
193
300
  end
194
-
195
301
  end
196
302
  end
@@ -0,0 +1,28 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'pluginmanager/main'
4
+
5
+ describe LogStash::PluginManager::Install do
6
+ let(:cmd) { LogStash::PluginManager::Install.new("install") }
7
+
8
+ before(:each) do
9
+ expect(cmd).to receive(:validate_cli_options!).and_return(nil)
10
+ end
11
+
12
+ context "when validating plugins" do
13
+ let(:sources) { ["https://rubygems.org", "http://localhost:9292"] }
14
+
15
+ before(:each) do
16
+ expect(cmd).to receive(:plugins_gems).and_return([["dummy", nil]])
17
+ expect(cmd).to receive(:install_gems_list!).and_return(nil)
18
+ expect(cmd).to receive(:remove_unused_locally_installed_gems!).and_return(nil)
19
+ cmd.verify = true
20
+ end
21
+
22
+ it "should load all the sources defined in the Gemfile" do
23
+ expect(cmd.gemfile.gemset).to receive(:sources).and_return(sources)
24
+ expect(LogStash::PluginManager).to receive(:logstash_plugin?).with("dummy", nil, {:rubygems_source => sources}).and_return(true)
25
+ cmd.execute
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,39 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'pluginmanager/main'
4
+
5
+ describe LogStash::PluginManager::Update do
6
+ let(:cmd) { LogStash::PluginManager::Update.new("update") }
7
+ let(:sources) { cmd.gemfile.gemset.sources }
8
+
9
+ before(:each) do
10
+ expect(cmd).to receive(:find_latest_gem_specs).and_return({})
11
+ allow(cmd).to receive(:warn_local_gems).and_return(nil)
12
+ expect(cmd).to receive(:display_updated_plugins).and_return(nil)
13
+ expect_any_instance_of(LogStash::Bundler).to receive(:invoke!).with(:clean => true)
14
+ end
15
+
16
+ it "pass all gem sources to the bundle update command" do
17
+ sources = cmd.gemfile.gemset.sources
18
+ expect_any_instance_of(LogStash::Bundler).to receive(:invoke!).with(:update => [], :rubygems_source => sources)
19
+ cmd.execute
20
+ end
21
+
22
+ context "when skipping validation" do
23
+ let(:cmd) { LogStash::PluginManager::Update.new("update") }
24
+ let(:plugin) { OpenStruct.new(:name => "dummy", :options => {} ) }
25
+
26
+ before(:each) do
27
+ expect(cmd.gemfile).to receive(:find).with(plugin).and_return(plugin)
28
+ expect(cmd.gemfile).to receive(:save).and_return(nil)
29
+ expect(cmd).to receive(:plugins_to_update).and_return([plugin])
30
+ expect_any_instance_of(LogStash::Bundler).to receive(:invoke!).with(:update => [plugin], :rubygems_source => sources).and_return(nil)
31
+ end
32
+
33
+ it "skips version verification when ask for it" do
34
+ cmd.verify = false
35
+ expect(cmd).to_not receive(:validates_version)
36
+ cmd.execute
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,71 @@
1
+ #encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'pluginmanager/util'
4
+ require 'gems'
5
+
6
+ describe LogStash::PluginManager do
7
+
8
+ describe "fetching plugin information" do
9
+ let(:plugin_name) { "logstash-output-elasticsearch" }
10
+
11
+ let(:version_data) do
12
+ [ { "authors"=>"Elastic", "built_at"=>"2015-08-11T00:00:00.000Z", "description"=>"Output events to elasticsearch",
13
+ "downloads_count"=>1638, "metadata"=>{"logstash_group"=>"output", "logstash_plugin"=>"true"}, "number"=>"2.0.0.pre",
14
+ "summary"=>"Logstash Output to Elasticsearch", "platform"=>"java", "ruby_version"=>">= 0", "prerelease"=>true,
15
+ "licenses"=>["apache-2.0"], "requirements"=>[], "sha"=>"194b27099c13605a882a3669e2363fdecccaab1de48dd44b0cda648dd5516799"},
16
+ { "authors"=>"Elastic", "built_at"=>"2015-08-10T00:00:00.000Z", "description"=>"Output events to elasticsearch",
17
+ "downloads_count"=>1638, "metadata"=>{"logstash_group"=>"output", "logstash_plugin"=>"true"}, "number"=>"1.0.7",
18
+ "summary"=>"Logstash Output to Elasticsearch", "platform"=>"java", "ruby_version"=>">= 0", "prerelease"=>false,
19
+ "licenses"=>["apache-2.0"], "requirements"=>[], "sha"=>"194b27099c13605a882a3669e2363fdecccaab1de48dd44b0cda648dd5516799"},
20
+ { "authors"=>"Elastic", "built_at"=>"2015-08-09T00:00:00.000Z", "description"=>"Output events to elasticsearch",
21
+ "downloads_count"=>1638, "metadata"=>{"logstash_group"=>"output", "logstash_plugin"=>"true"}, "number"=>"1.0.4",
22
+ "summary"=>"Logstash Output to Elasticsearch", "platform"=>"java", "ruby_version"=>">= 0", "prerelease"=>false,
23
+ "licenses"=>["apache-2.0"], "requirements"=>[], "sha"=>"194b27099c13605a882a3669e2363fdecccaab1de48dd44b0cda648dd5516799"} ]
24
+ end
25
+
26
+ before(:each) do
27
+ allow(Gems).to receive(:versions).with(plugin_name).and_return(version_data)
28
+ end
29
+
30
+ context "fetch plugin info" do
31
+ it "should search for the last version infomation non prerelease" do
32
+ version_info = LogStash::PluginManager.fetch_latest_version_info(plugin_name)
33
+ expect(version_info["number"]).to eq("1.0.7")
34
+ end
35
+
36
+
37
+ it "should search for the last version infomation with prerelease" do
38
+ version_info = LogStash::PluginManager.fetch_latest_version_info(plugin_name, :pre => true)
39
+ expect(version_info["number"]).to eq("2.0.0.pre")
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "a logstash_plugin validation" do
45
+ let(:plugin) { "foo" }
46
+ let(:version) { "9.0.0.0" }
47
+
48
+ let(:sources) { ["http://source.01", "http://source.02"] }
49
+ let(:options) { {:rubygems_source => sources} }
50
+
51
+ let(:gemset) { double("gemset") }
52
+ let(:gemfile) { double("gemfile") }
53
+ let(:dep) { double("dep") }
54
+ let(:fetcher) { double("fetcher") }
55
+
56
+ before(:each) do
57
+ allow(gemfile).to receive(:gemset).and_return(gemset)
58
+ allow(gemset).to receive(:sources).and_return(sources)
59
+ expect(fetcher).to receive(:spec_for_dependency).and_return([[],[]])
60
+ end
61
+
62
+ it "should load all available sources" do
63
+ expect(subject).to receive(:plugin_file?).and_return(false)
64
+ expect(Gem::Dependency).to receive(:new).and_return(dep)
65
+ expect(Gem::SpecFetcher).to receive(:fetcher).and_return(fetcher)
66
+
67
+ subject.logstash_plugin?(plugin, version, options)
68
+ expect(Gem.sources.map { |source| source }).to eq(sources)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,121 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+ require 'ostruct'
4
+ require "bootstrap/util/compress"
5
+
6
+ describe LogStash::Util::Zip do
7
+
8
+ subject { Class.new { extend LogStash::Util::Zip } }
9
+
10
+ context "#extraction" do
11
+
12
+ let(:source) { File.join(File.expand_path("."), "source_file.zip") }
13
+ let(:target) { File.expand_path("target_dir") }
14
+
15
+ it "raise an exception if the target dir exist" do
16
+ allow(File).to receive(:exist?).with(target).and_return(true)
17
+ expect { subject.extract(source, target) }.to raise_error
18
+ end
19
+
20
+ let(:zip_file) do
21
+ [ "foo", "bar", "zoo" ].inject([]) do |acc, name|
22
+ acc << OpenStruct.new(:name => name)
23
+ acc
24
+ end
25
+ end
26
+
27
+ it "extract the list of entries from a zip file" do
28
+ allow(Zip::File).to receive(:open).with(source).and_yield(zip_file)
29
+ expect(FileUtils).to receive(:mkdir_p).exactly(3).times
30
+ expect(zip_file).to receive(:extract).exactly(3).times
31
+ subject.extract(source, target)
32
+ end
33
+ end
34
+
35
+ context "#compression" do
36
+
37
+ let(:target) { File.join(File.expand_path("."), "target_file.zip") }
38
+ let(:source) { File.expand_path("source_dir") }
39
+
40
+ it "raise an exception if the target file exist" do
41
+ allow(File).to receive(:exist?).with(target).and_return(true)
42
+ expect { subject.compress(source, target) }.to raise_error
43
+ end
44
+
45
+ let(:dir_files) do
46
+ [ "foo", "bar", "zoo" ]
47
+ end
48
+
49
+ let(:zip_file) { Class.new }
50
+
51
+ it "add a dir to a zip file" do
52
+ allow(Zip::File).to receive(:open).with(target, ::Zip::File::CREATE).and_yield(zip_file)
53
+ allow(Dir).to receive(:glob).and_return(dir_files)
54
+ expect(zip_file).to receive(:add).exactly(3).times
55
+ subject.compress(source, target)
56
+ end
57
+ end
58
+ end
59
+
60
+ describe LogStash::Util::Tar do
61
+
62
+ subject { Class.new { extend LogStash::Util::Tar } }
63
+
64
+ context "#extraction" do
65
+
66
+ let(:source) { File.join(File.expand_path("."), "source_file.tar.gz") }
67
+ let(:target) { File.expand_path("target_dir") }
68
+
69
+ it "raise an exception if the target dir exist" do
70
+ allow(File).to receive(:exist?).with(target).and_return(true)
71
+ expect { subject.extract(source, target) }.to raise_error
72
+ end
73
+
74
+ let(:gzip_file) { Class.new }
75
+
76
+ let(:tar_file) do
77
+ [ "foo", "bar", "zoo" ].inject([]) do |acc, name|
78
+ acc << OpenStruct.new(:full_name => name)
79
+ acc
80
+ end
81
+ end
82
+
83
+ it "extract the list of entries from a tar.gz file" do
84
+ allow(Zlib::GzipReader).to receive(:open).with(source).and_yield(gzip_file)
85
+ allow(Gem::Package::TarReader).to receive(:new).with(gzip_file).and_yield(tar_file)
86
+
87
+ expect(FileUtils).to receive(:mkdir).with(target)
88
+ expect(File).to receive(:open).exactly(3).times
89
+ subject.extract(source, target)
90
+ end
91
+ end
92
+
93
+ context "#compression" do
94
+
95
+ let(:target) { File.join(File.expand_path("."), "target_file.tar.gz") }
96
+ let(:source) { File.expand_path("source_dir") }
97
+
98
+ it "raise an exception if the target file exist" do
99
+ allow(File).to receive(:exist?).with(target).and_return(true)
100
+ expect { subject.compress(source, target) }.to raise_error
101
+ end
102
+
103
+ let(:dir_files) do
104
+ [ "foo", "bar", "zoo" ]
105
+ end
106
+
107
+ let(:tar_file) { Class.new }
108
+ let(:tar) { Class.new }
109
+
110
+ it "add a dir to a tgz file" do
111
+ allow(Stud::Temporary).to receive(:file).and_yield(tar_file)
112
+ allow(Gem::Package::TarWriter).to receive(:new).with(tar_file).and_yield(tar)
113
+ allow(Dir).to receive(:glob).and_return(dir_files)
114
+ expect(File).to receive(:stat).exactly(3).times.and_return(OpenStruct.new(:mode => "rw"))
115
+ expect(tar).to receive(:add_file).exactly(3).times
116
+ expect(tar_file).to receive(:rewind)
117
+ expect(subject).to receive(:gzip).with(target, tar_file)
118
+ subject.compress(source, target)
119
+ end
120
+ end
121
+ end
@@ -10,7 +10,7 @@ describe LogStash::Util::DefaultsPrinter do
10
10
  end
11
11
 
12
12
  let(:workers) { 1 }
13
- let(:expected) { "Default settings used: Filter workers: #{workers}" }
13
+ let(:expected) { "Settings: User set filter workers: #{workers}" }
14
14
  let(:settings) { {} }
15
15
 
16
16
  describe 'class methods API' do
@@ -19,13 +19,13 @@ describe LogStash::Util::DefaultsPrinter do
19
19
  end
20
20
 
21
21
  context 'when the settings hash is empty' do
22
+ let(:expected) { "Settings: " }
22
23
  it_behaves_like "a defaults printer"
23
24
  end
24
25
 
25
26
  context 'when the settings hash has content' do
26
27
  let(:workers) { 42 }
27
28
  let(:settings) { {'filter-workers' => workers} }
28
-
29
29
  it_behaves_like "a defaults printer"
30
30
  end
31
31
  end
@@ -36,6 +36,7 @@ describe LogStash::Util::DefaultsPrinter do
36
36
  end
37
37
 
38
38
  context 'when the settings hash is empty' do
39
+ let(:expected) { "Settings: " }
39
40
  it_behaves_like "a defaults printer"
40
41
  end
41
42
 
@@ -3,24 +3,43 @@ require "spec_helper"
3
3
  require "logstash/util/worker_threads_default_printer"
4
4
 
5
5
  describe LogStash::Util::WorkerThreadsDefaultPrinter do
6
- let(:settings) { {} }
6
+ let(:settings) { {} }
7
7
  let(:collector) { [] }
8
8
 
9
9
  subject { described_class.new(settings) }
10
10
 
11
- context 'when the settings hash is empty' do
12
- it 'the #visit method returns a string with 1 filter worker' do
13
- subject.visit(collector)
14
- expect(collector.first).to eq("Filter workers: 1")
11
+ before { subject.visit(collector) }
12
+
13
+ describe "the #visit method" do
14
+ context 'when the settings hash is empty' do
15
+ it 'adds nothing to the collector' do
16
+ subject.visit(collector)
17
+ expect(collector).to eq([])
18
+ end
19
+ end
20
+
21
+ context 'when the settings hash has both user and default content' do
22
+ let(:settings) { {'filter-workers' => 42, 'default-filter-workers' => 5} }
23
+
24
+ it 'adds two strings' do
25
+ expect(collector).to eq(["User set filter workers: 42", "Default filter workers: 5"])
26
+ end
27
+ end
28
+
29
+ context 'when the settings hash has only user content' do
30
+ let(:settings) { {'filter-workers' => 42} }
31
+
32
+ it 'adds a string with user set filter workers' do
33
+ expect(collector.first).to eq("User set filter workers: 42")
34
+ end
15
35
  end
16
- end
17
36
 
18
- context 'when the settings hash has content' do
19
- let(:settings) { {'filter-workers' => 42} }
37
+ context 'when the settings hash has only default content' do
38
+ let(:settings) { {'default-filter-workers' => 5} }
20
39
 
21
- it 'the #visit method returns a string with 42 filter workers' do
22
- subject.visit(collector)
23
- expect(collector.first).to eq("Filter workers: 42")
40
+ it 'adds a string with default filter workers' do
41
+ expect(collector.first).to eq("Default filter workers: 5")
42
+ end
24
43
  end
25
44
  end
26
45
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstash-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0.snapshot1
4
+ version: 2.1.0.snapshot2
5
5
  platform: java
6
6
  authors:
7
7
  - Jordan Sissel
@@ -10,190 +10,204 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2015-11-17 00:00:00.000000000 Z
13
+ date: 2015-11-18 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: 0.7.0
16
21
  name: cabin
22
+ prerelease: false
23
+ type: :runtime
17
24
  version_requirements: !ruby/object:Gem::Requirement
18
25
  requirements:
19
26
  - - ~>
20
27
  - !ruby/object:Gem::Version
21
28
  version: 0.7.0
29
+ - !ruby/object:Gem::Dependency
22
30
  requirement: !ruby/object:Gem::Requirement
23
31
  requirements:
24
32
  - - ~>
25
33
  - !ruby/object:Gem::Version
26
- version: 0.7.0
34
+ version: 0.10.1
35
+ name: pry
27
36
  prerelease: false
28
37
  type: :runtime
29
- - !ruby/object:Gem::Dependency
30
- name: pry
31
38
  version_requirements: !ruby/object:Gem::Requirement
32
39
  requirements:
33
40
  - - ~>
34
41
  - !ruby/object:Gem::Version
35
42
  version: 0.10.1
43
+ - !ruby/object:Gem::Dependency
36
44
  requirement: !ruby/object:Gem::Requirement
37
45
  requirements:
38
46
  - - ~>
39
47
  - !ruby/object:Gem::Version
40
- version: 0.10.1
48
+ version: 0.0.19
49
+ name: stud
41
50
  prerelease: false
42
51
  type: :runtime
43
- - !ruby/object:Gem::Dependency
44
- name: stud
45
52
  version_requirements: !ruby/object:Gem::Requirement
46
53
  requirements:
47
54
  - - ~>
48
55
  - !ruby/object:Gem::Version
49
56
  version: 0.0.19
57
+ - !ruby/object:Gem::Dependency
50
58
  requirement: !ruby/object:Gem::Requirement
51
59
  requirements:
52
60
  - - ~>
53
61
  - !ruby/object:Gem::Version
54
- version: 0.0.19
62
+ version: 0.6.5
63
+ name: clamp
55
64
  prerelease: false
56
65
  type: :runtime
57
- - !ruby/object:Gem::Dependency
58
- name: clamp
59
66
  version_requirements: !ruby/object:Gem::Requirement
60
67
  requirements:
61
68
  - - ~>
62
69
  - !ruby/object:Gem::Version
63
70
  version: 0.6.5
71
+ - !ruby/object:Gem::Dependency
64
72
  requirement: !ruby/object:Gem::Requirement
65
73
  requirements:
66
- - - ~>
74
+ - - '='
67
75
  - !ruby/object:Gem::Version
68
- version: 0.6.5
76
+ version: 0.0.4
77
+ name: filesize
69
78
  prerelease: false
70
79
  type: :runtime
71
- - !ruby/object:Gem::Dependency
72
- name: filesize
73
80
  version_requirements: !ruby/object:Gem::Requirement
74
81
  requirements:
75
82
  - - '='
76
83
  - !ruby/object:Gem::Version
77
84
  version: 0.0.4
85
+ - !ruby/object:Gem::Dependency
78
86
  requirement: !ruby/object:Gem::Requirement
79
87
  requirements:
80
- - - '='
88
+ - - ~>
81
89
  - !ruby/object:Gem::Version
82
- version: 0.0.4
90
+ version: 0.8.3
91
+ name: gems
83
92
  prerelease: false
84
93
  type: :runtime
85
- - !ruby/object:Gem::Dependency
86
- name: gems
87
94
  version_requirements: !ruby/object:Gem::Requirement
88
95
  requirements:
89
96
  - - ~>
90
97
  - !ruby/object:Gem::Version
91
98
  version: 0.8.3
99
+ - !ruby/object:Gem::Dependency
92
100
  requirement: !ruby/object:Gem::Requirement
93
101
  requirements:
94
- - - ~>
102
+ - - '='
95
103
  - !ruby/object:Gem::Version
96
- version: 0.8.3
104
+ version: 0.9.2
105
+ name: concurrent-ruby
97
106
  prerelease: false
98
107
  type: :runtime
99
- - !ruby/object:Gem::Dependency
100
- name: concurrent-ruby
101
108
  version_requirements: !ruby/object:Gem::Requirement
102
109
  requirements:
103
110
  - - '='
104
111
  - !ruby/object:Gem::Version
105
112
  version: 0.9.2
113
+ - !ruby/object:Gem::Dependency
106
114
  requirement: !ruby/object:Gem::Requirement
107
115
  requirements:
108
- - - '='
116
+ - - '>='
109
117
  - !ruby/object:Gem::Version
110
- version: 0.9.2
118
+ version: 0.9.11
119
+ name: jruby-openssl
111
120
  prerelease: false
112
121
  type: :runtime
113
- - !ruby/object:Gem::Dependency
114
- name: jruby-openssl
115
122
  version_requirements: !ruby/object:Gem::Requirement
116
123
  requirements:
117
124
  - - '>='
118
125
  - !ruby/object:Gem::Version
119
126
  version: 0.9.11
127
+ - !ruby/object:Gem::Dependency
120
128
  requirement: !ruby/object:Gem::Requirement
121
129
  requirements:
122
- - - '>='
130
+ - - <
123
131
  - !ruby/object:Gem::Version
124
- version: 0.9.11
132
+ version: 1.5.0
133
+ name: treetop
125
134
  prerelease: false
126
135
  type: :runtime
127
- - !ruby/object:Gem::Dependency
128
- name: treetop
129
136
  version_requirements: !ruby/object:Gem::Requirement
130
137
  requirements:
131
138
  - - <
132
139
  - !ruby/object:Gem::Version
133
140
  version: 1.5.0
141
+ - !ruby/object:Gem::Dependency
134
142
  requirement: !ruby/object:Gem::Requirement
135
143
  requirements:
136
- - - <
144
+ - - '='
137
145
  - !ruby/object:Gem::Version
138
- version: 1.5.0
146
+ version: 0.6.9
147
+ name: i18n
139
148
  prerelease: false
140
149
  type: :runtime
141
- - !ruby/object:Gem::Dependency
142
- name: i18n
143
150
  version_requirements: !ruby/object:Gem::Requirement
144
151
  requirements:
145
152
  - - '='
146
153
  - !ruby/object:Gem::Version
147
154
  version: 0.6.9
155
+ - !ruby/object:Gem::Dependency
148
156
  requirement: !ruby/object:Gem::Requirement
149
157
  requirements:
150
- - - '='
158
+ - - ~>
151
159
  - !ruby/object:Gem::Version
152
- version: 0.6.9
160
+ version: 0.5.4
161
+ name: minitar
153
162
  prerelease: false
154
163
  type: :runtime
155
- - !ruby/object:Gem::Dependency
156
- name: minitar
157
164
  version_requirements: !ruby/object:Gem::Requirement
158
165
  requirements:
159
166
  - - ~>
160
167
  - !ruby/object:Gem::Version
161
168
  version: 0.5.4
169
+ - !ruby/object:Gem::Dependency
162
170
  requirement: !ruby/object:Gem::Requirement
163
171
  requirements:
164
172
  - - ~>
165
173
  - !ruby/object:Gem::Version
166
- version: 0.5.4
174
+ version: 1.1.7
175
+ name: rubyzip
167
176
  prerelease: false
168
177
  type: :runtime
169
- - !ruby/object:Gem::Dependency
170
- name: thread_safe
171
178
  version_requirements: !ruby/object:Gem::Requirement
172
179
  requirements:
173
180
  - - ~>
174
181
  - !ruby/object:Gem::Version
175
- version: 0.3.5
182
+ version: 1.1.7
183
+ - !ruby/object:Gem::Dependency
176
184
  requirement: !ruby/object:Gem::Requirement
177
185
  requirements:
178
186
  - - ~>
179
187
  - !ruby/object:Gem::Version
180
188
  version: 0.3.5
189
+ name: thread_safe
181
190
  prerelease: false
182
191
  type: :runtime
183
- - !ruby/object:Gem::Dependency
184
- name: jrjackson
185
192
  version_requirements: !ruby/object:Gem::Requirement
186
193
  requirements:
187
194
  - - ~>
188
195
  - !ruby/object:Gem::Version
189
- version: 0.3.7
196
+ version: 0.3.5
197
+ - !ruby/object:Gem::Dependency
190
198
  requirement: !ruby/object:Gem::Requirement
191
199
  requirements:
192
200
  - - ~>
193
201
  - !ruby/object:Gem::Version
194
202
  version: 0.3.7
203
+ name: jrjackson
195
204
  prerelease: false
196
205
  type: :runtime
206
+ version_requirements: !ruby/object:Gem::Requirement
207
+ requirements:
208
+ - - ~>
209
+ - !ruby/object:Gem::Version
210
+ version: 0.3.7
197
211
  description: The core components of logstash, the scalable log and event management tool
198
212
  email:
199
213
  - jls@semicomplete.com
@@ -277,11 +291,14 @@ files:
277
291
  - spec/logstash/agent_spec.rb
278
292
  - spec/logstash/patches_spec.rb
279
293
  - spec/outputs/base_spec.rb
280
- - spec/pluginmanager/util_spec.rb
294
+ - spec/plugin_manager/install_spec.rb
295
+ - spec/plugin_manager/update_spec.rb
296
+ - spec/plugin_manager/util_spec.rb
281
297
  - spec/spec_helper.rb
282
298
  - spec/util/accessors_spec.rb
283
299
  - spec/util/buftok_spec.rb
284
300
  - spec/util/charset_spec.rb
301
+ - spec/util/compress_spec.rb
285
302
  - spec/util/defaults_printer_spec.rb
286
303
  - spec/util/gemfile_spec.rb
287
304
  - spec/util/java_version_spec.rb
@@ -336,11 +353,14 @@ test_files:
336
353
  - spec/logstash/agent_spec.rb
337
354
  - spec/logstash/patches_spec.rb
338
355
  - spec/outputs/base_spec.rb
339
- - spec/pluginmanager/util_spec.rb
356
+ - spec/plugin_manager/install_spec.rb
357
+ - spec/plugin_manager/update_spec.rb
358
+ - spec/plugin_manager/util_spec.rb
340
359
  - spec/spec_helper.rb
341
360
  - spec/util/accessors_spec.rb
342
361
  - spec/util/buftok_spec.rb
343
362
  - spec/util/charset_spec.rb
363
+ - spec/util/compress_spec.rb
344
364
  - spec/util/defaults_printer_spec.rb
345
365
  - spec/util/gemfile_spec.rb
346
366
  - spec/util/java_version_spec.rb
@@ -1,42 +0,0 @@
1
- # encoding: utf-8
2
- require "spec_helper"
3
- require "pluginmanager/util"
4
- require "gems"
5
-
6
- describe LogStash::PluginManager do
7
-
8
- let(:plugin_name) { "logstash-output-elasticsearch" }
9
-
10
- let(:version_data) do
11
- [ { "authors"=>"Elastic", "built_at"=>"2015-08-11T00:00:00.000Z", "description"=>"Output events to elasticsearch",
12
- "downloads_count"=>1638, "metadata"=>{"logstash_group"=>"output", "logstash_plugin"=>"true"}, "number"=>"2.0.0.pre",
13
- "summary"=>"Logstash Output to Elasticsearch", "platform"=>"java", "ruby_version"=>">= 0", "prerelease"=>true,
14
- "licenses"=>["apache-2.0"], "requirements"=>[], "sha"=>"194b27099c13605a882a3669e2363fdecccaab1de48dd44b0cda648dd5516799"},
15
- { "authors"=>"Elastic", "built_at"=>"2015-08-10T00:00:00.000Z", "description"=>"Output events to elasticsearch",
16
- "downloads_count"=>1638, "metadata"=>{"logstash_group"=>"output", "logstash_plugin"=>"true"}, "number"=>"1.0.7",
17
- "summary"=>"Logstash Output to Elasticsearch", "platform"=>"java", "ruby_version"=>">= 0", "prerelease"=>false,
18
- "licenses"=>["apache-2.0"], "requirements"=>[], "sha"=>"194b27099c13605a882a3669e2363fdecccaab1de48dd44b0cda648dd5516799"},
19
- { "authors"=>"Elastic", "built_at"=>"2015-08-09T00:00:00.000Z", "description"=>"Output events to elasticsearch",
20
- "downloads_count"=>1638, "metadata"=>{"logstash_group"=>"output", "logstash_plugin"=>"true"}, "number"=>"1.0.4",
21
- "summary"=>"Logstash Output to Elasticsearch", "platform"=>"java", "ruby_version"=>">= 0", "prerelease"=>false,
22
- "licenses"=>["apache-2.0"], "requirements"=>[], "sha"=>"194b27099c13605a882a3669e2363fdecccaab1de48dd44b0cda648dd5516799"} ]
23
- end
24
-
25
- before(:each) do
26
- allow(Gems).to receive(:versions).with(plugin_name).and_return(version_data)
27
- end
28
-
29
- context "fetch plugin info" do
30
-
31
- it "should search for the last version infomation non prerelease" do
32
- version_info = LogStash::PluginManager.fetch_latest_version_info(plugin_name)
33
- expect(version_info["number"]).to eq("1.0.7")
34
- end
35
-
36
-
37
- it "should search for the last version infomation with prerelease" do
38
- version_info = LogStash::PluginManager.fetch_latest_version_info(plugin_name, :pre => true)
39
- expect(version_info["number"]).to eq("2.0.0.pre")
40
- end
41
- end
42
- end