fluentd-ui 1.0.1 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd-ui might be problematic. Click here for more details.

Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +5 -0
  3. data/Gemfile.lock +1 -1
  4. data/app/controllers/api/settings_controller.rb +46 -16
  5. data/app/controllers/concerns/setting_concern.rb +1 -1
  6. data/app/controllers/fluentd/settings/filter_grep_controller.rb +9 -0
  7. data/app/controllers/fluentd/settings/filter_parser_controller.rb +9 -0
  8. data/app/controllers/fluentd/settings/filter_record_transformer_controller.rb +14 -0
  9. data/app/controllers/fluentd/settings/filter_stdout_controller.rb +9 -0
  10. data/app/javascript/packs/filter_grep_setting.js +39 -0
  11. data/app/javascript/packs/grep_container.js +53 -0
  12. data/app/javascript/packs/grep_pattern.js +43 -0
  13. data/app/javascript/packs/owned_plugin_form.js +9 -7
  14. data/app/javascript/packs/settings.js +34 -16
  15. data/app/models/concerns/fluentd/setting/configurable.rb +1 -0
  16. data/app/models/concerns/fluentd/setting/label.rb +11 -0
  17. data/app/models/concerns/fluentd/setting/plugin.rb +2 -0
  18. data/app/models/concerns/fluentd/setting/plugin_config.rb +34 -4
  19. data/app/models/concerns/fluentd/setting/section_config.rb +10 -2
  20. data/app/models/fluentd/agent/common.rb +97 -0
  21. data/app/models/fluentd/setting/config.rb +71 -0
  22. data/app/models/fluentd/setting/filter_grep.rb +38 -0
  23. data/app/models/fluentd/setting/filter_parser.rb +34 -0
  24. data/app/models/fluentd/setting/filter_record_transformer.rb +27 -0
  25. data/app/models/fluentd/setting/filter_stdout.rb +34 -0
  26. data/app/models/fluentd/setting/in_forward.rb +1 -0
  27. data/app/models/fluentd/setting/in_http.rb +1 -1
  28. data/app/models/fluentd/setting/in_monitor_agent.rb +1 -1
  29. data/app/models/fluentd/setting/in_syslog.rb +1 -1
  30. data/app/models/fluentd/setting/out_elasticsearch.rb +1 -0
  31. data/app/models/fluentd/setting/out_forward.rb +1 -1
  32. data/app/models/fluentd/setting/out_mongo.rb +1 -0
  33. data/app/models/fluentd/setting/out_s3.rb +1 -0
  34. data/app/models/fluentd/setting/out_stdout.rb +1 -1
  35. data/app/models/fluentd/setting/out_tdlog.rb +1 -1
  36. data/app/views/api/settings/_element.json.jbuilder +3 -1
  37. data/app/views/api/settings/index.json.jbuilder +10 -2
  38. data/app/views/api/settings/show.json.jbuilder +1 -1
  39. data/app/views/fluentd/settings/filter_grep/_form.html.haml +18 -0
  40. data/app/views/fluentd/settings/filter_record_transformer/_form.html.haml +20 -0
  41. data/app/views/fluentd/settings/in_tail/_form.html.haml +1 -0
  42. data/app/views/fluentd/settings/source_and_output.html.haml +46 -14
  43. data/app/views/shared/vue/_filter_grep_setting.html.haml +19 -0
  44. data/app/views/shared/vue/_grep_container.html.haml +32 -0
  45. data/app/views/shared/vue/_grep_pattern.html.haml +24 -0
  46. data/app/views/shared/vue/_setting.html.erb +2 -2
  47. data/config/locales/translation_en.yml +39 -10
  48. data/config/locales/translation_ja.yml +39 -10
  49. data/config/routes.rb +6 -0
  50. data/lib/fluentd-ui/version.rb +1 -1
  51. data/test/factories/fluentd.rb +4 -4
  52. data/test/factories/plugins.rb +2 -2
  53. data/test/factories/user.rb +2 -2
  54. data/test/fixtures/config/label.conf +15 -0
  55. data/test/fixtures/config/multi-label.conf +40 -0
  56. data/test/fixtures/config/simple.conf +12 -0
  57. data/test/models/fluentd/agent_common_test.rb +288 -0
  58. data/test/models/fluentd/setting/config_test.rb +98 -0
  59. data/test/support/configurable_daemon_settings.rb +1 -1
  60. data/test/system/fluentd/setting/filter_grep_test.rb +96 -0
  61. data/test/system/fluentd/setting/filter_parser_test.rb +13 -0
  62. data/test/system/fluentd/setting/filter_record_transformer_test.rb +30 -0
  63. data/test/system/fluentd/setting/filter_stdout_test.rb +13 -0
  64. data/test/system/source_and_output_test.rb +168 -19
  65. data/test/test_helper.rb +4 -0
  66. metadata +98 -55
  67. data/.rspec +0 -2
