k8s-ruby 0.10.5 → 0.11.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: 279c695901bc2ffe4376b39eb1e7dd33df57ae64381441f601a358f052da1e0d
4
- data.tar.gz: 23a33081c4d7d75bf59af32fa4657ececb46a54a2d2ca5d22933dc31ebe15308
3
+ metadata.gz: 88dee10d641080bb5896aab32b8fd522415ce8e94a2135d68b06a3b9467ab6f8
4
+ data.tar.gz: 36d072c3d850a13419a1964afa0934494b220e3a9b82c359699ce13cf417356a
5
5
  SHA512:
6
- metadata.gz: bde359b7945227ffc1d8d81f705a411fd5a60ef119a2fabf244c20d5383eafd09e307f54f98bc86fdfa60ca40b8bbf358b33f76363756b164f09946f9a1e4ce3
7
- data.tar.gz: e4477e706fed4fae304cd4836144c5ffead93162d1bfa5f2d203d3b1d9db362717303394eefb159320257177588aa9a72304022b34f2a1288c78d0180624cb78
6
+ metadata.gz: 278cf65ef4d9795795b31352720831f82b90110a8463d6f792eddd6c8357e1549d70d859d113e042f1ef6543b2b43bd0d1aa07e178dbfbdd279bcc6d25907f51
7
+ data.tar.gz: 104f06d0534076270881b857f85b180c13cd8fe3a6b995f1335a69ae57844abc3f01f3665c58748b33791537173de0de35d9b09e7b7f3d0b4cefac61586ba2c3
data/.gitignore CHANGED
@@ -8,6 +8,7 @@
8
8
  /tmp/
9
9
  Gemfile.lock
10
10
  .ruby-version
11
+ /.byebug_history
11
12
 
12
13
  # rspec failure tracking
13
14
  .rspec_status
data/.rubocop.relaxed.yml CHANGED
@@ -152,7 +152,7 @@ Metrics/ModuleLength:
152
152
  Metrics/CyclomaticComplexity:
153
153
  Enabled: false
154
154
 
155
- Metrics/LineLength:
155
+ Layout/LineLength:
156
156
  Enabled: false
157
157
 
158
158
  Metrics/MethodLength:
@@ -167,10 +167,31 @@ Metrics/PerceivedComplexity:
167
167
  Naming/VariableName: # disabled because camelCased params are used in kube api/yamls
168
168
  Enabled: false
169
169
 
170
- Naming/UncommunicativeMethodParamName: # disabled because camelCased params are used in kube api/yamls
170
+ Naming/MethodParameterName: # disabled because camelCased params are used in kube api/yamls
171
171
  Enabled: false
172
172
 
173
173
  Naming/FileName:
174
174
  Enabled: true
175
175
  Exclude:
176
176
  - lib/k8s-ruby.rb # ignored because gem name is k8s-ruby, so 'require k8s-ruby' and gem 'k8s-ruby' in Gemfile work
177
+
178
+ Layout/SpaceAroundMethodCallOperator:
179
+ Enabled: true
180
+
181
+ Lint/RaiseException:
182
+ Enabled: true
183
+
184
+ Lint/StructNewOverride:
185
+ Enabled: true
186
+
187
+ Style/ExponentialNotation:
188
+ Enabled: true
189
+
190
+ Style/HashEachMethods:
191
+ Enabled: true
192
+
193
+ Style/HashTransformKeys:
194
+ Enabled: true
195
+
196
+ Style/HashTransformValues:
197
+ Enabled: true
data/.rubocop.yml CHANGED
@@ -49,7 +49,7 @@ Style/Alias:
49
49
  Style/BeginBlock:
50
50
  Enabled: true
51
51
 
52
- Naming/UncommunicativeMethodParamName:
52
+ Naming/MethodParameterName:
53
53
  AllowedNames:
54
54
  - cn
55
55
 
data/Dockerfile CHANGED
@@ -1,10 +1,14 @@
1
- FROM ruby:2.4.3
1
+ ARG BASE_IMAGE=ruby:2.7
2
+ FROM ${BASE_IMAGE}
2
3
 
