fluent-plugin-kubernetes_metadata_filter 3.7.0 → 3.7.1

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -1
  3. data/Rakefile +3 -4
  4. data/lib/fluent/plugin/filter_kubernetes_metadata.rb +307 -279
  5. data/lib/fluent/plugin/kubernetes_metadata_cache_strategy.rb +15 -11
  6. data/lib/fluent/plugin/kubernetes_metadata_common.rb +38 -40
  7. data/lib/fluent/plugin/kubernetes_metadata_stats.rb +4 -6
  8. data/lib/fluent/plugin/kubernetes_metadata_test_api_adapter.rb +39 -36
  9. data/lib/fluent/plugin/kubernetes_metadata_watch_namespaces.rb +15 -12
  10. data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +18 -17
  11. metadata +2 -172
  12. data/.circleci/config.yml +0 -48
  13. data/.gitignore +0 -18
  14. data/.rubocop.yml +0 -57
  15. data/Gemfile +0 -9
  16. data/Gemfile.lock +0 -172
  17. data/fluent-plugin-kubernetes_metadata_filter.gemspec +0 -34
  18. data/lib/fluent/plugin/kubernetes_metadata_util.rb +0 -33
  19. data/test/cassettes/invalid_api_server_config.yml +0 -53
  20. data/test/cassettes/kubernetes_docker_metadata_annotations.yml +0 -205
  21. data/test/cassettes/kubernetes_docker_metadata_dotted_slashed_labels.yml +0 -197
  22. data/test/cassettes/kubernetes_get_api_v1.yml +0 -193
  23. data/test/cassettes/kubernetes_get_api_v1_using_token.yml +0 -195
  24. data/test/cassettes/kubernetes_get_namespace_default.yml +0 -72
  25. data/test/cassettes/kubernetes_get_namespace_default_using_token.yml +0 -71
  26. data/test/cassettes/kubernetes_get_pod.yml +0 -146
  27. data/test/cassettes/kubernetes_get_pod_container_init.yml +0 -145
  28. data/test/cassettes/kubernetes_get_pod_using_token.yml +0 -148
  29. data/test/cassettes/kubernetes_get_pod_with_ownerrefs.yml +0 -156
  30. data/test/cassettes/metadata_from_tag_and_journald_fields.yml +0 -153
  31. data/test/cassettes/metadata_from_tag_journald_and_kubernetes_fields.yml +0 -285
  32. data/test/cassettes/valid_kubernetes_api_server.yml +0 -55
  33. data/test/cassettes/valid_kubernetes_api_server_using_token.yml +0 -57
  34. data/test/helper.rb +0 -82
  35. data/test/plugin/test.token +0 -1
  36. data/test/plugin/test_cache_stats.rb +0 -33
  37. data/test/plugin/test_cache_strategy.rb +0 -194
  38. data/test/plugin/test_filter_kubernetes_metadata.rb +0 -851
  39. data/test/plugin/test_watch_namespaces.rb +0 -245
  40. data/test/plugin/test_watch_pods.rb +0 -344
  41. data/test/plugin/watch_test.rb +0 -76