@@ -0,0 +1,98 @@
1
+ require "test_helper"
2
+
3
+ class FluentdConfigTest < ActiveSupport::TestCase
4
+ def create_config(fixture_name)
5
+ ::Fluentd::Setting::Config.new(fixture_path(fixture_name))
6
+ end
7
+
8
+ sub_test_case "#delete_element" do
9
+ test "delete a source" do
10
+ config = create_config("config/simple.conf")
11
+ element = config.elements(name: "source").first
12
+ config.delete_element("source", nil, element)
13
+ assert_equal(config.formatted.strip, <<CONFIG.chomp)
14
+ <filter dummy>
15
+ @type stdout
16
+ </filter>
17
+
18
+ <match dummy>
19
+ @type stdout
20
+ </match>
21
+ CONFIG
22
+ end
23
+
24
+ test "delete a filter" do
25
+ config = create_config("config/simple.conf")
26
+ element = config.elements(name: "filter").first
27
+ config.delete_element("filter", nil, element)
28
+ assert_equal(config.formatted.strip, <<CONFIG.chomp)
29
+ <source>
30
+ @type dummy
31
+ tag dummy
32
+ </source>
33
+
34
+ <match dummy>
35
+ @type stdout
36
+ </match>
37
+ CONFIG
38
+ end
39
+
40
+ test "delete a match" do
41
+ config = create_config("config/simple.conf")
42
+ element = config.elements(name: "match").first
43
+ config.delete_element("match", nil, element)
44
+ assert_equal(config.formatted.strip, <<CONFIG.chomp)
45
+ <source>
46
+ @type dummy
47
+ tag dummy
48
+ </source>
49
+
50
+ <filter dummy>
51
+ @type stdout
52
+ </filter>
53
+ CONFIG
54
+ end
55
+
56
+ test "delete all elements under the label" do
57
+ config = create_config("config/multi-label.conf")
58
+ input = config.elements(name: "label", arg: "@INPUT").first
59
+ input.elements.each do |element|
60
+ config.delete_element("label", "@INPUT", element)
61
+ end
62
+ assert_equal(config.formatted.strip, <<CONFIG.chomp)
63
+ <source>
64
+ @type dummy
65
+ tag dummy1
66
+ @label @INPUT
67
+ </source>
68
+
69
+ <source>
70
+ @type dummy
71
+ tag dummy2
72
+ @label @INPUT
73
+ </source>
74
+
75
+ <label @MAIN>
76
+ <filter dummy1>
77
+ @type stdout
78
+ </filter>
79
+ <filter dummy2>
80
+ @type stdout
81
+ </filter>
82
+ <match dummy1>
83
+ @type stdout
84
+ </match>
85
+ <match dummy2>
86
+ @type stdout
87
+ </match>
88
+ </label>
89
+ CONFIG
90
+ end
91
+
92
+ test "cannot delete specified element" do
93
+ config = create_config("config/simple.conf")
94
+ element = ::Fluent::Config::Element.new("source", nil, { :@type => "dummy", :tag => "dummy" }, [])
95
+ assert_nil(config.delete_element("source", nil, element))
96
+ end
97
+ end
98
+ end
@@ -15,7 +15,7 @@ module ConfigurableDaemonSettings
15
15
  end
16
16
  visit(__send__("daemon_setting_#{@type}_path"))
17
17
  within("form") do
18
- fill_in(@form_name.capitalize, with: @form_value)
18
+ fill_in(@form_name.humanize, with: @form_value)
19
19
  end
20
20
  click_button(I18n.t("fluentd.common.finish"))
21
21
  assert do
