fluent-plugin-kubernetes-objects 1.1.0 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6cfb891f22b53744c43fc6c2e1518d84a6b9f777715b8e76cdf6203d060dfebb
4
- data.tar.gz: 33e009c355bddf26ab670daf63891344edcba1e25cc449f482fd4021ff9537f9
3
+ metadata.gz: ebbda5fdcf1ccdfc296bd7de8c270b930241d7aeb270b3a75af166e11613a179
4
+ data.tar.gz: 0ca3df1c39ad412487c891c4e097b30e9516e07e1ab2deb50f5e887c0c761095
5
5
  SHA512:
6
- metadata.gz: 16d37fd0ff1778a2f02d60bb08fb45137fd18bacd4484add87df8d7d6fbda0a231225dcc443dc20d93df7ce6aee1bc03e22f08020260eb80af413959f693529d
7
- data.tar.gz: 66ccb72b7b271c55d67e573fbb614a57e7c6a4fa1bc8755d2eb47d09af3e5481865219c3e8ee3a291416365f53d5d3341b4cc510f32f4418be8ae9915f7a0aab
6
+ metadata.gz: 80f55f4be2a6d9177c3633e08d05b10c8ab854f275d724fec0fdcd86ab846ec496b69a3c1ccb6fbc55dcaad74ac598caecd7144577085f49fc66f1e2ed684152
7
+ data.tar.gz: 511205cdb4eb9cd1d977700fbd9d0fd9b31804ca19257965d59423bffc82200d35cc6fcfe329a560d79964d2fb0adc26bae885585dd734d707d0957ae07cf04e
data/Gemfile.lock CHANGED
@@ -1,86 +1,94 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- fluent-plugin-kubernetes-objects (1.0.0)
5
- fluentd (~> 1.3)
6
- kubeclient (~> 4.2)
4
+ fluent-plugin-kubernetes-objects (1.1.5)
5
+ fluentd (>= 1.9.1)
6
+ http_parser.rb (= 0.5.3)
7
+ kubeclient (~> 4.6.0)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
11
- addressable (2.6.0)
12
- public_suffix (>= 2.0.2, < 4.0)
13
- cool.io (1.5.3)
14
- crack (0.4.3)
15
- safe_yaml (~> 1.0.0)
16
- dig_rb (1.0.1)
17
- docile (1.3.1)
18
- domain_name (0.5.20180417)
12
+ addressable (2.7.0)
13
+ public_suffix (>= 2.0.2, < 5.0)
14
+ concurrent-ruby (1.1.8)
15
+ cool.io (1.7.1)
16
+ crack (0.4.5)
17
+ rexml
18
+ docile (1.3.5)
19
+ domain_name (0.5.20190701)
19
20
  unf (>= 0.0.5, < 1.0.0)
20
- fluentd (1.3.3)
21
+ ffi (1.14.2)
22
+ ffi-compiler (1.0.1)
23
+ ffi (>= 1.0.0)
24
+ rake
25
+ fluentd (1.12.1)
26
+ bundler
21
27
  cool.io (>= 1.4.5, < 2.0.0)
22
- dig_rb (~> 1.0.0)
23
28
  http_parser.rb (>= 0.5.1, < 0.7.0)
24
- msgpack (>= 0.7.0, < 2.0.0)
25
- serverengine (>= 2.0.4, < 3.0.0)
29
+ msgpack (>= 1.3.1, < 2.0.0)
30
+ serverengine (>= 2.2.2, < 3.0.0)
26
31
  sigdump (~> 0.2.2)
27
32
  strptime (>= 0.2.2, < 1.0.0)
28
- tzinfo (~> 1.0)
33
+ tzinfo (>= 1.0, < 3.0)
29
34
  tzinfo-data (~> 1.0)
30
35
  yajl-ruby (~> 1.0)
31
- hashdiff (0.3.8)
32
- http (3.3.0)
36
+ hashdiff (1.0.1)
37
+ http (4.4.1)
33
38
  addressable (~> 2.3)
34
39
  http-cookie (~> 1.0)
35
- http-form_data (~> 2.0)
36
- http_parser.rb (~> 0.6.0)
40
+ http-form_data (~> 2.2)
41
+ http-parser (~> 1.2.0)
42
+ http-accept (1.7.0)
37
43
  http-cookie (1.0.3)
38
44
  domain_name (~> 0.5)
39
- http-form_data (2.1.1)
40
- http_parser.rb (0.6.0)
41
- json (2.1.0)
42
- kubeclient (4.2.2)
43
- http (~> 3.0)
45
+ http-form_data (2.3.0)
46
+ http-parser (1.2.3)
47
+ ffi-compiler (>= 1.0, < 2.0)
48
+ http_parser.rb (0.5.3)
49
+ kubeclient (4.6.0)
50
+ http (>= 3.0, < 5.0)
44
51
  recursive-open-struct (~> 1.0, >= 1.0.4)
