logstash-core 6.0.0.alpha2-java → 6.0.0.beta1-java

Sign up to get free protection for your applications and to get access to all the features.
Files changed (110) hide show
  1. checksums.yaml +5 -5
  2. data/gemspec_jars.rb +6 -4
  3. data/lib/logstash-core/logstash-core.jar +0 -0
  4. data/lib/logstash-core/logstash-core.rb +2 -2
  5. data/lib/logstash-core/version.rb +1 -1
  6. data/lib/logstash-core_jars.rb +14 -10
  7. data/lib/logstash/agent.rb +4 -2
  8. data/lib/logstash/api/commands/default_metadata.rb +1 -1
  9. data/lib/logstash/api/commands/hot_threads_reporter.rb +8 -2
  10. data/lib/logstash/api/commands/node.rb +2 -2
  11. data/lib/logstash/api/commands/stats.rb +2 -2
  12. data/lib/logstash/bootstrap_check/bad_ruby.rb +2 -2
  13. data/lib/logstash/bootstrap_check/default_config.rb +2 -3
  14. data/lib/logstash/compiler.rb +12 -12
  15. data/lib/logstash/compiler/lscl.rb +17 -7
  16. data/lib/logstash/compiler/treetop_monkeypatches.rb +1 -0
  17. data/lib/logstash/config/config_ast.rb +11 -1
  18. data/lib/logstash/config/mixin.rb +5 -0
  19. data/lib/logstash/config/modules_common.rb +101 -0
  20. data/lib/logstash/config/source/base.rb +75 -0
  21. data/lib/logstash/config/source/local.rb +52 -50
  22. data/lib/logstash/config/source/modules.rb +55 -0
  23. data/lib/logstash/config/source/multi_local.rb +54 -10
  24. data/lib/logstash/config/source_loader.rb +1 -0
  25. data/lib/logstash/config/string_escape.rb +27 -0
  26. data/lib/logstash/elasticsearch_client.rb +142 -0
  27. data/lib/logstash/environment.rb +5 -1
  28. data/lib/logstash/event.rb +0 -1
  29. data/lib/logstash/instrument/global_metrics.rb +13 -0
  30. data/lib/logstash/instrument/metric_store.rb +16 -13
  31. data/lib/logstash/instrument/metric_type/counter.rb +6 -18
  32. data/lib/logstash/instrument/metric_type/gauge.rb +6 -12
  33. data/lib/logstash/instrument/periodic_poller/dlq.rb +19 -0
  34. data/lib/logstash/instrument/periodic_pollers.rb +3 -1
  35. data/lib/logstash/logging/logger.rb +43 -14
  36. data/lib/logstash/modules/cli_parser.rb +74 -0
  37. data/lib/logstash/modules/elasticsearch_config.rb +22 -0
  38. data/lib/logstash/modules/elasticsearch_importer.rb +37 -0
  39. data/lib/logstash/modules/elasticsearch_resource.rb +10 -0
  40. data/lib/logstash/modules/file_reader.rb +36 -0
  41. data/lib/logstash/modules/kibana_base.rb +24 -0
  42. data/lib/logstash/modules/kibana_client.rb +122 -0
  43. data/lib/logstash/modules/kibana_config.rb +125 -0
  44. data/lib/logstash/modules/kibana_dashboards.rb +36 -0
  45. data/lib/logstash/modules/kibana_importer.rb +17 -0
  46. data/lib/logstash/modules/kibana_resource.rb +10 -0
  47. data/lib/logstash/modules/kibana_settings.rb +40 -0
  48. data/lib/logstash/modules/logstash_config.rb +120 -0
  49. data/lib/logstash/modules/resource_base.rb +38 -0
  50. data/lib/logstash/modules/scaffold.rb +50 -0
  51. data/lib/logstash/modules/settings_merger.rb +23 -0
  52. data/lib/logstash/modules/util.rb +17 -0
  53. data/lib/logstash/namespace.rb +1 -0
  54. data/lib/logstash/pipeline.rb +66 -27
  55. data/lib/logstash/pipeline_settings.rb +1 -0
  56. data/lib/logstash/plugins/registry.rb +1 -0
  57. data/lib/logstash/runner.rb +47 -3
  58. data/lib/logstash/settings.rb +20 -1
  59. data/lib/logstash/util/dead_letter_queue_manager.rb +1 -1
  60. data/lib/logstash/util/safe_uri.rb +146 -11
  61. data/lib/logstash/util/thread_dump.rb +4 -3
  62. data/lib/logstash/util/wrapped_acked_queue.rb +28 -24
  63. data/lib/logstash/util/wrapped_synchronous_queue.rb +19 -20
  64. data/lib/logstash/version.rb +1 -1
  65. data/locales/en.yml +56 -1
  66. data/logstash-core.gemspec +6 -4
  67. data/spec/logstash/agent/converge_spec.rb +2 -2
  68. data/spec/logstash/agent_spec.rb +11 -3
  69. data/spec/logstash/api/modules/logging_spec.rb +13 -7
  70. data/spec/logstash/api/modules/node_plugins_spec.rb +23 -5
  71. data/spec/logstash/api/modules/node_spec.rb +17 -15
  72. data/spec/logstash/api/modules/node_stats_spec.rb +0 -1
  73. data/spec/logstash/api/modules/plugins_spec.rb +40 -9
  74. data/spec/logstash/api/modules/root_spec.rb +0 -1
  75. data/spec/logstash/api/rack_app_spec.rb +2 -1
  76. data/spec/logstash/compiler/compiler_spec.rb +54 -7
  77. data/spec/logstash/config/config_ast_spec.rb +47 -8
  78. data/spec/logstash/config/mixin_spec.rb +14 -2
  79. data/spec/logstash/config/pipeline_config_spec.rb +7 -7
  80. data/spec/logstash/config/source/local_spec.rb +5 -2
  81. data/spec/logstash/config/source/multi_local_spec.rb +56 -10
  82. data/spec/logstash/config/source_loader_spec.rb +1 -1
  83. data/spec/logstash/config/string_escape_spec.rb +24 -0
  84. data/spec/logstash/event_spec.rb +9 -0
  85. data/spec/logstash/filters/base_spec.rb +1 -1
  86. data/spec/logstash/instrument/metric_store_spec.rb +2 -3
  87. data/spec/logstash/instrument/metric_type/counter_spec.rb +0 -12
  88. data/spec/logstash/instrument/metric_type/gauge_spec.rb +1 -8
  89. data/spec/logstash/instrument/periodic_poller/dlq_spec.rb +17 -0
  90. data/spec/logstash/instrument/periodic_poller/jvm_spec.rb +1 -1
  91. data/spec/logstash/legacy_ruby_event_spec.rb +0 -9
  92. data/spec/logstash/legacy_ruby_timestamp_spec.rb +19 -14
  93. data/spec/logstash/modules/cli_parser_spec.rb +129 -0
  94. data/spec/logstash/modules/logstash_config_spec.rb +56 -0
  95. data/spec/logstash/modules/scaffold_spec.rb +239 -0
  96. data/spec/logstash/pipeline_dlq_commit_spec.rb +1 -1
  97. data/spec/logstash/pipeline_spec.rb +87 -20
  98. data/spec/logstash/runner_spec.rb +122 -5
  99. data/spec/logstash/setting_spec.rb +2 -2
  100. data/spec/logstash/settings/splittable_string_array_spec.rb +51 -0
  101. data/spec/logstash/timestamp_spec.rb +8 -2
  102. data/spec/logstash/util/safe_uri_spec.rb +16 -0
  103. data/spec/logstash/util/wrapped_acked_queue_spec.rb +63 -0
  104. data/spec/logstash/util/wrapped_synchronous_queue_spec.rb +0 -22
  105. data/spec/support/helpers.rb +1 -1
  106. data/spec/support/matchers.rb +21 -4
  107. metadata +102 -19
  108. data/lib/logstash/instrument/metric_type/base.rb +0 -31
  109. data/lib/logstash/program.rb +0 -14
  110. data/lib/logstash/string_interpolation.rb +0 -18