@@ -0,0 +1,96 @@
1
+ require "application_system_test_case"
2
+
3
+ class FilterGrepTest < ApplicationSystemTestCase
4
+ setup do
5
+ login_with(FactoryBot.build(:user))
6
+ @daemon = stub_daemon
7
+ end
8
+
9
+ test "show form" do
10
+ visit(daemon_setting_filter_grep_path)
11
+ assert do
12
+ page.has_css?("input[name=\"setting[label]\"]")
13
+ end
14
+ assert do
15
+ page.has_css?("input#setting_and_0_regexp_0__key")
16
+ end
17
+ assert do
18
+ page.has_css?("input#setting_and_0_regexp_0__pattern")
19
+ end
20
+ assert do
21
+ page.has_css?("input#setting_or_0_regexp_0__key")
22
+ end
23
+ assert do
24
+ page.has_css?("input#setting_or_0_regexp_0__pattern")
25
+ end
26
+ end
27
+
28
+ test "append and" do
29
+ visit(daemon_setting_filter_grep_path)
30
+ first(".card-header .btn .fa-plus").click
31
+ assert do
32
+ page.has_css?("input#setting_and_1_regexp_0__key")
33
+ end
34
+ assert do
35
+ page.has_css?("input#setting_and_1_regexp_0__pattern")
36
+ end
37
+ first(".card-header .btn .fa-minus").click
38
+ assert do
39
+ !page.has_css?("input#setting_and_1_regexp_0__key")
40
+ end
41
+ assert do
42
+ !page.has_css?("input#setting_and_1_regexp_0__pattern")
43
+ end
44
+ end
45
+
46
+ test "append regexp" do
47
+ visit(daemon_setting_filter_grep_path)
48
+ first(".card-body .btn .fa-plus").click
49
+ assert do
50
+ page.has_css?("input#setting_and_0_regexp_1__key")
51
+ end
52
+ assert do
53
+ page.has_css?("input#setting_and_0_regexp_1__pattern")
54
+ end
55
+ first(".card-body .btn .fa-minus").click
56
+ assert do
57
+ !page.has_css?("input#setting_and_0_regexp_1__key")
58
+ end
59
+ assert do
60
+ !page.has_css?("input#setting_and_0_regexp_1__pattern")
61
+ end
62
+ end
63
+
64
+ test "toggle regexp/exclude" do
65
+ visit(daemon_setting_filter_grep_path)
66
+ assert_equal(first(".card-body label").text, "Regexp")
67
+ first('input[name="setting[and[0]][grep_type]"][value="exclude"]').click()
68
+ assert_equal(first(".card-body label").text, "Exclude")
69
+ assert do
70
+ !page.has_css?("input#setting_and_0_regexp_0__key")
71
+ end
72
+ assert do
73
+ !page.has_css?("input#setting_and_0_regexp_0__pattern")
74
+ end
75
+ assert do
76
+ page.has_css?("input#setting_and_0_exclude_0__key")
77
+ end
78
+ assert do
79
+ page.has_css?("input#setting_and_0_exclude_0__pattern")
80
+ end
81
+ end
82
+
83
+ test "update config" do
84
+ visit(daemon_setting_filter_grep_path)
85
+ within("form") do
86
+ fill_in("setting_label", with: "@INPUT")
87
+ fill_in("setting_pattern", with: "pattern")
88
+ fill_in("setting_and_0_regexp_0__key", with: "message")
89
+ fill_in("setting_and_0_regexp_0__pattern", with: "pattern")
90
+ end
91
+ click_button(I18n.t("fluentd.common.finish"))
92
+ assert do
93
+ @daemon.agent.config.include?("@INPUT")
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,13 @@
1
+ require "application_system_test_case"
2
+
3
+ class FilterParserTest < ApplicationSystemTestCase
4
+ include ConfigurableDaemonSettings
5
+
6
+ setup do
7
+ login_with(FactoryBot.build(:user))
8
+ @type = "filter_parser"
9
+ @form_name = "key_name"
10
+ @form_value = "message"
11
+ @daemon = stub_daemon
12
+ end
13
+ end
@@ -0,0 +1,30 @@
1
+ require "application_system_test_case"
2
+
3
+ class FilterRecordTransformerTest < ApplicationSystemTestCase
4
+ setup do
5
+ login_with(FactoryBot.build(:user))
6
+ @daemon = stub_daemon
7
+ end
8
+
9
+ test "show form" do
10
+ visit(daemon_setting_filter_record_transformer_path)
11
+ assert do
12
+ page.has_css?("textarea[name=\"setting[record]\"]")
13
+ end
14
+ end
15
+
16
+ test "update config" do
17
+ value = "key value"
18
+ assert do
19
+ !@daemon.agent.config.include?(value)
20
+ end
21
+ visit(daemon_setting_filter_record_transformer_path)
22
+ within("form") do
23
+ fill_in("Record", with: value)
24
+ end
25
+ click_button(I18n.t("fluentd.common.finish"))
26
+ assert do
27
+ @daemon.agent.config.include?(value)
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,13 @@
1
+ require "application_system_test_case"
2
+
3
+ class FilterStdoutTest < ApplicationSystemTestCase
4
+ include ConfigurableDaemonSettings
5
+
6
+ setup do
7
+ login_with(FactoryBot.build(:user))
8
+ @type = "filter_stdout"
9
+ @form_name = "pattern"
10
+ @form_value = "stdout.**"
11
+ @daemon = stub_daemon
12
+ end
13
+ end
@@ -50,14 +50,21 @@ class SourceAndOutputTest < ApplicationSystemTestCase
50
50
  end
