fluentd-ui 1.0.1 → 1.1.0

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 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
@@ -112,6 +112,10 @@ ja:
112
112
  setup_in_monitor_agent: 監視エージェント
113
113
  setup_in_http: http
114
114
  setup_in_forward: 転送(他Fluentdからの受信)
115
+ setup_filter_grep: フィルタリング(grep)
116
+ setup_filter_parser: パース
117
+ setup_filter_record_transformer: レコード加工
118
+ setup_filter_stdout: 標準出力(ログ)
115
119
  setup_out_tdlog: Treasure Data
116
120
  setup_out_stdout: 標準出力(ログ)
117
121
  setup_out_mongo: MongoDB
@@ -144,6 +148,7 @@ ja:
144
148
  page_title: ソースと出力先の追加
145
149
  in: 入力
146
150
  out: 出力
151
+ filter: フィルター
147
152
  current: 現在の設定
148
153
  setting_empty: 設定されていません
149
154
  show:
@@ -153,7 +158,7 @@ ja:
153
158
  page_title: 設定ファイルの編集
154
159
  out_forward:
155
160
  option_guide: |
156
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/out_forward">out_forwardプラグインの解説</a>もご参照ください。
161
+ <a target="_blank" href="https://docs.fluentd.org/articles/out_forward">out_forwardプラグインの解説</a>もご参照ください。
157
162
  secondary_note: |
158
163
  ※どのserverにも転送できなかった場合、上記のパスにファイルとしてデータが保存されます。
159
164
  show:
@@ -161,7 +166,7 @@ ja:
161
166
  out_s3:
162
167
  option_guide: |
163
168
  fluent-plugin-s3プラグインのインストールが必要です。<br />
164
- <a target="_blank" href="http://docs.fluentd.org/articles/out_s3">out_s3プラグインの解説</a>もご参照ください。
169
+ <a target="_blank" href="https://docs.fluentd.org/articles/out_s3">out_s3プラグインの解説</a>もご参照ください。
165
170
  show:
166
171
  page_title: AWS S3書き出し設定
167
172
  out_tdlog:
@@ -172,37 +177,61 @@ ja:
172
177
  out_elasticsearch:
173
178
  option_guide: |
174
179
  fluent-plugin-elasticsearchプラグインのインストールが必要です。<br />
175
- <a target="_blank" href="https://github.com/uken/fluent-plugin-elasticsearch">out_elasticsearchプラグインの解説</a>もご参照ください。
180
+ <a target="_blank" href="httpss://github.com/uken/fluent-plugin-elasticsearch">out_elasticsearchプラグインの解説</a>もご参照ください。
176
181
  show:
177
182
  page_title: Elasticsearch設定
178
183
  out_mongo:
179
184
  option_guide: |
180
185
  fluent-plugin-mongoプラグインのインストールが必要です。<br />
181
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/out_mongo">out_mongoプラグインの解説</a>もご参照ください。
186
+ <a target="_blank" href="https://docs.fluentd.org/articles/out_mongo">out_mongoプラグインの解説</a>もご参照ください。
182
187
  show:
183
188
  page_title: MongoDB書き出し設定
184
189
  out_stdout:
185
190
  option_guide: |
186
191
  標準出力(デーモンとして起動しているときはログファイル)へイベントを書き出します。<br />
187
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/out_stdout">out_stdoutプラグインの解説</a>もご参照ください。
192
+ <a target="_blank" href="https://docs.fluentd.org/articles/out_stdout">out_stdoutプラグインの解説</a>もご参照ください。
193
+ show:
194
+ page_title: 標準出力(ログ)
195
+ filter_grep:
196
+ option_guide: |
197
+ 指定したフィールドの値を元にイベントを「Grep」します。<br />
198
+ <a target="_blank" href="https://docs.fluentd.org/articles/filter_grep">filter_grepプラグインの解説</a>もご参照ください。
199
+ show:
200
+ page_title: Grepフィルター設定
201
+ filter_parser:
202
+ option_guide: |
203
+ 指定したフィールドの値をパースした結果を使ってイベントを加工します。<br />
204
+ <a target="_blank" href="https://docs.fluentd.org/articles/filter_parser">filter_parserプラグインの解説</a>もご参照ください。
205
+ show:
206
+ page_title: Parserフィルター設定
207
+ filter_record_transformer:
208
+ option_guide: |
209
+ 様々な方法でイベントを加工します。<br />
210
+ <a target="_blank" href="https://docs.fluentd.org/articles/filter_record_transformer">filter_record_transformerプラグインの解説</a>もご参照ください。
211
+ show:
212
+ page_title: レコード加工設定
213
+ filter_stdout:
214
+ option_guide: |
215
+ 標準出力(デーモンとして起動しているときはログファイル)へイベントを書き出します。<br />
216
+ <a target="_blank" href="https://docs.fluentd.org/articles/filter_stdout">filter_stdoutプラグインの解説</a>もご参照ください。
188
217
  show:
