k8s-client 0.3.0 → 0.3.1

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