@@ -0,0 +1,17 @@
1
+ # encoding: utf-8
2
+ require "spec_helper"
3
+ require "logstash/instrument/periodic_poller/dlq"
4
+ require "logstash/instrument/collector"
5
+
6
+ describe LogStash::Instrument::PeriodicPoller::DeadLetterQueue do
7
+ subject { LogStash::Instrument::PeriodicPoller::DeadLetterQueue }
8
+
9
+ let(:metric) { LogStash::Instrument::Metric.new(LogStash::Instrument::Collector.new) }
10
+ let(:agent) { double("agent")}
11
+ let(:options) { {} }
12
+ subject(:dlq) { described_class.new(metric, agent, options) }
13
+
14
+ it "should initialize cleanly" do
15
+ expect { dlq }.not_to raise_error
16
+ end
17
+ end
@@ -44,7 +44,7 @@ describe LogStash::Instrument::PeriodicPoller::JVM do
44
44
  before do
45
45
  expect(LogStash::Environment).to receive(:windows?).and_return(false)
46
46
  expect(LogStash::Environment).to receive(:linux?).and_return(true)
47
- expect(::File).to receive(:read).with("/proc/loadavg").and_raise("Didnt work out so well")
47
+ expect(::File).to receive(:read).with("/proc/loadavg").at_least(:once).and_raise("Didnt work out so well")
48
48
  end
