kubeclient 4.9.3 → 4.10.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f402a08fef66f160df49d507487769073b248828869a2c874d78e947b1d6686
4
- data.tar.gz: 5d371f47861538f1e3e9deced8d1c41be1e0ca857ab8ed0607a75417948bb6f6
3
+ metadata.gz: 68296079e6db48ae555a4ca1f53c39b4c6349f3aebb426f443f884c984b904a1
4
+ data.tar.gz: 1524dfc158d01ac299c732f54dcf5e757cbd112eb07f3358ba798c3c8b09977d
5
5
  SHA512:
6
- metadata.gz: f06a16d02e150194d06a4aa2c37a23bd1b7bbef4daca379ed7f60dd9581310b98cd3026d86e90b1b23d861fe6186d05e003d41380cb1edeaf7a2e52ccc594520
7
- data.tar.gz: 7fbceb84c48af3bf4f28eadb05a2807a61196a26a66d72eb836ee5faa23d9a22fb1bd8e76fd16febd794007f1f0fd487000db40f543143789d33225c2350ccd0
6
+ metadata.gz: 0aa6e0f5d6934ef4de10a71a1388f53323ab235ca4b3c1a560b99a483fba3603c51cf463a5211554ab2d97d1dfce6a5623ce65898c0f188c231476b320180bc3
7
+ data.tar.gz: a6319a5a38d228db8b0ed08eb356d7539858cb0660ec2dba376177a3c02568b19ea42d5799feef04b5d86dc4284673c978d6cdaf82b286f3642ae33a0449eba0
@@ -16,7 +16,9 @@ jobs:
16
16
  matrix:
17
17
  ruby: [ '2.5', '2.6', '2.7', '3.0', '3.1', 'ruby-head', 'truffleruby-head' ]
18
18
  os_and_command:
19
- - os: 'macos-latest'
19
+ - os: macos-latest
20
+ command: 'env TESTOPTS="--verbose" bundle exec rake test'
21
+ - os: windows-latest
20
22
  command: 'env TESTOPTS="--verbose" bundle exec rake test'
21
23
  - os: ubuntu-latest
22
24
  # Sometimes minitest starts and then just hangs printing nothing.
@@ -35,7 +37,6 @@ jobs:
35
37
  with:
36
38
  ruby-version: ${{ matrix.ruby }}
37
39
  bundler-cache: false # disable running 'bundle install' and caching installed gems see https://github.com/httprb/http/issues/572
38
- - run: gem install rake bundler
39
40
  - run: bundle install
40
41
  - run: ${{ matrix.os_and_command.command }}
41
42
  timeout-minutes: 10