45
52
  rest-client (~> 2.0)
46
- mime-types (3.2.2)
53
+ mime-types (3.3.1)
47
54
  mime-types-data (~> 3.2015)
48
- mime-types-data (3.2018.0812)
49
- minitest (5.11.3)
50
- msgpack (1.2.6)
55
+ mime-types-data (3.2021.0225)
56
+ minitest (5.14.4)
57
+ msgpack (1.4.2)
51
58
  netrc (0.11.0)
52
- power_assert (1.1.3)
53
- public_suffix (3.0.3)
54
- rake (12.3.2)
55
- recursive-open-struct (1.1.0)
56
- rest-client (2.0.2)
59
+ power_assert (2.0.0)
60
+ public_suffix (4.0.6)
61
+ rake (13.0.3)
62
+ recursive-open-struct (1.1.3)
63
+ rest-client (2.1.0)
64
+ http-accept (>= 1.7.0, < 2.0)
57
65
  http-cookie (>= 1.0.2, < 2.0)
58
66
  mime-types (>= 1.16, < 4.0)
59
67
  netrc (~> 0.8)
60
- safe_yaml (1.0.4)
61
- serverengine (2.1.0)
68
+ rexml (3.2.4)
69
+ serverengine (2.2.3)
62
70
  sigdump (~> 0.2.2)
63
71
  sigdump (0.2.4)
64
- simplecov (0.16.1)
72
+ simplecov (0.21.2)
65
73
  docile (~> 1.1)
66
- json (>= 1.8, < 3)
67
- simplecov-html (~> 0.10.0)
68
- simplecov-html (0.10.2)
69
- strptime (0.2.3)
70
- test-unit (3.3.0)
74
+ simplecov-html (~> 0.11)
75
+ simplecov_json_formatter (~> 0.1)
76
+ simplecov-html (0.12.3)
77
+ simplecov_json_formatter (0.1.2)
78
+ strptime (0.2.5)
79
+ test-unit (3.4.0)
71
80
  power_assert
72
- thread_safe (0.3.6)
73
- tzinfo (1.2.5)
74
- thread_safe (~> 0.1)
75
- tzinfo-data (1.2018.9)
81
+ tzinfo (2.0.4)
82
+ concurrent-ruby (~> 1.0)
83
+ tzinfo-data (1.2021.1)
76
84
  tzinfo (>= 1.0.0)
77
85
  unf (0.1.4)
78
86
  unf_ext
79
- unf_ext (0.0.7.5)
80
- webmock (3.5.1)
87
+ unf_ext (0.0.7.7)
88
+ webmock (3.12.0)
81
89
  addressable (>= 2.3.6)
82
90
  crack (>= 0.3.2)
83
- hashdiff
91
+ hashdiff (>= 0.4.0, < 2.0.0)
84
92
  yajl-ruby (1.4.1)
85
93
 
86
94
  PLATFORMS
@@ -90,10 +98,10 @@ DEPENDENCIES
90
98
  bundler (~> 2.0)
91
99
  fluent-plugin-kubernetes-objects!
92
100
  minitest (~> 5.11)
93
- rake (~> 12.3)
101
+ rake (>= 12.0)
94
102
  simplecov
95
103
  test-unit (~> 3.3)
96
104
  webmock (~> 3.5)
97
105
 
98
106
  BUNDLED WITH
99
- 2.0.1
107
+ 2.2.13
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.1.5
@@ -9,35 +9,25 @@ Gem::Specification.new do |spec|
9
9
  spec.homepage = 'https://github.com/splunk/fluent-plugin-kubernetes-objects'
10
10
  spec.license = 'Apache-2.0'
11
11
 
12
- # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
13
- # to allow pushing to a single host or delete this section to allow pushing to any host.
14
- #if spec.respond_to?(:metadata)
15
- # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
16
- #else
17
- # raise 'RubyGems 2.0 or newer is required to protect against ' \
18
- # 'public gem pushes.'
19
- #end
20
-
21
12
  spec.require_paths = ['lib']
22
13
  spec.test_files = Dir.glob('test/**/**.rb')
23
14
  spec.files = %w[
24
15
  CODE_OF_CONDUCT.md README.md LICENSE
25
16
  fluent-plugin-kubernetes-objects.gemspec
26
17
  Gemfile Gemfile.lock
27
- Rakefile
18
+ Rakefile VERSION
28
19
  ] + Dir.glob('lib/**/**').reject(&File.method(:directory?))
29
20
 
30
21
  spec.bindir = 'exe'
31
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
-
33
23
  spec.required_ruby_version = '>= 2.3.0'