49
49
 
50
50
  it "doesn't raise an exception" do
@@ -590,15 +590,6 @@ describe LogStash::Event do
590
590
  describe "#to_s" do
591
591
  let(:timestamp) { LogStash::Timestamp.new }
592
592
  let(:event1) { LogStash::Event.new({ "@timestamp" => timestamp, "host" => "foo", "message" => "bar"}) }
593
- let(:event2) { LogStash::Event.new({ "host" => "bar", "message" => "foo"}) }
594
-
595
- it "should cache only one template" do
596
- LogStash::StringInterpolation.clear_cache
597
- expect {
598
- event1.to_s
599
- event2.to_s
600
- }.to change { LogStash::StringInterpolation.cache_size }.by(1)
601
- end
602
593
 
603
594
  it "return the string containing the timestamp, the host and the message" do
604
595
  expect(event1.to_s).to eq("#{timestamp.to_iso8601} #{event1.get("host")} #{event1.get("message")}")
@@ -4,7 +4,12 @@ require "logstash/timestamp"
4
4
  require "bigdecimal"
5
5
 
6
6
  describe LogStash::Timestamp do
7
-
7
+ # Via JRuby 9k time see logstash/issues/7463
8
+ # JRuby 9k now uses Java 8 Time with nanosecond precision but
9
+ # our Timestamp use Joda with millisecond precision
10
+ # expected: 10
11
+ # got: 9.999000001
12
+ # we may need to use `be_within(0.000999999).of()` in other places too
8
13
  it "should parse its own iso8601 output" do
9
14
  t = Time.now
10
15
  ts = LogStash::Timestamp.new(t)
@@ -12,7 +17,7 @@ describe LogStash::Timestamp do
12
17
  end
13
18
 
14
19
  it "should coerce iso8601 string" do
15
- t = Time.now
20
+ t = DateTime.now.to_time
16
21
  ts = LogStash::Timestamp.new(t)
17
22
  expect(LogStash::Timestamp.coerce(ts.to_iso8601).to_i).to eq(t.to_i)
18
23
  end
@@ -44,7 +49,7 @@ describe LogStash::Timestamp do
44
49
  end
45
50
 
46
51
  it "should support timestamp comparison" do
47
- current = LogStash::Timestamp.new(Time.now)
52
+ current = LogStash::Timestamp.new(Time.now)
48
53
  future = LogStash::Timestamp.new(Time.now + 100)
49
54
 
50
55
  expect(future > current).to eq(true)
@@ -57,29 +62,29 @@ describe LogStash::Timestamp do
57
62
  end
58
63
 
59
64
  it "should allow unary operation +" do
60
- current = Time.now
65
+ current = DateTime.now.to_time
61
66
  t = LogStash::Timestamp.new(current) + 10
62
- expect(t).to eq(current + 10)
67
+ expect(t).to be_within(0.000999999).of(current + 10)
63
68
  end
64
69
 
65
70
  describe "subtraction" do
66
71
  it "should work on a timestamp object" do
67
- t = Time.now
72
+ t = DateTime.now.to_time
68
73
  current = LogStash::Timestamp.new(t)
