k8s-ruby 0.10.5 → 0.12.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: 279c695901bc2ffe4376b39eb1e7dd33df57ae64381441f601a358f052da1e0d
4
- data.tar.gz: 23a33081c4d7d75bf59af32fa4657ececb46a54a2d2ca5d22933dc31ebe15308
3
+ metadata.gz: 462575bda9c48588eb7d9d9d1ffda32c973ebdbf0b3d9113a7b8a2fdd94b781f
4
+ data.tar.gz: 2a593329f6040478517bc2895d1cf4929a19f728fd97ceb696e538dfb0de161e
5
5
  SHA512:
6
- metadata.gz: bde359b7945227ffc1d8d81f705a411fd5a60ef119a2fabf244c20d5383eafd09e307f54f98bc86fdfa60ca40b8bbf358b33f76363756b164f09946f9a1e4ce3
7
- data.tar.gz: e4477e706fed4fae304cd4836144c5ffead93162d1bfa5f2d203d3b1d9db362717303394eefb159320257177588aa9a72304022b34f2a1288c78d0180624cb78
6
+ metadata.gz: 4ca53f957316cfc8b8fa38988e5637e85e110c8772601c6ad591a711486393d7ed530bfd86b6840bd8156bab9bf4299f5547963e825a5b1ee4c5835d95d8c0ae
7
+ data.tar.gz: b5ad610fadaa524f603e90b5c027bd6f17dc9005dc70785467a5ef50e59ae73aebf4c1962f0202f8221b070927c480286725baab366cfa888d7b1a9a76036b39
data/.gitignore CHANGED
@@ -8,6 +8,8 @@
8
8
  /tmp/
9
9
  Gemfile.lock
10
10
  .ruby-version
11
+ .tool-versions
12
+ /.byebug_history
11
13
 
12
14
  # rspec failure tracking
13
15
  .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.5
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
 
@@ -162,7 +175,7 @@ pods = client.api('v1').resource('pods', namespace: 'default').delete_collection
162
175
 
163
176
  #### Programmatically defined resources
