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 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