sensu-plugins-kubernetes-reactiveops 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 25b537379f6e02c1eeddab70d94520a43616d6c1
4
+ data.tar.gz: bccba5e6690207a3b3bb71d5ec1427e3ac1303e0
5
+ SHA512:
6
+ metadata.gz: 4f4673f8517e188270b429baf4a4f922359153a13dbe093e7b170ed0321c1873881aa6f40bfce8e3877babc02c03186da7c0e976dc8974fc7b259e6a660bf48b
7
+ data.tar.gz: 5f501632b0e28e4a12500effa1ed51aa7602c3e0abcbe788112540e4b45655050fe13d7a515ad809018e367cff844654f03c2b420b8a6693b9788113923177d2
@@ -0,0 +1,50 @@
1
+ #Change Log
2
+ This project adheres to [Semantic Versioning](http://semver.org/).
3
+
4
+ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
5
+
6
+ ## [Unreleased]
7
+ ### Added
8
+ - Added metrics-pods.rb that will output the number of running pods per service
9
+ - Added check-kube-pods-running check
10
+ - Split check-kube-pods-pending into two checks; the original still checks for
11
+ pending pods, the restart count portion has been split into it's own check.
12
+
13
+ ## [0.1.2] - 2016-08-07
14
+ ### Fixed
15
+ - check-kube-service-available.rb: fixed error caused by misspelling of true boolean (@justinhammar)
16
+
17
+ ### Changed
18
+ - check-kube-pods-pending.rb: Add namespace to output (@ajohnstone)
19
+ - check-kube-service-available.rb: Add namespace to output (@ajohnstone)
20
+ - pin `activesupport` to `< 5.0.0` to maintain compatability with Ruby < 2.2 (@eheydrick)
21
+
22
+ ## [0.1.1] - 2016-05-17
23
+ ### Fixed
24
+ - cli.rb: Fixed typo in critical call
25
+
26
+ ## [0.1.0] - 2016-05-15
27
+ ### Added
28
+ - Added flag to ignore namespaces in check-kube-pods-pending
29
+ - check-kube-service-available.rb: Will not mark a service as failed if any needed pod is running and ready
30
+ - check-kube-service-available.rb: Added options to allow of pod pending for given time to be counted as valid
31
+ - Factored all checks to share a common base class for connecting to Kubernetes
32
+ - Added flags to specify certificate authority and Kubernetes bearer token
33
+ - Added flags to specify client certificate/key and in-cluster support
34
+ - Support for Ruby 2.3
35
+
36
+ ### Fixed
37
+ - check-kube-service-available.rb: Fixed scope issue in main block that would cause a nil error
38
+
39
+ ### Changed
40
+ - Update to Rubocop 0.40 and cleanup
41
+ - Update to kubeclient 1.1.3
42
+
43
+ ## 0.0.1 - 2016-03-03
44
+ ### Added
45
+ - initial release
46
+
47
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-kubernetes/compare/0.1.2...HEAD
48
+ [0.1.2]: https://github.com/sensu-plugins/sensu-plugins-kubernetes/compare/0.1.1...0.1.2
49
+ [0.1.1]: https://github.com/sensu-plugins/sensu-plugins-kubernetes/compare/0.1.0...0.1.1
50
+ [0.1.0]: https://github.com/sensu-plugins/sensu-plugins-kubernetes/compare/0.0.1...0.1.0
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Sensu Community Plugins
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,229 @@
1
+ ## Sensu-Plugins-kubernetes
2
+
3
+ [![Build Status](https://travis-ci.org/sensu-plugins/sensu-plugins-kubernetes.svg?branch=master)](https://travis-ci.org/sensu-plugins/sensu-plugins-kubernetes)
4
+ [![Gem Version](https://badge.fury.io/rb/sensu-plugins-kubernetes.svg)](http://badge.fury.io/rb/sensu-plugins-kubernetes)
5
+ [![Code Climate](https://codeclimate.com/github/sensu-plugins/sensu-plugins-kubernetes/badges/gpa.svg)](https://codeclimate.com/github/sensu-plugins/sensu-plugins-kubernetes)
6
+ [![Test Coverage](https://codeclimate.com/github/sensu-plugins/sensu-plugins-kubernetes/badges/coverage.svg)](https://codeclimate.com/github/sensu-plugins/sensu-plugins-kubernetes)
7
+ [![Dependency Status](https://gemnasium.com/sensu-plugins/sensu-plugins-kubernetes.svg)](https://gemnasium.com/sensu-plugins/sensu-plugins-kubernetes)
8
+
9
+ ## Functionality
10
+ This provides functionality to check node and pod status as well as api and service availability.
11
+
12
+ ## Files
13
+ - bin/check-kube-nodes-ready.rb
14
+ - bin/check-kube-apiserver-available.rb
15
+ - bin/check-kube-pods-pending.rb
16
+ - bin/check-kube-service-available.rb
17
+ - bin/check-kube-pods-runtime.rb
18
+ - bin/check-kube-pods-running.rb
19
+ - bin/check-kube-pods-restarting.rb
20
+ - bin/handler-kube-pod.rb
21
+ - bin/metrics-pods.rb
22
+
23
+ ## Usage
24
+
25
+ **check-kube-nodes-ready.rb**
26
+ ```
27
+ Usage: check-kube-nodes-ready.rb (options)
28
+ --ca-file CA-FILE CA file to verify API server cert
29
+ --cert CERT-FILE Client cert to present
30
+ --key KEY-FILE Client key for the client cert
31
+ --in-cluster Use service account authentication
32
+ -p, --password PASSWORD If user is passed, also pass a password
33
+ -s, --api-server URL URL to API server
34
+ -t, --token TOKEN Bearer token for authorization
35
+ --token-file TOKEN-FILE File containing bearer token for authorization
36
+ -u, --user USER User with access to API
37
+ -v, --api-version VERSION API version
38
+ ```
39
+
40
+ **check-kube-apiserver-available.rb**
41
+ ```
42
+ Usage: check-kube-apiserver-available.rb (options)
43
+ --ca-file CA-FILE CA file to verify API server cert
44
+ --cert CERT-FILE Client cert to present
45
+ --key KEY-FILE Client key for the client cert
46
+ --in-cluster Use service account authentication
47
+ -p, --password PASSWORD If user is passed, also pass a password
48
+ -s, --api-server URL URL to API server
49
+ -t, --token TOKEN Bearer token for authorization
50
+ --token-file TOKEN-FILE File containing bearer token for authorization
51
+ -u, --user USER User with access to API
52
+ ```
53
+
54
+ **check-kube-pods-pending.rb**
55
+ ```
56
+ Usage: check-kube-pods-pending.rb (options)
57
+ --ca-file CA-FILE CA file to verify API server cert
58
+ --cert CERT-FILE Client cert to present
59
+ --key KEY-FILE Client key for the client cert
60
+ --in-cluster Use service account authentication
61
+ --password PASSWORD If user is passed, also pass a password
62
+ -s, --api-server URL URL to API server
63
+ --token TOKEN Bearer token for authorization
64
+ --token-file TOKEN-FILE File containing bearer token for authorization
65
+ -u, --user USER User with access to API
66
+ -v, --api-version VERSION API version
67
+ -n NAMESPACES, Exclude the specified list of namespaces
68
+ --exclude-namespace
69
+ -t, --timeout TIMEOUT Threshold for pods to be in the pending state
70
+ -f, --filter FILTER Selector filter for pods to be checked
71
+ -p, --pods PODS List of pods to check
72
+ -r, --restart COUNT Threshold for number of restarts allowed
73
+ ```
74
+
75
+ **check-kube-service-available.rb**
76
+ ```
77
+ Usage: check-kube-service-available.rb (options)
78
+ --ca-file CA-FILE CA file to verify API server cert
79
+ --cert CERT-FILE Client cert to present
80
+ --key KEY-FILE Client key for the client cert
81
+ --in-cluster Use service account authentication
82
+ --password PASSWORD If user is passed, also pass a password
83
+ -s, --api-server URL URL to API server
84
+ -t, --token TOKEN Bearer token for authorization
85
+ --token-file TOKEN-FILE File containing bearer token for authorization
86
+ -u, --user USER User with access to API
87
+ -v, --api-version VERSION API version
88
+ -p, --pending SECONDS Time (in seconds) a pod may be pending for and be valid
89
+ -l, --list SERVICES List of services to check (required)
90
+ ```
91
+
92
+ **check-kube-pods-runtime.rb**
93
+ ```
94
+ Usage: check-kube-pods-runtime.rb (options)
95
+ --ca-file CA-FILE CA file to verify API server cert
96
+ --cert CERT-FILE Client cert to present
97
+ --key KEY-FILE Client key for the client cert
98
+ --in-cluster Use service account authentication
99
+ --password PASSWORD If user is passed, also pass a password
100
+ -s, --api-server URL URL to API server
101
+ -t, --token TOKEN Bearer token for authorization
102
+ --token-file TOKEN-FILE File containing bearer token for authorization
103
+ -u, --user USER User with access to API
104
+ -v, --api-version VERSION API version
105
+ -c, --critical COUNT Threshold for Pods to be critical
106
+ -f, --filter FILTER Selector filter for pods to be checked
107
+ -p, --pods PODS List of pods to check
108
+ -w, --warn TIMEOUT Threshold for pods to be in the pending state
109
+ ```
110
+
111
+ **check-kube-pods-running.rb**
112
+ ```
113
+ Usage: ./check-kube-pods-running.rb (options)
114
+ --ca-file CA-FILE CA file to verify API server cert
115
+ --cert CERT-FILE Client cert to present
116
+ --key KEY-FILE Client key for the client cert
117
+ --in-cluster Use service account authentication
118
+ --password PASSWORD If user is passed, also pass a password
119
+ -s, --api-server URL URL to API server
120
+ -t, --token TOKEN Bearer token for authorization
121
+ --token-file TOKEN-FILE File containing bearer token for authorization
122
+ -u, --user USER User with access to API
123
+ -v, --api-version VERSION API version
124
+ -n NAMESPACES, Exclude the specified list of namespaces
125
+ --exclude-namespace
126
+ -f, --filter FILTER Selector filter for pods to be checked
127
+ -p, --pods PODS List of pods to check
128
+ ```
129
+
130
+ **check-kube-pods-restarting.rb**
131
+
132
+ ```
133
+ Usage: ./check-kube-pods-restarting.rb (options)
134
+ --ca-file CA-FILE CA file to verify API server cert
135
+ --cert CERT-FILE Client cert to present
136
+ --key KEY-FILE Client key for the client cert
137
+ --in-cluster Use service account authentication
138
+ --password PASSWORD If user is passed, also pass a password
139
+ -s, --api-server URL URL to API server
140
+ -t, --token TOKEN Bearer token for authorization
141
+ --token-file TOKEN-FILE File containing bearer token for authorization
142
+ -u, --user USER User with access to API
143
+ -v, --api-version VERSION API version
144
+ -n NAMESPACES, Exclude the specified list of namespaces
145
+ --exclude-namespace
146
+ -f, --filter FILTER Selector filter for pods to be checked
147
+ -p, --pods PODS List of pods to check
148
+ -r, --restart COUNT Threshold for number of restarts allowed
149
+ ```
150
+
151
+ **handler-kube-pod.rb**
152
+ ```
153
+ Usage: handler-kube-pod.rb (options)
154
+ -j, --json JSONCONFIG Configuration name
155
+ ```
156
+
157
+ `JSONCONFIG` defaults to `k8s`.
158
+
159
+ ```
160
+ {
161
+ "k8s": {
162
+ "server": "https://kubernetes/",
163
+ "version": "v1",
164
+ "incluster": false,
165
+ "ca_file": "/certs/ca.crt.pem",
166
+ "client_cert_file": "/certs/client.crt.pem",
167
+ "client_key_file": "/private/client.key.pem",
168
+ "username": "alice",
169
+ "password": "secret",
170
+ "token": "incomprehensible.token.string",
171
+ "token_file": "/secret/token"
172
+ }
173
+ }
174
+ ```
175
+
176
+ **metrics-pods**
177
+ ```
178
+ Usage: metrics-pods.rb (options)
179
+ --ca-file CA-FILE CA file to verify API server cert
180
+ --cert CERT-FILE Client cert to present
181
+ --key KEY-FILE Client key for the client cert
182
+ --in-cluster Use service account authentication
183
+ --password PASSWORD If user is passed, also pass a password
184
+ -s, --api-server URL URL to API server
185
+ -t, --token TOKEN Bearer token for authorization
186
+ --token-file TOKEN-FILE File containing bearer token for authorization
187
+ -u, --user USER User with access to API
188
+ -v, --api-version VERSION API version
189
+ ```
190
+
191
+ `api_server` and `api_version` can still be used for backwards compatibility,
192
+ but `server` and `version` will take precedence.
193
+
194
+ ## Installation
195
+
196
+ [Installation and Setup](http://sensu-plugins.io/docs/installation_instructions.html)
197
+
198
+ ## Notes
199
+
200
+ Of the Kubernetes connection options:
201
+ ```
202
+ --api-server URL URL to API server
203
+ --api-version VERSION API version
204
+ --in-cluster Use service account authentication
205
+ --ca-file CA-FILE CA file to verify API server cert
206
+ --cert CERT-FILE Client cert to present
207
+ --key KEY-FILE Client key for the client cert
208
+ --user USER User with access to API
209
+ --password PASSWORD If user is passed, also pass a password
210
+ --token TOKEN Bearer token for authorization
211
+ --token-file TOKEN-FILE File containing bearer token for authorization
212
+ ```
213
+ Only the API server option is required, however it does default to the `KUBERNETES_MASTER` environment variable, or you can use the in-cluster option. The other options are to be used as needed.
214
+
215
+ The default API version is `v1`.
216
+
217
+ The in-cluster option provides defaults for:
218
+ - The server URL, using the `KUBERNETES_SERVICE_HOST` and `KUBERNETES_SERVICE_PORT` environment variables.
219
+ - The API CA file, using the service account CA file if it exists. (`/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`)
220
+ - The API token, using the service account token file. (`/var/run/secrets/kubernetes.io/serviceaccount/token`)
221
+
222
+ If the Kubernetes API provides a server certificate, it is only validated if a CA file is provided.
223
+
224
+ The client certificate and client private key are optional, but if one is provided then the other must also be provided.
225
+
226
+ Only one of the authentication methods (user, token, or token file) can be used.
227
+ For example, using a username and a token, or a token and a token file, will produce an error.
228
+
229
+ If the 'user' authentication method is used, a password must also be provided.
@@ -0,0 +1,56 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-kube-apiserver-available.rb
4
+ #
5
+ # DESCRIPTION:
6
+ # => Check if the Kubernetes API server is up
7
+ #
8
+ # OUTPUT:
9
+ # plain text
10
+ #
11
+ # PLATFORMS:
12
+ # Linux
13
+ #
14
+ # DEPENDENCIES:
15
+ # gem: sensu-plugin
16
+ # gem: kube-client
17
+ #
18
+ # USAGE:
19
+ # -s, --api-server URL URL to API server
20
+ # --in-cluster Use service account authentication
21
+ # --ca-file CA-FILE CA file to verify API server cert
22
+ # --cert CERT-FILE Client cert to present
23
+ # --key KEY-FILE Client key for the client cert
24
+ # -u, --user USER User with access to API
25
+ # -p, --password PASSWORD If user is passed, also pass a password
26
+ # -t, --token TOKEN Bearer token for authorization
27
+ # --token-file TOKEN-FILE File containing bearer token for authorization
28
+ #
29
+ # LICENSE:
30
+ # Kel Cecil <kelcecil@praisechaos.com>
31
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
32
+ # for details.
33
+ #
34
+
35
+ require 'sensu-plugins-kubernetes/cli'
36
+
37
+ class ApiServerIsAvailable < Sensu::Plugins::Kubernetes::CLI
38
+ @options = Sensu::Plugins::Kubernetes::CLI.options.reject { |k| k == :api_version }
39
+
40
+ def run
41
+ if healthy?
42
+ ok 'Kubernetes API server is available'
43
+ end
44
+ critical 'Kubernetes API server is unavailable'
45
+ end
46
+
47
+ # TODO: replace this method when it's added to kubeclient
48
+ def healthy?
49
+ client.handle_exception do
50
+ client.create_rest_client('/healthz').get(client.headers)
51
+ end
52
+ true
53
+ rescue KubeException
54
+ false
55
+ end
56
+ end
@@ -0,0 +1,59 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-kube-nodes-ready.rb
4
+ #
5
+ # DESCRIPTION:
6
+ # => Check if the Kubernetes nodes are in a ready to use state
7
+ #
8
+ # OUTPUT:
9
+ # plain text
10
+ #
11
+ # PLATFORMS:
12
+ # Linux
13
+ #
14
+ # DEPENDENCIES:
15
+ # gem: sensu-plugin
16
+ # gem: kube-client
17
+ #
18
+ # USAGE:
19
+ # -s, --api-server URL URL to API server
20
+ # -v, --api-version VERSION API version. Defaults to 'v1'
21
+ # --in-cluster Use service account authentication
22
+ # --ca-file CA-FILE CA file to verify API server cert
23
+ # --cert CERT-FILE Client cert to present
24
+ # --key KEY-FILE Client key for the client cert
25
+ # -u, --user USER User with access to API
26
+ # -p, --password PASSWORD If user is passed, also pass a password
27
+ # -t, --token TOKEN Bearer token for authorization
28
+ # --token-file TOKEN-FILE File containing bearer token for authorization
29
+ #
30
+ # LICENSE:
31
+ # Kel Cecil <kelcecil@praisechaos.com>
32
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
33
+ # for details.
34
+ #
35
+
36
+ require 'sensu-plugins-kubernetes/cli'
37
+
38
+ class AllNodesAreReady < Sensu::Plugins::Kubernetes::CLI
39
+ @options = Sensu::Plugins::Kubernetes::CLI.options.dup
40
+
41
+ def run
42
+ failed_nodes = []
43
+ client.get_nodes.each do |node|
44
+ item = node.status.conditions.detect { |condition| condition.type == 'Ready' }
45
+ if item.nil?
46
+ warning "#{node.name} does not have a status"
47
+ elsif item.status != 'True'
48
+ failed_nodes << node.metadata.name
49
+ end
50
+ end
51
+
52
+ if failed_nodes.empty?
53
+ ok 'All nodes are reporting as ready'
54
+ end
55
+ critical "Nodes are not ready: #{failed_nodes.join(' ')}"
56
+ rescue KubeException => e
57
+ critical 'API error: ' << e.message
58
+ end
59
+ end
@@ -0,0 +1,116 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-kube-pods-pending
4
+ #
5
+ # DESCRIPTION:
6
+ # => Check if pods are stuck in a pending state or constantly restarting
7
+ #
8
+ # OUTPUT:
9
+ # plain text
10
+ #
11
+ # PLATFORMS:
12
+ # Linux
13
+ #
14
+ # DEPENDENCIES:
15
+ # gem: sensu-plugin
16
+ # gem: kube-client
17
+ #
18
+ # USAGE:
19
+ # -s, --api-server URL URL to API server
20
+ # -v, --api-version VERSION API version. Defaults to 'v1'
21
+ # --in-cluster Use service account authentication
22
+ # --ca-file CA-FILE CA file to verify API server cert
23
+ # --cert CERT-FILE Client cert to present
24
+ # --key KEY-FILE Client key for the client cert
25
+ # -u, --user USER User with access to API
26
+ # --password PASSWORD If user is passed, also pass a password
27
+ # --token TOKEN Bearer token for authorization
28
+ # --token-file TOKEN-FILE File containing bearer token for authorization
29
+ # -n NAMESPACES, Exclude the specified list of namespaces
30
+ # --exclude-namespace
31
+ # -t, --timeout TIMEOUT Threshold for pods to be in the pending state
32
+ # -f, --filter FILTER Selector filter for pods to be checked
33
+ # -p, --pods PODS Optional list of pods to check.
34
+ # Defaults to 'all'
35
+ #
36
+ # NOTES:
37
+ # => The filter used for the -f flag is in the form key=value. If multiple
38
+ # filters need to be specfied, use a comma. ex. foo=bar,red=color
39
+ #
40
+ # LICENSE:
41
+ # Barry Martin <nyxcharon@gmail.com>
42
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
43
+ # for details.
44
+ #
45
+
46
+ require 'sensu-plugins-kubernetes/cli'
47
+
48
+ class AllPodsAreReady < Sensu::Plugins::Kubernetes::CLI
49
+ @options = Sensu::Plugins::Kubernetes::CLI.options.dup
50
+
51
+ option :pod_list,
52
+ description: 'List of pods to check',
53
+ short: '-p PODS',
54
+ long: '--pods',
55
+ default: 'all'
56
+
57
+ option :pending_timeout,
58
+ description: 'Threshold for pods to be in the pending state',
59
+ short: '-t TIMEOUT',
60
+ long: '--timeout',
61
+ proc: proc(&:to_i),
62
+ default: 300
63
+
64
+ option :pod_filter,
65
+ description: 'Selector filter for pods to be checked',
66
+ short: '-f FILTER',
67
+ long: '--filter'
68
+
69
+ option :exclude_namespace,
70
+ description: 'Exclude the specified list of namespaces',
71
+ short: '-n NAMESPACES',
72
+ long: '--exclude-namespace',
73
+ proc: proc { |a| a.split(',') },
74
+ default: ''
75
+
76
+ def run
77
+ pods_list = []
78
+ failed_pods = []
79
+ pods = []
80
+ if config[:pod_filter].nil?
81
+ pods_list = parse_list(config[:pod_list])
82
+ pods = client.get_pods
83
+ else
84
+ pods = client.get_pods(label_selector: config[:pod_filter].to_s)
85
+ if pods.empty?
86
+ unknown 'The filter specified resulted in 0 pods'
87
+ end
88
+ pods_list = ['all']
89
+ end
90
+ pods.each do |pod|
91
+ next if pod.nil?
92
+ next if config[:exclude_namespace].include?(pod.metadata.namespace)
93
+ next unless pods_list.include?(pod.metadata.name) || pods_list.include?('all')
94
+ # Check for pending state
95
+ next unless pod.status.phase == 'Pending'
96
+ pod_stamp = Time.parse(pod.metadata.creationTimestamp)
97
+ puts pod.metadata.name
98
+ if (Time.now.utc - pod_stamp.utc).to_i > config[:pending_timeout]
99
+ failed_pods << "#{pod.metadata.namespace}.#{pod.metadata.name}"
100
+ end
101
+ end
102
+ if failed_pods.empty?
103
+ ok 'All pods are reporting as ready'
104
+ else
105
+ critical "Pods exceeded pending threshold: #{failed_pods.join(' ')}"
106
+ end
107
+ rescue KubeException => e
108
+ critical 'API error: ' << e.message
109
+ end
110
+
111
+ def parse_list(list)
112
+ return list.split(',') if list && list.include?(',')
113
+ return [list] if list
114
+ ['']
115
+ end
116
+ end