34
-
35
- spec.add_runtime_dependency 'fluentd', '~> 1.3'
36
- spec.add_runtime_dependency 'kubeclient', '~> 4.2'
24
+ spec.add_runtime_dependency 'fluentd', '>= 1.9.1'
25
+ spec.add_runtime_dependency 'kubeclient', '~> 4.6.0'
26
+ spec.add_runtime_dependency 'http_parser.rb', '= 0.5.3'
37
27
 
38
28
  spec.add_development_dependency 'bundler', '~> 2.0'
39
29
  spec.add_development_dependency 'minitest', '~> 5.11'
40
- spec.add_development_dependency 'rake', '~> 12.3'
30
+ spec.add_development_dependency 'rake', '>= 12.0'
41
31
  spec.add_development_dependency 'test-unit', '~> 3.3' # required by fluent/test.rb
42
32
  spec.add_development_dependency 'webmock', '~> 3.5'
43
33
  end
@@ -5,7 +5,7 @@ require 'kubeclient'
5
5
 
6
6
  module Fluent::Plugin
7
7
  class KubernetesObjectsInput < Fluent::Plugin::Input
8
- VERSION = '1.1.0'.freeze
8
+ VERSION = '1.1.2'.freeze
9
9
 
10
10
  Fluent::Plugin.register_input('kubernetes_objects', self)
11
11
 
@@ -72,6 +72,9 @@ module Fluent::Plugin
72
72
 
73
73
  desc 'A selector to restrict the list of returned objects by fields.'
74
74
  config_param :field_selector, :string, default: nil
75
+
76
+ desc 'The interval at which the objects will be watched.'
77
+ config_param :interval, :time, default: 15 * 60
75
78
  end
76
79
 
77
80
  config_section :storage do
@@ -99,7 +102,6 @@ module Fluent::Plugin
99
102
  end
100
103
 
101
104
  def close
102
- @watchers.each &:finish if @watchers
103
105
  super
104
106
  end
105
107
 
@@ -115,6 +117,21 @@ module Fluent::Plugin
115
117
  [@tag_prefix, item_name, @tag_suffix].join
116
118
  end
117
119
 
120
+ def init_with_kubeconfig()
121
+ options = {}
122
+ config = Kubeclient::Config.read @kubeconfig
123
+ current_context = config.context
124
+
125
+ @client = Kubeclient::Client.new(
126
+ current_context.api_endpoint,
127
+ current_context.api_version,
128
+ options.merge(
129
+ ssl_options: current_context.ssl_options,
130
+ auth_options: current_context.auth_options
131
+ )
132
+ )
133
+ end
134
+
118
135
  def initialize_client
119
136
  # mostly borrowed from Fluentd Kubernetes Metadata Filter Plugin
120
137
  if @kubernetes_url.nil?
@@ -140,7 +157,7 @@ module Fluent::Plugin
140
157
  if @bearer_token_file.nil? && File.exist?(secret_token_file)
141
158
  @bearer_token_file = secret_token_file
142
159
  end
143
- end
160
+ end
144
161
 
