kubeclient 2.5.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of kubeclient might be problematic. Click here for more details.

Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +13 -5
  3. data/.travis.yml +2 -10
  4. data/CHANGELOG.md +21 -2
  5. data/README.md +112 -46
  6. data/Rakefile +2 -5
  7. data/kubeclient.gemspec +9 -7
  8. data/lib/kubeclient.rb +8 -8
  9. data/lib/kubeclient/common.rb +88 -105
  10. data/lib/kubeclient/config.rb +10 -10
  11. data/lib/kubeclient/http_error.rb +25 -0
  12. data/lib/kubeclient/missing_kind_compatibility.rb +1 -1
  13. data/lib/kubeclient/resource.rb +11 -0
  14. data/lib/kubeclient/resource_not_found_error.rb +4 -0
  15. data/lib/kubeclient/version.rb +1 -1
  16. data/lib/kubeclient/watch_stream.rb +17 -10
  17. data/test/test_common.rb +3 -3
  18. data/test/test_component_status.rb +16 -14
  19. data/test/test_config.rb +11 -11
  20. data/test/test_endpoint.rb +16 -12
  21. data/test/test_guestbook_go.rb +64 -62
  22. data/test/test_helper.rb +2 -0
  23. data/test/test_kubeclient.rb +268 -282
  24. data/test/test_limit_range.rb +11 -11
  25. data/test/test_missing_methods.rb +3 -3
  26. data/test/test_namespace.rb +27 -27
  27. data/test/test_node.rb +17 -15
  28. data/test/test_persistent_volume.rb +16 -14
  29. data/test/test_persistent_volume_claim.rb +16 -14
  30. data/test/test_pod.rb +16 -14
  31. data/test/test_pod_log.rb +4 -4
  32. data/test/test_process_template.rb +7 -7
  33. data/test/test_replication_controller.rb +29 -4
  34. data/test/test_resource_list_without_kind.rb +7 -7
  35. data/test/test_resource_quota.rb +4 -4
  36. data/test/test_secret.rb +11 -10
  37. data/test/test_service.rb +36 -31
  38. data/test/test_service_account.rb +4 -4
  39. data/test/test_watch.rb +52 -29
  40. data/test/test_watch_notice.rb +1 -1
  41. metadata +35 -26
  42. data/Gemfile-rest-client-1.8.rb +0 -11
  43. data/lib/kubeclient/kube_exception.rb +0 -14
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d647693b6947c9d717f0b19dad1c1cadc46f14b7
4
- data.tar.gz: 1355734798902a5b0f890568df9276cc390205b7
3
+ metadata.gz: e9aaeb2002708298a57d829ccce3530a4233de62
4
+ data.tar.gz: 4343990defde5ef36719ccbf02936b92e7e1be5c
5
5
  SHA512:
6
- metadata.gz: d0f30f0903cbb179aee65b8a5e28f743e45ea6500752df248694f4ae57aaa46b98a6561638a83c915ce20cf0787159457ad85a2d7ac5573eec6913d83fe0989e
7
- data.tar.gz: 6a696571fe8281b2dad5d6f01f429c7d02a51913272a711dd315bbbd27f9f291e41ab60a89d8dd92a0a96f7a91931ddbedb880c691b653f6498d44480d5d0268
6
+ metadata.gz: 928f8df41783e2eb13c65536de2ad3270f3ed3fcc95459d25fcb21a66a6e86b0f279a9c238cddb7196dc82bd7c9cc7dd42a778f208ee56397e149a4c0f048f3c
7
+ data.tar.gz: 9a541d45aba922c4ab24196bd3d0cb755a46ae5bd276436510fa66e60cdc6c60056eba4501152036751ec5cd8ec3ec8c0d254687c54b6ba532ac18812634a06b
@@ -1,9 +1,10 @@
1
+ AllCops:
2
+ DisplayCopNames: true
3
+ TargetRubyVersion: 2.2 # Oldest version kubeclient supports
1
4
  MethodLength:
2
5
  Enabled: false
3
6
  ClassLength:
4
7
  Enabled: false
5
- Documentation:
6
- Enabled: false
7
8
  Metrics/AbcSize:
8
9
  Enabled: false
9
10
  Metrics/LineLength:
