kubeclient 4.9.1 → 4.12.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.
Files changed (117) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/actions.yml +43 -0
  3. data/.rubocop.yml +111 -14
  4. data/CHANGELOG.md +100 -0
  5. data/README.md +14 -4
  6. data/RELEASING.md +8 -8
  7. data/kubeclient.gemspec +10 -6
  8. data/lib/kubeclient/aws_eks_credentials.rb +17 -8
  9. data/lib/kubeclient/common.rb +24 -19
  10. data/lib/kubeclient/config.rb +22 -10
  11. data/lib/kubeclient/version.rb +1 -1
  12. data/lib/kubeclient/watch_stream.rb +1 -0
  13. metadata +45 -223
  14. data/.travis.yml +0 -29
  15. data/test/cassettes/kubernetes_guestbook.yml +0 -879
  16. data/test/config/allinone.kubeconfig +0 -20
  17. data/test/config/execauth.kubeconfig +0 -62
  18. data/test/config/external-ca.pem +0 -18
  19. data/test/config/external-cert.pem +0 -19
  20. data/test/config/external-key.rsa +0 -27
  21. data/test/config/external.kubeconfig +0 -20
  22. data/test/config/gcpauth.kubeconfig +0 -22
  23. data/test/config/gcpcmdauth.kubeconfig +0 -26
  24. data/test/config/nouser.kubeconfig +0 -16
  25. data/test/config/oidcauth.kubeconfig +0 -25
  26. data/test/config/timestamps.kubeconfig +0 -25
  27. data/test/config/userauth.kubeconfig +0 -28
  28. data/test/json/bindings_list.json +0 -10
  29. data/test/json/component_status.json +0 -17
  30. data/test/json/component_status_list.json +0 -52
  31. data/test/json/config.istio.io_api_resource_list.json +0 -679
  32. data/test/json/config_map_list.json +0 -9
  33. data/test/json/core_api_resource_list.json +0 -181
  34. data/test/json/core_api_resource_list_without_kind.json +0 -129
  35. data/test/json/core_oapi_resource_list_without_kind.json +0 -197
  36. data/test/json/created_endpoint.json +0 -28
  37. data/test/json/created_namespace.json +0 -20
  38. data/test/json/created_secret.json +0 -16
  39. data/test/json/created_security_context_constraint.json +0 -65
  40. data/test/json/created_service.json +0 -31
  41. data/test/json/empty_pod_list.json +0 -9
  42. data/test/json/endpoint_list.json +0 -48
  43. data/test/json/entity_list.json +0 -56
  44. data/test/json/event_list.json +0 -35
  45. data/test/json/extensions_v1beta1_api_resource_list.json +0 -217
  46. data/test/json/limit_range.json +0 -23
  47. data/test/json/limit_range_list.json +0 -31
  48. data/test/json/namespace.json +0 -13
  49. data/test/json/namespace_exception.json +0 -8
  50. data/test/json/namespace_list.json +0 -32
  51. data/test/json/node.json +0 -29
  52. data/test/json/node_list.json +0 -37
  53. data/test/json/node_notice.json +0 -160
  54. data/test/json/persistent_volume.json +0 -37
  55. data/test/json/persistent_volume_claim.json +0 -32
  56. data/test/json/persistent_volume_claim_list.json +0 -40
  57. data/test/json/persistent_volume_claims_nil_items.json +0 -8
  58. data/test/json/persistent_volume_list.json +0 -45
  59. data/test/json/pod.json +0 -92
  60. data/test/json/pod_list.json +0 -79
  61. data/test/json/pod_template_list.json +0 -9
  62. data/test/json/pods_1.json +0 -265
  63. data/test/json/pods_2.json +0 -102
  64. data/test/json/pods_410.json +0 -9
  65. data/test/json/processed_template.json +0 -27
  66. data/test/json/replication_controller.json +0 -57
  67. data/test/json/replication_controller_list.json +0 -66
  68. data/test/json/resource_quota.json +0 -46
  69. data/test/json/resource_quota_list.json +0 -54
  70. data/test/json/secret_list.json +0 -44
  71. data/test/json/security.openshift.io_api_resource_list.json +0 -69
  72. data/test/json/security_context_constraint_list.json +0 -375
  73. data/test/json/service.json +0 -33
  74. data/test/json/service_account.json +0 -25
  75. data/test/json/service_account_list.json +0 -82
  76. data/test/json/service_illegal_json_404.json +0 -1
  77. data/test/json/service_json_patch.json +0 -26
  78. data/test/json/service_list.json +0 -97
  79. data/test/json/service_merge_patch.json +0 -26
  80. data/test/json/service_patch.json +0 -25
  81. data/test/json/service_update.json +0 -22
  82. data/test/json/template.json +0 -27
  83. data/test/json/template.openshift.io_api_resource_list.json +0 -75
  84. data/test/json/template_list.json +0 -35
  85. data/test/json/versions_list.json +0 -6
  86. data/test/json/watch_stream.json +0 -3
  87. data/test/test_common.rb +0 -95
  88. data/test/test_common_url_handling.rb +0 -160
  89. data/test/test_component_status.rb +0 -29
  90. data/test/test_config.rb +0 -222
  91. data/test/test_endpoint.rb +0 -54
  92. data/test/test_exec_credentials.rb +0 -225
  93. data/test/test_gcp_command_credentials.rb +0 -27
  94. data/test/test_google_application_default_credentials.rb +0 -15
  95. data/test/test_guestbook_go.rb +0 -235
  96. data/test/test_helper.rb +0 -18
  97. data/test/test_kubeclient.rb +0 -881
  98. data/test/test_limit_range.rb +0 -25
  99. data/test/test_missing_methods.rb +0 -80
  100. data/test/test_namespace.rb +0 -59
  101. data/test/test_node.rb +0 -70
  102. data/test/test_oidc_auth_provider.rb +0 -103
  103. data/test/test_persistent_volume.rb +0 -29
  104. data/test/test_persistent_volume_claim.rb +0 -28
  105. data/test/test_pod.rb +0 -81
  106. data/test/test_pod_log.rb +0 -157
  107. data/test/test_process_template.rb +0 -80
  108. data/test/test_replication_controller.rb +0 -47
  109. data/test/test_resource_list_without_kind.rb +0 -78
  110. data/test/test_resource_quota.rb +0 -23
  111. data/test/test_secret.rb +0 -62
  112. data/test/test_security_context_constraint.rb +0 -62
  113. data/test/test_service.rb +0 -357
  114. data/test/test_service_account.rb +0 -26
  115. data/test/test_watch.rb +0 -195
  116. data/test/txt/pod_log.txt +0 -6
  117. data/test/valid_token_file +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1ea191875dc5c9e99d49152f6615caa50478bc8604a4de9c6fdda0d46da75ea5
4
- data.tar.gz: 84214e5b1f2f3116aeb646828e0a5cf6456173493abf1fb384fe6132a723271d
3
+ metadata.gz: 21e5de1343a8f393c8eef653af1bb41e061bbee7fafa5d8cedafe8c163653071
4
+ data.tar.gz: aebdf094e7b05239467c8120382e47b65c82e031092cfc728b605f158257800a
5
5
  SHA512:
6
- metadata.gz: 549974ed0fbec82aa99df19db4829af4da21eec3ab037037c9a6880ab2b7f0bbf9a854ee9e1713a9eedccf6e7fafbc593301a8e67b745e54d88f9da158f6b596
7
- data.tar.gz: 2f44720eca3c585e69c562b218f6e17c1ed0fb13dd5e26177fef6fa3ec610a6c0b1f056102ac3d3e3d9cf21801fe13d8560c509423838304cac0a40b66eedae8
6
+ metadata.gz: 161d8585521513897f730c0c1ab5f060634533cff048e146819dfa5c93e60afbdb67a4ed314245d61e343f7eca891454b2022e4ed9ced0117d518a8c2eb78ffa
7
+ data.tar.gz: 7f42460a4528177faccc81526ffc0904a5a7cc89ac56013fe99c208b6ab6cc2e7f289e1a654cb67f5f85985ffcd98af4b9e93b49cd052963d4d333697f50a7d5
@@ -0,0 +1,43 @@
1
+ name: CI
2
+ on:
3
+ push:
4
+ branches:
5
+ - '**'
6
+ tags:
7
+ - '**'
8
+ pull_request:
9
+ branches:
10
+ - '**'
11
+ jobs:
12
+ build:
13
+ continue-on-error: true
14
+ runs-on: ${{ matrix.os_and_command.os }}
15
+ strategy:
16
+ matrix:
17
+ ruby: [ '2.7', '3.0', '3.1', '3.2', 'ruby-head', 'truffleruby-head' ]
18
+ os_and_command:
19
+ - os: macos-latest
20
+ command: 'env TESTOPTS="--verbose" bundle exec rake test'
21
+ - os: windows-latest
22
+ command: 'env TESTOPTS="--verbose" bundle exec rake test'
23
+ - os: ubuntu-latest
24
+ # Sometimes minitest starts and then just hangs printing nothing.
25
+ # Github by default kills after 6hours(!). Hopefully SIGTERM may let it print some details?
26
+ command: 'timeout --signal=TERM 3m env TESTOPTS="--verbose" test/config/update_certs_k0s.rb'
27
+ include:
28
+ # run rubocop against lowest supported ruby
29
+ - os: ubuntu-latest
30
+ ruby: '2.7'
31
+ command: 'bundle exec rake rubocop'
32
+ name: ${{ matrix.os_and_command.os }} ${{ matrix.ruby }} rake ${{ matrix.os_and_command.command }}
33
+ steps:
34
+ - uses: actions/checkout@v4
35
+ # actions/setup-ruby did not support truffle or bundler caching
36
+ - uses: ruby/setup-ruby@v1
37
+ with:
38
+ ruby-version: ${{ matrix.ruby }}
39
+ bundler-cache: false # disable running 'bundle install' and caching installed gems see https://github.com/httprb/http/issues/572
40
+ - run: bundle install
41
+ - run: ${{ matrix.os_and_command.command }}
42
+ timeout-minutes: 10
43
+
data/.rubocop.yml CHANGED
@@ -1,35 +1,132 @@
1
1
  AllCops:
2
2
  DisplayCopNames: true
3
- TargetRubyVersion: 2.2 # Oldest version kubeclient supports
3
+ TargetRubyVersion: 2.7 # Oldest version kubeclient supports
4
4
  MethodLength:
5
5
  Enabled: false
6
6
  ClassLength:
7
7
  Enabled: false
8
8
  Metrics/AbcSize:
9
9
  Enabled: false
10
- Metrics/LineLength:
11
- Max: 100
12
10
  Metrics/ParameterLists:
13
11
  Max: 5
14
12
  CountKeywordArgs: false
15
- Metrics/CyclomaticComplexity:
16
- Max: 8
17
- Metrics/PerceivedComplexity:
18
- Max: 8
19
13
  Metrics/ModuleLength:
20
14
  Enabled: false
21
- Style/MethodCallWithArgsParentheses:
22
- Enabled: true
23
- IgnoredMethods: [require, raise, include, attr_reader, refute, assert]
24
- Exclude: [Gemfile, Rakefile, kubeclient.gemspec, Gemfile.dev.rb]
25
15
  Metrics/BlockLength:
26
16
  Exclude: [kubeclient.gemspec]
27
17
  Security/MarshalLoad:
28
18
  Exclude: [test/**/*]
29
19
  Style/FileName:
30
20
  Exclude: [Gemfile, Rakefile, Gemfile.dev.rb]
31
- Style/MethodCallWithArgsParentheses:
32
- IgnoredMethods:
33
- - require_relative
34
21
  Style/RegexpLiteral:
35
22
  Enabled: false
23
+
24
+ # Cops that have active offences in the codebase.
25
+ Lint/RedundantCopDisableDirective:
26
+ Enabled: false
27
+ Metrics/CyclomaticComplexity:
28
+ Enabled: false
29
+ Max: 8
30
+ Metrics/PerceivedComplexity:
31
+ Enabled: false
32
+ Max: 8
33
+ Style/MethodCallWithArgsParentheses:
34
+ Enabled: false
35
+ IgnoredMethods: [require, require_relative, raise, include, attr_reader, refute, assert]
36
+ Exclude: [Gemfile, Rakefile, kubeclient.gemspec, Gemfile.dev.rb]
37
+ Style/FrozenStringLiteralComment:
38
+ Enabled: false
39
+ Lint/UnreachableLoop:
40
+ Enabled: false
41
+ Style/RedundantRegexpEscape:
42
+ Enabled: false
43
+ Layout/MultilineMethodCallIndentation:
44
+ Enabled: false
45
+ Lint/UselessAssignment:
46
+ Enabled: false
47
+ Style/StringLiterals:
48
+ Enabled: false
49
+ Layout/ExtraSpacing:
50
+ Enabled: false
51
+ Layout/IndentationWidth:
52
+ Enabled: false
53
+ Naming/MethodParameterName:
54
+ Enabled: false
55
+ Layout/HashAlignment:
56
+ Enabled: false
57
+ Layout/TrailingWhitespace:
58
+ Enabled: false
59
+ Naming/RescuedExceptionsVariableName:
60
+ Enabled: false
61
+ Style/RedundantBegin:
62
+ Enabled: false
63
+ Style/WordArray:
64
+ Enabled: false
65
+ Style/ExplicitBlockArgument:
66
+ Enabled: false
67
+ Layout/LeadingEmptyLines:
68
+ Enabled: false
69
+ Layout/EmptyLineAfterGuardClause:
70
+ Enabled: false
71
+ Style/SafeNavigation:
72
+ Enabled: false
73
+ Style/SoleNestedConditional:
74
+ Enabled: false
75
+ Lint/MissingSuper:
76
+ Enabled: false
77
+ Style/IfUnlessModifier:
78
+ Enabled: false
79
+ Layout/LineLength:
80
+ Enabled: false
81
+ Lint/MissingCopEnableDirective:
82
+ Enabled: false
83
+ Naming/MethodName:
84
+ Enabled: false
85
+ Style/StringConcatenation:
86
+ Enabled: false
87
+ Style/SlicingWithRange:
88
+ Enabled: false
89
+ Lint/MixedRegexpCaptureTypes:
90
+ Enabled: false
91
+ Style/AccessorGrouping:
92
+ Enabled: false
93
+ Style/HashEachMethods:
94
+ Enabled: false
95
+ Naming/AccessorMethodName:
96
+ Enabled: false
97
+ Style/RedundantAssignment:
98
+ Enabled: false
99
+ Gemspec/OrderedDependencies:
100
+ Enabled: false
101
+ Style/ExpandPathArguments:
102
+ Enabled: false
103
+ Style/Encoding:
104
+ Enabled: false
105
+
106
+ # New Cops to configure
107
+ Lint/DuplicateBranch: # (new in 1.3)
108
+ Enabled: false
109
+ Lint/DuplicateRegexpCharacterClassElement: # (new in 1.1)
110
+ Enabled: false
111
+ Lint/EmptyBlock: # (new in 1.1)
112
+ Enabled: false
113
+ Lint/EmptyClass: # (new in 1.3)
114
+ Enabled: false
115
+ Lint/NoReturnInBeginEndBlocks: # (new in 1.2)
116
+ Enabled: false
117
+ Lint/ToEnumArguments: # (new in 1.1)
118
+ Enabled: false
119
+ Lint/UnmodifiedReduceAccumulator: # (new in 1.1)
120
+ Enabled: false
121
+ Style/ArgumentsForwarding: # (new in 1.1)
122
+ Enabled: false
123
+ Style/CollectionCompact: # (new in 1.2)
124
+ Enabled: false
125
+ Style/DocumentDynamicEvalDefinition: # (new in 1.1)
126
+ Enabled: false
127
+ Style/NegatedIfElseCondition: # (new in 1.2)
128
+ Enabled: false
129
+ Style/NilLambda: # (new in 1.3)
130
+ Enabled: false
131
+ Style/SwapValues: # (new in 1.1)
132
+ Enabled: false
data/CHANGELOG.md CHANGED
@@ -4,6 +4,106 @@ 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.12.0 - 2024-06-18
8
+
9
+ ### Added
10
+ - Add test coverage for Ruby 3.2 (#615)
11
+ - Allow a region when getting a signer for Aws::Sts (#507)
12
+ - Update the AWS STS endpoint to be regional as the method is now regional (#528)
13
+ - Assume role support for aws eks credentials (#630)
14
+
15
+ ### Fixed
16
+ - [v4.y] Regenerated expired test TLS certs by running `test/config/update_certs_k0s.rb`.
17
+ - [v4.y] Regenerated expired test TLS certs (#611)
18
+ - Regenerated expired test TLS certs (#632)
19
+
20
+ ### Changed
21
+ - Update actions/checkout (#590)
22
+ - chore(deps): update actions/checkout action to v4 (#619)
23
+
24
+ ## 4.11.0 — 2022-12-22
25
+
26
+ ### Removed
27
+
28
+ - Dropped support for EOL Ruby versions 2.5, 2.6. (#589)
29
+
30
+ ### Added
31
+
32
+ - Relaxed dependency on `http` gem (used for watches) to allow 5.y.z versions. (#589)
33
+
34
+ - Specifically, http 5.1.1 may fix issues watching with IPv6. (#585)
35
+
36
+ ## 4.10.1 — 2022-10-01
37
+
38
+ ### Removed
39
+
40
+ - Dropped debug logging about bearer token options that was added in 4.10.0. (#577)
41
+
42
+ ## 4.10.0 — 2022-08-29
43
+
44
+ ### Added
45
+
46
+ - When using `:bearer_token_file`, re-read the file on every request. (#566 closed #561)
47
+
48
+ Kubernetes version 1.21 graduated [BoundServiceAccountTokenVolume feature][] to beta
49
+ and enabled it by default, so standard in-cluster auth now uses short-lived tokens.
50
+
51
+ This changes allows a long-lived `Client` object to keep working when the token file gets
52
+ rotated. It's not optimized at all, if you feel the performance overhead, please report!
53
+
54
+ [BoundServiceAccountTokenVolume feature]: https://github.com/kubernetes/enhancements/issues/542
55
+
56
+ ## 4.9.3 — 2022-03-23
57
+
58
+ ### Fixed
59
+
60
+ - VULNERABILITY FIX: Previously, whenever kubeconfig did not define custom CA
61
+ (normal situation for production clusters with public domain and certificate!),
62
+ `Config` was returning ssl_options[:verify_ssl] hard-coded to `VERIFY_NONE` :-(
63
+
64
+ Assuming you passed those ssl_options to Kubeclient::Client, this means that
65
+ instead of checking server's certificate against your system CA store,
66
+ it would accept ANY certificate, allowing easy man-in-the middle attacks.
67
+
68
+ This is especially dangerous with user/password or token credentials
69
+ because MITM attacker could simply steal those credentials to the cluster
70
+ and do anything you could do on the cluster.
71
+
72
+ This was broken IN ALL RELEASES MADE BEFORE 2022, ever since
73
+ [`Kubeclient::Config` was created](https://github.com/ManageIQ/kubeclient/pull/127/files#diff-32e70f2f6781a9e9c7b83ae5e7eaf5ffd068a05649077fa38f6789e72f3de837R41-R48).
74
+
75
+ [#554](https://github.com/ManageIQ/kubeclient/issues/554).
76
+
77
+ - Bug fix: kubeconfig `insecure-skip-tls-verify` field was ignored.
78
+ When kubeconfig did define custom CA, `Config` was returning hard-coded `VERIFY_PEER`.
79
+
80
+ Now we honor it, return `VERIFY_NONE` iff kubeconfig has explicit
81
+ `insecure-skip-tls-verify: true`, otherwise `VERIFY_PEER`.
82
+
83
+ [#555](https://github.com/ManageIQ/kubeclient/issues/555).
84
+
85
+ - `Config`: fixed parsing of `certificate-authority` file containing concatenation of
86
+ several certificates. Previously, server's cert was checked against only first CA cert,
87
+ resulting in possible "certificate verify failed" errors.
88
+
89
+ An important use case is a chain of root & intermediate cert(s) - necessary when cluster's CA
90
+ itself is signed by another custom CA.
91
+ But also helps when you simply concatenate independent certs. (#461, #552)
92
+
93
+ - Still broken (#460): inline `certificate-authority-data` is still parsed using `add_cert`
94
+ method that handles only one cert.
95
+
96
+ These don't affect code that supplies `Client` parameters directly,
97
+ only code that uses `Config`.
98
+
99
+ ## 4.9.2 — 2021-05-30
100
+
101
+ ### Added
102
+ - Ruby 3.0 compatibility (#500, #505).
103
+
104
+ ### Removed
105
+ - Reduce .gem size by dropping test/ directory, it's useless at run time (#502).
106
+
7
107
  ## 4.9.1 — 2020-08-31
8
108
  ### Fixed
9
109
  - Now should work with apiserver deployed not at root of domain but a sub-path,
data/README.md CHANGED
@@ -9,6 +9,12 @@ The client supports GET, POST, PUT, DELETE on all the entities available in kube
9
9
  The client currently supports Kubernetes REST api version v1.
10
10
  To learn more about groups and versions in kubernetes refer to [k8s docs](https://kubernetes.io/docs/api/)
11
11
 
12
+ ## VULNERABILITY❗
13
+
14
+ If you use `Kubeclient::Config`, all gem versions released before 2022 could return incorrect `ssl_options[:verify_ssl]`,
15
+ endangering your connection and cluster credentials.
16
+ See https://github.com/ManageIQ/kubeclient/issues/554 for details and which versions got a fix.
17
+
12
18
  ## Installation
13
19
 
14
20
  Add this line to your application's Gemfile:
@@ -98,8 +104,8 @@ client = Kubeclient::Client.new(
98
104
  ### Authentication
99
105
 
100
106
  If you are using basic authentication or bearer tokens as described
101
- [here](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/authentication.md) then you can specify one
102
- of the following:
107
+ [here](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/authentication.md)
108
+ then you can specify one of the following:
103
109
 
104
110
  ```ruby
105
111
  auth_options = {
@@ -111,7 +117,7 @@ client = Kubeclient::Client.new(
111
117
  )
112
118
  ```
113
119
 
114
- or
120
+ or (fixed token, if it expires it's up to you to create a new `Client` object):
115
121
 
116
122
  ```ruby
117
123
  auth_options = {
@@ -122,7 +128,7 @@ client = Kubeclient::Client.new(
122
128
  )
123
129
  ```
124
130
 
125
- or
131
+ or (will automatically re-read the token if file is updated):
126
132
 
127
133
  ```ruby
128
134
  auth_options = {
@@ -307,10 +313,14 @@ require 'aws-sdk-core'
307
313
  credentials = Aws::Credentials.new(access_key, secret_key)
308
314
  # Or a profile
309
315
  credentials = Aws::SharedCredentials.new(profile_name: 'default').credentials
316
+ # Or for an STS Assumed Role Credentials or any other credential Provider other than Static Credentials
317
+ credentials = Aws::AssumeRoleCredentials.new({ client: sts_client, role_arn: role_arn, role_session_name: session_name })
310
318
 
319
+ # Kubeclient Auth Options
311
320
  auth_options = {
312
321
  bearer_token: Kubeclient::AmazonEksCredentials.token(credentials, eks_cluster_name)
313
322
  }
323
+
314
324
  client = Kubeclient::Client.new(
315
325
  eks_cluster_https_endpoint, 'v1', auth_options: auth_options
316
326
  )
data/RELEASING.md CHANGED
@@ -4,10 +4,6 @@
4
4
  Kubeclient release versioning follows [SemVer](https://semver.org/).
5
5
  At some point in time it is decided to release version x.y.z.
6
6
 
7
- ```bash
8
- RELEASE_BRANCH="master"
9
- ```
10
-
11
7
  ## 0. (once) Install gem-release, needed for several commands here:
12
8
 
13
9
  ```bash
@@ -16,13 +12,17 @@ gem install gem-release
16
12
 
17
13
  ## 1. PR(s) for changelog & bump
18
14
 
19
- Edit `CHANGELOG.md` as necessary. Even if all included changes remembered to update it, you should replace "Unreleased" section header with appropriate "x.y.z — 20yy-mm-dd" header.
20
-
21
- Bump `lib/kubeclient/version.rb` manually, or by using:
22
15
  ```bash
16
+ RELEASE_BRANCH="master"
23
17
  RELEASE_VERSION=x.y.z
24
18
 
25
19
  git checkout -b "release-$RELEASE_VERSION" $RELEASE_BRANCH
20
+ ```
21
+
22
+ Edit `CHANGELOG.md` as necessary. Even if all included changes remembered to update it, you should replace "Unreleased" section header with appropriate "x.y.z — 20yy-mm-dd" header.
23
+
24
+ Bump `lib/kubeclient/version.rb` manually, or by using:
25
+ ```bash
26
26
  # Won't work with uncommitted changes, you have to commit the changelog first.
27
27
  gem bump --version $RELEASE_VERSION
28
28
  git show # View version bump change.
@@ -46,7 +46,7 @@ Make sure we're locally after the bump PR *merge commit*:
46
46
  ```bash
47
47
  git checkout $RELEASE_BRANCH
48
48
  git status # Make sure there are no local changes
49
- git pull --ff-only https://github.com/abonas/kubeclient $RELEASE_BRANCH
49
+ git pull --ff-only https://github.com/ManageIQ/kubeclient $RELEASE_BRANCH
50
50
  git log -n1
51
51
  ```
52
52
 
data/kubeclient.gemspec CHANGED
@@ -14,15 +14,16 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = 'https://github.com/abonas/kubeclient'
15
15
  spec.license = 'MIT'
16
16
 
17
- spec.files = `git ls-files -z`.split("\x0")
17
+ git_files = `git ls-files -z`.split("\x0")
18
+ spec.files = git_files.grep_v(%r{^(test|spec|features)/})
18
19
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
+ spec.test_files = []
20
21
  spec.require_paths = ['lib']
21
- spec.required_ruby_version = '>= 2.2.0'
22
+ spec.required_ruby_version = '>= 2.7.0'
22
23
 
23
24
  spec.add_development_dependency 'bundler', '>= 1.6'
24
- spec.add_development_dependency 'rake', '~> 12.0'
25
- spec.add_development_dependency 'minitest'
25
+ spec.add_development_dependency 'rake', '~> 13.0'
26
+ spec.add_development_dependency 'minitest', '~> 5.15.0'
26
27
  spec.add_development_dependency 'minitest-rg'
27
28
  spec.add_development_dependency 'webmock', '~> 3.0'
28
29
  spec.add_development_dependency 'vcr'
@@ -30,9 +31,12 @@ Gem::Specification.new do |spec|
30
31
  spec.add_development_dependency 'googleauth', '~> 0.5.1'
31
32
  spec.add_development_dependency('mocha', '~> 1.5')
32
33
  spec.add_development_dependency 'openid_connect', '~> 1.1'
34
+ spec.add_development_dependency 'net-smtp'
35
+ # needed on Windows, at least for openid_connect
36
+ spec.add_development_dependency 'tzinfo-data'
33
37
 
34
38
  spec.add_dependency 'jsonpath', '~> 1.0'
35
39
  spec.add_dependency 'rest-client', '~> 2.0'
36
40
  spec.add_dependency 'recursive-open-struct', '~> 1.1', '>= 1.1.1'
37
- spec.add_dependency 'http', '>= 3.0', '< 5.0'
41
+ spec.add_dependency 'http', '>= 3.0', '< 6.0'
38
42
  end
@@ -7,7 +7,7 @@ module Kubeclient
7
7
  end
8
8
 
9
9
  class << self
10
- def token(credentials, eks_cluster)
10
+ def token(credentials, eks_cluster, region: 'us-east-1')
11
11
  begin
12
12
  require 'aws-sigv4'
13
13
  require 'base64'
@@ -20,17 +20,26 @@ module Kubeclient
20
20
  end
21
21
  # https://github.com/aws/aws-sdk-ruby/pull/1848
22
22
  # Get a signer
23
- # Note - sts only has ONE endpoint (not regional) so 'us-east-1' hardcoding should be OK
24
- signer = Aws::Sigv4::Signer.new(
25
- service: 'sts',
26
- region: 'us-east-1',
27
- credentials: credentials
28
- )
23
+ signer = if credentials.respond_to?(:credentials)
24
+ Aws::Sigv4::Signer.new(
25
+ service: 'sts',
26
+ region: region,
27
+ credentials_provider: credentials
28
+ )
29
+ else
30
+ Aws::Sigv4::Signer.new(
31
+ service: 'sts',
32
+ region: region,
33
+ credentials: credentials
34
+ )
35
+ end
36
+
37
+ credentials = credentials.credentials if credentials.respond_to?(:credentials)
29
38
 
30
39
  # https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Sigv4/Signer.html#presign_url-instance_method
31
40
  presigned_url_string = signer.presign_url(
32
41
  http_method: 'GET',
33
- url: 'https://sts.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15',
42
+ url: "https://sts.#{region}.amazonaws.com/?Action=GetCallerIdentity&Version=2011-06-15",
34
43
  body: '',
35
44
  credentials: credentials,
36
45
  expires_in: 60,
@@ -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,11 @@ 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
+ if auth_options[:bearer_token_file]
93
91
  validate_bearer_token_file
94
92
  bearer_token(File.read(@auth_options[:bearer_token_file]))
93
+ elsif auth_options[:bearer_token]
94
+ bearer_token(@auth_options[:bearer_token])
95
95
  end
96
96
  end
97
97
 
@@ -136,6 +136,11 @@ module Kubeclient
136
136
  @discovered = true
137
137
  end
138
138
 
139
+ def get_headers
140
+ bearer_token(File.read(@auth_options[:bearer_token_file])) if @auth_options[:bearer_token_file]
141
+ @headers
142
+ end
143
+
139
144
  def self.parse_definition(kind, name)
140
145
  # Kubernetes gives us 3 inputs:
141
146
  # kind: "ComponentStatus", "NetworkPolicy", "Endpoints"
@@ -267,8 +272,8 @@ module Kubeclient
267
272
  patch_entity(entity.resource_name, name, patch, 'merge-patch', namespace)
268
273
  end
269
274
 
270
- define_singleton_method("apply_#{entity.method_names[0]}") do |*args|
271
- apply_entity(entity.resource_name, *args)
275
+ define_singleton_method("apply_#{entity.method_names[0]}") do |resource, opts = {}|
276
+ apply_entity(entity.resource_name, resource, **opts)
272
277
  end
273
278
  end
274
279
  end
@@ -349,7 +354,7 @@ module Kubeclient
349
354
  ns_prefix = build_namespace_prefix(options[:namespace])
350
355
  response = handle_exception do
351
356
  rest_client[ns_prefix + resource_name]
352
- .get({ 'params' => params }.merge(@headers))
357
+ .get({ 'params' => params }.merge(get_headers))
353
358
  end
354
359
  format_response(options[:as] || @as, response.body, entity_type)
355
360
  end
@@ -362,7 +367,7 @@ module Kubeclient
362
367
  ns_prefix = build_namespace_prefix(namespace)
363
368
  response = handle_exception do
364
369
  rest_client[ns_prefix + resource_name + "/#{name}"]
365
- .get(@headers)
370
+ .get(get_headers)
366
371
  end
367
372
  format_response(options[:as] || @as, response.body)
368
373
  end
@@ -378,7 +383,7 @@ module Kubeclient
378
383
  rs.options.merge(
379
384
  method: :delete,
380
385
  url: rs.url,
381
- headers: { 'Content-Type' => 'application/json' }.merge(@headers),
386
+ headers: { 'Content-Type' => 'application/json' }.merge(get_headers),
382
387
  payload: payload
383
388
  )
384
389
  )
@@ -400,7 +405,7 @@ module Kubeclient
400
405
  hash[:apiVersion] = @api_group + @api_version
401
406
  response = handle_exception do
402
407
  rest_client[ns_prefix + resource_name]
403
- .post(hash.to_json, { 'Content-Type' => 'application/json' }.merge(@headers))
408
+ .post(hash.to_json, { 'Content-Type' => 'application/json' }.merge(get_headers))
404
409
  end
405
410
  format_response(@as, response.body)
406
411
  end
@@ -410,7 +415,7 @@ module Kubeclient
410
415
  ns_prefix = build_namespace_prefix(entity_config[:metadata][:namespace])
411
416
  response = handle_exception do
412
417
  rest_client[ns_prefix + resource_name + "/#{name}"]
413
- .put(entity_config.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(@headers))
418
+ .put(entity_config.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(get_headers))
414
419
  end
415
420
  format_response(@as, response.body)
416
421
  end
@@ -421,7 +426,7 @@ module Kubeclient
421
426
  rest_client[ns_prefix + resource_name + "/#{name}"]
422
427
  .patch(
423
428
  patch.to_json,
424
- { 'Content-Type' => "application/#{strategy}+json" }.merge(@headers)
429
+ { 'Content-Type' => "application/#{strategy}+json" }.merge(get_headers)
425
430
  )
426
431
  end
427
432
  format_response(@as, response.body)
@@ -434,7 +439,7 @@ module Kubeclient
434
439
  rest_client[ns_prefix + resource_name + "/#{name}"]
435
440
  .patch(
436
441
  resource.to_json,
437
- { 'Content-Type' => 'application/apply-patch+yaml' }.merge(@headers)
442
+ { 'Content-Type' => 'application/apply-patch+yaml' }.merge(get_headers)
438
443
  )
439
444
  end
440
445
  format_response(@as, response.body)
@@ -468,7 +473,7 @@ module Kubeclient
468
473
  ns = build_namespace_prefix(namespace)
469
474
  handle_exception do
470
475
  rest_client[ns + "pods/#{pod_name}/log"]
471
- .get({ 'params' => params }.merge(@headers))
476
+ .get({ 'params' => params }.merge(get_headers))
472
477
  end
473
478
  end
474
479
 
@@ -506,7 +511,7 @@ module Kubeclient
506
511
  ns_prefix = build_namespace_prefix(template[:metadata][:namespace])
507
512
  response = handle_exception do
508
513
  rest_client[ns_prefix + 'processedtemplates']
509
- .post(template.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(@headers))
514
+ .post(template.to_h.to_json, { 'Content-Type' => 'application/json' }.merge(get_headers))
510
515
  end
511
516
  JSON.parse(response)
512
517
  end
@@ -519,7 +524,7 @@ module Kubeclient
519
524
  end
520
525
 
521
526
  def api
522
- response = handle_exception { create_rest_client.get(@headers) }
527
+ response = handle_exception { create_rest_client.get(get_headers) }
523
528
  JSON.parse(response)
524
529
  end
525
530
 
@@ -593,7 +598,7 @@ module Kubeclient
593
598
  end
594
599
 
595
600
  def fetch_entities
596
- JSON.parse(handle_exception { rest_client.get(@headers) })
601
+ JSON.parse(handle_exception { rest_client.get(get_headers) })
597
602
  end
598
603
 
599
604
  def bearer_token(bearer_token)
@@ -638,11 +643,11 @@ module Kubeclient
638
643
  options = {
639
644
  basic_auth_user: @auth_options[:username],
640
645
  basic_auth_password: @auth_options[:password],
641
- headers: @headers,
646
+ headers: get_headers,
642
647
  http_proxy_uri: @http_proxy_uri,
643
648
  http_max_redirects: http_max_redirects
644
649
  }
645
-
650
+ options[:bearer_token_file] = @auth_options[:bearer_token_file] if @auth_options[:bearer_token_file]
646
651
  if uri.scheme == 'https'
647
652
  options[:ssl] = {
648
653
  ca_file: @ssl_options[:ca_file],