@@ -1,851 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- #
4
- # Fluentd Kubernetes Metadata Filter Plugin - Enrich Fluentd events with
5
- # Kubernetes metadata
6
- #
7
- # Copyright 2015 Red Hat, Inc.
8
- #
9
- # Licensed under the Apache License, Version 2.0 (the "License");
10
- # you may not use this file except in compliance with the License.
11
- # You may obtain a copy of the License at
12
- #
13
- # http://www.apache.org/licenses/LICENSE-2.0
14
- #
15
- # Unless required by applicable law or agreed to in writing, software
16
- # distributed under the License is distributed on an "AS IS" BASIS,
17
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
- # See the License for the specific language governing permissions and
19
- # limitations under the License.
20
- #
21
- require_relative '../helper'
22
-
23
- class KubernetesMetadataFilterTest < Test::Unit::TestCase
24
- include Fluent
25
-
26
- setup do
27
- Fluent::Test.setup
28
- @time = Fluent::Engine.now
29
- end
30
-
31
- VAR_LOG_CONTAINER_TAG = 'var.log.containers.fabric8-console-controller-98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log'
32
- VAR_LOG_POD_TAG = 'var.log.pods.default_fabric8-console-controller-98rqc_c76927af-f563-11e4-b32d-54ee7527188d.fabric8-console-container.0.log'
33
-
34
- def create_driver(conf = '')
35
- Test::Driver::Filter.new(Plugin::KubernetesMetadataFilter).configure(conf)
36
- end
37
-
38
- sub_test_case 'configure' do
39
- test 'check default' do
40
- d = create_driver
41
- assert_equal(1000, d.instance.cache_size)
42
- end
43
-
44
- sub_test_case 'stats_interval' do
45
-
46
- test 'enables stats when greater than zero' do
47
- d = create_driver('stats_interval 1')
48
- assert_equal(1, d.instance.stats_interval)
49
- d.instance.dump_stats
50
- assert_false(d.instance.instance_variable_get("@curr_time").nil?)
51
- end
52
-
53
- test 'disables stats when <= zero' do
54
- d = create_driver('stats_interval 0')
55
- assert_equal(0, d.instance.stats_interval)
56
- d.instance.dump_stats
57
- assert_nil(d.instance.instance_variable_get("@curr_time"))
58
- end
59
-
60
- end
61
-
62
- test 'check test_api_adapter' do
63
- d = create_driver('test_api_adapter KubernetesMetadata::TestApiAdapter')
64
- assert_equal('KubernetesMetadata::TestApiAdapter', d.instance.test_api_adapter)
65
- end
66
-
67
- test 'kubernetes url' do
68
- VCR.use_cassette('valid_kubernetes_api_server') do
69
- d = create_driver('
70
- kubernetes_url https://localhost:8443
71
- watch false
72
- ')
73
- assert_equal('https://localhost:8443', d.instance.kubernetes_url)
74
- assert_equal(1000, d.instance.cache_size)
75
- end
76
- end
77
-
78
- test 'cache size' do
79
- VCR.use_cassette('valid_kubernetes_api_server') do
80
- d = create_driver('
81
- kubernetes_url https://localhost:8443
82
- watch false
83
- cache_size 1
84
- ')
85
- assert_equal('https://localhost:8443', d.instance.kubernetes_url)
86
- assert_equal(1, d.instance.cache_size)
87
- end
88
- end
89
-
90
- test 'invalid API server config' do
91
- VCR.use_cassette('invalid_api_server_config') do
92
- assert_raise Fluent::ConfigError do
93
- create_driver('
94
- kubernetes_url https://localhost:8443
95
- bearer_token_file test/plugin/test.token
96
- watch false
97
- verify_ssl false
98
- ')
99
- end
100
- end
101
- end
102
-
103
- test 'service account credentials' do
104
- VCR.use_cassette('valid_kubernetes_api_server') do
105
- ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
106
- ENV['KUBERNETES_SERVICE_PORT'] = '8443'
107
-
108
- Dir.mktmpdir do |dir|
109
- # Fake token file and CA crt.
110
- expected_cert_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_CA_CERT)
111
- expected_token_path = File.join(dir, Plugin::KubernetesMetadataFilter::K8_POD_TOKEN)
112
-
113
- File.open(expected_cert_path, 'w')
114
- File.open(expected_token_path, 'w')
115
-
116
- d = create_driver("
117
- watch false
118
- secret_dir #{dir}
119
- ")
120
-
121
- assert_equal(d.instance.kubernetes_url, 'https://localhost:8443/api')
122
- assert_equal(d.instance.ca_file, expected_cert_path)
123
- assert_equal(d.instance.bearer_token_file, expected_token_path)
124
- end
125
- ensure
126
- ENV['KUBERNETES_SERVICE_HOST'] = nil
127
- ENV['KUBERNETES_SERVICE_PORT'] = nil
128
- end
129
- end
130
-
131
- test 'service account credential files are tested for existence' do
132
- VCR.use_cassette('valid_kubernetes_api_server') do
133
- ENV['KUBERNETES_SERVICE_HOST'] = 'localhost'
134
- ENV['KUBERNETES_SERVICE_PORT'] = '8443'
135
-
136
- Dir.mktmpdir do |dir|
137
- d = create_driver("
138
- watch false
139
- secret_dir #{dir}
140
- ")
141
- assert_equal(d.instance.kubernetes_url, 'https://localhost:8443/api')
142
- assert_nil(d.instance.ca_file, nil)
143
- assert_nil(d.instance.bearer_token_file)
144
- end
145
- ensure
146
- ENV['KUBERNETES_SERVICE_HOST'] = nil
147
- ENV['KUBERNETES_SERVICE_PORT'] = nil
148
- end
149
- end
150
- end
151
-
152
- sub_test_case 'filter' do
153
- def emit(msg = {}, config = '
154
- kubernetes_url https://localhost:8443
155
- watch false
156
- cache_size 1
157
- ', d: nil)
158
- d = create_driver(config) if d.nil?
159
- d.run(default_tag: VAR_LOG_CONTAINER_TAG) do
160
- d.feed(@time, msg)
161
- end
162
- d.filtered.map(&:last)
163
- end
164
-
165
- def emit_with_tag(tag, msg = {}, config = '
166
- kubernetes_url https://localhost:8443
167
- watch false
168
- cache_size 1
169
- ')
170
- d = create_driver(config)
171
- d.run(default_tag: tag) do
172
- d.feed(@time, msg)
173
- end
174
- d.filtered.map(&:last)
175
- end
176
-
177
- sub_test_case 'parsing_pod_metadata when container_status is missing from the pod status' do
178
- test 'using the tag_to_kubernetes_name_regexp for /var/log/containers ' do
179
- VCR.use_cassettes(
180
- [
181
- { name: 'valid_kubernetes_api_server' },
182
- { name: 'kubernetes_get_api_v1' },
183
- { name: 'kubernetes_get_namespace_default' },
184
- { name: 'kubernetes_get_pod_container_init' }
185
- ]) do
186
- filtered = emit({}, "
187
- kubernetes_url https://localhost:8443
188
- watch false
189
- cache_size 1
190
- ")
191
- expected_kube_metadata = {
192
- 'docker' => {
193
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
194
- },
195
- 'kubernetes' => {
196
- 'container_image'=>'fabric8/hawtio-kubernetes:latest',
197
- 'container_name'=>'fabric8-console-container',
198
- 'host' => 'jimmi-redhat.localnet',
199
- 'pod_name' => 'fabric8-console-controller-98rqc',
200
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
201
- 'namespace_name' => 'default',
202
- 'namespace_labels' => {
203
- 'tenant' => 'test'
204
- },
205
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
206
- 'pod_ip' => '172.17.0.8',
207
- 'master_url' => 'https://localhost:8443',
208
- 'labels' => {
209
- 'component' => 'fabric8Console'
210
- }
211
- }
212
- }
213
- assert_equal(expected_kube_metadata, filtered[0])
214
- end
215
- end
216
- test 'using the tag_to_kubernetes_name_regexp for /var/log/pods' do
217
- VCR.use_cassettes(
218
- [
219
- { name: 'valid_kubernetes_api_server' },
220
- { name: 'kubernetes_get_api_v1' },
221
- { name: 'kubernetes_get_namespace_default' },
222
- { name: 'kubernetes_get_pod_container_init' }
223
- ]) do
224
- filtered = emit_with_tag(VAR_LOG_POD_TAG,{}, "
225
- kubernetes_url https://localhost:8443
226
- watch false
227
- cache_size 1
228
- ")
229
- expected_kube_metadata = {
230
- 'kubernetes' => {
231
- 'container_image'=>'fabric8/hawtio-kubernetes:latest',
232
- 'container_name'=>'fabric8-console-container',
233
- 'host' => 'jimmi-redhat.localnet',
234
- 'pod_name' => 'fabric8-console-controller-98rqc',
235
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
236
- 'namespace_name' => 'default',
237
- 'namespace_labels' => {
238
- 'tenant' => 'test'
239
- },
240
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
241
- 'pod_ip' => '172.17.0.8',
242
- 'master_url' => 'https://localhost:8443',
243
- 'labels' => {
244
- 'component' => 'fabric8Console'
245
- }
246
- }
247
- }
248
- assert_equal(expected_kube_metadata, filtered[0])
249
- end
250
- end
251
- end
252
-
253
- test 'inability to connect to the api server handles exception and doensnt block pipeline' do
254
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }]) do
255
- driver = create_driver('
256
- kubernetes_url https://localhost:8443
257
- watch false
258
- cache_size 1
259
- ')
260
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_raise(SocketError.new('error from pod fetch'))
261
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_raise(SocketError.new('socket error from namespace fetch'))
262
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
263
- expected_kube_metadata = {
264
- 'time' => '2015-05-08T09:22:01Z',
265
- 'docker'=>{
266
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
267
- },
268
- 'kubernetes' => {
269
- 'pod_name' => 'fabric8-console-controller-98rqc',
270
- 'container_name' => 'fabric8-console-container',
271
- 'namespace_id' => 'orphaned',
272
- 'namespace_name' => '.orphaned',
273
- 'orphaned_namespace' => 'default'
274
- }
275
- }
276
- assert_equal(expected_kube_metadata, filtered[0])
277
- end
278
- end
279
-
280
- test 'with docker & kubernetes metadata where id cache hit and metadata miss' do
281
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }]) do
282
- driver = create_driver('
283
- kubernetes_url https://localhost:8443
284
- watch false
285
- cache_size 1
286
- ')
287
- cache = driver.instance.instance_variable_get(:@id_cache)
288
- cache['49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'] = {
289
- pod_id: 'c76927af-f563-11e4-b32d-54ee7527188d',
290
- namespace_id: '898268c8-4a36-11e5-9d81-42010af0194c'
291
- }
292
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_timeout
293
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_timeout
294
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
295
- expected_kube_metadata = {
296
- 'time' => '2015-05-08T09:22:01Z',
297
- 'docker' => {
298
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
299
- },
300
- 'kubernetes' => {
301
- 'pod_name' => 'fabric8-console-controller-98rqc',
302
- 'container_name' => 'fabric8-console-container',
303
- 'namespace_name' => 'default',
304
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
305
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d'
306
- }
307
- }
308
-
309
- assert_equal(expected_kube_metadata, filtered[0])
310
- end
311
- end
312
-
313
- test 'with docker & kubernetes metadata where id cache hit and metadata is reloaded' do
314
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
315
- driver = create_driver('
316
- kubernetes_url https://localhost:8443
317
- watch false
318
- cache_size 1
319
- ')
320
- cache = driver.instance.instance_variable_get(:@id_cache)
321
- cache['49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'] = {
322
- pod_id: 'c76927af-f563-11e4-b32d-54ee7527188d',
323
- namespace_id: '898268c8-4a36-11e5-9d81-42010af0194c'
324
- }
325
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' }, '', d: driver)
326
- expected_kube_metadata = {
327
- 'time' => '2015-05-08T09:22:01Z',
328
- 'docker' => {
329
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
330
- },
331
- 'kubernetes' => {
332
- 'host' => 'jimmi-redhat.localnet',
333
- 'pod_name' => 'fabric8-console-controller-98rqc',
334
- 'container_name' => 'fabric8-console-container',
335
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
336
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
337
- 'namespace_name' => 'default',
338
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
339
- 'namespace_labels' => {
340
- 'tenant' => 'test'
341
- },
342
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
343
- 'pod_ip' => '172.17.0.8',
344
- 'master_url' => 'https://localhost:8443',
345
- 'labels' => {
346
- 'component' => 'fabric8Console'
347
- }
348
- }
349
- }
350
-
351
- assert_equal(expected_kube_metadata, filtered[0])
352
- end
353
- end
354
-
355
- test 'with docker & kubernetes metadata' do
356
-
357
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
358
- filtered = emit({ 'time' => '2015-05-08T09:22:01Z' })
359
- expected_kube_metadata = {
360
- 'time' => '2015-05-08T09:22:01Z',
361
- 'docker' => {
362
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
363
- },
364
- 'kubernetes' => {
365
- 'host' => 'jimmi-redhat.localnet',
366
- 'pod_name' => 'fabric8-console-controller-98rqc',
367
- 'container_name' => 'fabric8-console-container',
368
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
369
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
370
- 'namespace_name' => 'default',
371
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
372
- 'namespace_labels' => {
373
- 'tenant' => 'test'
374
- },
375
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
376
- 'pod_ip' => '172.17.0.8',
377
- 'master_url' => 'https://localhost:8443',
378
- 'labels' => {
379
- 'component' => 'fabric8Console'
380
- }
381
- }
382
- }
383
-
384
- assert_equal(expected_kube_metadata, filtered[0])
385
- end
386
- end
387
-
388
- test 'kubernetes metadata is cloned so it further processing does not modify the cache' do
389
-
390
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' }, { name: 'kubernetes_get_namespace_default' }]) do
391
-
392
- d = create_driver('
393
- kubernetes_url https://localhost:8443
394
- watch false
395
- cache_size 1')
396
- d.run(default_tag: VAR_LOG_POD_TAG) do
397
- d.feed(@time, { 'time' => '2015-05-08T09:22:01Z' })
398
- d.feed(@time, { 'time' => '2015-05-08T09:22:01Z' })
399
- end
400
- filtered = d.filtered.map(&:last)
401
- assert_not_equal(filtered[0]['kubernetes']['labels'].object_id, filtered[1]['kubernetes']['labels'].object_id, "Exp. meta to be cloned")
402
- end
403
- end
404
-
405
- test 'with docker & kubernetes metadata & namespace_id enabled' do
406
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
407
- { name: 'kubernetes_get_namespace_default', options: { allow_playback_repeats: true } }]) do
408
- filtered = emit({}, '
409
- kubernetes_url https://localhost:8443
410
- watch false
411
- cache_size 1
412
- ')
413
- expected_kube_metadata = {
414
- 'docker' => {
415
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
416
- },
417
- 'kubernetes' => {
418
- 'host' => 'jimmi-redhat.localnet',
419
- 'pod_name' => 'fabric8-console-controller-98rqc',
420
- 'container_name' => 'fabric8-console-container',
421
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
422
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
423
- 'namespace_name' => 'default',
424
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
425
- 'namespace_labels' => {
426
- 'tenant' => 'test'
427
- },
428
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
429
- 'pod_ip' => '172.17.0.8',
430
- 'master_url' => 'https://localhost:8443',
431
- 'labels' => {
432
- 'component' => 'fabric8Console'
433
- }
434
- }
435
- }
436
- assert_equal(expected_kube_metadata, filtered[0])
437
- end
438
- end
439
-
440
- test 'with docker & kubernetes metadata using bearer token' do
441
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server_using_token' }, { name: 'kubernetes_get_api_v1_using_token' },
442
- { name: 'kubernetes_get_pod_using_token' }, { name: 'kubernetes_get_namespace_default_using_token' }]) do
443
- filtered = emit({}, '
444
- kubernetes_url https://localhost:8443
445
- verify_ssl false
446
- watch false
447
- bearer_token_file test/plugin/test.token
448
- ')
449
- expected_kube_metadata = {
450
- 'docker' => {
451
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
452
- },
453
- 'kubernetes' => {
454
- 'host' => 'jimmi-redhat.localnet',
455
- 'pod_name' => 'fabric8-console-controller-98rqc',
456
- 'container_name' => 'fabric8-console-container',
457
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
458
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
459
- 'namespace_name' => 'default',
460
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
461
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
462
- 'pod_ip' => '172.17.0.8',
463
- 'master_url' => 'https://localhost:8443',
464
- 'labels' => {
465
- 'component' => 'fabric8Console'
466
- }
467
- }
468
- }
469
- assert_equal(expected_kube_metadata, filtered[0])
470
- end
471
- end
472
-
473
- test 'with docker & kubernetes metadata but no configured api server' do
474
- filtered = emit({}, '')
475
- expected_kube_metadata = {
476
- 'docker'=>{
477
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
478
- },
479
- 'kubernetes' => {
480
- 'pod_name' => 'fabric8-console-controller-98rqc',
481
- 'container_name' => 'fabric8-console-container',
482
- 'namespace_name' => 'default'
483
- }
484
- }
485
- assert_equal(expected_kube_metadata, filtered[0])
486
- end
487
-
488
- test 'with docker & inaccessible kubernetes metadata' do
489
- stub_request(:any, 'https://localhost:8443/api').to_return(
490
- 'body' => {
491
- 'versions' => ['v1beta3', 'v1']
492
- }.to_json
493
- )
494
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller-98rqc').to_timeout
495
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default').to_timeout
496
- filtered = emit
497
- expected_kube_metadata = {
498
- 'docker'=>{
499
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
500
- },
501
- 'kubernetes' => {
502
- 'pod_name' => 'fabric8-console-controller-98rqc',
503
- 'container_name' => 'fabric8-console-container',
504
- 'namespace_name' => '.orphaned',
505
- 'orphaned_namespace' => 'default',
506
- 'namespace_id' => 'orphaned'
507
- }
508
- }
509
- assert_equal(expected_kube_metadata, filtered[0])
510
- end
511
-
512
- test 'with dot in pod name' do
513
- stub_request(:any, 'https://localhost:8443/api').to_return(
514
- 'body' => {
515
- 'versions' => ['v1beta3', 'v1']
516
- }.to_json
517
- )
518
- stub_request(:any, 'https://localhost:8443/api/v1/namespaces/default/pods/fabric8-console-controller.98rqc').to_timeout
519
- filtered = emit_with_tag('var.log.containers.fabric8-console-controller.98rqc_default_fabric8-console-container-49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459.log', {}, '')
520
- expected_kube_metadata = {
521
- 'docker'=>{
522
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
523
- },
524
- 'kubernetes' => {
525
- 'pod_name' => 'fabric8-console-controller.98rqc',
526
- 'container_name' => 'fabric8-console-container',
527
- 'namespace_name' => 'default'
528
- }
529
- }
530
- assert_equal(expected_kube_metadata, filtered[0])
531
- end
532
-
533
- test 'with docker metadata, non-kubernetes' do
534
- filtered = emit_with_tag('non-kubernetes', {}, '')
535
- assert_false(filtered[0].key?(:kubernetes))
536
- end
537
-
538
- test 'ignores invalid json in log field' do
539
- json_log = "{'foo':123}"
540
- msg = {
541
- 'log' => json_log
542
- }
543
- filtered = emit_with_tag('non-kubernetes', msg, '')
544
- assert_equal(msg, filtered[0])
545
- end
546
-
547
- test 'with kubernetes annotations' do
548
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
549
- { name: 'kubernetes_docker_metadata_annotations' },
550
- { name: 'kubernetes_get_namespace_default' }]) do
551
- filtered = emit({}, '
552
- kubernetes_url https://localhost:8443
553
- watch false
554
- cache_size 1
555
- annotation_match [ "^custom.+", "two"]
556
- ')
557
- expected_kube_metadata = {
558
- 'docker' => {
559
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
560
- },
561
- 'kubernetes' => {
562
- 'host' => 'jimmi-redhat.localnet',
563
- 'pod_name' => 'fabric8-console-controller-98rqc',
564
- 'container_name' => 'fabric8-console-container',
565
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
566
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
567
- 'namespace_name' => 'default',
568
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
569
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
570
- 'pod_ip' => '172.17.0.8',
571
- 'master_url' => 'https://localhost:8443',
572
- 'labels' => {
573
- 'component' => 'fabric8Console'
574
- },
575
- 'annotations' => {
576
- 'custom.field1' => 'hello_kitty',
577
- 'field.two' => 'value'
578
- }
579
- }
580
- }
581
- assert_equal(expected_kube_metadata, filtered[0])
582
- end
583
- end
584
-
585
- test 'with kubernetes namespace annotations' do
586
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
587
- { name: 'kubernetes_docker_metadata_annotations' },
588
- { name: 'kubernetes_get_namespace_default' }]) do
589
- filtered = emit({}, '
590
- kubernetes_url https://localhost:8443
591
- watch false
592
- cache_size 1
593
- annotation_match [ "^custom.+", "two", "workspace*"]
594
- ')
595
- expected_kube_metadata = {
596
- 'docker' => {
597
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
598
- },
599
- 'kubernetes' => {
600
- 'host' => 'jimmi-redhat.localnet',
601
- 'pod_name' => 'fabric8-console-controller-98rqc',
602
- 'container_name' => 'fabric8-console-container',
603
- 'namespace_name' => 'default',
604
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
605
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
606
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
607
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
608
- 'pod_ip' => '172.17.0.8',
609
- 'master_url' => 'https://localhost:8443',
610
- 'labels' => {
611
- 'component' => 'fabric8Console'
612
- },
613
- 'annotations' => {
614
- 'custom.field1' => 'hello_kitty',
615
- 'field.two' => 'value'
616
- },
617
- 'namespace_annotations' => {
618
- 'workspaceId' => 'myWorkspaceName'
619
- }
620
- }
621
- }
622
- assert_equal(expected_kube_metadata, filtered[0])
623
- end
624
- end
625
-
626
- test 'with kubernetes namespace annotations no match' do
627
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' },
628
- { name: 'kubernetes_docker_metadata_annotations' },
629
- { name: 'kubernetes_get_namespace_default' }]) do
630
- filtered = emit({}, '
631
- kubernetes_url https://localhost:8443
632
- watch false
633
- cache_size 1
634
- annotation_match [ "noMatch*"]
635
- ')
636
- expected_kube_metadata = {
637
- 'docker' => {
638
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
639
- },
640
- 'kubernetes' => {
641
- 'host' => 'jimmi-redhat.localnet',
642
- 'pod_name' => 'fabric8-console-controller-98rqc',
643
- 'container_name' => 'fabric8-console-container',
644
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
645
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
646
- 'namespace_name' => 'default',
647
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
648
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
649
- 'pod_ip' => '172.17.0.8',
650
- 'master_url' => 'https://localhost:8443',
651
- 'labels' => {
652
- 'component' => 'fabric8Console'
653
- }
654
- }
655
- }
656
- assert_equal(expected_kube_metadata, filtered[0])
657
- end
658
- end
659
-
660
- test 'processes all events when reading from MessagePackEventStream' do
661
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
662
- { name: 'kubernetes_get_api_v1' },
663
- { name: 'kubernetes_get_pod' },
664
- { name: 'kubernetes_get_namespace_default' }]) do
665
- entries = [[@time, { 'time' => '2015-05-08T09:22:01Z' }], [@time, { 'time' => '2015-05-08T09:22:01Z' }]]
666
- array_stream = Fluent::ArrayEventStream.new(entries)
667
- msgpack_stream = Fluent::MessagePackEventStream.new(array_stream.to_msgpack_stream)
668
-
669
- d = create_driver('
670
- kubernetes_url https://localhost:8443
671
- watch false
672
- cache_size 1
673
- stats_interval 0
674
- ')
675
- d.run do
676
- d.feed(VAR_LOG_CONTAINER_TAG, msgpack_stream)
677
- end
678
- filtered = d.filtered.map(&:last)
679
-
680
- expected_kube_metadata = {
681
- 'time' => '2015-05-08T09:22:01Z',
682
- 'docker' => {
683
- 'container_id' => '49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
684
- },
685
- 'kubernetes' => {
686
- 'host' => 'jimmi-redhat.localnet',
687
- 'pod_name' => 'fabric8-console-controller-98rqc',
688
- 'container_name' => 'fabric8-console-container',
689
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
690
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
691
- 'namespace_name' => 'default',
692
- 'namespace_id' => '898268c8-4a36-11e5-9d81-42010af0194c',
693
- 'namespace_labels' => {
694
- 'tenant' => 'test'
695
- },
696
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
697
- 'pod_ip' => '172.17.0.8',
698
- 'master_url' => 'https://localhost:8443',
699
- 'labels' => {
700
- 'component' => 'fabric8Console'
701
- }
702
- }
703
- }
704
-
705
- assert_equal(expected_kube_metadata, filtered[0])
706
- assert_equal(expected_kube_metadata, filtered[1])
707
- end
708
- end
709
-
710
- test 'with docker & kubernetes metadata using skip config params' do
711
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
712
- { name: 'kubernetes_get_namespace_default' }]) do
713
- filtered = emit({}, '
714
- kubernetes_url https://localhost:8443
715
- watch false
716
- cache_size 1
717
- skip_labels true
718
- skip_container_metadata true
719
- skip_master_url true
720
- skip_namespace_metadata true
721
- ')
722
- expected_kube_metadata = {
723
- 'docker'=>{
724
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
725
- },
726
- 'kubernetes' => {
727
- 'host' => 'jimmi-redhat.localnet',
728
- 'pod_name' => 'fabric8-console-controller-98rqc',
729
- 'container_name' => 'fabric8-console-container',
730
- 'namespace_name' => 'default',
731
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
732
- 'pod_ip' => '172.17.0.8'
733
- }
734
- }
735
-
736
- assert_equal(expected_kube_metadata, filtered[0])
737
- end
738
- end
739
-
740
- test 'with docker & kubernetes metadata using skip namespace labels config param' do
741
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
742
- { name: 'kubernetes_get_namespace_default' }]) do
743
- filtered = emit({}, '
744
- kubernetes_url https://localhost:8443
745
- watch false
746
- cache_size 1
747
- stats_interval 0
748
- skip_namespace_labels true
749
- skip_master_url true
750
- ')
751
- expected_kube_metadata = {
752
- 'docker'=>{
753
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
754
- },
755
- 'kubernetes' => {
756
- 'host' => 'jimmi-redhat.localnet',
757
- 'pod_name' => 'fabric8-console-controller-98rqc',
758
- 'container_name' => 'fabric8-console-container',
759
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
760
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
761
- 'namespace_name' => 'default',
762
- "namespace_id"=>"898268c8-4a36-11e5-9d81-42010af0194c",
763
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
764
- 'pod_ip' => '172.17.0.8',
765
- 'labels' => {
766
- 'component' => 'fabric8Console'
767
- }
768
- }
769
- }
770
-
771
- assert_equal(expected_kube_metadata, filtered[0])
772
- end
773
- end
774
- test 'with docker & kubernetes metadata using skip pod labels config param' do
775
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' }, { name: 'kubernetes_get_api_v1' }, { name: 'kubernetes_get_pod' },
776
- { name: 'kubernetes_get_namespace_default' }]) do
777
- filtered = emit({}, '
778
- kubernetes_url https://localhost:8443
779
- watch false
780
- cache_size 1
781
- stats_interval 0
782
- skip_pod_labels true
783
- skip_master_url true
784
- ')
785
- expected_kube_metadata = {
786
- 'docker'=>{
787
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
788
- },
789
- 'kubernetes' => {
790
- 'host' => 'jimmi-redhat.localnet',
791
- 'pod_name' => 'fabric8-console-controller-98rqc',
792
- 'container_name' => 'fabric8-console-container',
793
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
794
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
795
- 'namespace_name' => 'default',
796
- "namespace_id"=>"898268c8-4a36-11e5-9d81-42010af0194c",
797
- 'namespace_labels' => {
798
- 'tenant' => 'test'
799
- },
800
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
801
- 'pod_ip' => '172.17.0.8',
802
- }
803
- }
804
-
805
- assert_equal(expected_kube_metadata, filtered[0])
806
- end
807
- end
808
- test 'with docker & kubernetes metadata using include ownerrefs metadata' do
809
- VCR.use_cassettes([{ name: 'valid_kubernetes_api_server' },
810
- { name: 'kubernetes_get_api_v1' },
811
- { name: 'kubernetes_get_pod_with_ownerrefs' },
812
- { name: 'kubernetes_get_namespace_default' }]) do
813
- filtered = emit({}, '
814
- kubernetes_url https://localhost:8443
815
- watch false
816
- cache_size 1
817
- stats_interval 0
818
- skip_pod_labels true
819
- skip_master_url true
820
- include_ownerrefs_metadata true
821
- ')
822
- expected_kube_metadata = {
823
- 'docker'=>{
824
- 'container_id'=>'49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
825
- },
826
- 'kubernetes' => {
827
- 'host' => 'jimmi-redhat.localnet',
828
- 'pod_name' => 'fabric8-console-controller-98rqc',
829
- 'container_name' => 'fabric8-console-container',
830
- 'container_image' => 'fabric8/hawtio-kubernetes:latest',
831
- 'container_image_id' => 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
832
- 'namespace_name' => 'default',
833
- "namespace_id"=>"898268c8-4a36-11e5-9d81-42010af0194c",
834
- 'namespace_labels' => {
835
- 'tenant' => 'test'
836
- },
837
- 'pod_id' => 'c76927af-f563-11e4-b32d-54ee7527188d',
838
- 'pod_ip' => '172.17.0.8',
839
- 'ownerrefs' => [{
840
- 'kind' => 'ReplicaSet',
841
- 'name' => 'fabric8-console-controller'
842
- }]
843
- }
844
- }
845
-
846
- assert_equal(expected_kube_metadata, filtered[0])
847
- end
848
- end
849
-
850
- end
851
- end