fluent-plugin-kubernetes_metadata_filter 3.7.0 → 3.7.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -18,14 +18,17 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
+
21
22
  module KubernetesMetadata
22
23
  module CacheStrategy
23
- def get_pod_metadata(key, namespace_name, pod_name, time, batch_miss_cache)
24
+ def get_pod_metadata(key, namespace_name, pod_name, time, batch_miss_cache) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
24
25
  metadata = {}
25
26
  ids = @id_cache[key]
26
27
  if ids.nil?
27
28
  @stats.bump(:id_cache_miss)
28
- return batch_miss_cache["#{namespace_name}_#{pod_name}"] if batch_miss_cache.key?("#{namespace_name}_#{pod_name}")
29
+ if batch_miss_cache.key?("#{namespace_name}_#{pod_name}")
30
+ return batch_miss_cache["#{namespace_name}_#{pod_name}"]
31
+ end
29
32
 
30
33
  pod_metadata = fetch_pod_metadata(namespace_name, pod_name)
31
34
  if @skip_namespace_metadata
@@ -33,27 +36,27 @@ module KubernetesMetadata
33
36
  @id_cache[key] = ids
34
37
  return pod_metadata
35
38
  end
39
+
36
40
  namespace_metadata = fetch_namespace_metadata(namespace_name)
37
41
  ids = { pod_id: pod_metadata['pod_id'], namespace_id: namespace_metadata['namespace_id'] }
38
42
  if !ids[:pod_id].nil? && !ids[:namespace_id].nil?
39
43
  # pod found and namespace found
40
- metadata = pod_metadata
41
- metadata.merge!(namespace_metadata)
44
+ metadata = pod_metadata.merge(namespace_metadata)
42
45
  else
43
- if ids[:pod_id].nil? && !ids[:namespace_id].nil?
46
+ if ids[:pod_id].nil? && !ids[:namespace_id].nil? # rubocop:disable Style/IfInsideElse
44
47
  # pod not found, but namespace found
45
48
  @stats.bump(:id_cache_pod_not_found_namespace)
46
49
  ns_time = Time.parse(namespace_metadata['creation_timestamp'])
47
- if ns_time <= Time.at(time.to_f)
50
+ if ns_time <= Time.at(time.to_f) # rubocop:disable Metrics/BlockNesting
48
51
  # namespace is older then record for pod
49
52
  ids[:pod_id] = key
50
53
  metadata = @cache.fetch(ids[:pod_id]) do
51
54
  { 'pod_id' => ids[:pod_id] }
52
55
  end
53
56
  end
54
- metadata.merge!(namespace_metadata)
57
+ metadata = metadata.merge(namespace_metadata)
55
58
  else
56
- if !ids[:pod_id].nil? && ids[:namespace_id].nil?
59
+ if !ids[:pod_id].nil? && ids[:namespace_id].nil? # rubocop:disable Metrics/BlockNesting
57
60
  # pod found, but namespace NOT found
58
61
  # this should NEVER be possible since pod meta can
59
62
  # only be retrieved with a namespace
@@ -62,7 +65,7 @@ module KubernetesMetadata
62
65
  # nothing found
63
66
  @stats.bump(:id_cache_orphaned_record)
64
67
  end
65
- if @allow_orphans
68
+ if @allow_orphans # rubocop:disable Metrics/BlockNesting
66
69
  log.trace("orphaning message for: #{namespace_name}/#{pod_name} ")