69
74
  future = LogStash::Timestamp.new(t + 10)
70
- expect(future - current).to eq(10)
75
+ expect(future - current).to be_within(0.000999999).of(10)
71
76
  end
72
77
 
73
78
  it "should work on with time object" do
74
- current = Time.now
79
+ current = DateTime.now.to_time
75
80
  t = LogStash::Timestamp.new(current + 10)
76
- expect(t - current).to eq(10)
81
+ expect(t - current).to be_within(0.000999999).of(10)
77
82
  end
78
83
 
79
84
  it "should work with numeric value" do
80
- current = Time.now
85
+ current = DateTime.now.to_time
81
86
  t = LogStash::Timestamp.new(current + 10)
82
- expect(t - 10).to eq(current)
87
+ expect(t - 10).to be_within(0.000999999).of(current)
83
88
  end
84
89
  end
85
90
 
@@ -96,15 +101,15 @@ describe LogStash::Timestamp do
96
101
  end
97
102
 
98
103
  context "numeric casting methods" do
99
- let (:now) {Time.now}
104
+ let(:now) { Time.now }
100
105
  subject { LogStash::Timestamp.new(now) }
101
106
 
102
107
  it "should support to_i" do
103
- expect(subject.to_i).to eq(now.to_i)
108
+ expect(subject.to_i).to be_kind_of(Integer)
104
109
  end
105
110
 
106
111
  it "should support to_f" do
107
- expect(subject.to_f).to eq(now.to_f)
112
+ expect(subject.to_f).to be_kind_of(Float)
108
113
  end
109
114
  end
110
115
 