164
177
  ```ruby
165
- service = K8s::Resource.new(
178
+ service = K8s::Resource.new({
166
179
  apiVersion: 'v1',
167
180
  kind: 'Service',
168
181
  metadata: {
@@ -176,7 +189,7 @@ service = K8s::Resource.new(
176
189
  ],
177
190
  selector: {'app' => 'test'},
178
191
  },
179
- )
192
+ })
180
193
 
181
194
  logger.info "Create service=#{service.metadata.name} in namespace=#{service.metadata.namespace}"
182
195
 
@@ -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
+
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
@@ -1,5 +1,5 @@
1
1
 
2
- lib = File.expand_path("../lib", __FILE__)
2
+ lib = File.expand_path("lib", __dir__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require "k8s/ruby/version"
5
5
 
@@ -11,30 +11,32 @@ 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.
18
- spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
19
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
20
  end
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", "< 3.1"]
25
25
 
26
26
  spec.add_runtime_dependency "excon", "~> 0.71"
27
- spec.add_runtime_dependency "dry-struct", "~> 0.5.0"
28
- spec.add_runtime_dependency "dry-types", "~> 0.13.0"
29
- spec.add_runtime_dependency "recursive-open-struct", "~> 1.1.0"
30
- spec.add_runtime_dependency 'hashdiff', '~> 1.0.0'
31
- spec.add_runtime_dependency 'jsonpath', '~> 0.9.5'
32
- spec.add_runtime_dependency 'yajl-ruby', '~> 1.4.0'
33
- spec.add_runtime_dependency "yaml-safe_load_stream", "~> 0.1"
27
+ spec.add_runtime_dependency "dry-struct", "~> 1.3.0"
28
+ spec.add_runtime_dependency "dry-types", "~> 1.4.0"
29
+ spec.add_runtime_dependency "dry-configurable", "~> 0.13.0"
30
+ spec.add_runtime_dependency "recursive-open-struct", "~> 1.1.3"
31
+ spec.add_runtime_dependency "hashdiff", "~> 1.0.0"
32
+ spec.add_runtime_dependency "jsonpath", "~> 0.9.5"
33
+ spec.add_runtime_dependency "yajl-ruby", "~> 1.4.0"
34
+ spec.add_runtime_dependency "yaml-safe_load_stream2", "~> 0.1.1"
34
35
 
35
36
  spec.add_development_dependency "bundler", ">= 1.17", "< 3.0"
36
- spec.add_development_dependency "rake", "~> 10.0"
37
+ spec.add_development_dependency "rake", ">= 12.3.3"
37
38
  spec.add_development_dependency "rspec", "~> 3.7"
38
39
  spec.add_development_dependency "webmock", "~> 3.6.2"
39
- spec.add_development_dependency "rubocop", "~> 0.59"
40
+ spec.add_development_dependency "rubocop", "~> 0.82"
41
+ spec.add_development_dependency "byebug", "~> 11.1"
40
42
  end
@@ -12,8 +12,8 @@ module K8s
12
12
  attribute :version, Types::Strict::String.optional.default(nil)
13
13
  attribute :kind, Types::Strict::String
14
14
  attribute :verbs, Types::Strict::Array.of(Types::Strict::String)
15
- attribute :shortNames, Types::Strict::Array.of(Types::Strict::String).optional.default(proc { [] })
16
- attribute :categories, Types::Strict::Array.of(Types::Strict::String).optional.default(proc { [] })
15
+ attribute :shortNames, Types::Strict::Array.of(Types::Strict::String).optional.default(proc { [] }, shared: true)
16
+ attribute :categories, Types::Strict::Array.of(Types::Strict::String).optional.default(proc { [] }, shared: true)
17
17
  end
18
18
 
19
19
  # @see https://godoc.org/k8s.io/apimachinery/pkg/apis/meta/v1#APIResourceList
@@ -38,9 +38,9 @@ module K8s
38
38
  attribute :deletionGracePeriodSeconds, Types::Strict::Integer.optional.default(nil)
39
39
  attribute :labels, Types::Strict::Hash.map(Types::Strict::String, Types::Strict::String).optional.default(nil)
40
40
  attribute :annotations, Types::Strict::Hash.map(Types::Strict::String, Types::Strict::String).optional.default(nil)
41
- attribute :ownerReferences, Types::Strict::Array.of(OwnerReference).optional.default([])
41
+ attribute :ownerReferences, Types::Strict::Array.of(OwnerReference).optional.default([], shared: true)
42
42
  attribute :initializers, Initializers.optional.default(nil)
43
- attribute :finalizers, Types::Strict::Array.of(Types::Strict::String).optional.default([])
43
+ attribute :finalizers, Types::Strict::Array.of(Types::Strict::String).optional.default([], shared: true)
44
44
  attribute :clusterName, Types::Strict::String.optional.default(nil)
45
45
  end
46
46
 
data/lib/k8s/api.rb CHANGED
@@ -8,7 +8,7 @@ module K8s
8
8
  module API
9
9
  # Common Dry::Types used in the API
10
10
  module Types
11
- include Dry::Types.module
11
+ include Dry::Types()
12
12
  end
13
13
 
14
14
  # Common API struct type, handling JSON transforms with symbol keys
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
data/lib/k8s/config.rb CHANGED
@@ -25,7 +25,7 @@ module K8s
25
25
  class Config < ConfigStruct
26
26
  # Common dry-types for config
27
27
  class Types
28
- include Dry::Types.module
28
+ include Dry::Types()
29
29
  end
30
30
 
31
31
  # structured cluster
@@ -99,12 +99,12 @@ module K8s
99
99
 
100
100
  attribute :kind, Types::Strict::String.optional.default(nil)
101
101
  attribute :apiVersion, Types::Strict::String.optional.default(nil)
102
- attribute :preferences, Types::Strict::Hash.optional.default(proc { {} })
103
- attribute :clusters, Types::Strict::Array.of(NamedCluster).optional.default(proc { [] })
104
- attribute :users, Types::Strict::Array.of(NamedUser).optional.default(proc { [] })
105
- attribute :contexts, Types::Strict::Array.of(NamedContext).optional.default(proc { [] })
102
+ attribute :preferences, Types::Strict::Hash.optional.default(proc { {} }, shared: true)
103
+ attribute :clusters, Types::Strict::Array.of(NamedCluster).optional.default(proc { [] }, shared: true)
104
+ attribute :users, Types::Strict::Array.of(NamedUser).optional.default(proc { [] }, shared: true)
105
+ attribute :contexts, Types::Strict::Array.of(NamedContext).optional.default(proc { [] }, shared: true)
106
106
  attribute :current_context, Types::Strict::String.optional.default(nil)
107
- attribute :extensions, Types::Strict::Array.optional.default(proc { [] })
107
+ attribute :extensions, Types::Strict::Array.optional.default(proc { [] }, shared: true)
108
108
 
109
109
  # Loads a configuration from a YAML file
110
110
  #
data/lib/k8s/resource.rb CHANGED
@@ -40,19 +40,16 @@ module K8s
40
40
  end
41
41
 
42
42
  # @param hash [Hash]
43
- # @param recurse_over_arrays [Boolean]
44
43
  # @param options [Hash] see RecursiveOpenStruct#initialize
45
- def initialize(hash, recurse_over_arrays: true, **options)
46
- super(hash,
47
- recurse_over_arrays: recurse_over_arrays,
48
- **options
49
- )
44
+ def initialize(hash, options = {})
45
+ options_with_defaults = { recurse_over_arrays: true }.merge(options)
46
+ super(hash, options_with_defaults)
50
47
  end
51
48
 
52
- # @param options [Hash] see Hash#to_json
49
+ # @param args [Array] see Hash#to_json
53
50
  # @return [String]
54
- def to_json(**options)
55
- to_hash.to_json(**options)
51
+ def to_json(*args, **options)
52
+ to_hash.to_json(*args, **options)
56
53
  end
57
54
 
58
55
  # @param other [K8s::Resource]
@@ -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.12.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')),
@@ -360,11 +370,8 @@ module K8s
360
370
  # @param options [Hash] @see #request
361
371
  # @return [Array<response_class, Hash, NilClass>]
362
372
  def get(*path, **options)
363
- request(
364
- method: 'GET',
365
- path: self.path(*path),
366
- **options
367
- )
373
+ options = options.merge({ method: 'GET', path: self.path(*path) })
374
+ request(**options)
368
375
  end
369
376
 
370
377
  # @param paths [Array<String>]
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.12.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-26 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: excon
@@ -31,16 +31,30 @@ dependencies:
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: 0.5.0
34
+ version: 1.3.0
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: 0.5.0
41
+ version: 1.3.0
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: dry-types
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: 1.4.0
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: 1.4.0
56
+ - !ruby/object:Gem::Dependency
57
+ name: dry-configurable
44
58
  requirement: !ruby/object:Gem::Requirement
45
59
  requirements:
46
60
  - - "~>"
@@ -59,14 +73,14 @@ dependencies:
59
73
  requirements:
60
74
  - - "~>"
61
75
  - !ruby/object:Gem::Version
62
- version: 1.1.0
76
+ version: 1.1.3
63
77
  type: :runtime
64
78
  prerelease: false
65
79
  version_requirements: !ruby/object:Gem::Requirement
66
80
  requirements:
67
81
  - - "~>"
68
82
  - !ruby/object:Gem::Version
69
- version: 1.1.0
83
+ version: 1.1.3
70
84
  - !ruby/object:Gem::Dependency
71
85
  name: hashdiff
72
86
  requirement: !ruby/object:Gem::Requirement
@@ -110,19 +124,19 @@ dependencies:
110
124
  - !ruby/object:Gem::Version
111
125
  version: 1.4.0
112
126
  - !ruby/object:Gem::Dependency
113
- name: yaml-safe_load_stream
127
+ name: yaml-safe_load_stream2
114
128
  requirement: !ruby/object:Gem::Requirement
115
129
  requirements:
116
130
  - - "~>"
117
131
  - !ruby/object:Gem::Version
118
- version: '0.1'
132
+ version: 0.1.1
119
133
  type: :runtime
120
134
  prerelease: false
121
135
  version_requirements: !ruby/object:Gem::Requirement
122
136
  requirements:
123
137
  - - "~>"
124
138
  - !ruby/object:Gem::Version
125
- version: '0.1'
139
+ version: 0.1.1
126
140
  - !ruby/object:Gem::Dependency
127
141
  name: bundler
128
142
  requirement: !ruby/object:Gem::Requirement
@@ -147,16 +161,16 @@ dependencies:
147
161
  name: rake
148
162
  requirement: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - "~>"
164
+ - - ">="
151
165
  - !ruby/object:Gem::Version
152
- version: '10.0'
166
+ version: 12.3.3
153
167
  type: :development
154
168
  prerelease: false
155
169
  version_requirements: !ruby/object:Gem::Requirement
156
170
  requirements:
157
- - - "~>"
171
+ - - ">="
158
172
  - !ruby/object:Gem::Version
159
- version: '10.0'
173
+ version: 12.3.3
160
174
  - !ruby/object:Gem::Dependency
161
175
  name: rspec
162
176
  requirement: !ruby/object:Gem::Requirement
@@ -191,15 +205,29 @@ dependencies:
191
205
  requirements:
192
206
  - - "~>"
193
207
  - !ruby/object:Gem::Version
194
- version: '0.59'
208
+ version: '0.82'
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: '0.82'
216
+ - !ruby/object:Gem::Dependency
217
+ name: byebug
218
+ requirement: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '11.1'
223
+ type: :development
224
+ prerelease: false
225
+ version_requirements: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '11.1'
230
+ description:
203
231
  email:
204
232
  - firstname.lastname@rdx.net
205
233
  executables: []
@@ -215,7 +243,6 @@ files:
215
243
  - LICENSE
216
244
  - README.md
217
245
  - Rakefile
218
- - bin/k8s-client
219
246
  - docker-compose.yaml
220
247
  - k8s-ruby.gemspec
221
248
  - lib/k8s-ruby.rb
@@ -239,27 +266,30 @@ files:
239
266
  - lib/k8s/stack.rb
240
267
  - lib/k8s/transport.rb
241
268
  - lib/k8s/util.rb
242
- homepage: https://github.com/rdxnet/k8s-ruby
269
+ homepage: https://github.com/k8s-ruby/k8s-ruby
243
270
  licenses:
244
271
  - Apache-2.0
245
272
  metadata: {}
246
- post_install_message:
273
+ post_install_message:
247
274
  rdoc_options: []
248
275
  require_paths:
249
276
  - lib
250
277
  required_ruby_version: !ruby/object:Gem::Requirement
251
278
  requirements:
252
- - - "~>"
279
+ - - ">="
253
280
  - !ruby/object:Gem::Version
254
281
  version: '2.4'
282
+ - - "<"
283
+ - !ruby/object:Gem::Version
284
+ version: '3.1'
255
285
  required_rubygems_version: !ruby/object:Gem::Requirement
256
286
  requirements:
257
287
  - - ">="
258
288
  - !ruby/object:Gem::Version
259
289
  version: '0'
260
290
  requirements: []
261
- rubygems_version: 3.0.6
262
- signing_key:
291
+ rubygems_version: 3.2.3
292
+ signing_key:
263
293
  specification_version: 4
264
294
  summary: Kubernetes client library for Ruby
265
295
  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