67
70
  metadata = {
68
71
  'orphaned_namespace' => namespace_name,
@@ -83,13 +86,14 @@ module KubernetesMetadata
83
86
  m = fetch_pod_metadata(namespace_name, pod_name)
84
87
  m.nil? || m.empty? ? { 'pod_id' => ids[:pod_id] } : m
85
88
  end
86
- metadata.merge!(@namespace_cache.fetch(ids[:namespace_id]) do
89
+ namespace_metadata = @namespace_cache.fetch(ids[:namespace_id]) do
87
90
  m = unless @skip_namespace_metadata
88
91
  @stats.bump(:namespace_cache_miss)
89
92
  fetch_namespace_metadata(namespace_name)
90
93
  end
91
94
  m.nil? || m.empty? ? { 'namespace_id' => ids[:namespace_id] } : m
92
- end)
95
+ end
96
+ metadata = metadata.merge(namespace_metadata)
93
97
  end
94
98
 
95
99
  # remove namespace info that is only used for comparison
@@ -18,6 +18,7 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
+
21
22
  module KubernetesMetadata
22
23
  module Common
23
24
  class GoneError < StandardError
@@ -30,18 +31,15 @@ module KubernetesMetadata
30
31
  result = {}
31
32
  @annotations_regexps.each do |regexp|
32
33
  annotations.each do |key, value|
33
- if ::Fluent::StringUtil.match_regexp(regexp, key.to_s)
34
- result[key] = value
35
- end
34
+ result[key] = value if ::Fluent::StringUtil.match_regexp(regexp, key.to_s)
36
35
  end
37
36
  end
38
37
  result
39
38
  end
40
39
 
41
- def parse_namespace_metadata(namespace_object)
40
+ def parse_namespace_metadata(namespace_object) # rubocop:disable Metrics/AbcSize
42
41
  labels = ''
43
- labels = syms_to_strs(namespace_object[:metadata][:labels].to_h) unless (@skip_labels || @skip_namespace_labels)
44
-
42
+ labels = syms_to_strs(namespace_object[:metadata][:labels].to_h) unless @skip_labels || @skip_namespace_labels
45
43
  annotations = match_annotations(syms_to_strs(namespace_object[:metadata][:annotations].to_h))
46
44
 
47
45
  kubernetes_metadata = {
@@ -53,46 +51,48 @@ module KubernetesMetadata
53
51
  kubernetes_metadata
54
52
  end
55
53
 
56
- def parse_pod_metadata(pod_object)
54
+ def parse_pod_metadata(pod_object) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
57
55
  labels = ''
58
- labels = syms_to_strs(pod_object[:metadata][:labels].to_h) unless (@skip_labels || @skip_pod_labels)
59
-
56
+ labels = syms_to_strs(pod_object[:metadata][:labels].to_h) unless @skip_labels || @skip_pod_labels
60
57
  annotations = match_annotations(syms_to_strs(pod_object[:metadata][:annotations].to_h))
61
58
 
62
59
  # collect container information
63
60
  container_meta = {}
64
61
  begin
65
- pod_object[:status][:containerStatuses].each do |container_status|
66
- container_id = (container_status[:containerID]||"").sub(%r{^[-_a-zA-Z0-9]+://}, '')
67
- key = container_status[:name]
68
- container_meta[key] = if @skip_container_metadata
69
- {
70
- 'name' => container_status[:name]
71
- }
72
- else
73
- {
74
- 'name' => container_status[:name],
75
- 'image' => container_status[:image],
76
- 'image_id' => container_status[:imageID],
77
- :containerID => container_id
78
- }
79
- end
80
- end if pod_object[:status] && pod_object[:status][:containerStatuses]
81
- rescue StandardError=>e
82
- log.warn("parsing container meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]}: #{e}")
62
+ if pod_object[:status] && pod_object[:status][:containerStatuses]
63
+ pod_object[:status][:containerStatuses].each do |container_status|
64
+ container_id = (container_status[:containerID] || '').sub(%r{^[-_a-zA-Z0-9]+://}, '')
65
+ key = container_status[:name]
66
+ container_meta[key] = if @skip_container_metadata
67
+ {
68
+ 'name' => container_status[:name]
69
+ }
70
+ else
71
+ {
72
+ 'name' => container_status[:name],
73
+ 'image' => container_status[:image],
74
+ 'image_id' => container_status[:imageID],
75
+ :containerID => container_id
76
+ }
77
+ end
78
+ end
79
+ end
80
+ rescue StandardError => e
81
+ log.warn("parsing container meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]}: #{e}") # rubocop:disable Layout/LineLength
83
82
  end
84
83
 
85
84
  ownerrefs_meta = []
86
- begin
87
- pod_object[:metadata][:ownerReferences].each do |owner_reference|
88
- ownerrefs_meta.append({
89
- 'kind' => owner_reference[:kind],
90
- 'name' => owner_reference[:name]
91
- })
85
+ if @include_ownerrefs_metadata && pod_object[:metadata][:ownerReferences]
86
+ begin
87
+ pod_object[:metadata][:ownerReferences].each do |owner_reference|
88
+ ownerrefs_meta.append({ 'kind' => owner_reference[:kind], 'name' => owner_reference[:name] })
89
+ end
90
+ rescue StandardError => e
91
+ log.warn(
92
+ "parsing ownerrefs meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]}: #{e}" # rubocop:disable Layout/LineLength
93
+ )
92
94
  end
93
- rescue StandardError => e
94
- log.warn("parsing ownerrefs meta information failed for: #{pod_object[:metadata][:namespace]}/#{pod_object[:metadata][:name]}: #{e}")
95
- end if @include_ownerrefs_metadata && pod_object[:metadata][:ownerReferences]
95
+ end
96
96
 
97
97
  kubernetes_metadata = {
98
98
  'namespace_name' => pod_object[:metadata][:namespace],
@@ -103,8 +103,8 @@ module KubernetesMetadata
103
103
  'host' => pod_object[:spec][:nodeName],
104
104
  'ownerrefs' => (ownerrefs_meta if @include_ownerrefs_metadata)
105
105
  }.compact
106
- kubernetes_metadata['annotations'] = annotations unless annotations.empty?
107
106
  kubernetes_metadata['labels'] = labels unless labels.empty?
107
+ kubernetes_metadata['annotations'] = annotations unless annotations.empty?
108
108
  kubernetes_metadata['master_url'] = @kubernetes_url unless @skip_master_url
109
109
  kubernetes_metadata
110
110
  end
@@ -112,9 +112,7 @@ module KubernetesMetadata
112
112
  def syms_to_strs(hsh)
113
113
  newhsh = {}
114
114
  hsh.each_pair do |kk, vv|
115
- if vv.is_a?(Hash)
116
- vv = syms_to_strs(vv)
117
- end
115
+ vv = syms_to_strs(vv) if vv.is_a?(Hash)
118
116
  if kk.is_a?(Symbol)
119
117
  newhsh[kk.to_s] = vv
120
118
  else
@@ -18,7 +18,9 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
+
21
22
  require 'lru_redux'
23
+
22
24
  module KubernetesMetadata
23
25
  class Stats
24
26
  def initialize
@@ -38,15 +40,11 @@ module KubernetesMetadata
38
40
  end
39
41
 
40
42
  def to_s
41
- 'stats - ' + [].tap do |a|
42
- @stats.each { |k, v| a << "#{k}: #{v}" }
43
- end.join(', ')
43
+ "stats - #{@stats.to_a.map { |k, v| "#{k}: #{v}" }.join(', ')}"
44
44
  end
45
45
  end
46
- class NoOpStats
47
- def initialize
48
- end
49
46
 
47
+ class NoOpStats
50
48
  def bump(key)
51
49
  end
52
50
 
@@ -18,51 +18,54 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
+
21
22
  require 'kubeclient'
22
23
 
23
24
  module KubernetesMetadata
24
- module TestApiAdapter
25
-
26
- def api_valid?
27
- true
28
- end
29
- def get_namespace(namespace_name, unused, options)
30
- return {
31
- metadata: {
32
- name: namespace_name,
33
- uid: namespace_name + 'uuid',
34
- labels: {
35
- foo_ns: 'bar_ns'
36
- }
25
+ module TestApiAdapter
26
+ def api_valid?
27
+ true
28
+ end
29
+
30
+ def get_namespace(namespace_name, _unused, _options)
31
+ {
32
+ metadata: {
33
+ name: namespace_name,
34
+ uid: "#{namespace_name}uuid",
35
+ labels: {
36
+ foo_ns: 'bar_ns'
37
37
  }
38
38
  }
39
- end
39
+ }
40
+ end
40
41
 
41
- def get_pod(pod_name, namespace_name, options)
42
- return {
43
- metadata: {
44
- name: pod_name,
45
- namespace: namespace_name,
46
- uid: namespace_name + namespace_name + "uuid",
47
- labels: {
48
- foo: 'bar'
49
- }
50
- },
51
- spec: {
52
- nodeName: 'aNodeName',
53
- containers: [{
42
+ def get_pod(pod_name, namespace_name, _options) # rubocop:disable Metrics/MethodLength
43
+ {
44
+ metadata: {
45
+ name: pod_name,
46
+ namespace: namespace_name,
47
+ uid: "#{namespace_name}#{namespace_name}uuid",
48
+ labels: {
49
+ foo: 'bar'
50
+ }
51
+ },
52
+ spec: {
53
+ nodeName: 'aNodeName',
54
+ containers: [
55
+ {
54
56
  name: 'foo',
55
57
  image: 'bar'
56
- }, {
58
+ },
59
+ {
57
60
  name: 'bar',
58
61
  image: 'foo'
59
- }]
60
- },
61
- status: {
62
- podIP: '172.17.0.8'
63
- }
62
+ }
63
+ ]
64
+ },
65
+ status: {
66
+ podIP: '172.17.0.8'
64
67
  }
65
- end
66
-
68
+ }
67
69
  end
68
- end
70
+ end
71
+ end
@@ -18,14 +18,15 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
+
21
22
  # TODO: this is mostly copy-paste from kubernetes_metadata_watch_pods.rb unify them
22
23
  require_relative 'kubernetes_metadata_common'
23
24
 
24
25
  module KubernetesMetadata
25
- module WatchNamespaces
26
+ module WatchNamespaces # rubocop:disable Metrics/ModuleLength
26
27
  include ::KubernetesMetadata::Common
27
28
 
28
- def set_up_namespace_thread
29
+ def set_up_namespace_thread # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
29
30
  # Any failures / exceptions in the initial setup should raise
30
31
  # Fluent:ConfigError, so that users can inspect potential errors in
31
32
  # the configuration.
@@ -37,7 +38,7 @@ module KubernetesMetadata
37
38
  # processing will be swallowed and retried. These failures /
38
39
  # exceptions could be caused by Kubernetes API being temporarily
39
40
  # down. We assume the configuration is correct at this point.
40
- loop do
41
+ loop do # rubocop:disable Metrics/BlockLength
41
42
  namespace_watcher ||= get_namespaces_and_start_watcher
42
43
  process_namespace_watcher_notices(namespace_watcher)
43
44
  rescue GoneError => e
@@ -50,7 +51,7 @@ module KubernetesMetadata
50
51
  if e.error_code == 401
51
52
  # recreate client to refresh token
52
53
  log.info("Encountered '401 Unauthorized' exception in watch, recreating client to refresh token")
53
- create_client()
54
+ create_client
54
55
  namespace_watcher = nil
55
56
  else
56
57
  # treat all other errors the same as StandardError, log, swallow and reset
@@ -62,7 +63,8 @@ module KubernetesMetadata
62
63
  'Exception encountered parsing namespace watch event. ' \
63
64
  'The connection might have been closed. Sleeping for ' \
64
65
  "#{Thread.current[:namespace_watch_retry_backoff_interval]} " \
65
- 'seconds and resetting the namespace watcher.', e
66
+ 'seconds and resetting the namespace watcher.',
67
+ e
66
68
  )
67
69
  sleep(Thread.current[:namespace_watch_retry_backoff_interval])
68
70
  Thread.current[:namespace_watch_retry_count] += 1
@@ -88,7 +90,8 @@ module KubernetesMetadata
88
90
  'Exception encountered parsing namespace watch event. ' \
89
91
  'The connection might have been closed. Sleeping for ' \
90
92
  "#{Thread.current[:namespace_watch_retry_backoff_interval]} " \
91
- 'seconds and resetting the namespace watcher.', e
93
+ 'seconds and resetting the namespace watcher.',
94
+ e
92
95
  )
93
96
  sleep(Thread.current[:namespace_watch_retry_backoff_interval])
94
97
  Thread.current[:namespace_watch_retry_count] += 1
@@ -121,11 +124,11 @@ module KubernetesMetadata
121
124
 
122
125
  # List all namespaces, record the resourceVersion and return a watcher
123
126
  # starting from that resourceVersion.
124
- def get_namespaces_and_start_watcher
127
+ def get_namespaces_and_start_watcher # rubocop:disable Metrics/MethodLength, Naming/AccessorMethodName
125
128
  options = {
126
129
  resource_version: '0' # Fetch from API server cache instead of etcd quorum read
127
130
  }
128
- namespaces = @client.get_namespaces(options)
131
+ namespaces = @client.get_namespaces(**options)
129
132
  namespaces[:items].each do |namespace|
130
133
  cache_key = namespace[:metadata][:uid]
131
134
  @namespace_cache[cache_key] = parse_namespace_metadata(namespace)
@@ -135,7 +138,7 @@ module KubernetesMetadata
135
138
  # continue watching from most recent resourceVersion
136
139
  options[:resource_version] = namespaces[:metadata][:resourceVersion]
137
140
 
138
- watcher = @client.watch_namespaces(options)
141
+ watcher = @client.watch_namespaces(**options)
139
142
  reset_namespace_watch_retry_stats
140
143
  watcher
141
144
  end
@@ -148,13 +151,13 @@ module KubernetesMetadata
148
151
  end
149
152
 
150
153
  # Process a watcher notice and potentially raise an exception.
151
- def process_namespace_watcher_notices(watcher)
152
- watcher.each do |notice|
154
+ def process_namespace_watcher_notices(watcher) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
155
+ watcher.each do |notice| # rubocop:disable Metrics/BlockLength
153
156
  case notice[:type]
154
157
  when 'MODIFIED'
155
158
  reset_namespace_watch_retry_stats
156
159
  cache_key = notice[:object][:metadata][:uid]
157
- cached = @namespace_cache[cache_key]
160
+ cached = @namespace_cache[cache_key]
158
161
  if cached
159
162
  @namespace_cache[cache_key] = parse_namespace_metadata(notice[:object])
160
163
  @stats.bump(:namespace_cache_watch_updates)
@@ -18,14 +18,15 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
  #
21
+
21
22
  # TODO: this is mostly copy-paste from kubernetes_metadata_watch_namespaces.rb unify them
22
23
  require_relative 'kubernetes_metadata_common'
23
24
 
24
25
  module KubernetesMetadata
25
- module WatchPods
26
+ module WatchPods # rubocop:disable Metrics/ModuleLength
26
27
  include ::KubernetesMetadata::Common
27
28
 
28
- def set_up_pod_thread
29
+ def set_up_pod_thread # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
29
30
  # Any failures / exceptions in the initial setup should raise
30
31
  # Fluent:ConfigError, so that users can inspect potential errors in
31
32
  # the configuration.
@@ -38,7 +39,7 @@ module KubernetesMetadata
38
39
  # processing will be swallowed and retried. These failures /
39
40
  # exceptions could be caused by Kubernetes API being temporarily
40
41
  # down. We assume the configuration is correct at this point.
41
- loop do
42
+ loop do # rubocop:disable Metrics/BlockLength
42
43
  pod_watcher ||= get_pods_and_start_watcher
43
44
  process_pod_watcher_notices(pod_watcher)
44
45
  rescue GoneError => e
@@ -51,7 +52,7 @@ module KubernetesMetadata
51
52
  if e.error_code == 401
52
53
  # recreate client to refresh token
53
54
  log.info("Encountered '401 Unauthorized' exception in watch, recreating client to refresh token")
54
- create_client()
55
+ create_client
55
56
  pod_watcher = nil
56
57
  else
57
58
  # treat all other errors the same as StandardError, log, swallow and reset
@@ -63,7 +64,8 @@ module KubernetesMetadata
63
64
  'Exception encountered parsing pod watch event. The ' \
64
65
  'connection might have been closed. Sleeping for ' \
65
66
  "#{Thread.current[:pod_watch_retry_backoff_interval]} " \
66
- 'seconds and resetting the pod watcher.', e
67
+ 'seconds and resetting the pod watcher.',
68
+ e
67
69
  )
68
70
  sleep(Thread.current[:pod_watch_retry_backoff_interval])
69
71
  Thread.current[:pod_watch_retry_count] += 1
@@ -89,7 +91,8 @@ module KubernetesMetadata
89
91
  'Exception encountered parsing pod watch event. The ' \
90
92
  'connection might have been closed. Sleeping for ' \
91
93
  "#{Thread.current[:pod_watch_retry_backoff_interval]} " \
92
- 'seconds and resetting the pod watcher.', e
94
+ 'seconds and resetting the pod watcher.',
95
+ e
93
96
  )
94
97
  sleep(Thread.current[:pod_watch_retry_backoff_interval])
95
98
  Thread.current[:pod_watch_retry_count] += 1
@@ -122,17 +125,15 @@ module KubernetesMetadata
122
125
 
123
126
  # List all pods, record the resourceVersion and return a watcher starting
124
127
  # from that resourceVersion.
125
- def get_pods_and_start_watcher
128
+ def get_pods_and_start_watcher # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Naming/AccessorMethodName
126
129
  options = {
127
130
  resource_version: '0' # Fetch from API server cache instead of etcd quorum read
128
131
  }
129
- if ENV['K8S_NODE_NAME']
130
- options[:field_selector] = 'spec.nodeName=' + ENV['K8S_NODE_NAME']
131
- end
132
+ options[:field_selector] = "spec.nodeName=#{ENV['K8S_NODE_NAME']}" if ENV['K8S_NODE_NAME']
132
133
  if @last_seen_resource_version
133
134
  options[:resource_version] = @last_seen_resource_version
134
135
  else
135
- pods = @client.get_pods(options)
136
+ pods = @client.get_pods(**options)
136
137
  pods[:items].each do |pod|
137
138
  cache_key = pod[:metadata][:uid]
138
139
  @cache[cache_key] = parse_pod_metadata(pod)
@@ -143,7 +144,7 @@ module KubernetesMetadata
143
144
  options[:resource_version] = pods[:metadata][:resourceVersion]
144
145
  end
145
146
 
146
- watcher = @client.watch_pods(options)
147
+ watcher = @client.watch_pods(**options)
147
148
  reset_pod_watch_retry_stats
148
149
  watcher
149
150
  end
@@ -156,19 +157,19 @@ module KubernetesMetadata
156
157
  end
157
158
 
158
159
  # Process a watcher notice and potentially raise an exception.
159
- def process_pod_watcher_notices(watcher)
160
- watcher.each do |notice|
160
+ def process_pod_watcher_notices(watcher) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
161
+ watcher.each do |notice| # rubocop:disable Metrics/BlockLength
161
162
  # store version we processed to not reprocess it ... do not unset when there is no version in response
162
- version = ( # TODO: replace with &.dig once we are on ruby 2.5+
163
+ version = # TODO: replace with &.dig once we are on ruby 2.5+
163
164
  notice[:object] && notice[:object][:metadata] && notice[:object][:metadata][:resourceVersion]
164
- )
165
+
165
166
  @last_seen_resource_version = version if version
166
167
 
167
168
  case notice[:type]
168
169
  when 'MODIFIED'
169
170
  reset_pod_watch_retry_stats
170
171
  cache_key = notice.dig(:object, :metadata, :uid)
171
- cached = @cache[cache_key]
172
+ cached = @cache[cache_key]
172
173
  if cached
173
174
  @cache[cache_key] = parse_pod_metadata(notice[:object])
174
175
  @stats.bump(:pod_cache_watch_updates)