@@ -13,7 +14,14 @@ Metrics/ParameterLists:
13
14
  CountKeywordArgs: false
14
15
  Metrics/CyclomaticComplexity:
15
16
  Max: 8
16
- Style/FileName:
17
- Exclude: [Gemfile*]
18
- Style/SignalException:
17
+ Metrics/ModuleLength:
19
18
  Enabled: false
19
+ Style/MethodCallWithArgsParentheses:
20
+ Enabled: true
21
+ IgnoredMethods: [require, raise, include, attr_reader, refute, assert]
22
+ Exclude: [Gemfile, Rakefile, kubeclient.gemspec]
23
+ Security/MarshalLoad:
24
+ Exclude: [test/**/*]
25
+ Style/MethodCallWithArgsParentheses:
26
+ IgnoredMethods:
27
+ - require_relative
@@ -1,20 +1,12 @@
1
1
  language: ruby
2
2
  rvm:
3
- - "2.0"
4
- - "2.1"
5
3
  - "2.2"
6
4
  - "2.3.0"
7
- gemfile:
8
- - Gemfile
9
- - Gemfile-rest-client-1.8.rb
5
+ - "2.4.0"
6
+ - "2.5.0"
10
7
  sudo: false
11
8
  cache: bundler
12
9
  script: bundle exec rake $TASK
13
10
  env:
14
11
  - TASK=test
15
12
  - TASK=rubocop
16
- matrix:
17
- exclude:
18
- # No point running rubocop with old rest-client
19
- - gemfile: Gemfile-rest-client-1.8.rb
20
- env: TASK=rubocop
@@ -3,11 +3,30 @@
3
3
  Notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/).
5
5
 