189
218
  page_title: 標準出力(ログ)
190
219
  in_syslog:
191
220
  option_guide: |
192
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/in_syslog">in_syslogプラグイン解説ページ</a>もご参照ください。
221
+ <a target="_blank" href="https://docs.fluentd.org/articles/in_syslog">in_syslogプラグイン解説ページ</a>もご参照ください。
193
222
  show:
194
223
  page_title: Syslog読み込み設定
195
224
  in_monitor_agent:
196
225
  option_guide: |
197
226
  HTTP経由で現在稼働中のfluentdが使用しているconfigやプラグインをJSONやLTSV形式で取得できます。<br />
198
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/monitoring">監視エージェント</a>のページもご参照ください。
227
+ <a target="_blank" href="https://docs.fluentd.org/articles/monitoring">監視エージェント</a>のページもご参照ください。
199
228
  show:
200
229
  page_title: 監視エージェント設定(monitor_agent)
201
230
  in_http:
202
231
  option_guide: |
203
232
  http POSTからレコードを取得可能にします。<br />
204
233
  URLパスはFluentdイベントログのタグとなり、ポストされたbody要素はレコードそのものになります。<br />
205
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/in_http">httpインプットプラグイン解説ページ</a>もご参照ください。
234
+ <a target="_blank" href="https://docs.fluentd.org/articles/in_http">httpインプットプラグイン解説ページ</a>もご参照ください。
206
235
  show:
207
236
  page_title: http入力設定
208
237
  in_forward:
@@ -210,12 +239,12 @@ ja:
210
239
  TCPソケットをリッスンし、イベントストリームを受信します。<br />
211
240
  UDPソケットもリッスンし、ハートビートメッセージを受信します。<br />
212
241
  他のFluentdインスタンス、fluent-catコマンドまたはクライアントライブラリーからイベントログを受信するために使用されます。<br />
213
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/in_forward">forwardインプットプラグイン解説ページ</a>もご参照ください。
242
+ <a target="_blank" href="https://docs.fluentd.org/articles/in_forward">forwardインプットプラグイン解説ページ</a>もご参照ください。
214
243
  show:
215
244
  page_title: forward入力設定
216
245
 
217
246
  in_tail_option_guide: |
218
- <a target="_blank" href="http://docs.fluentd.org/ja/articles/in_tail">in_tailプラグインの解説ページ</a>や
247
+ <a target="_blank" href="https://docs.fluentd.org/articles/in_tail">in_tailプラグインの解説ページ</a>や
219
248
  <a target="_blank" href="http://fluentular.herokuapp.com/">Fluentular</a>もご参照ください。
220
249
  in_tail:
221
250
  notice_for_multiline_limit: "改行区切りで正規表現を入力してください。空行はカウントされません。21行目以降の入力は無視されます。"
@@ -41,6 +41,12 @@ Rails.application.routes.draw do
41
41
  post "finish"
42
42
  end
43
43
 
44
+ %w(grep parser record_transformer stdout).each do |type|
45
+ resource "filter_#{type}", only: [:show], module: :settings, controller: "filter_#{type}" do
46
+ post "finish"
47
+ end
48
+ end
49
+
44
50
  resource :out_stdout, only: [:show], module: :settings, controller: :out_stdout do
45
51
  post "finish"
46
52
  end
@@ -1,3 +1,3 @@
1
1
  module FluentdUI
2
- VERSION = "1.0.1"
2
+ VERSION = "1.1.0"
3
3
  end
