k8s-client 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 15012c4385d7320b4026e0da41c3092623ff3b157e3115e4d6a908e56a5af926
4
- data.tar.gz: 2a8b4a339cff5223c5c7a601b01d60af5313abde8ba42ad9cace8cda0fd6b510
3
+ metadata.gz: 4eadbdf15c18c24f837159b566d886fc3d7c2ee0f3319aaf791464ae9474535a
4
+ data.tar.gz: c1de255adac68b1550b379b555ba3d1c8c8fe9cdb30272344feed1a82a0a3bb3
5
5
  SHA512:
6
- metadata.gz: ce43ce55808589458ce1f6e002fd3687e78adc015c57f200791109fd88e664a9a11c80284cd60514a7822fc89662f7b23617b2802c8b90a99be31c8355ad62cc
7
- data.tar.gz: bbf4c9f9b66412bf179555a4d8ba3ae807f24a2629709efe8ed2ecbd466eeeca7597571685518afc246cec98e05602a050ba148409f8955114b3de373b1c0e1f
6
+ metadata.gz: 6a5e543cd9d4c310b769ed770a6d69cd27dbfd8d33af00c9b9e239a2f9277dbba450ee05d0f61c27d2940eadf8d372f053d2dec222168fbcb0d09e542236b82b
7
+ data.tar.gz: d7bbfe14c6ba9686b0ae2319e2e3dea91a983974842dc6089c832c6c582a460d4b422227c8cc3bca12b5a163eeca65455c826a6d8dd010d9974ce1c4dbb72ff2
@@ -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'
@@ -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
- @api_groups = @transport.get(
113
- '/apis',
114
- response_class: K8s::API::MetaV1::APIGroupList
115
- ).groups.map{ |api_group| api_group.versions.map(&:groupVersion) }.flatten
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
- @transport.gets(*api_paths, response_class: K8s::API::MetaV1::APIResourceList, skip_missing: skip_missing).each do |api_resource_list|
140
- api(api_resource_list.groupVersion).api_resources = api_resource_list.resources if api_resource_list
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
- ResourceClient.list(resources, @transport, **options)
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]
@@ -3,6 +3,6 @@
3
3
  module K8s
4
4
  class Client
5
5
  # Updated on releases using semver.
6
- VERSION = "0.7.0"
6
+ VERSION = "0.8.0"
7
7
  end
8
8
  end
@@ -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]
@@ -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
@@ -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.7.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-02 00:00:00.000000000 Z
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