51
51
 
52
52
  test "elements" do
53
- assert do
54
- !page.has_content?(I18n.t("fluentd.settings.source_and_output.setting_empty"))
53
+ within(".input .card") do
54
+ assert do
55
+ !has_content?(I18n.t("fluentd.settings.source_and_output.setting_empty"))
56
+ end
55
57
  end
56
- assert do
57
- page.has_css?('.input .card .card-header')
58
+ assert do
59
+ has_css?(".input .card .card-header")
58
60
  end
59
61
  assert do
60
- page.has_css?('.output .card .card-header')
62
+ has_css?(".output .card .card-header")
63
+ end
64
+ within(".filter .empty") do
65
+ assert do
66
+ has_content?(I18n.t("fluentd.settings.source_and_output.setting_empty"))
67
+ end
61
68
  end
62
69
  end
63
70
 
@@ -79,20 +86,9 @@ class SourceAndOutputTest < ApplicationSystemTestCase
79
86
  end
80
87
 
81
88
  test "display plugin name" do
82
- within ".input" do
83
- assert do
84
- page.has_content?("forward")
85
- end
86
- end
87
-
88
- within ".output" do
89
- assert do
90
- page.has_content?("stdout")
91
- end
92
- assert do
93
- page.has_content?("s3")
94
- end
95
- end
89
+ assert_equal(first(".input .card .card-header").text, "forward")
90
+ assert_equal(all(".output .card .card-header").map(&:text),
91
+ ["stdout (debug.*)", "s3 (s3.*)"])
96
92
  end
97
93
 
98
94
  sub_test_case "edit, update, delete" do
@@ -181,4 +177,157 @@ class SourceAndOutputTest < ApplicationSystemTestCase
181
177
  end
182
178
  end
183
179
  end
