fluentd-ui 1.0.0.alpha.2 → 1.0.0.alpha.3

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.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/ChangeLog.md +5 -0
  3. data/Gemfile.lock +56 -1
  4. data/README.md +2 -2
  5. data/app/controllers/api/config_definitions_controller.rb +55 -0
  6. data/app/controllers/api_controller.rb +20 -3
  7. data/app/controllers/concerns/setting_concern.rb +18 -2
  8. data/app/controllers/fluentd/settings/in_tail_controller.rb +13 -5
  9. data/app/controllers/fluentd/settings/out_forward_controller.rb +0 -9
  10. data/app/controllers/fluentd/settings/out_s3_controller.rb +0 -5
  11. data/app/controllers/fluentd/settings/out_tdlog_controller.rb +9 -0
  12. data/app/form_builders/fluentd_form_builder.rb +83 -0
  13. data/app/helpers/settings_helper.rb +81 -18
  14. data/app/javascript/packs/application.js +4 -0
  15. data/app/javascript/packs/in_tail_parse.js +159 -0
  16. data/app/javascript/packs/owned_plugin_form.js +141 -0
  17. data/app/javascript/packs/parser_multiline_form.js +51 -0
  18. data/app/javascript/packs/plugin_setting.js +19 -0
  19. data/app/models/concerns/fluentd/setting/configurable.rb +113 -0
  20. data/app/models/concerns/fluentd/setting/pattern.rb +11 -0
  21. data/app/models/concerns/fluentd/setting/plugin.rb +78 -0
  22. data/app/models/concerns/fluentd/setting/plugin_config.rb +74 -0
  23. data/app/models/concerns/fluentd/setting/plugin_parameter.rb +121 -0
  24. data/app/models/concerns/fluentd/setting/section_parser.rb +36 -0
  25. data/app/models/concerns/fluentd/setting/section_validator.rb +21 -0
  26. data/app/models/fluentd.rb +5 -5
  27. data/app/models/fluentd/setting/buffer_file.rb +23 -0
  28. data/app/models/fluentd/setting/buffer_memory.rb +17 -0
  29. data/app/models/fluentd/setting/formatter_csv.rb +21 -0
  30. data/app/models/fluentd/setting/formatter_hash.rb +19 -0
  31. data/app/models/fluentd/setting/formatter_json.rb +25 -0
  32. data/app/models/fluentd/setting/formatter_ltsv.rb +21 -0
  33. data/app/models/fluentd/setting/formatter_msgpack.rb +13 -0
  34. data/app/models/fluentd/setting/formatter_out_file.rb +21 -0
  35. data/app/models/fluentd/setting/formatter_single_value.rb +20 -0
  36. data/app/models/fluentd/setting/formatter_stdout.rb +19 -0
  37. data/app/models/fluentd/setting/formatter_tsv.rb +21 -0
  38. data/app/models/fluentd/setting/in_forward.rb +7 -17
  39. data/app/models/fluentd/setting/in_http.rb +13 -19
  40. data/app/models/fluentd/setting/in_monitor_agent.rb +6 -19
  41. data/app/models/fluentd/setting/in_syslog.rb +14 -12
  42. data/app/models/fluentd/setting/in_tail.rb +7 -84
  43. data/app/models/fluentd/setting/out_elasticsearch.rb +12 -21
  44. data/app/models/fluentd/setting/out_forward.rb +22 -66
  45. data/app/models/fluentd/setting/out_mongo.rb +20 -26
  46. data/app/models/fluentd/setting/out_s3.rb +18 -30
  47. data/app/models/fluentd/setting/out_stdout.rb +21 -18
  48. data/app/models/fluentd/setting/out_tdlog.rb +35 -0
  49. data/app/models/fluentd/setting/parser_apache.rb +13 -0
  50. data/app/models/fluentd/setting/parser_apache2.rb +13 -0
  51. data/app/models/fluentd/setting/parser_apache_error.rb +13 -0
  52. data/app/models/fluentd/setting/parser_csv.rb +22 -0
  53. data/app/models/fluentd/setting/parser_in_http.rb +13 -0
  54. data/app/models/fluentd/setting/parser_json.rb +25 -0
  55. data/app/models/fluentd/setting/parser_ltsv.rb +30 -0
  56. data/app/models/fluentd/setting/parser_msgpack.rb +13 -0
  57. data/app/models/fluentd/setting/parser_multiline.rb +24 -0
  58. data/app/models/fluentd/setting/parser_nginx.rb +13 -0
  59. data/app/models/fluentd/setting/parser_none.rb +19 -0
  60. data/app/models/fluentd/setting/parser_regexp.rb +26 -0
  61. data/app/models/fluentd/setting/parser_syslog.rb +29 -0
  62. data/app/models/fluentd/setting/parser_tsv.rb +19 -0
  63. data/app/models/fluentd/setting/section.rb +38 -0
  64. data/app/models/fluentd/setting/storage_local.rb +22 -0
  65. data/app/models/fluentd/setting/type/array.rb +17 -0
  66. data/app/models/fluentd/setting/type/bool.rb +18 -0
  67. data/app/models/fluentd/setting/type/enum.rb +17 -0
  68. data/app/models/fluentd/setting/type/hash.rb +17 -0
  69. data/app/models/fluentd/setting/type/regexp.rb +17 -0
  70. data/app/models/fluentd/setting/type/section.rb +17 -0
  71. data/app/models/fluentd/setting/type/size.rb +17 -0
  72. data/app/models/fluentd/setting/type/time.rb +17 -0
  73. data/app/views/api/settings/_element.json.jbuilder +1 -1
  74. data/app/views/fluentd/settings/in_forward/_form.html.haml +16 -0
  75. data/app/views/fluentd/settings/in_tail/_form.html.haml +22 -29
  76. data/app/views/fluentd/settings/in_tail/after_file_choose.html.haml +1 -1
  77. data/app/views/fluentd/settings/in_tail/after_format.html.haml +4 -4
  78. data/app/views/fluentd/settings/in_tail/confirm.html.haml +5 -5
  79. data/app/views/fluentd/settings/source_and_output.html.haml +1 -1
  80. data/app/views/shared/_global_nav.html.erb +8 -8
  81. data/app/views/shared/settings/_form.html.haml +40 -9
  82. data/app/views/shared/settings/show.html.haml +4 -1
  83. data/app/views/shared/vue/_in_tail_parse.html.haml +20 -0
  84. data/app/views/shared/vue/_owned_plugin_form.html.haml +68 -0
  85. data/app/views/shared/vue/_parser_multiline_form.html.haml +19 -0
  86. data/app/views/shared/vue/_setting.html.erb +1 -1
  87. data/config/application.rb +1 -1
  88. data/config/environment.rb +3 -0
  89. data/config/initializers/types.rb +7 -0
  90. data/config/routes.rb +2 -1
  91. data/fluentd-ui.gemspec +5 -0
  92. data/lib/fluentd-ui/version.rb +1 -1
  93. data/lib/regexp_preview.rb +2 -2
  94. data/lib/regexp_preview/multi_line.rb +53 -63
  95. data/lib/regexp_preview/single_line.rb +40 -46
  96. data/spec/features/fluentd/setting/out_forward_spec.rb +1 -1
  97. data/spec/features/fluentd/setting/out_stdout_spec.rb +1 -1
  98. data/spec/features/{out_td_spec.rb → out_tdlog_spec.rb} +3 -3
  99. data/spec/lib/regexp_preview/multi_line_spec.rb +29 -34
  100. data/spec/lib/regexp_preview/single_line_spec.rb +89 -87
  101. data/spec/models/fluentd/setting/in_forward_spec.rb +75 -0
  102. data/spec/models/fluentd/setting/in_http_spec.rb +31 -0
  103. data/spec/models/fluentd/setting/in_monitor_agent_spec.rb +31 -0
  104. data/spec/models/fluentd/setting/in_syslog_spec.rb +65 -7
  105. data/spec/models/fluentd/setting/in_tail_spec.rb +47 -0
  106. data/spec/models/fluentd/setting/out_elasticsearch_spec.rb +31 -0
  107. data/spec/models/fluentd/setting/out_mongo_spec.rb +35 -12
  108. data/spec/models/fluentd/setting/out_s3_spec.rb +128 -0
  109. data/spec/models/fluentd/setting/out_stdout_spec.rb +31 -0
  110. data/spec/models/fluentd/setting/out_tdlog_spec.rb +47 -0
  111. metadata +164 -38
  112. data/app/controllers/fluentd/settings/out_td_controller.rb +0 -18
  113. data/app/helpers/fluentd/settings_helper.rb +0 -2
  114. data/app/javascript/packs/in_tail_format.js +0 -174
  115. data/app/models/fluentd/setting/common.rb +0 -185
  116. data/app/models/fluentd/setting/out_td.rb +0 -48
  117. data/app/views/shared/vue/_in_tail_format.html.erb +0 -43
  118. data/spec/models/fluentd/setting/common_spec.rb +0 -178
  119. data/spec/models/fluentd/setting/out_td_spec.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d72809f1d9f4e9c2ec00cb5cfc89c21151d278fc47c9b60caa3bc8746532e281
