k8s-client 0.3.0 → 0.3.1

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: 780d34c7890954d2e54e0b158f94a8d90e9b5bdaaab11e65cf2db86e695f640a
4
- data.tar.gz: 40f4843ff19e0b403f906e2f17f9ff7859c5f47413f0354e7ae1758fc5d24377
3
+ metadata.gz: 767ebc980b6e01f66e4739cc341aa7518245287d88273068460358b88f8b110f
4
+ data.tar.gz: 73a21392fdf0ad9e56060571aced26e0b53983f6f2c1b727280a16d72dbaa8a1
5
5
  SHA512:
6
- metadata.gz: 8a5014cf50bd530964fd31c686587288c76bd86aff746bdd5c09b73ec265a82baf4e46d10d297150d48e8984f7d7bc3f0eee25c33511611b7d71e73397675cc0
7
- data.tar.gz: fda08120279153fd294f8b7a820acdd052f61d6a96d589733800e90ef3673863e3fe5ef600ae5b46f421c4a32b2994681840da356424c0da5aea650faf96dedf
6
+ metadata.gz: a2943973befbad7b7f24b6f9aa9aa186a20ca5e970259bcb2a354e8161511af4a42d29aeceb75ab26f9031c414f56d0f7f7cc606723e4f585c637427d4e59e6d
7
+ data.tar.gz: a8161a1c2b74a027395a33ee3ff39ea4b87554615d861933a5a0c04cac4525086bc84ca91234ab7c62b308b067ec441b7b396c7fb9e3e08493141814a3acf0b2
@@ -11,3 +11,4 @@ require 'k8s/resource'
11
11
  require 'k8s/resource_client'
12
12
  require 'k8s/stack'
13
13
  require 'k8s/transport'
14
+ require 'k8s/util'
@@ -58,19 +58,22 @@ module K8s
58
58
  end
59
59
 
60
60
  # @param api_versions [Array<String>] defaults to all APIs
61
+ # @param prefetch_resources [Boolean] prefetch any missing api_resources for each api_version
62
+ # @param skip_missing [Boolean] return APIClient without api_resources? if 404
61
63
  # @return [Array<APIClient>]
62
- def apis(api_versions = nil, prefetch_resources: false)
64
+ def apis(api_versions = nil, prefetch_resources: false, skip_missing: false)
63
65
  api_versions ||= ['v1'] + self.api_groups
64
66
 
65
67
  if prefetch_resources
66
68
  # api groups that are missing their api_resources
67
69
  api_paths = api_versions
70
+ .uniq
68
71
  .select{|api_version| !api(api_version).api_resources? }
69
72
  .map{|api_version| APIClient.path(api_version) }
70
73
 
71
74
  # load into APIClient.api_resources=
72
- @transport.gets(*api_paths, response_class: K8s::API::MetaV1::APIResourceList).each do |api_resource_list|
73
- api(api_resource_list.groupVersion).api_resources = api_resource_list.resources
75
+ @transport.gets(*api_paths, response_class: K8s::API::MetaV1::APIResourceList, skip_missing: skip_missing).each do |api_resource_list|
76
+ api(api_resource_list.groupVersion).api_resources = api_resource_list.resources if api_resource_list
74
77
  end
75
78
  end
76
79
 
@@ -116,21 +119,32 @@ module K8s
116
119
  client_for_resource(resource).get_resource(resource)
117
120
  end
118
121
 
122
+ # Returns nils for any resources that do not exist.
123
+ # This includes custom resources that were not yet defined.
124
+ #
119
125
  # @param resources [Array<K8s::Resource>]
120
- # @return [Array<K8s::Resource, nil>]
126
+ # @return [Array<K8s::Resource, nil>] matching resources array 1:1
121
127
  def get_resources(resources)