180
+
181
+ sub_test_case "filter" do
182
+ setup do
183
+ config = <<-CONFIG.strip_heredoc
184
+ <source>
185
+ @type dummy
186
+ tag debug.*
187
+ </source>
188
+
189
+ <filter debug.*>
190
+ @type stdout
191
+ </filter>
192
+
193
+ <match debug.*>
194
+ # http://docs.fluentd.org/articles/out_stdout
195
+ type stdout
196
+ </match>
197
+ CONFIG
198
+ @daemon.agent.config_write(config)
199
+ visit(source_and_output_daemon_setting_path)
200
+ end
201
+
202
+ test "elements" do
203
+ assert_equal(first(".filter .card .card-header").text, "stdout (debug.*)")
204
+ end
205
+ end
206
+
207
+ sub_test_case "label" do
208
+ setup do
209
+ @config = <<-CONFIG.strip_heredoc
210
+ <source>
211
+ @type dummy
212
+ tag debug.*
213
+ @label @INPUT
214
+ </source>
215
+
216
+ <label @INPUT>
217
+ <filter debug.*>
218
+ @type grep
219
+ <regexp>
220
+ key message
221
+ pattern /debug.+/
222
+ </regexp>
223
+ </filter>
224
+
225
+ <match debug.*>
226
+ @type stdout
227
+ </match>
228
+ </label>
229
+ CONFIG
230
+ @daemon.agent.config_write(@config)
231
+ visit(source_and_output_daemon_setting_path)
232
+ end
233
+
234
+ test "elements under @INPUT" do
235
+ assert do
236
+ all(".input h5").map(&:text).include?("@INPUT")
237
+ end
238
+ assert_equal(first(".input .card .card-header").text, "dummy")
239
+ assert do
240
+ all(".filter h5").map(&:text).include?("@INPUT")
241
+ end
242
+ assert_equal(first(".filter .card .card-header").text, "grep (debug.*)")
243
+ assert do
244
+ all(".output h5").map(&:text).include?("@INPUT")
245
+ end
246
+ assert_equal(first(".output .card .card-header").text, "stdout (debug.*)")
247
+ end
248
+
249
+ test "click delete button" do
250
+ assert do
251
+ find(".filter .card-header").click
252
+ end
253
+ page.accept_confirm do
254
+ find(".filter .btn", text: I18n.t("terms.destroy")).click
255
+ end
256
+ within(".filter .empty") do
257
+ assert do
258
+ has_content?(I18n.t("fluentd.settings.source_and_output.setting_empty"))
259
+ end
260
+ end
261
+ end
262
+
263
+ test "click edit and cancel" do
264
+ config = <<-CONFIG.strip_heredoc
265
+ <filter debug.*>
266
+ @type grep
267
+ <regexp>
268
+ key message
269
+ pattern /debug.+/
270
+ </regexp>
271
+ </filter>
272
+ CONFIG
273
+ new_config = <<-CONFIG.strip_heredoc
274
+ <filter debug.*>
275
+ @type grep
276
+ <regexp>
277
+ key message
278
+ pattern /debug2.+/
279
+ </regexp>
280
+ </filter>
281
+ CONFIG
282
+ assert do
283
+ find(".filter .card-header").click
284
+ end
285
+ find(".filter .btn", text: I18n.t("terms.edit")).click
286
+ original_contents = page.evaluate_script(%Q!document.querySelector(".CodeMirror").CodeMirror.getValue()!)
287
+ assert_equal(original_contents, config)
288
+ page.execute_script(<<-JS)
289
+ var cm = document.querySelector('.CodeMirror').CodeMirror;
290
+ cm.setValue(#{new_config.to_json});
291
+ JS
292
+ find(".filter .btn", text: I18n.t("terms.cancel")).click
293
+ contents = page.evaluate_script("document.querySelector('.filter pre').textContent")
294
+ assert_equal(contents, config)
295
+ assert_equal(@daemon.agent.config.strip, @config.strip)
296
+ end
297
+
298
+ test "click edit and save" do
299
+ config = <<-CONFIG.strip_heredoc
300
+ <filter debug.*>
301
+ @type grep
302
+ <regexp>
303
+ key message
304
+ pattern /debug.+/
305
+ </regexp>
306
+ </filter>
307
+ CONFIG
308
+ new_config = <<-CONFIG.strip_heredoc
309
+ <filter debug.*>
310
+ @type grep
311
+ <regexp>
312
+ key message
313
+ pattern /debug2.+/
314
+ </regexp>
315
+ </filter>
316
+ CONFIG
317
+ assert do
318
+ find(".filter .card-header").click
319
+ end
320
+ find(".filter .btn", text: I18n.t("terms.edit")).click
321
+ original_contents = page.evaluate_script(%Q!document.querySelector(".CodeMirror").CodeMirror.getValue()!)
322
+ assert_equal(original_contents, config)
323
+ page.execute_script(<<-JS)
324
+ var cm = document.querySelector('.CodeMirror').CodeMirror;
325
+ cm.setValue(#{new_config.to_json});
326
+ JS
327
+ find(".filter .btn", text: I18n.t("terms.save")).click
328
+ sleep(1)
329
+ contents = page.evaluate_script("document.querySelector('.filter pre').textContent")
330
+ assert_equal(new_config, contents)
331
+ end
332
+ end
184
333
  end