4
- data.tar.gz: 60222c373826c90c8cce959bcad61f6bcf2f893b94c5ff4f82d5e591ac85d84e
3
+ metadata.gz: 371bb07d552eafadfce633dfec5adb819f3035e0d1c2f741a02935aacc5224ab
4
+ data.tar.gz: 62b220afde0c306b9d86ecddf71cefe85afe2008e4b08a80ab8fc01166002272
5
5
  SHA512:
6
- metadata.gz: d1ced5aaa01552d4520490efdd02bf9cd977e686e1034791f69eb8b4c4bfc1ae694ee387ca21e5d77e9e1b9fdc2ca529a2b8a0774f13086a007e75b481485e1c
7
- data.tar.gz: 50fdfc479a24f2f967e26c90eb631a2b62fcdb0d6f6a54a001652493a04b1b41a61900c4c6fcde4994457dbe2c0b6827f689c4972e2282d18278c7e2fc5d38a4
6
+ metadata.gz: 834685ca65b72e54d287fdbcd74abed5df9b2d856c04126364de5e4714597e3f099bec3d38cd933496c15e7cbaac3b1271760a5c6070be1afebb2814c1a5a94c
7
+ data.tar.gz: 9880d835ba57727cb5a10816e49cae0e4854062fe88cde847231ca630f73eab3232238925e8e457ae610d11c306ab1bc55369a4106236febf1bbf2d873bdd984
data/ChangeLog.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## Release 1.0.0.alpha.3 - 2018/06/18
2
+
3
+ * [improvement] Support Fluentd v1 [#238](https://github.com/fluent/fluentd-ui/pull/238)
4
+ * [maintenance] Update document [#237](https://github.com/fluent/fluentd-ui/pull/237)
5
+
1
6
  ## Release 1.0.0-alpha.2 - 2018/05/24
2
7
 
3
8
  * [fixed] Update HTML classes [#234](https://github.com/fluent/fluentd-ui/pull/234)
data/Gemfile.lock CHANGED
@@ -1,12 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluentd-ui (1.0.0.alpha.2)
4
+ fluentd-ui (1.0.0.alpha.3)
5
5
  addressable
6
6
  bootsnap (>= 1.1.0)
7
7
  bundler
8
8
  diff-lcs
9
9
  draper (~> 3.0)
10
+ fluent-plugin-elasticsearch (~> 2.10)
11
+ fluent-plugin-mongo (~> 1.1)
12
+ fluent-plugin-s3 (~> 1.1)
13
+ fluent-plugin-td (~> 1.0)
10
14
  fluentd (>= 1.0.0, < 2)
11
15
  font-awesome-rails
12
16
  haml-rails (~> 1.0)
@@ -74,6 +78,24 @@ GEM
74
78
  addressable (2.5.2)
75
79
  public_suffix (>= 2.0.2, < 4.0)
76
80
  arel (9.0.0)
81
+ aws-eventstream (1.0.0)
82
+ aws-partitions (1.87.0)
83
+ aws-sdk-core (3.21.2)
84
+ aws-eventstream (~> 1.0)
85
+ aws-partitions (~> 1.0)
86
+ aws-sigv4 (~> 1.0)
87
+ jmespath (~> 1.0)
88
+ aws-sdk-kms (1.5.0)
89
+ aws-sdk-core (~> 3)
90
+ aws-sigv4 (~> 1.0)
91
+ aws-sdk-s3 (1.13.0)
92
+ aws-sdk-core (~> 3, >= 3.21.2)
93
+ aws-sdk-kms (~> 1)
94
+ aws-sigv4 (~> 1.0)
95
+ aws-sdk-sqs (1.3.0)
96
+ aws-sdk-core (~> 3)
97
+ aws-sigv4 (~> 1.0)
98
+ aws-sigv4 (1.0.2)
77
99
  better_errors (2.1.1)
78
100
  coderay (>= 1.0.0)
79
101
  erubis (>= 2.6.6)
@@ -83,6 +105,7 @@ GEM
83
105
  debug_inspector (>= 0.0.1)
84
106
  bootsnap (1.3.0)
85
107
  msgpack (~> 1.0)
108
+ bson (4.3.0)
86
109
  builder (3.2.3)
87
110
  capybara (3.0.2)
88
111
  addressable
@@ -112,14 +135,39 @@ GEM
112
135
  activemodel-serializers-xml (~> 1.0)
113
136
  activesupport (~> 5.0)
114
137
  request_store (~> 1.0)
138
+ elasticsearch (6.0.2)
139
+ elasticsearch-api (= 6.0.2)
140
+ elasticsearch-transport (= 6.0.2)
141
+ elasticsearch-api (6.0.2)
142
+ multi_json
143
+ elasticsearch-transport (6.0.2)
144
+ faraday
145
+ multi_json
115
146
  erubi (1.7.1)
116
147
  erubis (2.7.0)
148
+ excon (0.62.0)
117
149
  factory_bot (4.8.2)
118
150
  activesupport (>= 3.0.0)
119
151
  factory_bot_rails (4.8.2)
120
152
  factory_bot (~> 4.8.2)
121
153
  railties (>= 3.0.0)
154
+ faraday (0.15.2)
155
+ multipart-post (>= 1.2, < 3)
122
156
  ffi (1.9.23)
157
+ fluent-plugin-elasticsearch (2.10.1)
158
+ elasticsearch
159
+ excon
160
+ fluentd (>= 0.14.20)
161
+ fluent-plugin-mongo (1.1.1)
162
+ fluentd (>= 0.14.12, < 2)
163
+ mongo (~> 2.2.0)
164
+ fluent-plugin-s3 (1.1.3)
165
+ aws-sdk-s3 (~> 1.0)
166
+ aws-sdk-sqs (~> 1.0)
167
+ fluentd (>= 0.14.2, < 2)
168
+ fluent-plugin-td (1.0.0)
169
+ fluentd (>= 0.14.13, < 2)
170
+ td-client (~> 1.0)
123
171
  fluentd (1.2.1)
124
172
  cool.io (>= 1.4.5, < 2.0.0)
125
173
  dig_rb (~> 1.0.0)
@@ -159,6 +207,7 @@ GEM
159
207
  jbuilder (2.7.0)
160
208
  activesupport (>= 4.2.0)
161
209
  multi_json (>= 1.2)
210
+ jmespath (1.4.0)
162
211
  json (2.1.0)
163
212
  kramdown (1.16.2)
164
213
  kramdown-haml (0.0.3)
@@ -181,8 +230,11 @@ GEM
181
230
  mini_mime (1.0.0)
182
231
  mini_portile2 (2.3.0)
183
232
  minitest (5.11.3)
233
+ mongo (2.2.7)
234
+ bson (~> 4.0)
184
235
  msgpack (1.2.4)
185
236
  multi_json (1.13.1)
237
+ multipart-post (2.0.0)
186
238
  nio4r (2.3.0)
187
239
  nokogiri (1.8.2)
188
240
  mini_portile2 (~> 2.3.0)
@@ -286,6 +338,9 @@ GEM
286
338
  strptime (0.2.3)
287
339
  sucker_punch (2.0.4)
288
340
  concurrent-ruby (~> 1.0.0)
341
+ td-client (1.0.6)
342
+ httpclient (>= 2.7)
343
+ msgpack (>= 0.5.6, < 2)
289
344
  temple (0.8.0)
290
345
  thor (0.20.0)
291
346
  thread_safe (0.3.6)
data/README.md CHANGED
@@ -17,9 +17,9 @@ fluentd-ui is a browser-based [fluentd](http://www.fluentd.org) and [td-agent](h
17
17
  ## Requirements
18
18
 
19
19
  - ruby 2.2.2 or later (since v1.0.0)
20
- - fluentd v1.0.0 or later
20
+ - fluentd v1.0.0 or later (also supports td-agent 3)
21
+ - Currently, fluentd v1 and td-agent 3 support is in alpha state
21
22
 
22
- Currently, fluentd-ui doesn't support fleuntd v1 and td-agent 3.
23
23
  And some additional packages (Debian / Ubuntu)
24
24
 
25
25
  - build-essential
@@ -0,0 +1,55 @@
1
+ class Api::ConfigDefinitionsController < ApplicationController
2
+ before_action :login_required
3
+
4
+ def index
5
+ name = params[:name]
6
+ type = params[:type]
7
+ prefix = case type
8
+ when "input"
9
+ "in"
10
+ when "output"
11
+ "out"
12
+ when "filter"
13
+ "filter"
14
+ when "parse"
15
+ "parser"
16
+ when "format"
17
+ "formatter"
18
+ when "parser", "formatter", "buffer", "storage"
19
+ type
20
+ end
21
+
22
+ target_class = Fluentd::Setting.const_get("#{prefix}_#{name}".classify)
23
+ target = target_class.new
24
+
25
+ common_options = target.common_options.map do |key|
26
+ h = {
27
+ name: key,
28
+ type: target.column_type(key),
29
+ desc: target.desc(key),
30
+ default: target.default(key)
31
+ }
32
+ h[:list] = target.list_of(key) if target.column_type(key) == :enum
33
+ h
34
+ end
35
+
36
+ advanced_options = target.advanced_options.map do |key|
37
+ h = {
38
+ name: key,
39
+ type: target.column_type(key),
40
+ desc: target.desc(key),
41
+ default: target.default(key)
42
+ }
43
+ h[:list] = target.list_of(key) if target.column_type(key) == :enum
44
+ h
45
+ end
46
+
47
+ options = {
48
+ type: type,
49
+ name: name,
50
+ commonOptions: common_options,
51
+ advancedOptions: advanced_options
52
+ }
53
+ render json: options
54
+ end
55
+ end
@@ -19,9 +19,12 @@ class ApiController < ApplicationController
19
19
  end
20
20
 
21
21
  def regexp_preview
22
- preview = RegexpPreview.processor(params[:format]).new(params[:file], params[:format], params)
22
+ plugin_config = prepare_plugin_config || {}
23
+ preview = RegexpPreview.processor(params[:parse_type]).new(params[:file], params[:parse_type], plugin_config)
23
24
 
24
- render json: preview.matches_json
25
+ render json: preview.matches
26
+ rescue Fluent::ConfigError => ex
27
+ render json: { error: "#{ex.class}: #{ex.message}" }
25
28
  end
26
29
 
27
30
  def grok_to_regexp
@@ -29,5 +32,19 @@ class ApiController < ApplicationController
29
32
  grok.load_patterns
30
33
  render text: grok.convert_to_regexp(params[:grok_str]).source
31
34
  end
32
- end
33
35
 
36
+ private
37
+
38
+ def prepare_plugin_config
39
+ plugin_config = params[:plugin_config]
40
+ case params[:parse_type]
41
+ when "multiline"
42
+ plugin_config[:formats].lines.each.with_index do |line, index|
43
+ plugin_config["format#{index + 1}"] = line.chomp
44
+ end
45
+ plugin_config
46
+ else
47
+ plugin_config
48
+ end
49
+ end
50
+ end
@@ -10,11 +10,19 @@ module SettingConcern
10
10
 
11
11
  def show
12
12
  @setting = target_class.new(initial_params)
13
+ @buffer = @setting.create_buffer
14
+ @storage = @setting.create_storage
15
+ @parser = @setting.create_parser
16
+ @formatter = @setting.create_formatter
17
+ @_used_param = {}
18
+ @_used_section = {}
13
19
  render "shared/settings/show"
14
20
  end
15
21
 
16
22
  def finish
17
23
  @setting = target_class.new(setting_params)
24
+ @_used_param = {}
25
+ @_used_section = {}
18
26
  unless @setting.valid?
19
27
  return render "shared/settings/show"
20
28
  end
@@ -32,7 +40,7 @@ module SettingConcern
32
40
  private
33
41
 
34
42
  def setting_params
35
- params.require(target_class.to_s.underscore.gsub("/", "_")).permit(*target_class.const_get(:KEYS))
43
+ params.require(:setting).permit(*target_class.permit_params)
36
44
  end
37
45
 
38
46
  def initial_params
@@ -40,7 +48,15 @@ module SettingConcern
40
48
  end
41
49
 
42
50
  def target_plugin_name
43
- target_class.to_s.split("::").last.underscore
51
+ prefix = case target_class.plugin_type
52
+ when "input"
53
+ "in"
54
+ when "output"
55
+ "out"
56
+ else
57
+ target_class.plugin_type
58
+ end
59
+ "#{prefix}_#{target_class.plugin_name}"
44
60
  end
45
61
 
46
62
  def plugin_setting_form_action_url(*args)
@@ -4,8 +4,8 @@ class Fluentd::Settings::InTailController < ApplicationController
4
4
 
5
5
  def after_file_choose
6
6
  @setting = Fluentd::Setting::InTail.new({
7
- :path => params[:path],
8
- :tag => nil,
7
+ path: params[:path],
8
+ tag: nil
9
9
  })
10
10
  end
11
11
 
@@ -38,20 +38,28 @@ class Fluentd::Settings::InTailController < ApplicationController
38
38
  return render "after_format"
39
39
  end
40
40
 
41
- if @fluentd.agent.configuration.to_s.include?(@setting.to_conf.strip)
41
+ if @fluentd.agent.configuration.to_s.include?(@setting.to_config.to_s.strip)
42
42
  @setting.errors.add(:base, :duplicated_conf)
43
43
  return render "after_format"
44
44
  end
45
45
 
46
- @fluentd.agent.config_append @setting.to_conf
46
+ @fluentd.agent.config_append @setting.to_config.to_s
47
47
  @fluentd.agent.restart if @fluentd.agent.running?
48
48
  redirect_to daemon_setting_path(@fluentd)
49
49
  end
50
50
 
51
+ def target_class
52
+ Fluentd::Setting::InTail
53
+ end
54
+
51
55
  private
52
56
 
53
57
  def setting_params
54
- params.require(:setting).permit(:path, :format, :regexp, *Fluentd::Setting::InTail.known_formats, :tag, :rotate_wait, :pos_file, :read_from_head, :refresh_interval)
58
+ permit_params = target_class._types.keys
59
+ permit_params << :parse_type
60
+ section_class = Fluentd::Setting.const_get("parser_#{params.dig(:setting, :parse_type)}".classify)
61
+ permit_params << { parse: section_class._types.keys }
62
+ params.require(:setting).permit(*permit_params)
55
63
  end
56
64
 
57
65
  end
@@ -6,13 +6,4 @@ class Fluentd::Settings::OutForwardController < ApplicationController
6
6
  def target_class
7
7
  Fluentd::Setting::OutForward
8
8
  end
9
-
10
- def setting_params
11
- params.require(:fluentd_setting_out_forward).permit(*Fluentd::Setting::OutForward::KEYS).merge(
12
- params.require(:fluentd_setting_out_forward).permit(
13
- :server => Fluentd::Setting::OutForward::Server::KEYS,
14
- :secondary => Fluentd::Setting::OutForward::Secondary::KEYS,
15
- ),
16
- )
17
- end
18
9
  end
@@ -6,9 +6,4 @@ class Fluentd::Settings::OutS3Controller < ApplicationController
6
6
  def target_class
7
7
  Fluentd::Setting::OutS3
8
8
  end
9
-
10
- def setting_params
11
- params.require(:fluentd_setting_out_s3).permit(*Fluentd::Setting::OutS3::KEYS)
12
- end
13
-
14
9
  end
@@ -0,0 +1,9 @@
1
+ class Fluentd::Settings::OutTdlogController < ApplicationController
2
+ include SettingConcern
3
+
4
+ private
5
+
6
+ def target_class
7
+ Fluentd::Setting::OutTdlog
8
+ end
9
+ end
@@ -0,0 +1,83 @@
1
+ class FluentdFormBuilder < ActionView::Helpers::FormBuilder
2
+ include ActionView::Helpers::TagHelper
3
+ include ActionView::Context
4
+
5
+ def field(key, options = {})
6
+ plugin_class = object.class
7
+ content_tag(:div, class: "form-group") do
8
+ if plugin_class._sections[key]
9
+ render_section(key, options)
10
+ else
11
+ resolve_field(key, options)
12
+ end
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def resolve_field(key, options = {})
19
+ plugin_class = object.class
20
+ column_type = plugin_class.column_type(key)
21
+ case column_type
22
+ when :enum
23
+ enum_field(key, options)
24
+ when :bool
25
+ bool_field(key, options)
26
+ else
27
+ other_field(key, options)
28
+ end
29
+ end
30
+
31
+ def enum_field(key, options)
32
+ label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key)) +
33
+ select(key, object.list_of(key), options, { class: "enum" })
34
+ end
35
+
36
+ def bool_field(key, options)
37
+ check_box(key, options, "true", "false") + " " +
38
+ label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key))
39
+ end
40
+
41
+ def other_field(key, options)
42
+ return unless object.respond_to?(key)
43
+ label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key)) +
44
+ text_field(key, class: "form-control", **options)
45
+ end
46
+
47
+ def render_section(key, options)
48
+ section_class = object.class._sections[key]
49
+ children = object.__send__(key) || { "0" => {} }
50
+ html = ""
51
+
52
+ children.each do |index, child|
53
+ html << content_tag("div", class: "js-nested-column #{section_class.multi ? "js-multiple" : ""}") do
54
+ _html = ""
55
+ _html << append_and_remove_links if section_class.multi
56
+ _html << label(key, nil, data: { toggle: "tooltip", placement: "right" }, title: object.desc(key))
57
+ _html << section_fields(key, index, section_class, child)
58
+ _html.html_safe
59
+ end
60
+ end
61
+ html.html_safe
62
+ end
63
+
64
+ def section_fields(key, index, section_class, child)
65
+ section = section_class.new(child)
66
+ fields("#{key}[#{index}]", model: section) do |section_form|
67
+ html = ""
68
+ section_class._types.keys.each do |section_key|
69
+ html << section_form.field(section_key)
70
+ end
71
+ html.html_safe
72
+ end
73
+ end
74
+
75
+ def append_and_remove_links
76
+ %Q!<a class="btn btn-xs btn-default js-append">#{icon('fa-plus')}</a> ! +
77
+ %Q!<a class="btn btn-xs btn-default js-remove" style="display:none">#{icon('fa-minus')}</a> !
78
+ end
79
+
80
+ def icon(classes, inner=nil)
81
+ %Q!<i class="fa #{classes}">#{inner}</i> !.html_safe
82
+ end
83
+ end