122
- # prefetch api resources
123
- apis(resources.map{|resource| resource.apiVersion }.uniq, prefetch_resources: true)
128
+ # prefetch api resources, skip missing APIs
129
+ resource_apis = apis(resources.map{ |resource| resource.apiVersion }, prefetch_resources: true, skip_missing: true)
130
+
131
+ # map each resource to excon request options, or nil if resource is not (yet) defined
132
+ requests = resources.zip(resource_apis).map{ |resource, api_client|
133
+ next nil unless api_client.api_resources?
134
+
135
+ resource_client = api_client.client_for_resource(resource)
124
136
 
125
- resource_clients = resources.map{|resource| client_for_resource(resource) }
126
- requests = resources.zip(resource_clients).map{|resource, resource_client|
127
137
  {
128
138
  method: 'GET',
129
139
  path: resource_client.path(resource.metadata.name, namespace: resource.metadata.namespace),
130
140
  response_class: resource_client.resource_class,
131
141
  }
132
142
  }
133
- responses = @transport.requests(*requests, skip_missing: true)
143
+
144
+ # map non-nil requests to response objects, or nil for nil request options
145
+ Util.compact_map(requests) { |reqs|
146
+ @transport.requests(*reqs, skip_missing: true)
147
+ }
134
148
  end
135
149
 
136
150
  # @param resource [K8s::Resource]
@@ -1,5 +1,5 @@
1
1
  module K8s
2
2
  class Client
3
- VERSION = "0.3.0"
3
+ VERSION = "0.3.1"
4
4
  end
5
5
  end
@@ -124,6 +124,7 @@ module K8s
124
124
  client.delete_resource(resource)
125
125
  rescue K8s::Error::NotFound
126
126
  # assume aliased objects in multiple API groups, like for Deployments
127
+ # alternatively, a custom resource whose definition was already deleted earlier
127
128
  end
128
129
  end
129
130
  end
@@ -201,19 +201,21 @@ module K8s
201
201
  # @param skip_missing [Boolean] return nil for HTTP 404 responses
202
202
  # @param retry_errors [Boolean] retry with non-pipelined request for HTTP 503 responses
203
203
  # @return [Array<response_class, Hash, nil>]
204
- def requests(*options, response_class: nil, skip_missing: false, retry_errors: true)
204
+ def requests(*options, skip_missing: false, retry_errors: true, **common_options)
205
205
  return [] if options.empty? # excon chokes
206
206
 
207
207
  start = Time.now
208
208
  responses = excon.requests(
209
- options.map{|options| request_options(**options)}
209
+ options.map{|options| request_options(**common_options.merge(options))}
210
210
  )
211
211
  t = Time.now - start
212
212
 
213
213
  objects = responses.zip(options).map{|response, request_options|
214
+ response_class = request_options[:response_class] || common_options[:response_class]
215
+
214
216
  begin
215
217
  parse_response(response, request_options,
216
- response_class: request_options[:response_class] || response_class,
218
+ response_class: response_class,
217
219
  )
218
220
  rescue K8s::Error::NotFound
219
221
  if skip_missing
@@ -226,7 +228,7 @@ module K8s
226
228
  logger.warn { "Retry #{format_request(request_options)} => HTTP #{exc.code} #{exc.reason} in #{'%.3f' % t}s" }
227
229
 
228
230
  # only retry the failed request, not the entire pipeline
229
- request(response_class: response_class, **request_options)
231
+ request(response_class: response_class, **common_options.merge(request_options))
230
232
  else
231
233
  raise
232
234
  end
@@ -250,13 +252,12 @@ module K8s
250
252
  end
251
253
 
252
254
  # @param *paths [String]
253
- def gets(*paths, response_class: nil, **options)
255
+ def gets(*paths, **options)
254
256
  requests(*paths.map{|path| {
255
257
  method: 'GET',
256
258
  path: self.path(path),
257
- **options,
258
259
  } },
259
- response_class: response_class,
260
+ **options
260
261
  )
261
262
  end
262
263
  end
@@ -0,0 +1,22 @@
1
+ module K8s
2
+ module Util
3
+ # Yield with all non-nil args, returning matching array with corresponding return values or nils.
4
+ #
5
+ # Args must be usable as hash keys. Duplicate args will all map to the same return value.
6
+ #
7
+ # @param args [Array<nil, Object>]
8
+ # @yield args
9
+ # @yieldparam args [Array<Object>] omitting any nil values
10
+ # @return [Array<nil, Object>] matching args array 1:1, containing yielded values for non-nil args
11
+ def self.compact_map(args)
12
+ func_args = args.compact
13
+
14
+ values = yield func_args
15
+
16
+ # Hash{arg => value}
17
+ value_map = Hash[func_args.zip(values)]
18
+
19
+ args.map{|arg| value_map[arg] }
20
+ end
21
+ end
22
+ end
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.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kontena, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-08-09 00:00:00.000000000 Z
11
+ date: 2018-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: excon
@@ -159,6 +159,7 @@ files:
159
159
  - lib/k8s/resource_client.rb
160
160
  - lib/k8s/stack.rb
161
161
  - lib/k8s/transport.rb
162
+ - lib/k8s/util.rb
162
163
  homepage: https://github.com/kontena/k8s-client
163
164
  licenses:
164
165
  - Apache-2.0