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.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/Rakefile +3 -4
- data/lib/fluent/plugin/filter_kubernetes_metadata.rb +307 -279
- data/lib/fluent/plugin/kubernetes_metadata_cache_strategy.rb +15 -11
- data/lib/fluent/plugin/kubernetes_metadata_common.rb +38 -40
- data/lib/fluent/plugin/kubernetes_metadata_stats.rb +4 -6
- data/lib/fluent/plugin/kubernetes_metadata_test_api_adapter.rb +39 -36
- data/lib/fluent/plugin/kubernetes_metadata_watch_namespaces.rb +15 -12
- data/lib/fluent/plugin/kubernetes_metadata_watch_pods.rb +18 -17
- metadata +2 -172
- data/.circleci/config.yml +0 -48
- data/.gitignore +0 -18
- data/.rubocop.yml +0 -57
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -172
- data/fluent-plugin-kubernetes_metadata_filter.gemspec +0 -34
- data/lib/fluent/plugin/kubernetes_metadata_util.rb +0 -33
- data/test/cassettes/invalid_api_server_config.yml +0 -53
- data/test/cassettes/kubernetes_docker_metadata_annotations.yml +0 -205
- data/test/cassettes/kubernetes_docker_metadata_dotted_slashed_labels.yml +0 -197
- data/test/cassettes/kubernetes_get_api_v1.yml +0 -193
- data/test/cassettes/kubernetes_get_api_v1_using_token.yml +0 -195
- data/test/cassettes/kubernetes_get_namespace_default.yml +0 -72
- data/test/cassettes/kubernetes_get_namespace_default_using_token.yml +0 -71
- data/test/cassettes/kubernetes_get_pod.yml +0 -146
- data/test/cassettes/kubernetes_get_pod_container_init.yml +0 -145
- data/test/cassettes/kubernetes_get_pod_using_token.yml +0 -148
- data/test/cassettes/kubernetes_get_pod_with_ownerrefs.yml +0 -156
- data/test/cassettes/metadata_from_tag_and_journald_fields.yml +0 -153
- data/test/cassettes/metadata_from_tag_journald_and_kubernetes_fields.yml +0 -285
- data/test/cassettes/valid_kubernetes_api_server.yml +0 -55
- data/test/cassettes/valid_kubernetes_api_server_using_token.yml +0 -57
- data/test/helper.rb +0 -82
- data/test/plugin/test.token +0 -1
- data/test/plugin/test_cache_stats.rb +0 -33
- data/test/plugin/test_cache_strategy.rb +0 -194
- data/test/plugin/test_filter_kubernetes_metadata.rb +0 -851
- data/test/plugin/test_watch_namespaces.rb +0 -245
- data/test/plugin/test_watch_pods.rb +0 -344
- data/test/plugin/watch_test.rb +0 -76
@@ -1,245 +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
|
-
require_relative 'watch_test'
|
23
|
-
|
24
|
-
class WatchNamespacesTestTest < WatchTest
|
25
|
-
include KubernetesMetadata::WatchNamespaces
|
26
|
-
|
27
|
-
setup do
|
28
|
-
@initial = {
|
29
|
-
kind: 'NamespaceList',
|
30
|
-
metadata: { resourceVersion: '123' },
|
31
|
-
items: [
|
32
|
-
{
|
33
|
-
metadata: {
|
34
|
-
name: 'initial',
|
35
|
-
uid: 'initial_uid'
|
36
|
-
}
|
37
|
-
},
|
38
|
-
{
|
39
|
-
metadata: {
|
40
|
-
name: 'modified',
|
41
|
-
uid: 'modified_uid'
|
42
|
-
}
|
43
|
-
}
|
44
|
-
]
|
45
|
-
}
|
46
|
-
|
47
|
-
@created = {
|
48
|
-
type: 'CREATED',
|
49
|
-
object: {
|
50
|
-
metadata: {
|
51
|
-
name: 'created',
|
52
|
-
uid: 'created_uid'
|
53
|
-
}
|
54
|
-
}
|
55
|
-
}
|
56
|
-
@modified = {
|
57
|
-
type: 'MODIFIED',
|
58
|
-
object: {
|
59
|
-
metadata: {
|
60
|
-
name: 'foo',
|
61
|
-
uid: 'modified_uid'
|
62
|
-
}
|
63
|
-
}
|
64
|
-
}
|
65
|
-
@deleted = {
|
66
|
-
type: 'DELETED',
|
67
|
-
object: {
|
68
|
-
metadata: {
|
69
|
-
name: 'deleteme',
|
70
|
-
uid: 'deleted_uid'
|
71
|
-
}
|
72
|
-
}
|
73
|
-
}
|
74
|
-
@error = {
|
75
|
-
type: 'ERROR',
|
76
|
-
object: {
|
77
|
-
message: 'some error message'
|
78
|
-
}
|
79
|
-
}
|
80
|
-
@gone = {
|
81
|
-
type: 'ERROR',
|
82
|
-
object: {
|
83
|
-
code: 410,
|
84
|
-
kind: 'Status',
|
85
|
-
message: 'too old resource version: 123 (391079)',
|
86
|
-
metadata: {
|
87
|
-
name: 'gone',
|
88
|
-
namespace: 'gone',
|
89
|
-
uid: 'gone_uid'
|
90
|
-
},
|
91
|
-
reason: 'Gone'
|
92
|
-
}
|
93
|
-
}
|
94
|
-
end
|
95
|
-
|
96
|
-
test 'namespace list caches namespaces' do
|
97
|
-
@client.stub :get_namespaces, @initial do
|
98
|
-
process_namespace_watcher_notices(start_namespace_watch)
|
99
|
-
assert_equal(true, @namespace_cache.key?('initial_uid'))
|
100
|
-
assert_equal(true, @namespace_cache.key?('modified_uid'))
|
101
|
-
assert_equal(2, @stats[:namespace_cache_host_updates])
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
test 'namespace list caches namespaces and watch updates' do
|
106
|
-
orig_env_val = ENV['K8S_NODE_NAME']
|
107
|
-
ENV['K8S_NODE_NAME'] = 'aNodeName'
|
108
|
-
@client.stub :get_namespaces, @initial do
|
109
|
-
@client.stub :watch_namespaces, [@modified] do
|
110
|
-
process_namespace_watcher_notices(start_namespace_watch)
|
111
|
-
assert_equal(2, @stats[:namespace_cache_host_updates])
|
112
|
-
assert_equal(1, @stats[:namespace_cache_watch_updates])
|
113
|
-
end
|
114
|
-
end
|
115
|
-
ENV['K8S_NODE_NAME'] = orig_env_val
|
116
|
-
end
|
117
|
-
|
118
|
-
test 'namespace watch ignores CREATED' do
|
119
|
-
@client.stub :watch_namespaces, [@created] do
|
120
|
-
process_namespace_watcher_notices(start_namespace_watch)
|
121
|
-
assert_equal(false, @namespace_cache.key?('created_uid'))
|
122
|
-
assert_equal(1, @stats[:namespace_cache_watch_ignored])
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
test 'namespace watch ignores MODIFIED when info not in cache' do
|
127
|
-
@client.stub :watch_namespaces, [@modified] do
|
128
|
-
process_namespace_watcher_notices(start_namespace_watch)
|
129
|
-
assert_equal(false, @namespace_cache.key?('modified_uid'))
|
130
|
-
assert_equal(1, @stats[:namespace_cache_watch_misses])
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
test 'namespace watch updates cache when MODIFIED is received and info is cached' do
|
135
|
-
@namespace_cache['modified_uid'] = {}
|
136
|
-
@client.stub :watch_namespaces, [@modified] do
|
137
|
-
process_namespace_watcher_notices(start_namespace_watch)
|
138
|
-
assert_equal(true, @namespace_cache.key?('modified_uid'))
|
139
|
-
assert_equal(1, @stats[:namespace_cache_watch_updates])
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
test 'namespace watch ignores DELETED' do
|
144
|
-
@namespace_cache['deleted_uid'] = {}
|
145
|
-
@client.stub :watch_namespaces, [@deleted] do
|
146
|
-
process_namespace_watcher_notices(start_namespace_watch)
|
147
|
-
assert_equal(true, @namespace_cache.key?('deleted_uid'))
|
148
|
-
assert_equal(1, @stats[:namespace_cache_watch_deletes_ignored])
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
test 'namespace watch raises Fluent::UnrecoverableError when cannot re-establish connection to k8s API server' do
|
153
|
-
# Stub start_namespace_watch to simulate initial successful connection to API server
|
154
|
-
stub(self).start_namespace_watch
|
155
|
-
# Stub watch_namespaces to simluate not being able to set up watch connection to API server
|
156
|
-
stub(@client).watch_namespaces { raise }
|
157
|
-
@client.stub :get_namespaces, @initial do
|
158
|
-
assert_raise Fluent::UnrecoverableError do
|
159
|
-
set_up_namespace_thread
|
160
|
-
end
|
161
|
-
end
|
162
|
-
assert_equal(3, @stats[:namespace_watch_failures])
|
163
|
-
assert_equal(2, Thread.current[:namespace_watch_retry_count])
|
164
|
-
assert_equal(4, Thread.current[:namespace_watch_retry_backoff_interval])
|
165
|
-
assert_nil(@stats[:namespace_watch_error_type_notices])
|
166
|
-
end
|
167
|
-
|
168
|
-
test 'namespace watch resets watch retry count when exceptions are encountered and connection to k8s API server is re-established' do
|
169
|
-
@client.stub :get_namespaces, @initial do
|
170
|
-
@client.stub :watch_namespaces, [[@created, @exception_raised]] do
|
171
|
-
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
172
|
-
# no unrecoverable error was thrown during this period of time.
|
173
|
-
assert_raise Timeout::Error.new('execution expired') do
|
174
|
-
Timeout.timeout(3) do
|
175
|
-
set_up_namespace_thread
|
176
|
-
end
|
177
|
-
end
|
178
|
-
assert_operator(@stats[:namespace_watch_failures], :>=, 3)
|
179
|
-
assert_operator(Thread.current[:namespace_watch_retry_count], :<=, 1)
|
180
|
-
assert_operator(Thread.current[:namespace_watch_retry_backoff_interval], :<=, 1)
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
test 'namespace watch resets watch retry count when error is received and connection to k8s API server is re-established' do
|
186
|
-
@client.stub :get_namespaces, @initial do
|
187
|
-
@client.stub :watch_namespaces, [@error] do
|
188
|
-
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
189
|
-
# no unrecoverable error was thrown during this period of time.
|
190
|
-
assert_raise Timeout::Error.new('execution expired') do
|
191
|
-
Timeout.timeout(3) do
|
192
|
-
set_up_namespace_thread
|
193
|
-
end
|
194
|
-
end
|
195
|
-
assert_operator(@stats[:namespace_watch_failures], :>=, 3)
|
196
|
-
assert_operator(Thread.current[:namespace_watch_retry_count], :<=, 1)
|
197
|
-
assert_operator(Thread.current[:namespace_watch_retry_backoff_interval], :<=, 1)
|
198
|
-
end
|
199
|
-
end
|
200
|
-
end
|
201
|
-
|
202
|
-
test 'namespace watch continues after retries succeed' do
|
203
|
-
@client.stub :get_namespaces, @initial do
|
204
|
-
@client.stub :watch_namespaces, [@modified, @error, @modified] do
|
205
|
-
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
206
|
-
# no unrecoverable error was thrown during this period of time.
|
207
|
-
assert_raise Timeout::Error.new('execution expired') do
|
208
|
-
Timeout.timeout(3) do
|
209
|
-
set_up_namespace_thread
|
210
|
-
end
|
211
|
-
end
|
212
|
-
assert_operator(@stats[:namespace_watch_failures], :>=, 3)
|
213
|
-
assert_operator(Thread.current[:namespace_watch_retry_count], :<=, 1)
|
214
|
-
assert_operator(Thread.current[:namespace_watch_retry_backoff_interval], :<=, 1)
|
215
|
-
assert_operator(@stats[:namespace_watch_error_type_notices], :>=, 3)
|
216
|
-
end
|
217
|
-
end
|
218
|
-
end
|
219
|
-
|
220
|
-
test 'namespace watch raises a GoneError when a 410 Gone error is received' do
|
221
|
-
@cache['gone_uid'] = {}
|
222
|
-
@client.stub :watch_namespaces, [@gone] do
|
223
|
-
assert_raise KubernetesMetadata::Common::GoneError do
|
224
|
-
process_namespace_watcher_notices(start_namespace_watch)
|
225
|
-
end
|
226
|
-
assert_equal(1, @stats[:namespace_watch_gone_notices])
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|
230
|
-
test 'namespace watch retries when 410 Gone errors are encountered' do
|
231
|
-
@client.stub :get_namespaces, @initial do
|
232
|
-
@client.stub :watch_namespaces, [@created, @gone, @modified] do
|
233
|
-
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
234
|
-
# no unrecoverable error was thrown during this period of time.
|
235
|
-
assert_raise Timeout::Error.new('execution expired') do
|
236
|
-
Timeout.timeout(3) do
|
237
|
-
set_up_namespace_thread
|
238
|
-
end
|
239
|
-
end
|
240
|
-
assert_operator(@stats[:namespace_watch_gone_errors], :>=, 3)
|
241
|
-
assert_operator(@stats[:namespace_watch_gone_notices], :>=, 3)
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
245
|
-
end
|
@@ -1,344 +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
|
-
require_relative 'watch_test'
|
23
|
-
|
24
|
-
class DefaultPodWatchStrategyTest < WatchTest
|
25
|
-
include KubernetesMetadata::WatchPods
|
26
|
-
|
27
|
-
setup do
|
28
|
-
@initial = {
|
29
|
-
kind: 'PodList',
|
30
|
-
metadata: { resourceVersion: '123' },
|
31
|
-
items: [
|
32
|
-
{
|
33
|
-
metadata: {
|
34
|
-
name: 'initial',
|
35
|
-
namespace: 'initial_ns',
|
36
|
-
uid: 'initial_uid',
|
37
|
-
labels: {}
|
38
|
-
},
|
39
|
-
spec: {
|
40
|
-
nodeName: 'aNodeName',
|
41
|
-
containers: [{
|
42
|
-
name: 'foo',
|
43
|
-
image: 'bar'
|
44
|
-
}, {
|
45
|
-
name: 'bar',
|
46
|
-
image: 'foo'
|
47
|
-
}]
|
48
|
-
},
|
49
|
-
status: {
|
50
|
-
podIP: '172.17.0.8'
|
51
|
-
}
|
52
|
-
},
|
53
|
-
{
|
54
|
-
metadata: {
|
55
|
-
name: 'modified',
|
56
|
-
namespace: 'create',
|
57
|
-
uid: 'modified_uid',
|
58
|
-
labels: {}
|
59
|
-
},
|
60
|
-
spec: {
|
61
|
-
nodeName: 'aNodeName',
|
62
|
-
containers: [{
|
63
|
-
name: 'foo',
|
64
|
-
image: 'bar'
|
65
|
-
}, {
|
66
|
-
name: 'bar',
|
67
|
-
image: 'foo'
|
68
|
-
}]
|
69
|
-
},
|
70
|
-
status: {
|
71
|
-
podIP: '172.17.0.8'
|
72
|
-
}
|
73
|
-
}
|
74
|
-
]
|
75
|
-
}
|
76
|
-
@created = {
|
77
|
-
type: 'CREATED',
|
78
|
-
object: {
|
79
|
-
metadata: {
|
80
|
-
name: 'created',
|
81
|
-
namespace: 'create',
|
82
|
-
uid: 'created_uid',
|
83
|
-
resourceVersion: '122',
|
84
|
-
labels: {}
|
85
|
-
},
|
86
|
-
spec: {
|
87
|
-
nodeName: 'aNodeName',
|
88
|
-
containers: [{
|
89
|
-
name: 'foo',
|
90
|
-
image: 'bar'
|
91
|
-
}, {
|
92
|
-
name: 'bar',
|
93
|
-
image: 'foo'
|
94
|
-
}]
|
95
|
-
},
|
96
|
-
status: {
|
97
|
-
podIP: '172.17.0.8'
|
98
|
-
}
|
99
|
-
}
|
100
|
-
}
|
101
|
-
@modified = {
|
102
|
-
type: 'MODIFIED',
|
103
|
-
object: {
|
104
|
-
metadata: {
|
105
|
-
name: 'foo',
|
106
|
-
namespace: 'modified',
|
107
|
-
uid: 'modified_uid',
|
108
|
-
resourceVersion: '123',
|
109
|
-
labels: {}
|
110
|
-
},
|
111
|
-
spec: {
|
112
|
-
nodeName: 'aNodeName',
|
113
|
-
containers: [{
|
114
|
-
name: 'foo',
|
115
|
-
image: 'bar'
|
116
|
-
}, {
|
117
|
-
name: 'bar',
|
118
|
-
image: 'foo'
|
119
|
-
}]
|
120
|
-
},
|
121
|
-
status: {
|
122
|
-
podIP: '172.17.0.8',
|
123
|
-
containerStatuses: [
|
124
|
-
{
|
125
|
-
name: 'fabric8-console-container',
|
126
|
-
state: {
|
127
|
-
running: {
|
128
|
-
startedAt: '2015-05-08T09:22:44Z'
|
129
|
-
}
|
130
|
-
},
|
131
|
-
lastState: {},
|
132
|
-
ready: true,
|
133
|
-
restartCount: 0,
|
134
|
-
image: 'fabric8/hawtio-kubernetes:latest',
|
135
|
-
imageID: 'docker://b2bd1a24a68356b2f30128e6e28e672c1ef92df0d9ec01ec0c7faea5d77d2303',
|
136
|
-
containerID: 'docker://49095a2894da899d3b327c5fde1e056a81376cc9a8f8b09a195f2a92bceed459'
|
137
|
-
}
|
138
|
-
]
|
139
|
-
}
|
140
|
-
}
|
141
|
-
}
|
142
|
-
@deleted = {
|
143
|
-
type: 'DELETED',
|
144
|
-
object: {
|
145
|
-
metadata: {
|
146
|
-
name: 'deleteme',
|
147
|
-
namespace: 'deleted',
|
148
|
-
uid: 'deleted_uid',
|
149
|
-
resourceVersion: '124'
|
150
|
-
}
|
151
|
-
}
|
152
|
-
}
|
153
|
-
@error = {
|
154
|
-
type: 'ERROR',
|
155
|
-
object: {
|
156
|
-
message: 'some error message'
|
157
|
-
}
|
158
|
-
}
|
159
|
-
@gone = {
|
160
|
-
type: 'ERROR',
|
161
|
-
object: {
|
162
|
-
code: 410,
|
163
|
-
kind: 'Status',
|
164
|
-
message: 'too old resource version: 123 (391079)',
|
165
|
-
metadata: {
|
166
|
-
name: 'gone',
|
167
|
-
namespace: 'gone',
|
168
|
-
uid: 'gone_uid'
|
169
|
-
},
|
170
|
-
reason: 'Gone'
|
171
|
-
}
|
172
|
-
}
|
173
|
-
end
|
174
|
-
|
175
|
-
test 'pod list caches pods' do
|
176
|
-
orig_env_val = ENV['K8S_NODE_NAME']
|
177
|
-
ENV['K8S_NODE_NAME'] = 'aNodeName'
|
178
|
-
@client.stub :get_pods, @initial do
|
179
|
-
process_pod_watcher_notices(start_pod_watch)
|
180
|
-
assert_equal(true, @cache.key?('initial_uid'))
|
181
|
-
assert_equal(true, @cache.key?('modified_uid'))
|
182
|
-
assert_equal(2, @stats[:pod_cache_host_updates])
|
183
|
-
end
|
184
|
-
ENV['K8S_NODE_NAME'] = orig_env_val
|
185
|
-
end
|
186
|
-
|
187
|
-
test 'pod list caches pods and watch updates' do
|
188
|
-
orig_env_val = ENV['K8S_NODE_NAME']
|
189
|
-
ENV['K8S_NODE_NAME'] = 'aNodeName'
|
190
|
-
@client.stub :get_pods, @initial do
|
191
|
-
@client.stub :watch_pods, [@modified] do
|
192
|
-
process_pod_watcher_notices(start_pod_watch)
|
193
|
-
assert_equal(2, @stats[:pod_cache_host_updates])
|
194
|
-
assert_equal(1, @stats[:pod_cache_watch_updates])
|
195
|
-
end
|
196
|
-
end
|
197
|
-
ENV['K8S_NODE_NAME'] = orig_env_val
|
198
|
-
assert_equal('123', @last_seen_resource_version) # from @modified
|
199
|
-
end
|
200
|
-
|
201
|
-
test 'pod watch notice ignores CREATED' do
|
202
|
-
@client.stub :get_pods, @initial do
|
203
|
-
@client.stub :watch_pods, [@created] do
|
204
|
-
process_pod_watcher_notices(start_pod_watch)
|
205
|
-
assert_equal(false, @cache.key?('created_uid'))
|
206
|
-
assert_equal(1, @stats[:pod_cache_watch_ignored])
|
207
|
-
end
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
test 'pod watch notice is ignored when info not cached and MODIFIED is received' do
|
212
|
-
@client.stub :watch_pods, [@modified] do
|
213
|
-
process_pod_watcher_notices(start_pod_watch)
|
214
|
-
assert_equal(false, @cache.key?('modified_uid'))
|
215
|
-
assert_equal(1, @stats[:pod_cache_watch_misses])
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
test 'pod MODIFIED cached when hostname matches' do
|
220
|
-
orig_env_val = ENV['K8S_NODE_NAME']
|
221
|
-
ENV['K8S_NODE_NAME'] = 'aNodeName'
|
222
|
-
@client.stub :watch_pods, [@modified] do
|
223
|
-
process_pod_watcher_notices(start_pod_watch)
|
224
|
-
assert_equal(true, @cache.key?('modified_uid'))
|
225
|
-
assert_equal(1, @stats[:pod_cache_host_updates])
|
226
|
-
end
|
227
|
-
ENV['K8S_NODE_NAME'] = orig_env_val
|
228
|
-
end
|
229
|
-
|
230
|
-
test 'pod watch notice is updated when MODIFIED is received' do
|
231
|
-
@cache['modified_uid'] = {}
|
232
|
-
@client.stub :watch_pods, [@modified] do
|
233
|
-
process_pod_watcher_notices(start_pod_watch)
|
234
|
-
assert_equal(true, @cache.key?('modified_uid'))
|
235
|
-
assert_equal(1, @stats[:pod_cache_watch_updates])
|
236
|
-
end
|
237
|
-
end
|
238
|
-
|
239
|
-
test 'pod watch notice is ignored when delete is received' do
|
240
|
-
@cache['deleted_uid'] = {}
|
241
|
-
@client.stub :watch_pods, [@deleted] do
|
242
|
-
process_pod_watcher_notices(start_pod_watch)
|
243
|
-
assert_equal(true, @cache.key?('deleted_uid'))
|
244
|
-
assert_equal(1, @stats[:pod_cache_watch_delete_ignored])
|
245
|
-
end
|
246
|
-
end
|
247
|
-
|
248
|
-
test 'pod watch raises Fluent::UnrecoverableError when cannot re-establish connection to k8s API server' do
|
249
|
-
# Stub start_pod_watch to simulate initial successful connection to API server
|
250
|
-
stub(self).start_pod_watch
|
251
|
-
# Stub watch_pods to simluate not being able to set up watch connection to API server
|
252
|
-
stub(@client).watch_pods { raise }
|
253
|
-
@client.stub :get_pods, @initial do
|
254
|
-
assert_raise Fluent::UnrecoverableError do
|
255
|
-
set_up_pod_thread
|
256
|
-
end
|
257
|
-
end
|
258
|
-
assert_equal(3, @stats[:pod_watch_failures])
|
259
|
-
assert_equal(2, Thread.current[:pod_watch_retry_count])
|
260
|
-
assert_equal(4, Thread.current[:pod_watch_retry_backoff_interval])
|
261
|
-
assert_nil(@stats[:pod_watch_error_type_notices])
|
262
|
-
end
|
263
|
-
|
264
|
-
test 'pod watch resets watch retry count when exceptions are encountered and connection to k8s API server is re-established' do
|
265
|
-
@client.stub :get_pods, @initial do
|
266
|
-
@client.stub :watch_pods, [[@created, @exception_raised]] do
|
267
|
-
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
268
|
-
# no unrecoverable error was thrown during this period of time.
|
269
|
-
assert_raise Timeout::Error.new('execution expired') do
|
270
|
-
Timeout.timeout(3) do
|
271
|
-
set_up_pod_thread
|
272
|
-
end
|
273
|
-
end
|
274
|
-
assert_operator(@stats[:pod_watch_failures], :>=, 3)
|
275
|
-
assert_operator(Thread.current[:pod_watch_retry_count], :<=, 1)
|
276
|
-
assert_operator(Thread.current[:pod_watch_retry_backoff_interval], :<=, 1)
|
277
|
-
end
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
|
-
test 'pod watch resets watch retry count when error is received and connection to k8s API server is re-established' do
|
282
|
-
@client.stub :get_pods, @initial do
|
283
|
-
@client.stub :watch_pods, [@error] do
|
284
|
-
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
285
|
-
# no unrecoverable error was thrown during this period of time.
|
286
|
-
assert_raise Timeout::Error.new('execution expired') do
|
287
|
-
Timeout.timeout(3) do
|
288
|
-
set_up_pod_thread
|
289
|
-
end
|
290
|
-
end
|
291
|
-
assert_operator(@stats[:pod_watch_failures], :>=, 3)
|
292
|
-
assert_operator(Thread.current[:pod_watch_retry_count], :<=, 1)
|
293
|
-
assert_operator(Thread.current[:pod_watch_retry_backoff_interval], :<=, 1)
|
294
|
-
assert_operator(@stats[:pod_watch_error_type_notices], :>=, 3)
|
295
|
-
end
|
296
|
-
end
|
297
|
-
end
|
298
|
-
|
299
|
-
test 'pod watch continues after retries succeed' do
|
300
|
-
@client.stub :get_pods, @initial do
|
301
|
-
@client.stub :watch_pods, [@modified, @error, @modified] do
|
302
|
-
# Force the infinite watch loop to exit after 3 seconds. Verifies that
|
303
|
-
# no unrecoverable error was thrown during this period of time.
|
304
|
-
assert_raise Timeout::Error.new('execution expired') do
|
305
|
-
Timeout.timeout(3) do
|
306
|
-
set_up_pod_thread
|
307
|
-
end
|
308
|
-
end
|
309
|
-
assert_operator(@stats[:pod_watch_failures], :>=, 3)
|
310
|
-
assert_operator(Thread.current[:pod_watch_retry_count], :<=, 1)
|
311
|
-
assert_operator(Thread.current[:pod_watch_retry_backoff_interval], :<=, 1)
|
312
|
-
assert_operator(@stats[:pod_watch_error_type_notices], :>=, 3)
|
313
|
-
end
|
314
|
-
end
|
315
|
-
end
|
316
|
-
|
317
|
-
test 'pod watch raises a GoneError when a 410 Gone error is received' do
|
318
|
-
@cache['gone_uid'] = {}
|
319
|
-
@client.stub :watch_pods, [@gone] do
|
320
|
-
@last_seen_resource_version = '100'
|
321
|
-
assert_raise KubernetesMetadata::Common::GoneError do
|
322
|
-
process_pod_watcher_notices(start_pod_watch)
|
323
|
-
end
|
324
|
-
assert_equal(1, @stats[:pod_watch_gone_notices])
|
325
|
-
assert_nil @last_seen_resource_version # forced restart
|
326
|
-
end
|
327
|
-
end
|
328
|
-
|
329
|
-
test 'pod watch retries when 410 Gone errors are encountered' do
|
330
|
-
@client.stub :get_pods, @initial do
|
331
|
-
@client.stub :watch_pods, [@created, @gone, @modified] do
|
332
|
-
# Force the infinite watch loop to exit after 3 seconds because the code sleeps 3 times.
|
333
|
-
# Verifies that no unrecoverable error was thrown during this period of time.
|
334
|
-
assert_raise Timeout::Error.new('execution expired') do
|
335
|
-
Timeout.timeout(3) do
|
336
|
-
set_up_pod_thread
|
337
|
-
end
|
338
|
-
end
|
339
|
-
assert_operator(@stats[:pod_watch_gone_errors], :>=, 3)
|
340
|
-
assert_operator(@stats[:pod_watch_gone_notices], :>=, 3)
|
341
|
-
end
|
342
|
-
end
|
343
|
-
end
|
344
|
-
end
|
data/test/plugin/watch_test.rb
DELETED
@@ -1,76 +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 WatchTest < Test::Unit::TestCase
|
24
|
-
def thread_current_running?
|
25
|
-
true
|
26
|
-
end
|
27
|
-
|
28
|
-
setup do
|
29
|
-
@annotations_regexps = []
|
30
|
-
@namespace_cache = {}
|
31
|
-
@watch_retry_max_times = 2
|
32
|
-
@watch_retry_interval = 1
|
33
|
-
@watch_retry_exponential_backoff_base = 2
|
34
|
-
@cache = {}
|
35
|
-
@stats = KubernetesMetadata::Stats.new
|
36
|
-
Thread.current[:pod_watch_retry_count] = 0
|
37
|
-
Thread.current[:namespace_watch_retry_count] = 0
|
38
|
-
|
39
|
-
@client = OpenStruct.new
|
40
|
-
def @client.watch_pods(_options = {})
|
41
|
-
[]
|
42
|
-
end
|
43
|
-
|
44
|
-
def @client.watch_namespaces(_options = {})
|
45
|
-
[]
|
46
|
-
end
|
47
|
-
|
48
|
-
def @client.get_namespaces(_options = {})
|
49
|
-
{ items: [], metadata: { resourceVersion: '12345' } }
|
50
|
-
end
|
51
|
-
|
52
|
-
def @client.get_pods(_options = {})
|
53
|
-
{ items: [], metadata: { resourceVersion: '12345' } }
|
54
|
-
end
|
55
|
-
|
56
|
-
@exception_raised = :blow_up_when_used
|
57
|
-
end
|
58
|
-
|
59
|
-
def watcher=(value)
|
60
|
-
end
|
61
|
-
|
62
|
-
def log
|
63
|
-
logger = {}
|
64
|
-
def logger.debug(message)
|
65
|
-
end
|
66
|
-
|
67
|
-
def logger.info(message, error)
|
68
|
-
end
|
69
|
-
|
70
|
-
def logger.error(message, error)
|
71
|
-
end
|
72
|
-
def logger.warn(message)
|
73
|
-
end
|
74
|
-
logger
|
75
|
-
end
|
76
|
-
end
|