@@ -3,9 +3,9 @@ FactoryBot.define do
3
3
  dir = Rails.root.join("tmp/fluentd-test").to_s
4
4
  FileUtils.mkdir_p(dir)
5
5
 
6
- variant "fluentd_gem"
7
- log_file dir + "/fluentd.log"
8
- pid_file dir + "/fluentd.pid"
9
- config_file dir + "/fluentd.conf"
6
+ variant { "fluentd_gem" }
7
+ log_file { dir + "/fluentd.log" }
8
+ pid_file { dir + "/fluentd.pid" }
9
+ config_file { dir + "/fluentd.conf" }
10
10
  end
11
11
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  FactoryBot.define do
4
4
  factory :plugin do
5
- gem_name "fluent-plugin-dummy"
6
- version "1.2.3"
5
+ gem_name { "fluent-plugin-dummy" }
6
+ version { "1.2.3" }
7
7
  end
8
8
  end
@@ -1,6 +1,6 @@
1
1
  FactoryBot.define do
2
2
  factory :user do
3
- name "admin"
4
- password "changeme"
3
+ name { "admin" }
4
+ password { "changeme" }
5
5
  end
6
6
  end
@@ -0,0 +1,15 @@
1
+ <source>
2
+ @type dummy
3
+ tag dummy
4
+ @label @INPUT
5
+ </source>
6
+
7
+ <label @INPUT>
8
+ <filter dummy>
9
+ @type stdout
10
+ </filter>
11
+
12
+ <match dummy>
13
+ @type stdout
14
+ </match>
15
+ </label>
@@ -0,0 +1,40 @@
1
+ <source>
2
+ @type dummy
3
+ tag dummy1
4
+ @label @INPUT
5
+ </source>
6
+
7
+ <source>
8
+ @type dummy
9
+ tag dummy2
10
+ @label @INPUT
11
+ </source>
12
+
13
+ <label @INPUT>
14
+ <filter dummy1>
15
+ @type stdout
16
+ </filter>
17
+
18
+ <match dummy1>
19
+ @type relabel
20
+ @label @MAIN
21
+ </match>
22
+ </label>
23
+
24
+ <label @MAIN>
25
+ <filter dummy1>
26
+ @type stdout
27
+ </filter>
28
+
29
+ <filter dummy2>
30
+ @type stdout
31
+ </filter>
32
+
33
+ <match dummy1>
34
+ @type stdout
35
+ </match>
36
+
37
+ <match dummy2>
38
+ @type stdout
39
+ </match>
40
+ </label>
@@ -0,0 +1,12 @@
1
+ <source>
2
+ @type dummy
3
+ tag dummy
4
+ </source>
5
+
6
+ <filter dummy>
7
+ @type stdout
8
+ </filter>
9
+
10
+ <match dummy>
11
+ @type stdout
12
+ </match>
@@ -0,0 +1,288 @@
1
+ require "test_helper"
2
+
3
+ class Fluentd
4
+ class TestAgentCommon < ActiveSupport::TestCase
5
+ class DummyAgent
6
+ include ::Fluentd::Agent::Common
7
+ end
8
+
9
+ setup do
10
+ @agent = DummyAgent.new
11
+ end
12
+
13
+ sub_test_case "#parse_config" do
14
+ test "empty" do
15
+ actual = @agent.__send__(:parse_config, "")
16
+ assert_equal({}, actual)
17
+ end
18
+
19
+ test "simple" do
20
+ actual = @agent.__send__(:parse_config, fixture_content("config/simple.conf"))
21
+ source_section_content = <<-CONFIG.strip_heredoc.chomp
22
+ <source>
23
+ @type dummy
24
+ tag dummy
25
+ </source>
26
+ CONFIG
27
+ filter_section_content = <<-CONFIG.strip_heredoc.chomp
28
+ <filter dummy>
29
+ @type stdout
30
+ </filter>
31
+ CONFIG
32
+ match_section_content = <<-CONFIG.strip_heredoc.chomp
33
+ <match dummy>
34
+ @type stdout
35
+ </match>
36
+ CONFIG
37
+ expected = {
38
+ "source" => [
39
+ { pos: 0, content: source_section_content }
40
+ ],
41
+ "filter" => [
42
+ { pos: 44, content: filter_section_content }
43
+ ],
44
+ "match" => [
45
+ { pos: 85, content: match_section_content }
46
+ ]
47
+ }
48
+ assert_equal(expected, actual)
49
+ end
50
+
51
+ test "simple label" do
52
+ actual = @agent.__send__(:parse_config, fixture_content("config/label.conf"))
53
+ source_section_content = <<-CONFIG.strip_heredoc.chomp
54
+ <source>
55
+ @type dummy
56
+ tag dummy
57
+ @label @INPUT
58
+ </source>
59
+ CONFIG
60
+ filter_section_content = <<-CONFIG.chomp
61
+ <filter dummy>
62
+ @type stdout
63
+ </filter>
64
+ CONFIG
65
+ match_section_content = <<-CONFIG.chomp
66
+ <match dummy>
67
+ @type stdout
68
+ </match>
69
+ CONFIG
70
+ sections = {
71
+ "filter" => [
72
+ { label: "@INPUT", pos: 76, content: filter_section_content}
73
+ ],
74
+ "match" => [
75
+ { label: "@INPUT", pos: 122, content: match_section_content}
76
+ ]
77
+ }
78
+ expected = {
79
+ "source" => [
80
+ { pos: 0, content: source_section_content }
81
+ ],
82
+ "label:@INPUT" => [
83
+ { label: "@INPUT", pos: 60, sections: sections, size: 116 }
84
+ ]
85
+ }
86
+ assert_equal(expected, actual)
87
+ end
88
+
89
+ test "multiple labels" do
90
+ actual = @agent.__send__(:parse_config, fixture_content("config/multi-label.conf"))
91
+ source_section_content1 = <<-CONFIG.strip_heredoc.chomp
92
+ <source>
93
+ @type dummy
94
+ tag dummy1
95
+ @label @INPUT
96
+ </source>
97
+ CONFIG
98
+ source_section_content2 = <<-CONFIG.strip_heredoc.chomp
99
+ <source>
100
+ @type dummy
101
+ tag dummy2
102
+ @label @INPUT
103
+ </source>
104
+ CONFIG
105
+ filter_section_content = <<-CONFIG.chomp
106
+ <filter dummy1>
107
+ @type stdout
108
+ </filter>
109
+ CONFIG
110
+ match_section_content = <<-CONFIG.chomp
111
+ <match dummy1>
112
+ @type relabel
113
+ @label @MAIN
114
+ </match>
115
+ CONFIG
116
+ input_sections = {
117
+ "filter" => [
118
+ { label: "@INPUT", pos: 140, content: filter_section_content }
119
+ ],
120
+ "match" => [
121
+ { label: "@INPUT", pos: 187, content: match_section_content }
122
+ ]
123
+ }
124
+ filter_secion_content1 = <<-CONFIG.chomp
125
+ <filter dummy1>
126
+ @type stdout
127
+ </filter>
128
+ CONFIG
129
+ filter_secion_content2 = <<-CONFIG.chomp
130
+ <filter dummy2>
131
+ @type stdout
132
+ </filter>
133
+ CONFIG
134
+ match_secion_content1 = <<-CONFIG.chomp
135
+ <match dummy1>
136
+ @type stdout
137
+ </match>
138
+ CONFIG
139
+ match_secion_content2 = <<-CONFIG.chomp
140
+ <match dummy2>
141
+ @type stdout
142
+ </match>
143
+ CONFIG
144
+ main_sections = {
145
+ "filter" => [
146
+ { label: "@MAIN", pos: 275, content: filter_secion_content1 },
147
+ { label: "@MAIN", pos: 322, content: filter_secion_content2 }
148
+ ],
149
+ "match" => [
150
+ { label: "@MAIN", pos: 370, content: match_secion_content1 },
151
+ { label: "@MAIN", pos: 416, content: match_secion_content2 }
152
+ ]
153
+ }
154
+ expected = {
155
+ "source" => [
156
+ { pos: 0, content: source_section_content1 },
157
+ { pos: 61, content: source_section_content2 },
158
+ ],
159
+ "label:@INPUT" => [
160
+ { label: "@INPUT", pos: 124, sections: input_sections, size: 136 }
161
+ ],
162
+ "label:@MAIN" => [
163
+ { label: "@MAIN", pos: 260, sections: main_sections, size: 211 }
164
+ ]
165
+ }
166
+ assert_equal(expected, actual)
167
+ end
168
+ end
169
+
170
+ sub_test_case "#dump_parsed_config" do
171
+ test "simple" do
172
+ parsed_config = @agent.__send__(:parse_config, fixture_content("config/simple.conf"))
173
+ config = @agent.__send__(:dump_parsed_config, parsed_config)
174
+ assert_equal(fixture_content("config/simple.conf"), config)
175
+ end
176
+
177
+ test "simple label" do
178
+ parsed_config = @agent.__send__(:parse_config, fixture_content("config/label.conf"))
179
+ config = @agent.__send__(:dump_parsed_config, parsed_config)
180
+ assert_equal(fixture_content("config/label.conf"), config)
181
+ end
182
+
183
+ test "multiple labels" do
184
+ parsed_config = @agent.__send__(:parse_config, fixture_content("config/multi-label.conf"))
185
+ config = @agent.__send__(:dump_parsed_config, parsed_config)
186
+ assert_equal(fixture_content("config/multi-label.conf"), config)
187
+ end
188
+ end
189
+
190
+ sub_test_case "#config_merge" do
191
+ test "simple" do
192
+ stub(@agent).config { fixture_content("config/simple.conf") }
193
+ stub(@agent).backup_config
194
+ content = <<-CONFIG
195
+ <match dummy3>
196
+ @type stdout
197
+ </match>
198
+ CONFIG
199
+ mock(@agent).config_append(content)
200
+ @agent.config_merge(content)
201
+ end
202
+
203
+ test "simple with label" do
204
+ stub(@agent).config { fixture_content("config/simple.conf") }
205
+ stub(@agent).backup_config
206
+ content = <<-CONFIG
207
+ <label @INPUT>
208
+ <match dummy3>
209
+ @type stdout
210
+ </match>
211
+ </label>
212
+ CONFIG
213
+ mock(@agent).config_append(content)
214
+ @agent.config_merge(content)
215
+ end
216
+
217
+ test "append to label" do
218
+ stub(@agent).config { fixture_content("config/label.conf") }
219
+ stub(@agent).config_file { "tmp/fluent.conf" }
220
+ stub(@agent).backup_config
221
+ content = <<-CONFIG
222
+ <label @INPUT>
223
+ <match dummy3>
224
+ @type stdout
225
+ </match>
226
+ </label>
227
+ CONFIG
228
+ mock(@agent).config_write(<<-CONFIG)
229
+ <source>
230
+ @type dummy
231
+ tag dummy
232
+ @label @INPUT
233
+ </source>
234
+
235
+ <label @INPUT>
236
+ <filter dummy>
237
+ @type stdout
238
+ </filter>
239
+
240
+ <match dummy>
241
+ @type stdout
242
+ </match>
243
+
244
+ <match dummy3>
245
+ @type stdout
246
+ </match>
247
+ </label>
248
+ CONFIG
249
+ @agent.config_merge(content)
250
+ end
251
+
252
+ test "append filter to label" do
253
+ stub(@agent).config { fixture_content("config/label.conf") }
254
+ stub(@agent).config_file { "tmp/fluent.conf" }
255
+ stub(@agent).backup_config
256
+ content = <<-CONFIG
257
+ <label @INPUT>
258
+ <filter dummy3>
259
+ @type stdout
260
+ </filter>
261
+ </label>
262
+ CONFIG
263
+ mock(@agent).config_write(<<-CONFIG)
264
+ <source>
265
+ @type dummy
266
+ tag dummy
267
+ @label @INPUT
268
+ </source>
269
+
270
+ <label @INPUT>
271
+ <filter dummy>
272
+ @type stdout
273
+ </filter>
274
+
275
+ <filter dummy3>
276
+ @type stdout
277
+ </filter>
278
+
279
+ <match dummy>
280
+ @type stdout
281
+ </match>
282
+ </label>
283
+ CONFIG
284
+ @agent.config_merge(content)
285
+ end
286
+ end
287
+ end
288
+ end