6
- ## 2.5.2 - 2018-02-04
6
+ ## 3.0.0 - 2018-02-01
7
+ ### Removed
8
+ - Dropped entity classes (`Kubeclient::Pod` etc.), only `Kubeclient::Resource` exists now (#292, #288).
9
+ - Ruby 2.0, 2.1 no longer supported (#253, #291).
10
+
7
11
  ### Fixed
8
12
  - Watch results are now `RecursiveOpenStruct` inside arrays too (#279).
9
13
  - Fixed watch `.finish` sometimes caused `Errno::EBADF` exception from the reading loop (#280).
10
- - Easing dependency version (#287, #301)
14
+ - Added missing singular `get_security_context_constraint`, fixed `get_security_context_constraints` to mean plural (#261).
15
+ - Fixed `@http_proxy_uri` undefined warning (#261).
16
+ - Documentation fixes & improvements (#225, #229, #243, #296).
17
+
18
+ ### Added
19
+ - `delete_options:` parameter to `delete_*` methods, useful for cascade delete (#267).
20
+ - `as: :raw` option for watch (#285).
21
+ - Now raises `Kubeclient::HttpError`. Rescuing `KubeException` still works but is deprecated. (#195, #288)
22
+ - 404 error raise `Kubeclient::ResourceNotFoundError`, a subclass of `HttpError` (#233).
23
+ - Include request info in exception message (#221).
24
+ - Ruby 2.4 and 2.5 are now supported & tested (#247, #295).
25
+
26
+ ### Changed
27
+ - `Kubeclient::Config#context(nonexistent_context_name)` raises `KeyError` instead of `RuntimeError`.
28
+ - `update_*`, `delete_*`, `patch_*` now all return `RecursiveOpenStruct` consistently (#290).
29
+ - Many dependencies bumped (#204, #231, #253, #269).
11
30
 
12
31
  ## 2.5.1 - 2017-10-12
13
32
  No changes since 2.5.0, fixed packaging mistake.
data/README.md CHANGED
@@ -6,8 +6,9 @@
6
6
  [![Dependency Status](https://gemnasium.com/abonas/kubeclient.svg)](https://gemnasium.com/abonas/kubeclient)
7
7
 
8
8
  A Ruby client for Kubernetes REST api.
9
- The client supports GET, POST, PUT, DELETE on nodes, pods, secrets, services, replication controllers, namespaces, resource quotas, limit ranges, endpoints, persistent volumes, persistent volume claims, component statuses and service accounts.
9
+ The client supports GET, POST, PUT, DELETE on all the entities available in kubernetes in both the core and group apis.
10
10
  The client currently supports Kubernetes REST api version v1.
11
+ To learn more about groups and versions in kubernetes refer to [k8s docs](https://kubernetes.io/docs/api/)
11
12
 
12
13
  ## Installation
13
14
 
@@ -19,23 +20,28 @@ gem 'kubeclient'
19
20
 
20
21
  And then execute:
21
22
 
22
- $ bundle
23
+ ```Bash
24
+ bundle
25
+ ```
23
26
 
24
27
  Or install it yourself as:
25
28
 
26
- $ gem install kubeclient
29
+ ```Bash
30
+ gem install kubeclient
31
+ ```
27
32
 
28
33
  ## Usage
29
34
 
30
35
  Initialize the client:
36
+
31
37
  ```ruby
32
- client = Kubeclient::Client.new 'http://localhost:8080/api/' , "v1"
38
+ client = Kubeclient::Client.new('http://localhost:8080/api/', "v1")
33
39
  ```
34
40
 
35
41
  Or without specifying version (it will be set by default to "v1")
36
42
 
37
43
  ```ruby
38
- client = Kubeclient::Client.new 'http://localhost:8080/api/'
44
+ client = Kubeclient::Client.new('http://localhost:8080/api/')
39
45
  ```
40
46
 
41
47
  For A Group Api:
@@ -48,7 +54,7 @@ Another option is to initialize the client with URI object:
48
54
 
49
55
  ```ruby
50
56
  uri = URI::HTTP.build(host: "somehostname", port: 8080)
51
- client = Kubeclient::Client.new uri
57
+ client = Kubeclient::Client.new(uri)
52
58
  ```
53
59
 
54
60
  ### SSL
@@ -62,8 +68,9 @@ ssl_options = {
62
68
  ca_file: '/path/to/ca.crt',
63
69
  verify_ssl: OpenSSL::SSL::VERIFY_PEER
64
70
  }
65
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , "v1",
66
- ssl_options: ssl_options
71
+ client = Kubeclient::Client.new(
72
+ 'https://localhost:8443/api/', "v1", ssl_options: ssl_options
73
+ )
67
74
  ```
68
75
 
69
76
  As an alternative to the `ca_file` it's possible to use the `cert_store`:
@@ -75,16 +82,18 @@ ssl_options = {
75
82
  cert_store: cert_store,
76
83
  verify_ssl: OpenSSL::SSL::VERIFY_PEER
77
84
  }
78
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , "v1",
79
- ssl_options: ssl_options
85
+ client = Kubeclient::Client.new(
86
+ 'https://localhost:8443/api/', "v1", ssl_options: ssl_options
87
+ )
80
88
  ```
81
89
 
82
90
  For testing and development purpose you can disable the ssl check with:
83
91
 
84
92
  ```ruby
85
93
  ssl_options = { verify_ssl: OpenSSL::SSL::VERIFY_NONE }
86
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , 'v1',
87
- ssl_options: ssl_options
94
+ client = Kubeclient::Client.new(
95
+ 'https://localhost:8443/api/', 'v1', ssl_options: ssl_options
96
+ )
88
97
  ```
89
98
 
90
99
  ### Authentication
@@ -98,8 +107,9 @@ auth_options = {
98
107
  username: 'username',
99
108
  password: 'password'
100
109
  }
101
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , 'v1',
102
- auth_options: auth_options
110
+ client = Kubeclient::Client.new(
111
+ 'https://localhost:8443/api/', 'v1', auth_options: auth_options
112
+ )
103
113
  ```
104
114
 
105
115
  or
@@ -108,8 +118,9 @@ or
108
118
  auth_options = {
109
119
  bearer_token: 'MDExMWJkMjItOWY1Ny00OGM5LWJlNDEtMjBiMzgxODkxYzYz'
110
120
  }
111
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , 'v1',
112
- auth_options: auth_options
121
+ client = Kubeclient::Client.new(
122
+ 'https://localhost:8443/api/', 'v1', auth_options: auth_options
123
+ )
113
124
  ```
114
125
 
115
126
  or
@@ -118,8 +129,9 @@ or
118
129
  auth_options = {
119
130
  bearer_token_file: '/path/to/token_file'
120
131
  }
121
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , 'v1',
122
- auth_options: auth_options
132
+ client = Kubeclient::Client.new(
133
+ 'https://localhost:8443/api/', 'v1', auth_options: auth_options
134
+ )
123
135
  ```
124
136
 
125
137
  If you are running your app using kubeclient inside a Kubernetes cluster, then you can have a bearer token file
@@ -133,15 +145,16 @@ for more details). For example:
133
145
  auth_options = {
134
146
  bearer_token_file: '/var/run/secrets/kubernetes.io/serviceaccount/token'
135
147
  }
136
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , 'v1',
137
- auth_options: auth_options
148
+ client = Kubeclient::Client.new(
149
+ 'https://localhost:8443/api/', 'v1', auth_options: auth_options
150
+ )
138
151
  ```
139
152
 
140
- You can find information about token in [this guide](http://kubernetes.io/docs/user-guide/accessing-the-cluster/) and in [this reference](http://kubernetes.io/docs/admin/authentication/).
153
+ You can find information about tokens in [this guide](http://kubernetes.io/docs/user-guide/accessing-the-cluster/) and in [this reference](http://kubernetes.io/docs/admin/authentication/).
141
154
 
142
155
  ### Non-blocking IO
143
156
 
144
- You can also use kubeclient with non-blocking sockets such as Celluloid::IO, see [here](https://github.com/httprb/http/wiki/Parallel-requests-with-Celluloid%3A%3AIO)
157
+ You can also use kubeclient with non-blocking sockets such as Celluloid::IO, see [here](https://github.com/httprb/http/wiki/Parallel-requests-with-Celluloid%3A%3AIO)
145
158
  for details. For example:
146
159
 
147
160
  ```ruby
@@ -150,8 +163,9 @@ socket_options = {
150
163
  socket_class: Celluloid::IO::TCPSocket,
151
164
  ssl_socket_class: Celluloid::IO::SSLSocket
152
165
  }
153
- client = Kubeclient::Client.new 'https://localhost:8443/api/' , 'v1',
154
- socket_options: socket_options
166
+ client = Kubeclient::Client.new(
167
+ 'https://localhost:8443/api/', 'v1', socket_options: socket_options
168
+ )
155
169
  ```
156
170
 
157
171
  This affects only `.watch_*` sockets, not one-off actions like `.get_*`, `.delete_*` etc.
@@ -162,8 +176,9 @@ You can also use kubeclient with an http proxy server such as tinyproxy. It can
162
176
  For example:
163
177
  ```ruby
164
178
  proxy_uri = URI::HTTP.build(host: "myproxyhost", port: 8443)
165
- client = Kubeclient::Client.new('https://localhost:8443/api/',
166
- :http_proxy_uri => proxy_uri)
179
+ client = Kubeclient::Client.new(
180
+ 'https://localhost:8443/api/', http_proxy_uri: proxy_uri
181
+ )
167
182
  ```
168
183
 
169
184
 
@@ -193,13 +208,15 @@ If you want ruby-independent behavior, always specify `:open`.
193
208
  Discovery from the kube-apiserver is done lazily on method calls so it would not change behavior.
194
209
 
195
210
  It can also be done explicitly:
196
- ```
211
+
212
+ ```ruby
197
213
  client = Kubeclient::Client.new('http://localhost:8080/api', 'v1')
198
214
  client.discover
199
215
  ```
200
216
 
201
217
  It is possible to check the status of discovery
202
- ```
218
+
219
+ ```ruby
203
220
  unless client.discovered
204
221
  client.discover
205
222
  end
@@ -208,6 +225,7 @@ end
208
225
  ### Kubeclient::Config
209
226
 
210
227
  If you've been using `kubectl` and have a `.kube/config` file, you can auto-populate a config object using `Kubeclient::Config`:
228
+
211
229
  ```ruby
212
230
  config = Kubeclient::Config.read('/path/to/.kube/config')
213
231
  ```
@@ -216,21 +234,22 @@ config = Kubeclient::Config.read('/path/to/.kube/config')
216
234
 
217
235
  ```
218
236
  Kubeclient::Client.new(
219
- config.context.api_endpoint,
237
+ config.context.api_endpoint,
220
238
  config.context.api_version,
221
239
  {
222
- ssl_options: config.context.ssl_options,
223
- auth_options: config.context.auth_options
240
+ ssl_options: config.context.ssl_options,
241
+ auth_options: config.context.auth_options
224
242
  }
225
243
  )
226
244
  ```
227
245
 
228
246
  You can also load your JSONified config in from an ENV variable (e.g. `KUBE_CONFIG`) like so:
229
247
 
230
- ```
248
+ ```ruby
231
249
  Kubeclient::Config.new(JSON.parse(ENV['KUBE_CONFIG']), nil)
232
250
  ```
233
- ###Supported kubernetes versions
251
+
252
+ ### Supported kubernetes versions
234
253
 
235
254
  For 1.1 only the core api v1 is supported, all api groups are supported in later versions.
236
255
 
@@ -256,6 +275,7 @@ pods = client.get_pods(label_selector: 'name=redis-master')
256
275
  ```
257
276
 
258
277
  You can specify multiple labels (that option will return entities which have both labels:
278
+
259
279
  ```ruby
260
280
  pods = client.get_pods(label_selector: 'name=redis-master,app=redis')
261
281
  ```
@@ -289,8 +309,23 @@ node = client.get_node "127.0.0.1", as: :raw
289
309
  For example: `delete_pod "pod name"` , `delete_replication_controller "rc name"`, `delete_node "node name"`, `delete_secret "secret name"`
290
310
 
291
311
  Input parameter - name (string) specifying service name, pod name, replication controller name.
312
+
313
+ ```ruby
314
+ deleted = client.delete_service("redis-service")
315
+ ```
316
+
317
+ If you want to cascade delete, for example a deployment, you can use the `delete_options` parameter.
318
+
292
319
  ```ruby
293
- client.delete_service "redis-service"
320
+ deployment_name = 'redis-deployment'
321
+ namespace = 'default'
322
+ delete_options = Kubeclient::Resource.new(
323
+ apiVersion: 'meta/v1',
324
+ gracePeriodSeconds: 0,
325
+ kind: 'DeleteOptions',
326
+ propagationPolicy: 'Foreground' # Orphan, Foreground, or Background
327
+ )
328
+ client.delete_deployment(deployment_name, namespace, delete_options: delete_options)
294
329
  ```
295
330
 
296
331
  #### Create an entity
@@ -301,21 +336,22 @@ Input parameter - object of type `Service`, `Pod`, `ReplicationController`.
301
336
  The below example is for v1
302
337
 
303
338
  ```ruby
304
- service = Service.new
339
+ service = Kubeclient::Resource.new
305
340
  service.metadata = {}
306
341
  service.metadata.name = "redis-master"
307
342
  service.metadata.namespace = 'staging'
308
343
  service.spec = {}
309
- service.spec.ports = [{ 'port' => 6379,
310
- 'targetPort' => 'redis-server'
311
- }]
344
+ service.spec.ports = [{
345
+ 'port' => 6379,
346
+ 'targetPort' => 'redis-server'
347
+ }]
312
348
  service.spec.selector = {}
313
349
  service.spec.selector.name = "redis"
314
350
  service.spec.selector.role = "master"
315
351
  service.metadata.labels = {}
316
352
  service.metadata.labels.app = 'redis'
317
353
  service.metadata.labels.role = 'slave'
318
- client.create_service service`
354
+ client.create_service(service)
319
355
  ```
320
356
 
321
357
  #### Update an entity
@@ -326,7 +362,7 @@ Input parameter - object of type `Pod`, `Service`, `ReplicationController` etc.
326
362
  The below example is for v1
327
363
 
328
364
  ```ruby
329
- client.update_service service1
365
+ updated = client.update_service(service1)
330
366
  ```
331
367
 
332
368
  #### Patch an entity (by name)
@@ -339,7 +375,7 @@ The PATCH request should include the namespace name, except for nodes and namesp
339
375
  The below example is for v1
340
376
 
341
377
  ```ruby
342
- client.patch_pod "docker-registry", {:metadata => {:annotations => {:key => 'value'}}}, "default"
378
+ patched = client.patch_pod("docker-registry", {metadata: {annotations: {key: 'value'}}}, "default")
343
379
  ```
344
380
 
345
381
  #### Get all entities of all types : all_entities
@@ -366,6 +402,8 @@ It is possible to interrupt the watcher from another thread with:
366
402
  watcher.finish
367
403
  ```
368
404
 
405
+ Pass `as: :raw` to `watch_*` get raw replies.
406
+
369
407
  #### Watch events for a particular object
370
408
  You can use the `field_selector` option as part of the watch methods.
371
409
 
@@ -381,14 +419,14 @@ You can get a complete URL for connecting a kubernetes entity via the proxy.
381
419
 
382
420
  ```ruby
383
421
  client.proxy_url('service', 'srvname', 'srvportname', 'ns')
384
- => "https://localhost.localdomain:8443/api/v1/proxy/namespaces/ns/services/srvname:srvportname"
422
+ # => "https://localhost.localdomain:8443/api/v1/proxy/namespaces/ns/services/srvname:srvportname"
385
423
  ```
386
424
 
387
425
  Note the third parameter, port, is a port name for services and an integer for pods:
388
426
 
389
427
  ```ruby
390
428
  client.proxy_url('pod', 'podname', 5001, 'ns')
391
- => "https://localhost.localdomain:8443/api/v1/namespaces/ns/pods/podname:5001/proxy"
429
+ # => "https://localhost.localdomain:8443/api/v1/namespaces/ns/pods/podname:5001/proxy"
392
430
  ```
393
431
 
394
432
  #### Get the logs of a pod
@@ -397,14 +435,14 @@ namespace where the pod is running:
397
435
 
398
436
  ```ruby
399
437
  client.get_pod_log('pod-name', 'default')
400
- => "Running...\nRunning...\nRunning...\n"
438
+ # => "Running...\nRunning...\nRunning...\n"
401
439
  ```
402
440
 
403
441
  If that pod has more than one container, you must specify the container:
404
442
 
405
443
  ```ruby
406
444
  client.get_pod_log('pod-name', 'default', container: 'ruby')
407
- => "..."
445
+ # => "..."
408
446
  ```
409
447
 
410
448
  If a container in a pod terminates, a new container is started, and you want to
@@ -412,7 +450,7 @@ retrieve the logs of the dead container, you can pass in the `:previous` option:
412
450
 
413
451
  ```ruby
414
452
  client.get_pod_log('pod-name', 'default', previous: true)
415
- => "..."
453
+ # => "..."
416
454
  ```
417
455
 
418
456
  You can also watch the logs of a pod to get a stream of data:
@@ -430,21 +468,49 @@ Input parameter - template (hash)
430
468
  Besides its metadata, the template should include a list of objects to be processed and a list of parameters
431
469
  to be substituted. Note that for a required parameter that does not provide a generated value, you must supply a value.
432
470
 
471
+ ##### Note: This functionality is not supported by K8s at this moment. See the following [issue](https://github.com/kubernetes/kubernetes/issues/23896)
472
+
433
473
  ```ruby
434
474
  client.process_template template
435
475
  ```
436
476
 
437
477
  ## Upgrading
438
478
 
479
+ See [CHANGELOG.md](CHANGELOG.md) for full changelog.
480
+
481
+ #### past version 3.0
482
+
483
+ Ruby versions < 2.2 are no longer supported
484
+
485
+ Specific entity classes mentioned in [past version 1.2.0](#past_version_1.2.0) have been dropped.
486
+ Return values and expected classes are always Kubeclient::Resource.
487
+ Checking the type of a resource can be done using:
488
+ ```
489
+ > pod.kind
490
+ => "Pod"
491
+ ```
492
+
493
+ update_* delete_* and patch_* now return a RecursiveOpenStruct like the get_* methods
494
+
495
+ The gem raises Kubeclient::HttpError or subclasses now. Catching KubeException still works but is deprecated.
496
+
497
+ `Kubeclient::Config#context` raises KeyError instead of RuntimeError for non-existent context name.
498
+
499
+ <a name="past_version_1.2.0">
500
+
439
501
  #### past version 1.2.0
440
502
  Replace Specific Entity class references:
503
+
441
504
  ```ruby
442
505
  Kubeclient::Service
443
506
  ```
507
+
444
508
  with the generic
509
+
445
510
  ```ruby
446
511
  Kubeclient::Resource.new
447
512
  ```
513
+
448
514
  Where ever possible.
449
515
 
450
516
  ## Contributing