k9s_kit 0.0.7.pre.pre1
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/.gitignore +2 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +64 -0
- data/bin/k9s_kit +71 -0
- data/k9s_kit.gemspec +22 -0
- data/lib/k8s_kit/context.rb +66 -0
- data/lib/k8s_kit/job.rb +41 -0
- data/lib/k8s_kit/pod.rb +33 -0
- data/lib/k8s_kit/version.rb +3 -0
- data/lib/k8s_kit.rb +4 -0
- metadata +128 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 0ded026e238b1b5ee9c91b4a779c4b776edb1c5cb60953ed5626ed464f5ada3f
|
4
|
+
data.tar.gz: f70fb69e6805ed004b14dbb56d52afa34e7d3dc4569fe75bc52449a9cd088f14
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5a87edde563f935bc4bba9fde37565d07c531fe367f2db885c4e3235a676b70ff192451fa22e18114e1eb4963a666a30fdab8998c141ac63724b661b0e7e3488
|
7
|
+
data.tar.gz: 52597e1e043ac5f4e8564996827d3b342645c1034915861ed53aeaf83baee8ca72d66532c12fe4902da478279163864718fac9e464e0ce48559a87cc0078b7bb
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
k9s_kit (0.0.6)
|
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
|
+
byebug (11.0.1)
|
20
|
+
childprocess (2.0.0)
|
21
|
+
rake (< 13.0)
|
22
|
+
contracts (0.16.0)
|
23
|
+
cucumber (3.1.2)
|
24
|
+
builder (>= 2.1.2)
|
25
|
+
cucumber-core (~> 3.2.0)
|
26
|
+
cucumber-expressions (~> 6.0.1)
|
27
|
+
cucumber-wire (~> 0.0.1)
|
28
|
+
diff-lcs (~> 1.3)
|
29
|
+
gherkin (~> 5.1.0)
|
30
|
+
multi_json (>= 1.7.5, < 2.0)
|
31
|
+
multi_test (>= 0.1.2)
|
32
|
+
cucumber-core (3.2.1)
|
33
|
+
backports (>= 3.8.0)
|
34
|
+
cucumber-tag_expressions (~> 1.1.0)
|
35
|
+
gherkin (~> 5.0)
|
36
|
+
cucumber-expressions (6.0.1)
|
37
|
+
cucumber-tag_expressions (1.1.1)
|
38
|
+
cucumber-wire (0.0.1)
|
39
|
+
diff-lcs (1.3)
|
40
|
+
ffi (1.11.1)
|
41
|
+
gherkin (5.1.0)
|
42
|
+
gli (2.18.1)
|
43
|
+
multi_json (1.13.1)
|
44
|
+
multi_test (0.1.2)
|
45
|
+
rake (12.3.3)
|
46
|
+
rdoc (6.1.1)
|
47
|
+
rspec-expectations (3.8.4)
|
48
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
49
|
+
rspec-support (~> 3.8.0)
|
50
|
+
rspec-support (3.8.2)
|
51
|
+
thor (0.20.3)
|
52
|
+
|
53
|
+
PLATFORMS
|
54
|
+
ruby
|
55
|
+
|
56
|
+
DEPENDENCIES
|
57
|
+
aruba
|
58
|
+
byebug
|
59
|
+
k8s_kit!
|
60
|
+
rake
|
61
|
+
rdoc
|
62
|
+
|
63
|
+
BUNDLED WITH
|
64
|
+
2.0.2
|
data/bin/k9s_kit
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'gli'
|
3
|
+
require 'k8s_kit'
|
4
|
+
|
5
|
+
class App
|
6
|
+
extend GLI::App
|
7
|
+
|
8
|
+
program_desc 'Describe your application here'
|
9
|
+
|
10
|
+
version K8sKit::VERSION
|
11
|
+
|
12
|
+
subcommand_option_handling :normal
|
13
|
+
arguments :strict
|
14
|
+
|
15
|
+
desc 'Choose the namespace (current namespace is used if not set)'
|
16
|
+
flag [:n, :namespace]
|
17
|
+
|
18
|
+
desc 'Describe attach-job here'
|
19
|
+
arg_name '<job name>'
|
20
|
+
command 'attach-job' do |c|
|
21
|
+
c.desc 'Container name (needed if more than one container is running in the pod)'
|
22
|
+
c.flag [:c, :container]
|
23
|
+
|
24
|
+
c.action do |global_options, options, args|
|
25
|
+
K8sKit::Context.new(namespace: global_options[:namespace]).tap do |ctx|
|
26
|
+
ctx.job(args[0]).attach(container: options[:container])
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
desc 'Waits until all pods in the namespace are "Ready"'
|
32
|
+
command 'wait-all-pods-ready' do |c|
|
33
|
+
c.desc 'Timeout in seconds'
|
34
|
+
c.default_value '300'
|
35
|
+
c.flag [:t, :timeout]
|
36
|
+
|
37
|
+
c.action do |global_options, options, args|
|
38
|
+
K8sKit::Context.new(namespace: global_options[:namespace]).tap do |ctx|
|
39
|
+
ctx.wait_for_all_pods_ready(timeout: options[:timeout].to_i > 0 ? options[:timeout].to_i : 300)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
pre do |global,command,options,args|
|
45
|
+
# Pre logic here
|
46
|
+
# Return true to proceed; false to abort and not call the
|
47
|
+
# chosen command
|
48
|
+
# Use skips_pre before a command to skip this block
|
49
|
+
# on that command only
|
50
|
+
true
|
51
|
+
end
|
52
|
+
|
53
|
+
post do |global,command,options,args|
|
54
|
+
# Post logic here
|
55
|
+
# Use skips_post before a command to skip this
|
56
|
+
# block on that command only
|
57
|
+
end
|
58
|
+
|
59
|
+
on_error do |exception|
|
60
|
+
# Error logic here
|
61
|
+
# return false to skip default error handling
|
62
|
+
case exception
|
63
|
+
when SystemExit
|
64
|
+
exit exception.status
|
65
|
+
else
|
66
|
+
true
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
exit App.run(ARGV)
|
data/k9s_kit.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
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 = 'k9s_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 << 'k9s_kit'
|
17
|
+
s.add_development_dependency('byebug')
|
18
|
+
s.add_development_dependency('rake')
|
19
|
+
s.add_development_dependency('rdoc')
|
20
|
+
s.add_development_dependency('aruba')
|
21
|
+
s.add_runtime_dependency('gli','2.18.1')
|
22
|
+
end
|
@@ -0,0 +1,66 @@
|
|
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
|
+
print 'Waiting for all pods to be ready...'
|
47
|
+
loop do
|
48
|
+
statuses = run('get pods -o jsonpath="{.items.*.status.containerStatuses[*].ready}"')
|
49
|
+
if statuses.empty?
|
50
|
+
puts ''
|
51
|
+
raise StandardError, 'No pod could be found in the namespace'
|
52
|
+
end
|
53
|
+
|
54
|
+
return unless statuses.include?('false')
|
55
|
+
|
56
|
+
if t0 + timeout < Time.now
|
57
|
+
puts ''
|
58
|
+
raise StandardError, 'Timeout while waiting for pods to become ready'
|
59
|
+
end
|
60
|
+
|
61
|
+
print '.'
|
62
|
+
sleep 2
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/k8s_kit/job.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'waitutil'
|
2
|
+
|
3
|
+
module K8sKit
|
4
|
+
class Job
|
5
|
+
attr_reader :context, :name
|
6
|
+
|
7
|
+
def initialize(context, name)
|
8
|
+
@context = context
|
9
|
+
@name = name
|
10
|
+
end
|
11
|
+
|
12
|
+
def attach(container:, delete_on_completion: true, exit_on_completion: true)
|
13
|
+
pod.wait_until_ready
|
14
|
+
pod.logs(container: container, stream: true)
|
15
|
+
|
16
|
+
WaitUtil.wait_for_condition("pod has exit code",
|
17
|
+
:timeout_sec => 30,
|
18
|
+
:delay_sec => 0.5) do
|
19
|
+
Integer(pod.exit_code(container: container)) rescue false
|
20
|
+
end
|
21
|
+
|
22
|
+
exit_code = pod.exit_code(container: container)
|
23
|
+
|
24
|
+
delete if delete_on_completion
|
25
|
+
exit exit_code if exit_on_completion
|
26
|
+
|
27
|
+
exit_code
|
28
|
+
end
|
29
|
+
|
30
|
+
def delete
|
31
|
+
context.run("delete job #{name}")
|
32
|
+
end
|
33
|
+
|
34
|
+
def pod
|
35
|
+
@pod ||= begin
|
36
|
+
pod_name = context.run("get pod -l job-name=#{name} -o jsonpath='{.items[0].metadata.name}'")
|
37
|
+
Pod.new(context, pod_name)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/k8s_kit/pod.rb
ADDED
@@ -0,0 +1,33 @@
|
|
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 wait_until_complete(timeout: '5m')
|
23
|
+
context.run("wait pod/#{name} --for=condition=Completed")
|
24
|
+
end
|
25
|
+
|
26
|
+
def exit_code(container:)
|
27
|
+
json_path = "{ .status.containerStatuses[?(@.name == '#{container}')].state.terminated.exitCode }"
|
28
|
+
context.run("get pod #{name} -o jsonpath=\"#{json_path}\"").to_i
|
29
|
+
rescue StandardError
|
30
|
+
nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/k8s_kit.rb
ADDED
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: k9s_kit
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.7.pre.pre1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Your Name Here
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-01-15 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: byebug
|
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: rake
|
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: rdoc
|
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: aruba
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: gli
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 2.18.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 2.18.1
|
83
|
+
description:
|
84
|
+
email: your@email.address.com
|
85
|
+
executables:
|
86
|
+
- k9s_kit
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- Gemfile
|
92
|
+
- Gemfile.lock
|
93
|
+
- bin/k9s_kit
|
94
|
+
- k9s_kit.gemspec
|
95
|
+
- lib/k8s_kit.rb
|
96
|
+
- lib/k8s_kit/context.rb
|
97
|
+
- lib/k8s_kit/job.rb
|
98
|
+
- lib/k8s_kit/pod.rb
|
99
|
+
- lib/k8s_kit/version.rb
|
100
|
+
homepage: http://your.website.com
|
101
|
+
licenses: []
|
102
|
+
metadata: {}
|
103
|
+
post_install_message:
|
104
|
+
rdoc_options:
|
105
|
+
- "--title"
|
106
|
+
- k8s_kit
|
107
|
+
- "--main"
|
108
|
+
- README.rdoc
|
109
|
+
- "-ri"
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
- lib
|
113
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
requirements:
|
120
|
+
- - ">"
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 1.3.1
|
123
|
+
requirements: []
|
124
|
+
rubygems_version: 3.0.1
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: A description of your project
|
128
|
+
test_files: []
|