k8s_kit 0.0.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 +7 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +62 -0
- data/bin/k8s_kit +73 -0
- data/k8s_kit.gemspec +21 -0
- data/lib/k8s_kit/context.rb +57 -0
- data/lib/k8s_kit/job.rb +32 -0
- data/lib/k8s_kit/pod.rb +29 -0
- data/lib/k8s_kit/version.rb +3 -0
- data/lib/k8s_kit.rb +4 -0
- metadata +113 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: d6536da6860c0b0bcfa14bae28fbee59110c028b589bab71deb2437f1cd28d2d
|
4
|
+
data.tar.gz: 4317a20be3364cfb36851c81105d9f59df3aa0ad718350e33ed12a1396e3e27a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8ecfb4eba9a6ee5832aea993271160d052fd404c9eef4bef58ebb455eb661a1c627fe021dfed1921d5dc39eb33a20091894b6a8db5142ed673a865567c2924bf
|
7
|
+
data.tar.gz: b9e70468631580c5000831ee0d382580ef9d59a403b3fc78b2eea616bd2096f552b1289b6a127967a9a0ba5c28e5ceb3a9aba95dc70b7f8b0406b01250bbadfc
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
k8s_kit (0.0.1)
|
5
|
+
gli (= 2.18.1)
|
6
|
+
|
7
|
+
GEM
|
8
|
+
remote: https://rubygems.org/
|
9
|
+
specs:
|
10
|
+
aruba (0.14.11)
|
11
|
+
childprocess (>= 0.6.3, < 3.0.0)
|
12
|
+
contracts (~> 0.9)
|
13
|
+
cucumber (>= 1.3.19)
|
14
|
+
ffi (~> 1.9)
|
15
|
+
rspec-expectations (>= 2.99)
|
16
|
+
thor (~> 0.19)
|
17
|
+
backports (3.15.0)
|
18
|
+
builder (3.2.3)
|
19
|
+
childprocess (2.0.0)
|
20
|
+
rake (< 13.0)
|
21
|
+
contracts (0.16.0)
|
22
|
+
cucumber (3.1.2)
|
23
|
+
builder (>= 2.1.2)
|
24
|
+
cucumber-core (~> 3.2.0)
|
25
|
+
cucumber-expressions (~> 6.0.1)
|
26
|
+
cucumber-wire (~> 0.0.1)
|
27
|
+
diff-lcs (~> 1.3)
|
28
|
+
gherkin (~> 5.1.0)
|
29
|
+
multi_json (>= 1.7.5, < 2.0)
|
30
|
+
multi_test (>= 0.1.2)
|
31
|
+
cucumber-core (3.2.1)
|
32
|
+
backports (>= 3.8.0)
|
33
|
+
cucumber-tag_expressions (~> 1.1.0)
|
34
|
+
gherkin (~> 5.0)
|
35
|
+
cucumber-expressions (6.0.1)
|
36
|
+
cucumber-tag_expressions (1.1.1)
|
37
|
+
cucumber-wire (0.0.1)
|
38
|
+
diff-lcs (1.3)
|
39
|
+
ffi (1.11.1)
|
40
|
+
gherkin (5.1.0)
|
41
|
+
gli (2.18.1)
|
42
|
+
multi_json (1.13.1)
|
43
|
+
multi_test (0.1.2)
|
44
|
+
rake (12.3.3)
|
45
|
+
rdoc (6.1.1)
|
46
|
+
rspec-expectations (3.8.4)
|
47
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
48
|
+
rspec-support (~> 3.8.0)
|
49
|
+
rspec-support (3.8.2)
|
50
|
+
thor (0.20.3)
|
51
|
+
|
52
|
+
PLATFORMS
|
53
|
+
ruby
|
54
|
+
|
55
|
+
DEPENDENCIES
|
56
|
+
aruba
|
57
|
+
k8s_kit!
|
58
|
+
rake
|
59
|
+
rdoc
|
60
|
+
|
61
|
+
BUNDLED WITH
|
62
|
+
2.0.2
|
data/bin/k8s_kit
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gli'
|
3
|
+
begin # XXX: Remove this begin/rescue before distributing your app
|
4
|
+
require 'k8s_kit'
|
5
|
+
rescue LoadError
|
6
|
+
STDERR.puts "In development, you need to use `bundle exec bin/k8s_kit` to run your app"
|
7
|
+
STDERR.puts "At install-time, RubyGems will make sure lib, etc. are in the load path"
|
8
|
+
STDERR.puts "Feel free to remove this message from bin/k8s_kit now"
|
9
|
+
exit 64
|
10
|
+
end
|
11
|
+
|
12
|
+
class App
|
13
|
+
extend GLI::App
|
14
|
+
|
15
|
+
program_desc 'Describe your application here'
|
16
|
+
|
17
|
+
version K8sKit::VERSION
|
18
|
+
|
19
|
+
subcommand_option_handling :normal
|
20
|
+
arguments :strict
|
21
|
+
|
22
|
+
desc 'Choose the namespace (current namespace is used if not set)'
|
23
|
+
flag [:n, :namespace]
|
24
|
+
|
25
|
+
desc 'Describe attach-job here'
|
26
|
+
arg_name '<job name>'
|
27
|
+
command 'attach-job' do |c|
|
28
|
+
c.desc 'Container name (needed if more than one container is running in the pod)'
|
29
|
+
c.flag [:c, :container]
|
30
|
+
|
31
|
+
c.action do |global_options, options, args|
|
32
|
+
K8sKit::Context.new(namespace: global_options[:namespace]).tap do |ctx|
|
33
|
+
ctx.job(args[0]).attach(container: options[:container])
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
desc 'Waits until all pods in the namespace are "Ready"'
|
39
|
+
command 'wait-all-pods-ready' do |c|
|
40
|
+
c.desc 'Timeout in seconds'
|
41
|
+
c.default_value '300'
|
42
|
+
c.flag [:t, :timeout]
|
43
|
+
|
44
|
+
c.action do |global_options, options, args|
|
45
|
+
K8sKit::Context.new(namespace: global_options[:namespace]).tap do |ctx|
|
46
|
+
ctx.wait_for_all_pods_ready(timeout: options[:timeout].to_i > 0 ? options[:timeout].to_i : 300)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
pre do |global,command,options,args|
|
52
|
+
# Pre logic here
|
53
|
+
# Return true to proceed; false to abort and not call the
|
54
|
+
# chosen command
|
55
|
+
# Use skips_pre before a command to skip this block
|
56
|
+
# on that command only
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
post do |global,command,options,args|
|
61
|
+
# Post logic here
|
62
|
+
# Use skips_post before a command to skip this
|
63
|
+
# block on that command only
|
64
|
+
end
|
65
|
+
|
66
|
+
on_error do |exception|
|
67
|
+
# Error logic here
|
68
|
+
# return false to skip default error handling
|
69
|
+
true
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
exit App.run(ARGV)
|
data/k8s_kit.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# Ensure we require the local version and not one we might have installed already
|
2
|
+
require File.join([File.dirname(__FILE__),'lib','k8s_kit','version.rb'])
|
3
|
+
spec = Gem::Specification.new do |s|
|
4
|
+
s.name = 'k8s_kit'
|
5
|
+
s.version = K8sKit::VERSION
|
6
|
+
s.author = 'Your Name Here'
|
7
|
+
s.email = 'your@email.address.com'
|
8
|
+
s.homepage = 'http://your.website.com'
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.summary = 'A description of your project'
|
11
|
+
s.files = `git ls-files`.split("
|
12
|
+
")
|
13
|
+
s.require_paths << 'lib'
|
14
|
+
s.rdoc_options << '--title' << 'k8s_kit' << '--main' << 'README.rdoc' << '-ri'
|
15
|
+
s.bindir = 'bin'
|
16
|
+
s.executables << 'k8s_kit'
|
17
|
+
s.add_development_dependency('rake')
|
18
|
+
s.add_development_dependency('rdoc')
|
19
|
+
s.add_development_dependency('aruba')
|
20
|
+
s.add_runtime_dependency('gli','2.18.1')
|
21
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'open3'
|
2
|
+
|
3
|
+
module K8sKit
|
4
|
+
class Context
|
5
|
+
attr_reader :namespace
|
6
|
+
|
7
|
+
def initialize(namespace: nil)
|
8
|
+
@namespace = namespace
|
9
|
+
end
|
10
|
+
|
11
|
+
def kubectl
|
12
|
+
ns = namespace ? "-n #{namespace}" : ''
|
13
|
+
"kubectl #{ns}"
|
14
|
+
end
|
15
|
+
|
16
|
+
def run(cmd, silent: true)
|
17
|
+
cmd = "#{kubectl} #{cmd}"
|
18
|
+
|
19
|
+
out = []
|
20
|
+
Open3.popen2e(cmd) do |stdin, stdout_err, wait_thr|
|
21
|
+
while line = stdout_err.gets
|
22
|
+
puts line unless silent
|
23
|
+
out << line
|
24
|
+
end
|
25
|
+
|
26
|
+
exit_status = wait_thr.value
|
27
|
+
unless exit_status.success?
|
28
|
+
abort "Failed: #{cmd}"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
out.join("\n").chomp
|
33
|
+
end
|
34
|
+
|
35
|
+
def pod(name)
|
36
|
+
Pod.new(self, name)
|
37
|
+
end
|
38
|
+
|
39
|
+
def job(name)
|
40
|
+
Job.new(self, name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def wait_for_all_pods_ready(timeout: 300)
|
44
|
+
t0 = Time.now
|
45
|
+
|
46
|
+
loop do
|
47
|
+
statuses = run('get pods -o jsonpath="{.items.*.status.containerStatuses[*].ready}"')
|
48
|
+
return unless statuses.include?('false')
|
49
|
+
|
50
|
+
raise StandardError, 'Timeout while waiting for pods to become ready' if t0 + timeout < Time.now
|
51
|
+
|
52
|
+
puts 'Some pods are not ready yet, retrying...'
|
53
|
+
sleep 5
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/k8s_kit/job.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
module K8sKit
|
2
|
+
class Job
|
3
|
+
attr_reader :context, :name
|
4
|
+
|
5
|
+
def initialize(context, name)
|
6
|
+
@context = context
|
7
|
+
@name = name
|
8
|
+
end
|
9
|
+
|
10
|
+
def attach(container:, delete_on_completion: true, exit_on_completion: true)
|
11
|
+
pod.wait_until_ready
|
12
|
+
pod.logs(container: container, stream: true)
|
13
|
+
exit_code = pod.exit_code(container: container)
|
14
|
+
|
15
|
+
delete if delete_on_completion
|
16
|
+
exit exit_code if exit_on_completion
|
17
|
+
|
18
|
+
exit_code
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete
|
22
|
+
context.run("delete job #{name}")
|
23
|
+
end
|
24
|
+
|
25
|
+
def pod
|
26
|
+
@pod ||= begin
|
27
|
+
pod_name = context.run("get pod -l job-name=#{name} -o jsonpath='{.items[0].metadata.name}'")
|
28
|
+
Pod.new(context, pod_name)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/k8s_kit/pod.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
module K8sKit
|
2
|
+
class Pod
|
3
|
+
attr_reader :context, :name
|
4
|
+
|
5
|
+
def initialize(context, name)
|
6
|
+
@context = context
|
7
|
+
@name = name
|
8
|
+
end
|
9
|
+
|
10
|
+
def logs(container: nil, stream: false)
|
11
|
+
command = "logs #{name}"
|
12
|
+
command += " -c #{container}" if container
|
13
|
+
command += " -f" if stream
|
14
|
+
|
15
|
+
context.run(command, silent: false)
|
16
|
+
end
|
17
|
+
|
18
|
+
def wait_until_ready(timeout: '5m')
|
19
|
+
context.run("wait pod/#{name} --for=condition=Ready --timeout=#{timeout}")
|
20
|
+
end
|
21
|
+
|
22
|
+
def exit_code(container:)
|
23
|
+
json_path = "{ .status.containerStatuses[?(@.name == '#{container}')].state.terminated.exitCode }"
|
24
|
+
context.run("get pod #{name} -o jsonpath=\"#{json_path}\"").to_i
|
25
|
+
rescue StandardError
|
26
|
+
nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/k8s_kit.rb
ADDED
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: k8s_kit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Your Name Here
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-08-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rdoc
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: aruba
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: gli
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 2.18.1
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 2.18.1
|
69
|
+
description:
|
70
|
+
email: your@email.address.com
|
71
|
+
executables:
|
72
|
+
- k8s_kit
|
73
|
+
extensions: []
|
74
|
+
extra_rdoc_files: []
|
75
|
+
files:
|
76
|
+
- Gemfile
|
77
|
+
- Gemfile.lock
|
78
|
+
- bin/k8s_kit
|
79
|
+
- k8s_kit.gemspec
|
80
|
+
- lib/k8s_kit.rb
|
81
|
+
- lib/k8s_kit/context.rb
|
82
|
+
- lib/k8s_kit/job.rb
|
83
|
+
- lib/k8s_kit/pod.rb
|
84
|
+
- lib/k8s_kit/version.rb
|
85
|
+
homepage: http://your.website.com
|
86
|
+
licenses: []
|
87
|
+
metadata: {}
|
88
|
+
post_install_message:
|
89
|
+
rdoc_options:
|
90
|
+
- "--title"
|
91
|
+
- k8s_kit
|
92
|
+
- "--main"
|
93
|
+
- README.rdoc
|
94
|
+
- "-ri"
|
95
|
+
require_paths:
|
96
|
+
- lib
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
103
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
104
|
+
requirements:
|
105
|
+
- - ">="
|
106
|
+
- !ruby/object:Gem::Version
|
107
|
+
version: '0'
|
108
|
+
requirements: []
|
109
|
+
rubygems_version: 3.0.3
|
110
|
+
signing_key:
|
111
|
+
specification_version: 4
|
112
|
+
summary: A description of your project
|
113
|
+
test_files: []
|