@@ -0,0 +1,129 @@
1
+ require "spec_helper"
2
+ require "logstash/logging"
3
+ require "logstash/errors"
4
+ require "logstash/modules/cli_parser"
5
+
6
+ describe LogStash::Modules::CLIParser do
7
+
8
+ subject { LogStash::Modules::CLIParser.new(module_names, module_variables) }
9
+ let(:logger) { double("logger") }
10
+ let(:module_name) { "foo" }
11
+ let(:module_names) { [ module_name, "bar" ] }
12
+ let(:proto_key_value) { "var.input.stdin.type=example" }
13
+ let(:proto_mod_vars) { module_name + "." + proto_key_value }
14
+ let(:module_variables) { [ proto_mod_vars ] }
15
+ let(:expected_output) { { "name" => module_name, "var.input.stdin.type" => "example" } }
16
+
17
+ describe ".parse_modules" do
18
+ let(:module1) { "module1" }
19
+ let(:module2) { "module2" }
20
+ let(:csv_modules) { "#{module1},#{module2}" }
21
+ let(:list_with_csv) { [ module_name, csv_modules ] }
22
+ let(:post_parse) { [ module_name, module1, module2 ] }
23
+
24
+ context "when it receives an array without a csv entry" do
25
+ it "return the array unaltered" do
26
+ expect(subject.parse_modules(module_names)).to eq(module_names)
27
+ end
28
+ end
29
+
30
+ context "when it receives an empty array" do
31
+ it "return an empty array" do
32
+ expect(subject.parse_modules([])).to eq([])
33
+ end
34
+ end
35
+
36
+ context "when it receives an array with a csv entry" do
37
+ it "return the original array with the csv values split into elements" do
38
+ expect(subject.parse_modules(list_with_csv)).to eq(post_parse)
39
+ end
40
+ end
41
+
42
+ context "when it receives an array with a bad csv entry" do
43
+ let(:bad_modules) { [ "-Minvalid", module1 ] }
44
+ it "raise a LogStash::ConfigLoadingError exception" do
45
+ expect { subject.parse_modules(bad_modules) }.to raise_error LogStash::ConfigLoadingError
46
+ end
47
+ end
48
+
49
+ context "when it receives a nil value in an array" do
50
+ let(:array_with_nil) { list_with_csv << nil }
51
+ it "skip it" do
52
+ expect(subject.parse_modules(array_with_nil)).to eq(post_parse)
53
+ end
54
+ end
55
+ end
56
+
57
+ describe ".get_kv" do
58
+ context "when it receives a valid string" do
59
+ let(:expected_key) { "var.input.stdin.type" }
60
+ let(:expected_value) { "example" }
61
+ let(:unparsed) { expected_key + "=" + expected_value }
62
+ it "split it into a key value pair" do
63
+ expect(subject.get_kv(module_name,unparsed)).to eq([expected_key,expected_value])
64
+ end
65
+ end
66
+
67
+ context "when it receives an invalid string" do
68
+ let(:bad_example) { "var.fail" }
69
+ it "raise a LogStash::ConfigLoadingError exception" do
70
+ expect { subject.get_kv(module_name,bad_example) }.to raise_error LogStash::ConfigLoadingError
71
+ end
72
+ end
73
+ end
74
+
75
+ describe ".name_splitter" do
76
+ context "when it receives a valid string" do
77
+ let(:expected) { "var.input.stdin.type=example" }
78
+ it "split the module name from the rest of the string" do
79
+ expect(subject.name_splitter(proto_mod_vars)).to eq([module_name,expected])
80
+ end
81
+ end
82
+
83
+ context "when it receives an invalid string" do
84
+ let(:bad_example) { "var.fail" }
85
+ it "raise a LogStash::ConfigLoadingError exception" do
86
+ expect { subject.name_splitter(bad_example) }.to raise_error LogStash::ConfigLoadingError
87
+ end
88
+ end
89
+ end
90
+
91
+ describe ".parse_vars" do
92
+ context "when it receives a vars_list with valid strings" do
93
+ it "return a hash with the module name and associated variables as key value pairs" do
94
+ expect(subject.parse_vars(module_name, module_variables)).to eq(expected_output)
95
+ end
96
+ end
97
+
98
+ context "when it receives a string that doesn't start with module_name" do
99
+ let(:has_unrelated) { module_variables << "bar.var.input.stdin.type=different" }
100
+ it "skips it" do
101
+ expect(subject.parse_vars(module_name, has_unrelated)).to eq(expected_output)
102
+ end
103
+ end
104
+
105
+ context "when it receives an empty vars_list" do
106
+ let(:name_only) { { "name" => module_name } }
107
+ it "return a hash with only 'name => module_name'" do
108
+ expect(subject.parse_vars(module_name, [])).to eq(name_only)
109
+ end
110
+ end
111
+ end
112
+
113
+ describe ".parse_it" do
114
+ context "when it receives a valid module_list and module_variable_list" do
115
+ let(:module_names) { [ module_name ]}
116
+ it "@output is array of hashes with the module name and associated variables as key value pairs" do
117
+ expect(subject.output).to eq([expected_output])
118
+ end
119
+ end
120
+
121
+ context "when it receives a non-array value for module_list" do
122
+ let(:module_names) { "string value" }
123
+ it "return an empty array" do
124
+ expect(subject.output).to eq([])
125
+ end
126
+ end
127
+ end
128
+
129
+ end
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+ require "logstash/modules/logstash_config"
3
+
4
+ describe LogStash::Modules::LogStashConfig do
5
+ let(:mod) { instance_double("module", :directory => Stud::Temporary.directory, :module_name => "testing") }
6
+ let(:settings) { {"var.logstash.testing.pants" => "fancy" }}
7
+ subject { described_class.new(mod, settings) }
8
+
9
+ describe "configured inputs" do
10
+ context "when no inputs is send" do
11
+ it "returns the default" do
12
+ expect(subject.configured_inputs(["kafka"])).to include("kafka")
13
+ end
14
+ end
15
+
16
+ context "when inputs are send" do
17
+ let(:settings) { { "var.inputs" => "tcp" } }
18
+
19
+ it "returns the configured inputs" do
20
+ expect(subject.configured_inputs(["kafka"])).to include("tcp")
21
+ end
22
+
23
+ context "when alias is specified" do
24
+ let(:settings) { { "var.inputs" => "smartconnector" } }
25
+
26
+ it "returns the configured inputs" do
27
+ expect(subject.configured_inputs(["kafka"], { "smartconnector" => "tcp" })).to include("tcp", "smartconnector")
28
+ end
29
+ end
30
+ end
31
+ end
32
+
33
+ describe "array to logstash array string" do
34
+ it "return an escaped string" do
35
+ expect(subject.array_to_string(["hello", "ninja"])).to eq("['hello', 'ninja']")
36
+ end
37
+ end
38
+
39
+ describe "alias modules options" do
40
+ let(:alias_table) do
41
+ { "var.logstash.testing" => "var.logstash.better" }
42
+ end
43
+
44
+ before do
45
+ subject.alias_settings_keys!(alias_table)
46
+ end
47
+
48
+ it "allow to retrieve settings" do
49
+ expect(subject.setting("var.logstash.better.pants", "dont-exist")).to eq("fancy")
50
+ end
51
+
52
+ it "allow to retrieve settings with the original name" do
53
+ expect(subject.setting("var.logstash.testing.pants", "dont-exist")).to eq("fancy")
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,239 @@
1
+ # encoding: utf-8
2
+ #
3
+ require "logstash/namespace"
4
+ require "logstash/elasticsearch_client"
5
+ require "logstash/modules/kibana_client"
6
+ require "logstash/modules/kibana_config"
7
+ require "logstash/modules/scaffold"
8
+ require "logstash/modules/elasticsearch_importer"
9
+ require "logstash/modules/kibana_importer"
10
+
11
+ require_relative "../../support/helpers"
12
+
13
+ describe LogStash::Modules::Scaffold do
14
+ let(:base_dir) { "gem-home" }
15
+ let(:mname) { "foo" }
16
+ subject(:test_module) { described_class.new(mname, base_dir) }
17
+ let(:module_settings) do
18
+ {
19
+ "var.elasticsearch.hosts" => "es.mycloud.com:9200",
20
+ "var.elasticsearch.user" => "foo",
21
+ "var.elasticsearch.password" => "password",
22
+ "var.input.tcp.port" => 5606,
23
+ }
24
+ end
25
+ let(:dashboard_hash) do
26
+ {
27
+ "hits" => 0,
28
+ "timeRestore" => false,
29
+ "description" => "",
30
+ "title" => "Filebeat Apache2 Dashboard",
31
+ "uiStateJSON" => "{}",
32
+ "panelsJSON" => '[{"col":1,"id":"foo-c","panelIndex":1,"row":1,"size_x":12,"size_y":3,"type":"visualization"},{"id":"foo-d","type":"search","panelIndex":7,"size_x":12,"size_y":3,"col":1,"row":11,"columns":["apache2.error.client","apache2.error.level","apache2.error.module","apache2.error.message"],"sort":["@timestamp","desc"]}]',
33
+ "optionsJSON" => "{}",
34
+ "version" => 1,
35
+ "kibanaSavedObjectMeta" => {
36
+ "searchSourceJSON" => "{}"
37
+ }
38
+ }
39
+ end
40
+ let(:viz_hash) do
41
+ {
42
+ "visState" => "",
43
+ "description" => "",
44
+ "title" => "foo-c",
45
+ "uiStateJSON" => "",
46
+ "version" => 1,
47
+ "savedSearchId" => "foo-e",
48
+ "kibanaSavedObjectMeta" => {}
49
+ }
50
+ end
51
+ let(:index_pattern_hash) do
52
+ {
53
+ "title" => "foo-*",
54
+ "timeFieldName" =>"time",
55
+ "fieldFormatMap" => "{some map}",
56
+ "fields" => "[some array]"
57
+ }
58
+ end
59
+ context "logstash operation" do
60
+ let(:ls_conf) do
61
+ <<-ERB
62
+ input {
63
+ tcp {
64
+ port => <%= setting("var.input.tcp.port", 45) %>
65
+ host => <%= setting("var.input.tcp.host", "localhost") %>
66
+ type => <%= setting("var.input.tcp.type", "server") %>
67
+ }
68
+ }
69
+ filter {
70
+
71
+ }
72
+ output {
73
+ <%= elasticsearch_output_config() %>
74
+ }
75
+ ERB
76
+ end
77
+
78
+ before do
79
+ allow(LogStash::Modules::FileReader).to receive(:read).and_return(ls_conf)
80
+ end
81
+
82
+ it "provides a logstash config" do
83
+ expect(test_module.logstash_configuration).to be_nil
84
+ test_module.with_settings(module_settings)
85
+ expect(test_module.logstash_configuration).not_to be_nil
86
+ config_string = test_module.config_string
87
+ expect(config_string).to include("port => 5606")
88
+ expect(config_string).to include("hosts => ['es.mycloud.com:9200']")
89
+ end
90
+ end
91
+
92
+ context "elasticsearch operation" do
93
+ it "provides the elasticsearch mapping file paths" do
94
+ test_module.with_settings(module_settings)
95
+ expect(test_module.elasticsearch_configuration).not_to be_nil
96
+ files = test_module.elasticsearch_configuration.resources
97
+ expect(files.size).to eq(1)
98
+ expect(files.first).to be_a(LogStash::Modules::ElasticsearchResource)
99
+ expect(files.first.content_path).to eq("gem-home/elasticsearch/foo.json")
100
+ expect(files.first.import_path).to eq("_template/foo")
101
+ end
102
+ end
103
+
104
+ context "kibana operation" do
105
+ before do
106
+ # allow(LogStash::Modules::FileReader).to receive(:read_json).and_return({})
107
+ allow(LogStash::Modules::FileReader).to receive(:read_json).with("gem-home/kibana/6.x/dashboard/foo.json").and_return(["Foo-Dashboard"])
108
+ allow(LogStash::Modules::FileReader).to receive(:read_json).with("gem-home/kibana/6.x/dashboard/Foo-Dashboard.json").and_return(dashboard_hash)
109
+ allow(LogStash::Modules::FileReader).to receive(:read_json).with("gem-home/kibana/6.x/visualization/foo-c.json").and_return(viz_hash)
110
+ allow(LogStash::Modules::FileReader).to receive(:read_json).with("gem-home/kibana/6.x/search/foo-d.json").and_return({"d" => "search"})
111
+ allow(LogStash::Modules::FileReader).to receive(:read_json).with("gem-home/kibana/6.x/search/foo-e.json").and_return({"e" => "search"})
112
+ allow(LogStash::Modules::FileReader).to receive(:read_json).with("gem-home/kibana/6.x/index-pattern/foo.json").and_return(index_pattern_hash)
113
+ end
114
+
115
+ it "provides a list of importable files" do
116
+ expect(test_module.kibana_configuration).to be_nil
117
+ test_module.with_settings(module_settings)
118
+ expect(test_module.kibana_configuration).not_to be_nil
119
+ resources = test_module.kibana_configuration.resources
120
+ expect(resources.size).to eq(2)
121
+ resource1 = resources[0]
122
+ resource2 = resources[1]
123
+ expect(resource1).to be_a(LogStash::Modules::KibanaSettings)
124
+ expect(resource2).to be_a(LogStash::Modules::KibanaDashboards)
125
+ expect(resource1.import_path).to eq("api/kibana/settings")
126
+ expect(resource1.content).to be_a(Array)
127
+ expect(resource1.content.size).to eq(2)
128
+
129
+ test_object = resource1.content[0]
130
+ expect(test_object).to be_a(LogStash::Modules::KibanaSettings::Setting)
131
+ expect(test_object.name).to eq("defaultIndex")
132
+ expect(test_object.value).to eq("foo-*")
133
+
134
+ test_object = resource1.content[1]
135
+ expect(test_object).to be_a(LogStash::Modules::KibanaSettings::Setting)
136
+ expect(test_object.name).to eq("metrics:max_buckets")
137
+ expect(test_object.value).to eq(86400)
138
+
139
+ expect(resource2.import_path).to eq("api/kibana/dashboards/import")
140
+ expect(resource2.content).to be_a(Array)
141
+ expect(resource2.content.size).to eq(5)
142
+ expect(resource2.content.map{|o| o.class}.uniq).to eq([LogStash::Modules::KibanaResource])
143
+
144
+ test_object = resource2.content[0]
145
+ expect(test_object.content_id).to eq("foo-*")
146
+ expect(test_object.content_type).to eq("index-pattern")
147
+ expect(test_object.content_as_object).to eq(index_pattern_hash)
148
+
149
+ test_object = resource2.content[1]
150
+ expect(test_object.content_id).to eq("Foo-Dashboard")
151
+ expect(test_object.content_type).to eq("dashboard")
152
+ expect(test_object.content_as_object).to eq(dashboard_hash)
153
+
154
+ test_object = resource2.content[2]
155
+ expect(test_object.content_id).to eq("foo-c") #<- the panels can contain items from other folders
156
+ expect(test_object.content_type).to eq("visualization")
157
+ expect(test_object.content_as_object).to eq(viz_hash)
158
+ expect(test_object.content_as_object["savedSearchId"]).to eq("foo-e")
159
+
160
+ test_object = resource2.content[3]
161
+ expect(test_object.content_id).to eq("foo-d") #<- the panels can contain items from other folders
162
+ expect(test_object.content_type).to eq("search")
163
+ expect(test_object.content_as_object).to eq("d"=>"search")
164
+
165
+ test_object = resource2.content[4]
166
+ expect(test_object.content_id).to eq("foo-e") # <- the visualization can contain items from the search folder
167
+ expect(test_object.content_type).to eq("search")
168
+ expect(test_object.content_as_object).to eq("e"=>"search")
169
+ end
170
+ end
171
+
172
+ context "importing to elasticsearch stubbed client" do
173
+ let(:mname) { "tester" }
174
+ let(:base_dir) { File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "modules_test_files", "modules", "#{mname}", "configuration")) }
175
+ let(:response) { double(:response) }
176
+ let(:client) { double(:client) }
177
+ let(:kbnclient) { double(:kbnclient) }
178
+ let(:paths) { [] }
179
+ let(:expected_paths) { ["_template/tester", "api/kibana/settings", "api/kibana/dashboards/import"] }
180
+ let(:contents) { [] }
181
+ let(:expected_objects) do
182
+ [
183
+ "index-pattern tester-*",
184
+ "dashboard FW-Dashboard",
185
+ "visualization FW-Viz-1",
186
+ "visualization FW-Viz-2",
187
+ "search Search-Tester"
188
+ ]
189
+ end
190
+
191
+ before do
192
+ allow(response).to receive(:status).and_return(404)
193
+ allow(client).to receive(:head).and_return(response)
194
+ allow(kbnclient).to receive(:version).and_return("9.8.7-6")
195
+ end
196
+
197
+ it "calls the import method" do
198
+ expect(client).to receive(:put).once do |path, content|
199
+ paths << path
200
+ LogStash::ElasticsearchClient::Response.new(201, "", {})
201
+ end
202
+ expect(kbnclient).to receive(:post).twice do |path, content|
203
+ paths << path
204
+ contents << content
205
+ LogStash::Modules::KibanaClient::Response.new(201, "", {})
206
+ end
207
+ test_module.with_settings(module_settings)
208
+ test_module.import(LogStash::Modules::ElasticsearchImporter.new(client), LogStash::Modules::KibanaImporter.new(kbnclient))
209
+ expect(paths).to eq(expected_paths)
210
+ expect(contents[0]).to eq({"changes"=>{"defaultIndex"=>"tester-*", "metrics:max_buckets"=>"86400"}})
211
+ second_kbn_post = contents[1]
212
+ expect(second_kbn_post[:version]).to eq("9.8.7-6")
213
+ expect(second_kbn_post[:objects]).to be_a(Array)
214
+ expect(second_kbn_post[:objects].size).to eq(5)
215
+ objects_types_ids = second_kbn_post[:objects].map {|h| "#{h["type"]} #{h["id"]}"}
216
+ expect(objects_types_ids).to eq(expected_objects)
217
+ end
218
+ end
219
+
220
+ context "import 4 realz", :skip => "integration" do
221
+ let(:mname) { "cef" }
222
+ let(:base_dir) { File.expand_path(File.join(File.dirname(__FILE__), "..", "..", "modules_test_files", "#{mname}")) }
223
+ let(:module_settings) do
224
+ {
225
+ "var.elasticsearch.hosts" => "localhost:9200",
226
+ "var.elasticsearch.user" => "foo",
227
+ "var.elasticsearch.password" => "password",
228
+ "var.input.tcp.port" => 5606,
229
+ }
230
+ end
231
+ it "puts stuff in ES" do
232
+ test_module.with_settings(module_settings)
233
+ client = LogStash::ElasticsearchClient.build(module_settings)
234
+ import_engine = LogStash::Modules::Importer.new(client)
235
+ test_module.import(import_engine)
236
+ expect(1).to eq(1)
237
+ end
238
+ end
239
+ end