data/CHANGELOG.md CHANGED
@@ -4,7 +4,21 @@ 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
  Kubeclient release versioning follows [SemVer](https://semver.org/).
6
6
 
7
- ## 4.9.3 2021-03-23
7
+ ## 4.10.0 2022-08-29
8
+
9
+ ### Added
10
+
11
+ - When using `:bearer_token_file`, re-read the file on every request. (#566 closed #561)
12
+
13
+ Kubernetes version 1.21 graduated [BoundServiceAccountTokenVolume feature][] to beta
14
+ and enabled it by default, so standard in-cluster auth now uses short-lived tokens.
15
+
16
+ This changes allows a long-lived `Client` object to keep working when the token file gets
17
+ rotated. It's not optimized at all, if you feel the performance overhead, please report!
18
+
19
+ [BoundServiceAccountTokenVolume feature]: https://github.com/kubernetes/enhancements/issues/542
20
+
21
+ ## 4.9.3 — 2022-03-23
8
22
 
9
23
  ### Fixed
10
24
 
@@ -23,12 +37,16 @@ Kubeclient release versioning follows [SemVer](https://semver.org/).
23
37
  This was broken IN ALL RELEASES MADE BEFORE 2022, ever since
24
38
  [`Kubeclient::Config` was created](https://github.com/ManageIQ/kubeclient/pull/127/files#diff-32e70f2f6781a9e9c7b83ae5e7eaf5ffd068a05649077fa38f6789e72f3de837R41-R48).
25
39
 
40
+ [#554](https://github.com/ManageIQ/kubeclient/issues/554).
41
+
26
42
  - Bug fix: kubeconfig `insecure-skip-tls-verify` field was ignored.
27
43
  When kubeconfig did define custom CA, `Config` was returning hard-coded `VERIFY_PEER`.
28
44
 
29
45
  Now we honor it, return `VERIFY_NONE` iff kubeconfig has explicit
30
46
  `insecure-skip-tls-verify: true`, otherwise `VERIFY_PEER`.
31
47
 
48
+ [#555](https://github.com/ManageIQ/kubeclient/issues/555).
49
+
32
50
  - `Config`: fixed parsing of `certificate-authority` file containing concatenation of
33
51
  several certificates. Previously, server's cert was checked against only first CA cert,
34
52
  resulting in possible "certificate verify failed" errors.
data/README.md CHANGED
@@ -13,8 +13,7 @@ To learn more about groups and versions in kubernetes refer to [k8s docs](https:
13
13
 
14
14
  If you use `Kubeclient::Config`, all gem versions released before 2022 could return incorrect `ssl_options[:verify_ssl]`,
15
15
  endangering your connection and cluster credentials.
16
- See [latest CHANGELOG.md](https://github.com/ManageIQ/kubeclient/blob/master/CHANGELOG.md) for details and which versions got a fix.
17
- Open an issue if you want a backport to another version.
16
+ See https://github.com/ManageIQ/kubeclient/issues/554 for details and which versions got a fix.
18
17
 
19
18
  ## Installation
20
19
 
data/kubeclient.gemspec CHANGED
@@ -23,7 +23,7 @@ Gem::Specification.new do |spec|
23
23
 
24
24
  spec.add_development_dependency 'bundler', '>= 1.6'
25
25
  spec.add_development_dependency 'rake', '~> 12.0'
26
- spec.add_development_dependency 'minitest'
26
+ spec.add_development_dependency 'minitest', '~> 5.15.0'
27
27
  spec.add_development_dependency 'minitest-rg'
28
28
  spec.add_development_dependency 'webmock', '~> 3.0'
29
29
  spec.add_development_dependency 'vcr'
@@ -32,6 +32,8 @@ Gem::Specification.new do |spec|
32
32
  spec.add_development_dependency('mocha', '~> 1.5')
33
33
  spec.add_development_dependency 'openid_connect', '~> 1.1'
34
34
  spec.add_development_dependency 'net-smtp'
35
+ # needed on Windows, at least for openid_connect
36
+ spec.add_development_dependency 'tzinfo-data'
35
37
 
36
38
  spec.add_dependency 'jsonpath', '~> 1.0'
37
39
  spec.add_dependency 'rest-client', '~> 2.0'
@@ -78,7 +78,7 @@ module Kubeclient
78
78
  @api_version = version
79
79
  @headers = {}
80
80
  @ssl_options = ssl_options
81
- @auth_options = auth_options
81
+ @auth_options = auth_options.dup
82
82
  @socket_options = socket_options
83
83
  # Allow passing partial timeouts hash, without unspecified
84
84
  # @timeouts[:foo] == nil resulting in infinite timeout.
@@ -87,11 +87,18 @@ module Kubeclient
87
87
  @http_max_redirects = http_max_redirects
88
88
  @as = as
89
89
 
90
- if auth_options[:bearer_token]
91
- bearer_token(@auth_options[:bearer_token])
92
- elsif auth_options[:bearer_token_file]
90
+ @log = Logger.new(STDOUT)
91
+ @log.formatter = proc do |severity, datetime, progname, msg|
92
+ "#{datetime} [#{severity}]: #{msg}\n"
93
+ end
94
+
95
+ if auth_options[:bearer_token_file]
93
96
  validate_bearer_token_file
97
+ @log.info("Reading bearer token from #{@auth_options[:bearer_token_file]}")
94
98
  bearer_token(File.read(@auth_options[:bearer_token_file]))
99
+ elsif auth_options[:bearer_token]
100
+ bearer_token(@auth_options[:bearer_token])
101
+ @log.info("bearer_token_file path not provided. Kubeclient will not be able to refresh the token if it expires")
95
102
  end
96
103
  end
97
104
 
@@ -136,6 +143,11 @@ module Kubeclient
136
143
  @discovered = true
137
144
  end
138
145
 
146
+ def get_headers
147
+ bearer_token(File.read(@auth_options[:bearer_token_file])) if @auth_options[:bearer_token_file]
148
+ @headers
149
+ end
150
+
139
151
  def self.parse_definition(kind, name)
140
152
  # Kubernetes gives us 3 inputs:
141
153
  # kind: "ComponentStatus", "NetworkPolicy", "Endpoints"
@@ -349,7 +361,7 @@ module Kubeclient
349
361
  ns_prefix = build_namespace_prefix(options[:namespace])
350
362
  response = handle_exception do
351
363
  rest_client[ns_prefix + resource_name]
352
- .get({ 'params' => params }.merge(@headers))
364
+ .get({ 'params' => params }.merge(get_headers))
353
365
  end
354
366
  format_response(options[:as] || @as, response.body, entity_type)
355
367
  end
@@ -362,7 +374,7 @@ module Kubeclient
362
374
  ns_prefix = build_namespace_prefix(namespace)
363
375
  response = handle_exception do
364
376
  rest_client[ns_prefix + resource_name + "/#{name}"]
365
- .get(@headers)
377
+ .get(get_headers)
366
378
  end
367
379
  format_response(options[:as] || @as, response.body)
368
380
  end
@@ -378,7 +390,7 @@ module Kubeclient
378
390
  rs.options.merge(
379
391
  method: :delete,
380
392
  url: rs.url,
381
- headers: { 'Content-Type' => 'application/json' }.merge(@headers),
393
+ headers: { 'Content-Type' => 'application/json' }.merge(get_headers),
382
394
  payload: payload
383
395
  )
384
396
  )
@@ -400,7 +412,7 @@ module Kubeclient
400
412
  hash[:apiVersion] = @api_group + @api_version
401
413
  response = handle_exception do
402
414
  rest_client[ns_prefix + resource_name]
403
- .post(hash.to_json, { 'Content-Type' => 'application/json' }.merge(@headers))
415
+ .post(hash.to_json, { 'Content-Type' => 'application/json' }.merge(get_headers))
404
416
  end
405
417
  format_response(@as, response.body)
406
418
  end
@@ -410,7 +422,7 @@ module Kubeclient
410
422
  ns_prefix = build_namespace_prefix(entity_config[:metadata][:namespace])
411
423
  response = handle_exception do
412
424
  rest_client[ns_prefix + resource_name + "/#{name}"]
413
- .put(entity_config.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(@headers))
425
+ .put(entity_config.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(get_headers))
414
426
  end
415
427
  format_response(@as, response.body)
416
428
  end
@@ -421,7 +433,7 @@ module Kubeclient
421
433
  rest_client[ns_prefix + resource_name + "/#{name}"]
422
434
  .patch(
423
435
  patch.to_json,
424
- { 'Content-Type' => "application/#{strategy}+json" }.merge(@headers)
436
+ { 'Content-Type' => "application/#{strategy}+json" }.merge(get_headers)
425
437
  )
426
438
  end
427
439
  format_response(@as, response.body)
@@ -434,7 +446,7 @@ module Kubeclient
434
446
  rest_client[ns_prefix + resource_name + "/#{name}"]
435
447
  .patch(
436
448
  resource.to_json,
437
- { 'Content-Type' => 'application/apply-patch+yaml' }.merge(@headers)
449
+ { 'Content-Type' => 'application/apply-patch+yaml' }.merge(get_headers)
438
450
  )
439
451
  end
440
452
  format_response(@as, response.body)
@@ -468,7 +480,7 @@ module Kubeclient
468
480
  ns = build_namespace_prefix(namespace)
469
481
  handle_exception do
470
482
  rest_client[ns + "pods/#{pod_name}/log"]
471
- .get({ 'params' => params }.merge(@headers))
483
+ .get({ 'params' => params }.merge(get_headers))
472
484
  end
473
485
  end
474
486
 
@@ -506,7 +518,7 @@ module Kubeclient
506
518
  ns_prefix = build_namespace_prefix(template[:metadata][:namespace])
507
519
  response = handle_exception do
508
520
  rest_client[ns_prefix + 'processedtemplates']
509
- .post(template.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(@headers))
521
+ .post(template.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(get_headers))
510
522
  end
511
523
  JSON.parse(response)
512
524
  end
@@ -519,7 +531,7 @@ module Kubeclient
519
531
  end
520
532
 
521
533
  def api
522
- response = handle_exception { create_rest_client.get(@headers) }
534
+ response = handle_exception { create_rest_client.get(get_headers) }
523
535
  JSON.parse(response)
524
536
  end
525
537
 
@@ -593,7 +605,7 @@ module Kubeclient
593
605
  end
594
606
 
595
607
  def fetch_entities
596
- JSON.parse(handle_exception { rest_client.get(@headers) })
608
+ JSON.parse(handle_exception { rest_client.get(get_headers) })
597
609
  end
598
610
 
599
611
  def bearer_token(bearer_token)
@@ -638,11 +650,11 @@ module Kubeclient
638
650
  options = {
639
651
  basic_auth_user: @auth_options[:username],
640
652
  basic_auth_password: @auth_options[:password],
641
- headers: @headers,
653
+ headers: get_headers,
642
654
  http_proxy_uri: @http_proxy_uri,
643
655
  http_max_redirects: http_max_redirects
644
656
  }
645
-
657
+ options[:bearer_token_file] = @auth_options[:bearer_token_file] if @auth_options[:bearer_token_file]
646
658
  if uri.scheme == 'https'
647
659
  options[:ssl] = {
648
660
  ca_file: @ssl_options[:ca_file],
@@ -1,4 +1,4 @@
1
1
  # Kubernetes REST-API Client
2
2
  module Kubeclient
3
- VERSION = '4.9.3'.freeze
3
+ VERSION = '4.10.0'.freeze
4
4
  end
@@ -79,6 +79,7 @@ module Kubeclient
79
79
  end
80
80
 
81
81
  def build_client_options
82
+ @http_options[:headers][:Authorization] = "Bearer #{File.read(@http_options[:bearer_token_file])}" if @http_options[:bearer_token_file]
82
83
  client_options = {
83
84
  headers: @http_options[:headers],
84
85
  proxy: using_proxy
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubeclient
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.9.3
4
+ version: 4.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alissa Bonas
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-23 00:00:00.000000000 Z
11
+ date: 2022-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -42,16 +42,16 @@ dependencies:
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 5.15.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 5.15.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: minitest-rg
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: tzinfo-data
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: jsonpath
169
183
  requirement: !ruby/object:Gem::Requirement