3
4
  WORKDIR /app
4
5
 
5
6
  COPY Gemfile *.gemspec ./
6
- COPY lib/k8s/client/version.rb ./lib/k8s/client/
7
+ COPY lib/k8s/ruby/version.rb ./lib/k8s/ruby/
8
+
9
+ RUN gem install bundler:2.3.4
7
10
  RUN bundle install
11
+ RUN bundle update --bundler
8
12
 
9
13
  COPY . .
10
14
 
data/README.md CHANGED
@@ -1,6 +1,19 @@
1
1
  # K8s::Client provided by k8s-ruby
2
2
 
3
- Ruby client library for the Kubernetes (1.9+) API
3
+ Ruby client library for the Kubernetes (1.9+) API.
4
+
5
+ The `k8s-ruby` project is a fork of
6
+ [kontena/k8s-client](https://github.com/kontena/k8s-client).
7
+
8
+ Unfortunately the company
9
+ [Kontena.io went bankcrupt](https://blog.kontena.io/farewell/) at
10
+ the end of the year 2019. They had created many wonderful Ruby projects which we
11
+ are grateful.
12
+
13
+ The `k8s-ruby` library is a community effort to keep `k8s-client`
14
+ maintained without any dependencies to the former Kontena.io organization.
15
+ The library was renamed in order to publish it to Rubygems without conflicting
16
+ with `k8s-client`.
4
17
 
5
18
  ## Highlights
6
19
 
@@ -211,4 +224,4 @@ end
211
224
 
212
225
  ## Contributing
213
226
 
214
- Bug reports and pull requests are welcome on GitHub at [rdxnet/k8s-ruby](https://github.com/rdxnet/k8s-ruby).
227
+ Bug reports and pull requests are welcome on GitHub at [k8s-ruby/k8s-ruby](https://github.com/k8s-ruby/k8s-ruby).
data/docker-compose.yaml CHANGED
@@ -1,10 +1,27 @@
1
- rspec:
2
- build: .
3
- volumes:
4
- - .:/app
5
- entrypoint: bundle exec rspec
6
- k8s-ruby:
7
- build: .
8
- volumes:
9
- - .:/app
10
- entrypoint: bundle exec bin/k8s-client
1
+ services:
2
+ rspec-2.6:
3
+ build:
4
+ context: .
5
+ args:
6
+ BASE_IMAGE: ruby:2.6
7
+ volumes:
8
+ - .:/app
9
+ entrypoint: bundle exec rspec
10
+
11
+ rspec-2.7:
12
+ build:
13
+ context: .
14
+ args:
15
+ BASE_IMAGE: ruby:2.7
16
+ volumes:
17
+ - .:/app
18
+ entrypoint: bundle exec rspec
19
+ # # Fails, please fix
20
+ # rspec-3.0:
21
+ # build:
22
+ # context: .
23
+ # args:
24
+ # BASE_IMAGE: ruby:3.0
25
+ # volumes:
26
+ # - .:/app
27
+ # entrypoint: bundle exec rspec
data/k8s-ruby.gemspec CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
11
11
  spec.license = "Apache-2.0"
12
12
 
13
13
  spec.summary = "Kubernetes client library for Ruby"
14
- spec.homepage = "https://github.com/rdxnet/k8s-ruby"
14
+ spec.homepage = "https://github.com/k8s-ruby/k8s-ruby"
15
15
 
16
16
  # Specify which files should be added to the gem when it is released.
17
17
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.bindir = "bin"
22
22
  spec.executables = []
23
23
  spec.require_paths = ["lib"]
24
- spec.required_ruby_version = '~> 2.4'
24
+ spec.required_ruby_version = '>= 2.4'
25
25
 
26
26
  spec.add_runtime_dependency "excon", "~> 0.71"
27
27
  spec.add_runtime_dependency "dry-struct", "~> 0.5.0"
@@ -33,8 +33,9 @@ Gem::Specification.new do |spec|
33
33
  spec.add_runtime_dependency "yaml-safe_load_stream", "~> 0.1"
34
34
 
35
35
  spec.add_development_dependency "bundler", ">= 1.17", "< 3.0"
36
- spec.add_development_dependency "rake", "~> 10.0"
36
+ spec.add_development_dependency "rake", ">= 12.3.3"
37
37
  spec.add_development_dependency "rspec", "~> 3.7"
38
38
  spec.add_development_dependency "webmock", "~> 3.6.2"
39
- spec.add_development_dependency "rubocop", "~> 0.59"
39
+ spec.add_development_dependency "rubocop", "~> 0.82"
40
+ spec.add_development_dependency "byebug", "~> 11.1"
40
41
  end
data/lib/k8s/client.rb CHANGED
@@ -167,7 +167,7 @@ module K8s
167
167
  @transport.gets(*api_paths, response_class: K8s::API::MetaV1::APIResourceList, skip_missing: skip_missing).each do |api_resource_list|
168
168
  api(api_resource_list.groupVersion).api_resources = api_resource_list.resources if api_resource_list
169
169
  end
170
- rescue K8s::Error::NotFound, K8s::Error::ServiceUnavailable # rubocop:disable Lint/HandleExceptions
170
+ rescue K8s::Error::NotFound, K8s::Error::ServiceUnavailable
171
171
  # kubernetes api is in unstable state
172
172
  # because this is only performance optimization, better to skip prefetch and move on
173
173
  end
@@ -3,6 +3,6 @@
3
3
  module K8s
4
4
  class Ruby
5
5
  # Updated on releases using semver.
6
- VERSION = "0.10.5"
6
+ VERSION = "0.11.0"
7
7
  end
8
8
  end
data/lib/k8s/stack.rb CHANGED
@@ -94,7 +94,7 @@ module K8s
94
94
 
95
95
  # @param client [K8s::Client]
96
96
  # @return [Array<K8s::Resource>]
97
- def apply(client, prune: true)
97
+ def apply(client, prune: true, patch: true)
98
98
  server_resources = client.get_resources(resources)
99
99
 
100
100
  resources.zip(server_resources).map do |resource, server_resource|
@@ -104,10 +104,11 @@ module K8s
104
104
  elsif server_resource.metadata.annotations&.dig(@checksum_annotation) != resource.checksum
105
105
  logger.info "Update resource #{resource.apiVersion}:#{resource.kind}/#{resource.metadata.name} in namespace #{resource.metadata.namespace} with checksum=#{resource.checksum}"
106
106
  r = prepare_resource(resource)
107
- if server_resource.can_patch?(@last_config_annotation)
107
+ if patch && server_resource.can_patch?(@last_config_annotation)
108
+ # Patch: apply changes to specific fields only
108
109
  keep_resource! client.patch_resource(server_resource, server_resource.merge_patch_ops(r.to_hash, @last_config_annotation))
109
110
  else
110
- # try to update with PUT
111
+ # Replace (PUT): replace complete object
111
112
  keep_resource! client.update_resource(server_resource.merge(prepare_resource(resource)))
112
113
  end
113
114
  else
data/lib/k8s/transport.rb CHANGED
@@ -94,12 +94,16 @@ module K8s
94
94
  # @param auth_provider [K8s::Config::UserAuthProvider]
95
95
  # @return [String]
96
96
  def self.token_from_auth_provider(auth_provider)
97
- auth_data = `#{auth_provider['cmd-path']} #{auth_provider['cmd-args']}`.strip
98
- if auth_provider['token-key']
99
- json_path = JsonPath.new(auth_provider['token-key'][1...-1])
100
- json_path.first(auth_data)
97
+ if auth_provider['id-token']
98
+ json_path = auth_provider['id-token']
101
99
  else
102
- auth_data
100
+ auth_data = `#{auth_provider['cmd-path']} #{auth_provider['cmd-args']}`.strip
101
+ if auth_provider['token-key']
102
+ json_path = JsonPath.new(auth_provider['token-key'][1...-1])
103
+ json_path.first(auth_data)
104
+ else
105
+ auth_data
106
+ end
103
107
  end
104
108
  end
105
109
 
@@ -133,8 +137,14 @@ module K8s
133
137
  port = ENV['KUBERNETES_SERVICE_PORT_HTTPS'].to_s
134
138
  raise(K8s::Error::Configuration, "in_cluster_config failed: KUBERNETES_SERVICE_PORT_HTTPS environment not set") if port.empty?
135
139
 
140
+ host_with_ipv6_brackets_if_needed = if host.include? "::"
141
+ "[#{host}]"
142
+ else
143
+ host
144
+ end
145
+
136
146
  new(
137
- "https://#{host}:#{port}",
147
+ "https://#{host_with_ipv6_brackets_if_needed}:#{port}",
138
148
  ssl_verify_peer: options.key?(:ssl_verify_peer) ? options.delete(:ssl_verify_peer) : true,
139
149
  ssl_ca_file: options.delete(:ssl_ca_file) || File.join((ENV['TELEPRESENCE_ROOT'] || '/'), 'var/run/secrets/kubernetes.io/serviceaccount/ca.crt'),
140
150
  auth_token: options.delete(:auth_token) || File.read(File.join((ENV['TELEPRESENCE_ROOT'] || '/'), 'var/run/secrets/kubernetes.io/serviceaccount/token')),
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: k8s-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.5
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - rdx.net
8
8
  - Kontena, Inc.
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-01-29 00:00:00.000000000 Z
12
+ date: 2022-01-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: excon
@@ -147,16 +147,16 @@ dependencies:
147
147
  name: rake
148
148
  requirement: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - "~>"
150
+ - - ">="
151
151
  - !ruby/object:Gem::Version
152
- version: '10.0'
152
+ version: 12.3.3
153
153
  type: :development
154
154
  prerelease: false
155
155
  version_requirements: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - "~>"
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
- version: '10.0'
159
+ version: 12.3.3
160
160
  - !ruby/object:Gem::Dependency
161
161
  name: rspec
162
162
  requirement: !ruby/object:Gem::Requirement
@@ -191,15 +191,29 @@ dependencies:
191
191
  requirements:
192
192
  - - "~>"
193
193
  - !ruby/object:Gem::Version
194
- version: '0.59'
194
+ version: '0.82'
195
+ type: :development
196
+ prerelease: false
197
+ version_requirements: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: '0.82'
202
+ - !ruby/object:Gem::Dependency
203
+ name: byebug
204
+ requirement: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '11.1'
195
209
  type: :development
196
210
  prerelease: false
197
211
  version_requirements: !ruby/object:Gem::Requirement
198
212
  requirements:
199
213
  - - "~>"
200
214
  - !ruby/object:Gem::Version
201
- version: '0.59'
202
- description:
215
+ version: '11.1'
216
+ description:
203
217
  email:
204
218
  - firstname.lastname@rdx.net
205
219
  executables: []
@@ -215,7 +229,6 @@ files:
215
229
  - LICENSE
216
230
  - README.md
217
231
  - Rakefile
218
- - bin/k8s-client
219
232
  - docker-compose.yaml
220
233
  - k8s-ruby.gemspec
221
234
  - lib/k8s-ruby.rb
@@ -239,17 +252,17 @@ files:
239
252
  - lib/k8s/stack.rb
240
253
  - lib/k8s/transport.rb
241
254
  - lib/k8s/util.rb
242
- homepage: https://github.com/rdxnet/k8s-ruby
255
+ homepage: https://github.com/k8s-ruby/k8s-ruby
243
256
  licenses:
244
257
  - Apache-2.0
245
258
  metadata: {}
246
- post_install_message:
259
+ post_install_message:
247
260
  rdoc_options: []
248
261
  require_paths:
249
262
  - lib
250
263
  required_ruby_version: !ruby/object:Gem::Requirement
251
264
  requirements:
252
- - - "~>"
265
+ - - ">="
253
266
  - !ruby/object:Gem::Version
254
267
  version: '2.4'
255
268
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -258,8 +271,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
258
271
  - !ruby/object:Gem::Version
259
272
  version: '0'
260
273
  requirements: []
261
- rubygems_version: 3.0.6
262
- signing_key:
274
+ rubygems_version: 3.0.9
275
+ signing_key:
263
276
  specification_version: 4
264
277
  summary: Kubernetes client library for Ruby
265
278
  test_files: []
data/bin/k8s-client DELETED
@@ -1,337 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # frozen_string_literal: true
3
-
4
- require 'optparse'
5
- require 'uri'
6
- require 'k8s-ruby'
7
-
8
- Options = Struct.new(
9
- :in_cluster_config,
10
- :config,
11
- :server,
12
- :insecure_skip_tls_verify,
13
- :prefetch_resources,
14
- :list_resource_kinds,
15
- :namespace,
16
- :all_namespaces,
17
- :label_selector,
18
- :pipeline_list,
19
- :list_resources,
20
- :list_pods,
21
- :update_node,
22
- :node_unschedulable,
23
- :delete_pod,
24
- :delete_pods,
25
- :create_service,
26
- :service_type,
27
- :service_port,
28
- :resources,
29
- :create_resources,
30
- :update_resources,
31
- :delete_resources,
32
- :stack_name,
33
- :stack,
34
- :prune_stack,
35
- :delete_stack,
36
- :api,
37
- :list_api_resources,
38
- :patch_deployment,
39
- :replicas,
40
- :version
41
- )
42
-
43
- options = Options.new
44
- options.create_resources = []
45
- options.update_resources = []
46
- options.delete_resources = []
47
-
48
- logger = Logger.new(STDERR)
49
-
50
- opt_parser = OptionParser.new do |parser|
51
- parser.on('--debug-api') do
52
- K8s::Logging.debug!
53
- K8s::Transport.debug!
54
- end
55
- parser.on('--debug') do
56
- K8s::Logging.debug!
57
- K8s::Transport.verbose!
58
- end
59
- parser.on('--verbose') do
60
- K8s::Logging.verbose!
61
- K8s::Transport.quiet!
62
- end
63
- parser.on('--quiet') do
64
- K8s::Logging.quiet!
65
- K8s::Transport.quiet!
66
- end
67
- parser.on('--version') do
68
- options.version = true
69
- end
70
- parser.on('--in-cluster-config') do
71
- options.in_cluster_config = true
72
- end
73
- parser.on('--kubeconfig=PATH') do |path|
74
- options.config = K8s::Config.load_file(path)
75
- end
76
- parser.on('--server=SERVER') do |server|
77
- options.server = server
78
- end
79
- parser.on('--insecure-skip-tls-verify', TrueClass) do |bool|
80
- options.insecure_skip_tls_verify = bool
81
- end
82
- parser.on('--prefetch-resources', TrueClass) do |bool|
83
- options.prefetch_resources = bool
84
- end
85
- parser.on('--list-resource-kinds', TrueClass) do |_bool|
86
- options.list_resource_kinds = true
87
- end
88
- parser.on('-n', '--namespace=NAMESPACE') do |namespace|
89
- options.namespace = namespace
90
- end
91
- parser.on('--all-namespaces') do
92
- options.all_namespaces = true
93
- end
94
- parser.on('-l', '--label-selector=LABEL=VALUE') do |selector|
95
- options.label_selector = selector
96
- end
97
- parser.on('--pipeline-list') do
98
- options.pipeline_list = true
99
- end
100
- parser.on('--list-resources') do
101
- options.list_resources = true
102
- end
103
- parser.on('--list-pods') do
104
- options.list_pods = true
105
- end
106
- parser.on('--update-node=NODE') do |node|
107
- options.update_node = node
108
- end
109
- parser.on('--node-unschedulable=BOOL', TrueClass) do |bool|
110
- options.node_unschedulable = bool
111
- end
112
- parser.on('--delete-pod=POD') do |pod|
113
- options.delete_pod = pod
114
- end
115
- parser.on('--delete-pods') do
116
- options.delete_pods = true
117
- end
118
- parser.on('--create-service=SERVICE') do |service|
119
- options.create_service = service
120
- end
121
- parser.on('--service-type=SERVICE-TYPE') do |type|
122
- options.service_type = type
123
- end
124
- parser.on('--service-port=PORT', Integer) do |port|
125
- options.service_port = port
126
- end
127
- parser.on('--resource-file=path') do |path|
128
- options.resources = K8s::Resource.from_files(path)
129
- end
130
- parser.on('--create') do
131
- options.create_resources = options.resources
132
- end
133
- parser.on('--update') do
134
- options.update_resources = options.resources
135
- end
136
- parser.on('--delete') do
137
- options.delete_resources = options.resources
138
- end
139
- parser.on('--stack-name=NAME') do |name|
140
- options.stack_name = name
141
- end
142
- parser.on('--stack=PATH') do |path|
143
- options.stack = K8s::Stack.load(options.stack_name || File.basename(path, ".*"), path)
144
- end
145
- parser.on('--prune-stack', TrueClass) do |flag|
146
- options.prune_stack = flag
147
- end
148
- parser.on('--delete-stack') do
149
- options.delete_stack = options.stack
150
- end
151
- parser.on('--api=API') do |api|
152
- options.api = api
153
- end
154
- parser.on('--list-api-resources') do
155
- options.list_api_resources = options.api
156
- end
157
- parser.on('--patch-deployment=NAME') do |name|
158
- options.patch_deployment = name
159
- end
160
- parser.on('--replicas=COUNT', Integer) do |count|
161
- options.replicas = count
162
- end
163
- end
164
-
165
- opt_parser.parse!
166
-
167
- if options.config
168
- overrides = {}
169
- overrides[:ssl_verify_peer] = false if options.insecure_skip_tls_verify
170
-
171
- client = K8s::Client.config(options.config,
172
- server: options.server,
173
- **overrides)
174
- elsif options.in_cluster_config
175
- client = K8s::Client.in_cluster_config
176
- else
177
- client = K8s.client(options.server,
178
- ssl_verify_peer: !options.insecure_skip_tls_verify)
179
- end
180
-
181
- if options.version
182
- logger.info client.version
183
- else
184
- logger.info "Kube server version: #{client.version.gitVersion}"
185
- end
186
-
187
- if options.prefetch_resources
188
- client.apis(prefetch_resources: true)
189
- end
190
-
191
- if options.list_resource_kinds
192
- client.resources.sort_by(&:kind).each do |resource_client|
193
- next if resource_client.subresource?
194
-
195
- puts "#{resource_client.kind} => #{resource_client.api_version} #{resource_client.name}"
196
- end
197
- end
198
-
199
- namespace = if options.all_namespaces
200
- nil # all
201
- elsif options.namespace
202
- options.namespace
203
- elsif options.config && ns = options.config.context.namespace
204
- ns
205
- end
206
-
207
- if options.list_api_resources
208
- logger.info "List resource types for api=#{options.list_api_resources}..."
209
-
210
- client.api(options.list_api_resources).resources do |api_resource|
211
- logger.info "api=#{api_resource.api_version} resource=#{api_resource.resource} subresource=#{api_resource.subresource}"
212
- end
213
- end
214
-
215
- if options.pipeline_list
216
- objects = client.list_resources(namespace: namespace, labelSelector: options.label_selector)
217
- objects.each do |object|
218
- logger.info "api=#{object.apiVersion} kind=#{object.kind} namespace=#{object.metadata.namespace} name=#{object.metadata.name}"
219
- end
220
- elsif options.list_resources
221
- client.apis(prefetch_resources: true).each do |api|
222
- logger.info "api=#{api.api_version}"
223
-
224
- resources = api.resources.select(&:list?)
225
-
226
- resources.each do |resource|
227
- logger.info "api=#{api.api_version} resource=#{resource.name}"
228
-
229
- objects = resource.list(labelSelector: options.label_selector)
230
- objects.each do |object|
231
- logger.info "api=#{object.apiVersion} kind=#{object.kind} namespace=#{object.metadata.namespace} name=#{object.metadata.name}"
232
- end
233
- end
234
- end
235
- end
236
-
237
- if options.list_pods
238
- client.api('v1').resource('pods', namespace: namespace).list(labelSelector: options.label_selector).each do |pod|
239
- puts "namespace=#{pod.metadata.namespace} pod: #{pod.metadata.name} node=#{pod.spec.nodeName}"
240
- end
241
- end
242
-
243
- if options.update_node
244
- node = client.api('v1').resource('nodes').get(options.update_node)
245
-
246
- puts "Update node=#{node.metadata.name}..."
247
-
248
- if !options.node_unschedulable.nil?
249
- puts "Set node=#{node.metadata.name} unschedulable: #{node.spec.unschedulable} => #{options.node_unschedulable}"
250
-
251
- node[:spec][:unschedulable] = options.node_unschedulable
252
- end
253
-
254
- client.api('v1').resource('nodes').update_resource(node)
255
- end
256
-
257
- if options.delete_pod
258
- logger.info "Delete pod=#{options.delete_pod} in namespace=#{namespace}"
259
-
260
- pod = client.api('v1').resource('pods', namespace: namespace).delete(options.delete_pod)
261
-
262
- logger.debug { pod.metadata }
263
- end
264
-
265
- if options.delete_pods
266
- logger.info "Delete pods with labelSelector=#{options.label_selector} in namespace=#{namespace}"
267
-
268
- pods = client.api('v1').resource('pods', namespace: namespace).delete_collection(labelSelector: options.label_selector)
269
-
270
- pods.each do |pod_instance|
271
- logger.info "Deleted pod=#{pod_instance.metadata.name} in namespace=#{pod_instance.metadata.namespace} on node=#{pod_instance.spec.nodeName}"
272
- end
273
- end
274
-
275
- if options.create_service
276
- service = K8s::Resource.new(
277
- apiVersion: 'v1',
278
- kind: 'Service',
279
- metadata: {
280
- namespace: namespace,
281
- name: options.create_service
282
- },
283
- spec: {
284
- type: options.service_type,
285
- ports: [
286
- { port: options.service_port }
287
- ],
288
- selector: Hash[options.label_selector.split('=', 2)]
289
- }
290
- )
291
-
292
- logger.info "Create service=#{service.metadata.name} in namespace=#{service.metadata.namespace}"
293
-
294
- service = client.api('v1').resource('services').create_resource(service)
295
-
296
- logger.debug { service }
297
- end
298
-
299
- options.create_resources.each do |resource|
300
- resource = client.create_resource(resource)
301
-
302
- logger.info "Created #{resource.apiVersion} resource #{resource.kind} #{resource.metadata.name} in namespace #{resource.metadata.namespace}:\n#{JSON.pretty_generate(resource)}"
303
- end
304
-
305
- options.update_resources.each do |resource|
306
- resource = client.update_resource(resource)
307
-
308
- logger.info "Updated #{resource.apiVersion} resource #{resource.kind} #{resource.metadata.name} in namespace #{resource.metadata.namespace}:\n#{JSON.pretty_generate(resource)}"
309
- end
310
-
311
- options.delete_resources.each do |resource|
312
- begin
313
- resource = client.delete_resource(resource)
314
-
315
- logger.info "Deleted #{resource.apiVersion} resource #{resource.kind} #{resource.metadata.name} in namespace #{resource.metadata.namespace}:\n#{JSON.pretty_generate(resource)}"
316
- rescue K8s::Error::NotFound => e
317
- logger.info "Skip #{resource.apiVersion} resource #{resource.kind} #{resource.metadata.name} in namespace #{resource.metadata.namespace}: #{e}"
318
- end
319
- end
320
-
321
- if stack = options.delete_stack
322
- logger.info "Delete stack #{stack.name}..."
323
-
324
- stack.delete(client)
325
-
326
- elsif options.stack
327
- logger.info "Apply stack #{options.stack.name}..."
328
-
329
- options.stack.apply(client, prune: options.prune_stack)
330
- end
331
-
332
- if name = options.patch_deployment
333
- client.api('apps/v1').resource('deployments', namespace: namespace).merge_patch(
334
- name,
335
- spec: { replicas: options.replicas }
336
- )
337
- end