145
162
  ssl_options = {
146
163
  client_cert: @client_cert && OpenSSL::X509::Certificate.new(File.read(@client_cert)),
@@ -170,16 +187,7 @@ module Fluent::Plugin
170
187
  end
171
188
 
172
189
  def start_watchers
173
- @watchers = @watch_objects.map do |o|
174
- o = o.to_h.dup
175
- o[:as] = :raw
176
- resource_name = o.delete(:resource_name)
177
- version = @storage.get(resource_name)
178
- o[:resource_version] = version if version
179
- @client.public_send("watch_#{resource_name}", o).tap do |watcher|
180
- create_watcher_thread resource_name, watcher
181
- end
182
- end
190
+ @watch_objects.each(&method(:create_watcher_thread))
183
191
  end
184
192
 
185
193
  def create_pull_thread(conf)
@@ -209,7 +217,7 @@ module Fluent::Plugin
209
217
  ->(item) { item['metadata'].update requestResourceVersion: resource_version }
210
218
  else
211
219
  ->(item) {}
212
- end
220
+ end
213
221
 
214
222
  # result['items'] might be nil due to https://github.com/kubernetes/kubernetes/issues/13096
215
223
  items = result['items'].to_a
@@ -222,16 +230,35 @@ module Fluent::Plugin
222
230
  end
223
231
  end
224
232
 
225
- def create_watcher_thread(object_name, watcher)
226
- thread_create(:"watch_#{object_name}") do
227
- tag = generate_tag "#{object_name}.watch"
228
- watcher.each do |entity|
229
- log.trace { "Received new object from watching #{object_name}" }
230
- entity = JSON.parse(entity)
231
- router.emit tag, Fluent::Engine.now, entity
232
- @storage.put object_name, entity['object']['metadata']['resourceVersion']
233
+ def create_watcher_thread(conf)
234
+ options = conf.to_h.dup
235
+ options[:as] = :raw
236
+ resource_name = options[:resource_name]
237
+ version = @storage.get(resource_name)
238
+ if version
239
+ options[:resource_version] = version
240
+ else
241
+ options[:resource_version] = 0
242
+ end
243
+
244
+ thread_create :"watch_#{resource_name}" do
245
+ while thread_current_running?
246
+ @client.public_send("watch_#{resource_name}", options).tap do |watcher|
247
+ tag = generate_tag "#{resource_name}"
248
+ watcher.each do |entity|
249
+ begin
250
+ entity = JSON.parse(entity)
251
+ router.emit tag, Fluent::Engine.now, entity
252
+ options[:resource_version] = entity['object']['metadata']['resourceVersion']
253
+ @storage.put resource_name, entity['object']['metadata']['resourceVersion']
254
+ rescue => e
255
+ log.info "Got exception #{e} parsing entity #{entity}. Resetting watcher."
256
+ end
257
+ end
258
+ end
233
259
  end
234
260
  end
235
261
  end
236
262
  end
237
263
  end
264
+
@@ -1,4 +1,5 @@
1
1
  require "test_helper"
2
+ require 'fluent/plugin/in_kubernetes_objects.rb'
2
3
 
3
4
  describe Fluent::Plugin::KubernetesObjectsInput do
4
5
  include Fluent::Test::Helpers
@@ -109,9 +110,12 @@ describe Fluent::Plugin::KubernetesObjectsInput do
109
110
  </watch>
110
111
  CONF
111
112
 
113
+ stub_k8s_events params: {resourceVersion: "0"}
114
+ stub_k8s_events params: {resourceVersion: "6621683"}
115
+
112
116
  d.run expect_emits: 1, timeout: 3
113
117
  events = d.events
114
- expect(events.all? { |e| e[0] == 'kubernetes.events.watch'}).must_equal true
118
+ expect(events.all? { |e| e[0] == 'kubernetes.events'}).must_equal true
115
119
  end
116
120
 
117
121
  it "should use checkpoints for watching" do
@@ -133,9 +137,10 @@ describe Fluent::Plugin::KubernetesObjectsInput do
133
137
  CONF
134
138
 
135
139
  stub_k8s_events params: {resourceVersion: "123456"}
140
+ stub_k8s_events params: {resourceVersion: "6621683"}
136
141
 
137
142
  d.run expect_emits: 1, timeout: 3
138
- ensure
143
+ ensure
139
144
  f.unlink
140
145
  end
141
146
  end
data/test/test_helper.rb CHANGED
@@ -1,13 +1,12 @@
1
1
  require 'simplecov'
2
2
  SimpleCov.start
3
3
 
4
- $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
+ $LOAD_PATH.unshift(File.expand_path('..', __dir__))
5
5
 
6
6
  # suppress warning, when require the 'http' library shows circle require warning
7
7
  # which is pretty annoying (kubeclient depends on http for watch_stream)
8
8
  _verbose = $VERBOSE
9
9
  $VERBOSE = nil
10
- require 'fluent/plugin/in_kubernetes_objects'
11
10
  $VERBOSE = _verbose
12
11
 
13
12
  require 'fluent/test'
metadata CHANGED
@@ -1,43 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-kubernetes-objects
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Splunk Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-03-07 00:00:00.000000000 Z
11
+ date: 2021-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: 1.9.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: 1.9.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: kubeclient
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '4.2'
33
+ version: 4.6.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '4.2'
40
+ version: 4.6.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: http_parser.rb
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.5.3
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.5.3
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +84,16 @@ dependencies:
70
84
  name: rake
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: '12.3'
89
+ version: '12.0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: '12.3'
96
+ version: '12.0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: test-unit
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -122,6 +136,7 @@ files:
122
136
  - LICENSE
123
137
  - README.md
124
138
  - Rakefile
139
+ - VERSION
125
140
  - fluent-plugin-kubernetes-objects.gemspec
126
141
  - lib/fluent/plugin/in_kubernetes_objects.rb
127
142
  - test/fluent/plugin/in_kubernetes_objects_test.rb
@@ -137,7 +152,7 @@ homepage: https://github.com/splunk/fluent-plugin-kubernetes-objects
137
152
  licenses:
138
153
  - Apache-2.0
139
154
  metadata: {}
140
- post_install_message:
155
+ post_install_message:
141
156
  rdoc_options: []
142
157
  require_paths:
143
158
  - lib
@@ -152,8 +167,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
152
167
  - !ruby/object:Gem::Version
153
168
  version: '0'
154
169
  requirements: []
155
- rubygems_version: 3.0.1
156
- signing_key:
170
+ rubygems_version: 3.1.1
171
+ signing_key:
157
172
  specification_version: 4
158
173
  summary: Fluentd Plugin for Kubernetes Objects.
159
174
  test_files: