k8s-client 0.7.0 → 0.8.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 +4 -4
- data/k8s-client.gemspec +0 -1
- data/lib/k8s/client.rb +36 -12
- data/lib/k8s/client/version.rb +1 -1
- data/lib/k8s/resource.rb +1 -1
- data/lib/k8s/transport.rb +2 -2
- data/lib/k8s/util.rb +52 -0
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4eadbdf15c18c24f837159b566d886fc3d7c2ee0f3319aaf791464ae9474535a
|
4
|
+
data.tar.gz: c1de255adac68b1550b379b555ba3d1c8c8fe9cdb30272344feed1a82a0a3bb3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a5e543cd9d4c310b769ed770a6d69cd27dbfd8d33af00c9b9e239a2f9277dbba450ee05d0f61c27d2940eadf8d372f053d2dec222168fbcb0d09e542236b82b
|
7
|
+
data.tar.gz: d7bbfe14c6ba9686b0ae2319e2e3dea91a983974842dc6089c832c6c582a460d4b422227c8cc3bca12b5a163eeca65455c826a6d8dd010d9974ce1c4dbb72ff2
|
data/k8s-client.gemspec
CHANGED
@@ -25,7 +25,6 @@ Gem::Specification.new do |spec|
|
|
25
25
|
|
26
26
|
spec.add_runtime_dependency "excon", "~> 0.62.0"
|
27
27
|
spec.add_runtime_dependency "dry-struct", "~> 0.5.0"
|
28
|
-
spec.add_runtime_dependency "deep_merge", "~> 1.2.1"
|
29
28
|
spec.add_runtime_dependency "recursive-open-struct", "~> 1.1.0"
|
30
29
|
spec.add_runtime_dependency 'hashdiff', '~> 0.3.7'
|
31
30
|
spec.add_runtime_dependency 'jsonpath', '~> 0.9.5'
|
data/lib/k8s/client.rb
CHANGED
@@ -3,20 +3,20 @@
|
|
3
3
|
require 'openssl'
|
4
4
|
require 'base64'
|
5
5
|
require 'yajl'
|
6
|
+
require 'monitor'
|
7
|
+
|
8
|
+
require 'k8s/util'
|
6
9
|
|
7
10
|
require 'k8s/api/metav1'
|
8
11
|
require 'k8s/api/version'
|
9
|
-
|
10
12
|
require 'k8s/config'
|
11
13
|
require 'k8s/logging'
|
12
|
-
|
13
14
|
require 'k8s/api_client'
|
14
15
|
require "k8s/error"
|
15
16
|
require 'k8s/resource'
|
16
17
|
require 'k8s/resource_client'
|
17
18
|
require 'k8s/stack'
|
18
19
|
require 'k8s/transport'
|
19
|
-
require 'k8s/util'
|
20
20
|
|
21
21
|
module K8s
|
22
22
|
# @param server [String] http/s URL
|
@@ -45,10 +45,11 @@ module K8s
|
|
45
45
|
# @see K8s::Transport#in_cluster_config
|
46
46
|
#
|
47
47
|
# @param namespace [String] default namespace for all operations
|
48
|
+
# @param options [Hash] options passed to transport, @see Transport#in_cluster_config
|
48
49
|
# @return [K8s::Client]
|
49
50
|
# @raise [K8s::Error::Config,Errno::ENOENT,Errno::EACCES]
|
50
|
-
def self.in_cluster_config(namespace: nil)
|
51
|
-
new(Transport.in_cluster_config, namespace: namespace)
|
51
|
+
def self.in_cluster_config(namespace: nil, **options)
|
52
|
+
new(Transport.in_cluster_config(**options), namespace: namespace)
|
52
53
|
end
|
53
54
|
|
54
55
|
# Attempts to create a K8s::Client instance automatically using environment variables, existing configuration
|
@@ -81,6 +82,8 @@ module K8s
|
|
81
82
|
end
|
82
83
|
end
|
83
84
|
|
85
|
+
include MonitorMixin
|
86
|
+
|
84
87
|
attr_reader :transport
|
85
88
|
|
86
89
|
# @param transport [K8s::Transport]
|
@@ -90,6 +93,7 @@ module K8s
|
|
90
93
|
@namespace = namespace
|
91
94
|
|
92
95
|
@api_clients = {}
|
96
|
+
super()
|
93
97
|
end
|
94
98
|
|
95
99
|
# @raise [K8s::Error]
|
@@ -109,10 +113,16 @@ module K8s
|
|
109
113
|
#
|
110
114
|
# @return [Array<String>]
|
111
115
|
def api_groups!
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
+
synchronize do
|
117
|
+
@api_groups = @transport.get(
|
118
|
+
'/apis',
|
119
|
+
response_class: K8s::API::MetaV1::APIGroupList
|
120
|
+
).groups.flat_map{ |api_group| api_group.versions.map(&:groupVersion) }
|
121
|
+
|
122
|
+
@api_clients.clear
|
123
|
+
end
|
124
|
+
|
125
|
+
@api_groups
|
116
126
|
end
|
117
127
|
|
118
128
|
# Cached /apis preferred group apiVersions
|
@@ -136,8 +146,13 @@ module K8s
|
|
136
146
|
.map{ |api_version| APIClient.path(api_version) }
|
137
147
|
|
138
148
|
# load into APIClient.api_resources=
|
139
|
-
|
140
|
-
|
149
|
+
begin
|
150
|
+
@transport.gets(*api_paths, response_class: K8s::API::MetaV1::APIResourceList, skip_missing: skip_missing).each do |api_resource_list|
|
151
|
+
api(api_resource_list.groupVersion).api_resources = api_resource_list.resources if api_resource_list
|
152
|
+
end
|
153
|
+
rescue K8s::Error::NotFound, K8s::Error::ServiceUnavailable # rubocop:disable Lint/HandleExceptions
|
154
|
+
# kubernetes api is in unstable state
|
155
|
+
# because this is only performance optimization, better to skip prefetch and move on
|
141
156
|
end
|
142
157
|
end
|
143
158
|
|
@@ -158,9 +173,18 @@ module K8s
|
|
158
173
|
# @param options @see K8s::ResourceClient#list
|
159
174
|
# @return [Array<K8s::Resource>]
|
160
175
|
def list_resources(resources = nil, **options)
|
176
|
+
cached_clients = @api_clients.size.positive?
|
161
177
|
resources ||= self.resources.select(&:list?)
|
162
178
|
|
163
|
-
|
179
|
+
begin
|
180
|
+
ResourceClient.list(resources, @transport, **options)
|
181
|
+
rescue K8s::Error::NotFound
|
182
|
+
raise unless cached_clients
|
183
|
+
|
184
|
+
cached_clients = false
|
185
|
+
api_groups!
|
186
|
+
retry
|
187
|
+
end
|
164
188
|
end
|
165
189
|
|
166
190
|
# @param resource [K8s::Resource]
|
data/lib/k8s/client/version.rb
CHANGED
data/lib/k8s/resource.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'deep_merge'
|
4
3
|
require 'recursive-open-struct'
|
5
4
|
require 'hashdiff'
|
6
5
|
require 'forwardable'
|
@@ -13,6 +12,7 @@ module K8s
|
|
13
12
|
include Comparable
|
14
13
|
|
15
14
|
using YAMLSafeLoadStream
|
15
|
+
using K8s::Util::HashDeepMerge
|
16
16
|
|
17
17
|
# @param data [String]
|
18
18
|
# @return [self]
|
data/lib/k8s/transport.rb
CHANGED
@@ -106,8 +106,8 @@ module K8s
|
|
106
106
|
new(
|
107
107
|
"https://#{host}:#{port}",
|
108
108
|
ssl_verify_peer: options.key?(:ssl_verify_peer) ? options.delete(:ssl_verify_peer) : true,
|
109
|
-
ssl_ca_file: options.delete(:ssl_ca_file) || '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt',
|
110
|
-
auth_token: options.delete(:auth_token) || File.read('/var/run/secrets/kubernetes.io/serviceaccount/token'),
|
109
|
+
ssl_ca_file: options.delete(:ssl_ca_file) || File.join((ENV['TELEPRESENCE_ROOT'] || '/'), 'var/run/secrets/kubernetes.io/serviceaccount/ca.crt'),
|
110
|
+
auth_token: options.delete(:auth_token) || File.read(File.join((ENV['TELEPRESENCE_ROOT'] || '/'), 'var/run/secrets/kubernetes.io/serviceaccount/token')),
|
111
111
|
**options
|
112
112
|
)
|
113
113
|
end
|
data/lib/k8s/util.rb
CHANGED
@@ -3,6 +3,58 @@
|
|
3
3
|
module K8s
|
4
4
|
# Miscellaneous helpers
|
5
5
|
module Util
|
6
|
+
module HashDeepMerge
|
7
|
+
refine Hash do
|
8
|
+
# @param other [Hash]
|
9
|
+
# @param overwrite_arrays [Boolean] when encountering an array, replace the array with the new array
|
10
|
+
# @param union_arrays [Boolean] when encountering an array, use Array#union to combine with the existing array
|
11
|
+
# @param keep_existing [Boolean] prefer old value over new value
|
12
|
+
# @param merge_nil_values [Boolean] overwrite an existing value with a nil value
|
13
|
+
# @param merge_non_hash [Boolean] calls .merge on objects that respond to .merge
|
14
|
+
def deep_merge(other, overwrite_arrays: true, union_arrays: false, keep_existing: false, merge_nil_values: false, merge_non_hash: false)
|
15
|
+
merge(other) do |key, old_value, new_value|
|
16
|
+
case old_value
|
17
|
+
when Hash
|
18
|
+
raise "#{key} : #{new_value.class.name} can not be merged into a Hash" unless new_value.is_a?(Hash)
|
19
|
+
|
20
|
+
old_value.deep_merge(
|
21
|
+
new_value,
|
22
|
+
overwrite_arrays: overwrite_arrays,
|
23
|
+
union_arrays: union_arrays,
|
24
|
+
keep_existing: keep_existing,
|
25
|
+
merge_nil_values: merge_nil_values,
|
26
|
+
merge_non_hash: merge_non_hash
|
27
|
+
)
|
28
|
+
when Array
|
29
|
+
if overwrite_arrays
|
30
|
+
new_value
|
31
|
+
elsif union_arrays
|
32
|
+
raise "#{key} : #{new_value.class.name} can not be merged into an Array" unless new_value.is_a?(Array)
|
33
|
+
|
34
|
+
old_value | new_value
|
35
|
+
else
|
36
|
+
old_value + new_value
|
37
|
+
end
|
38
|
+
else
|
39
|
+
if keep_existing
|
40
|
+
old_value
|
41
|
+
elsif new_value.nil? && merge_nil_values
|
42
|
+
nil
|
43
|
+
elsif merge_non_hash && old_value.respond_to?(:merge)
|
44
|
+
old_value.merge(new_value)
|
45
|
+
else
|
46
|
+
new_value.nil? ? old_value : new_value
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def deep_merge!(other, **options)
|
53
|
+
replace(deep_merge(other, **options))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
6
58
|
PATH_TR_MAP = { '~' => '~0', '/' => '~1' }.freeze
|
7
59
|
PATH_REGEX = %r{(/|~(?!1))}.freeze
|
8
60
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: k8s-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kontena, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: excon
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.5.0
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: deep_merge
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 1.2.1
|
48
|
-
type: :runtime
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 1.2.1
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: recursive-open-struct
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|