kuberun 0.1.0 → 0.1.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 +4 -4
- data/.travis.yml +1 -0
- data/Gemfile.lock +0 -11
- data/README.md +8 -2
- data/lib/kuberun/cli.rb +4 -3
- data/lib/kuberun/commands/run_pod.rb +2 -1
- data/lib/kuberun/kubectl/exec.rb +81 -0
- data/lib/kuberun/kubectl.rb +14 -45
- data/lib/kuberun/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fca4d9708c1d5a9a9afa70d9983940d31f8dfebb6900c5f570c4add622dac72f
|
|
4
|
+
data.tar.gz: 836812210b8df17491153f82c7d3feba0ac2b6067fe2bea92bb8a8af83380f6a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f77eda69cc9423990517a5810ec17a6fa7465e12a31d40a049c06a6c196273b3673df6ca87c715c5dae3dc5187ce8608e55084f319a0036ed149b2b95330780d
|
|
7
|
+
data.tar.gz: 2e553ff1da4812949e6ab878b5925a36aa34436784f4208194dec0279692e09ac333c8f1b4d0b726d80dbf3355d2692ed27f48e6c1b5af5a8a7e932ad1d4e21a
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -26,14 +26,11 @@ GEM
|
|
|
26
26
|
remote: https://rubygems.org/
|
|
27
27
|
specs:
|
|
28
28
|
ast (2.4.0)
|
|
29
|
-
byebug (10.0.2)
|
|
30
|
-
coderay (1.1.2)
|
|
31
29
|
diff-lcs (1.3)
|
|
32
30
|
equatable (0.5.0)
|
|
33
31
|
hitimes (1.3.0)
|
|
34
32
|
jaro_winkler (1.5.1)
|
|
35
33
|
kramdown (1.16.2)
|
|
36
|
-
method_source (0.9.0)
|
|
37
34
|
necromancer (0.4.0)
|
|
38
35
|
parallel (1.12.1)
|
|
39
36
|
parser (2.5.1.2)
|
|
@@ -42,12 +39,6 @@ GEM
|
|
|
42
39
|
equatable (~> 0.5.0)
|
|
43
40
|
tty-color (~> 0.4.0)
|
|
44
41
|
powerpack (0.1.2)
|
|
45
|
-
pry (0.11.3)
|
|
46
|
-
coderay (~> 1.1.0)
|
|
47
|
-
method_source (~> 0.9.0)
|
|
48
|
-
pry-byebug (3.6.0)
|
|
49
|
-
byebug (~> 10.0)
|
|
50
|
-
pry (~> 0.10)
|
|
51
42
|
rainbow (3.0.0)
|
|
52
43
|
rake (10.5.0)
|
|
53
44
|
rouge (3.1.1)
|
|
@@ -139,8 +130,6 @@ PLATFORMS
|
|
|
139
130
|
DEPENDENCIES
|
|
140
131
|
bundler (~> 1.16)
|
|
141
132
|
kuberun!
|
|
142
|
-
pry
|
|
143
|
-
pry-byebug
|
|
144
133
|
rake (~> 10.0)
|
|
145
134
|
rspec (~> 3.0)
|
|
146
135
|
rubocop (~> 0.58.0)
|
data/README.md
CHANGED
|
@@ -6,13 +6,17 @@ This CLI tool aims to create completely separate pod for those commands without
|
|
|
6
6
|
|
|
7
7
|
Uses `kubectl` inside.
|
|
8
8
|
|
|
9
|
+
## Status
|
|
10
|
+
|
|
11
|
+
This tool is in early alpha stage.
|
|
12
|
+
|
|
9
13
|
## Installation
|
|
10
14
|
|
|
11
15
|
Dependencies:
|
|
12
16
|
* Ruby >= 2.4
|
|
13
17
|
* kubectl in `$PATH`
|
|
14
18
|
|
|
15
|
-
Add this line to your application's Gemfile:
|
|
19
|
+
Add this line to your application's Gemfile (preferably in `development` group):
|
|
16
20
|
|
|
17
21
|
```ruby
|
|
18
22
|
gem 'kuberun'
|
|
@@ -28,7 +32,9 @@ Or install it yourself as:
|
|
|
28
32
|
|
|
29
33
|
## Usage
|
|
30
34
|
|
|
31
|
-
|
|
35
|
+
```
|
|
36
|
+
kuberun help
|
|
37
|
+
```
|
|
32
38
|
|
|
33
39
|
## Development
|
|
34
40
|
|
data/lib/kuberun/cli.rb
CHANGED
|
@@ -8,7 +8,7 @@ module Kuberun
|
|
|
8
8
|
#
|
|
9
9
|
# @api public
|
|
10
10
|
class CLI < Thor
|
|
11
|
-
DEFAULT_OPTIONS_FOR_KUBECTL_OPTIONS = { type: :string, default: '', desc: 'See kubectl options' }
|
|
11
|
+
DEFAULT_OPTIONS_FOR_KUBECTL_OPTIONS = { type: :string, default: '', desc: 'See kubectl options' }.freeze
|
|
12
12
|
BASE_KUBECTL_OPTIONS = {
|
|
13
13
|
'certificate-authority': {},
|
|
14
14
|
'client-certificate': {},
|
|
@@ -19,11 +19,12 @@ module Kuberun
|
|
|
19
19
|
'kubeconfig': {},
|
|
20
20
|
'namespace': { aliases: :'-n' },
|
|
21
21
|
'token': {},
|
|
22
|
-
'v': { type: :numeric, default: 0, desc: 'Log level
|
|
23
|
-
}
|
|
22
|
+
'v': { type: :numeric, default: 0, desc: 'Log level passed to kubectl' }
|
|
23
|
+
}.freeze
|
|
24
24
|
BASE_KUBECTL_OPTIONS.each do |option_name, hash|
|
|
25
25
|
class_option option_name, DEFAULT_OPTIONS_FOR_KUBECTL_OPTIONS.merge(hash)
|
|
26
26
|
end
|
|
27
|
+
class_option :debug, type: :boolean, default: false, desc: 'Debug logging'
|
|
27
28
|
|
|
28
29
|
# Error raised by this runner
|
|
29
30
|
Error = Class.new(StandardError)
|
|
@@ -38,8 +38,9 @@ module Kuberun
|
|
|
38
38
|
|
|
39
39
|
execute_command(input, output)
|
|
40
40
|
|
|
41
|
-
unless prompt.no?('Should I delete pod?')
|
|
41
|
+
unless prompt.no?(Kuberun::Pastel.yellow('Should I delete pod?'))
|
|
42
42
|
Kuberun::Kubectl.delete(resource: 'pod', resource_name: generated_pod_name)
|
|
43
|
+
Kuberun::Pastel.green("Pod #{generated_pod_name} has been deleted!")
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
output.puts(Kuberun::Pastel.green('Done!'))
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'forwardable'
|
|
4
|
+
|
|
5
|
+
class Kubectl
|
|
6
|
+
##
|
|
7
|
+
# Handles running kubectl exec
|
|
8
|
+
class Exec
|
|
9
|
+
extend Forwardable
|
|
10
|
+
|
|
11
|
+
def_delegators :@kubectl, :kubectl_base_command
|
|
12
|
+
|
|
13
|
+
def initialize(kubectl)
|
|
14
|
+
@kubectl = kubectl
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def exec(pod:, command:)
|
|
18
|
+
old_state = `stty -g`
|
|
19
|
+
|
|
20
|
+
PTY.spawn("#{kubectl_base_command('exec', resource: pod)} #{command}") do |out, inp, pid|
|
|
21
|
+
pty_process(out, inp, pid, old_state)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
attr_reader :stdin_thread, :stdout_thread
|
|
28
|
+
|
|
29
|
+
def prepare_stdin_thread(inp)
|
|
30
|
+
@stdin_thread = Thread.new do
|
|
31
|
+
until inp.closed?
|
|
32
|
+
input = $stdin.getch
|
|
33
|
+
inp.write(input)
|
|
34
|
+
inp.flush
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def prepare_stdout_thread(out)
|
|
40
|
+
@stdout_thread = Thread.new do
|
|
41
|
+
until out.eof?
|
|
42
|
+
$stdout.print(out.readchar)
|
|
43
|
+
$stdout.flush
|
|
44
|
+
end
|
|
45
|
+
rescue Errno::EIO, EOFError
|
|
46
|
+
nil
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def pty_process(out, inp, pid, old_state)
|
|
51
|
+
prepare_stdin_thread(inp)
|
|
52
|
+
prepare_stdout_thread(out)
|
|
53
|
+
|
|
54
|
+
stdin_thread.run
|
|
55
|
+
|
|
56
|
+
wait_for_process(pid)
|
|
57
|
+
|
|
58
|
+
stdout_thread.join
|
|
59
|
+
stdin_thread.kill
|
|
60
|
+
|
|
61
|
+
sleep 0.1
|
|
62
|
+
ensure
|
|
63
|
+
cleanup_pty(old_state)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def wait_for_process(pid)
|
|
67
|
+
Process.waitpid(pid)
|
|
68
|
+
rescue StandardError
|
|
69
|
+
nil # "rescue nil" is there in case process already ended.
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def cleanup_pty(old_stty_state)
|
|
73
|
+
stdout_thread&.kill
|
|
74
|
+
stdin_thread&.kill
|
|
75
|
+
$stdout.puts
|
|
76
|
+
$stdout.flush
|
|
77
|
+
|
|
78
|
+
system("stty #{old_stty_state}")
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
data/lib/kuberun/kubectl.rb
CHANGED
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
require 'open3'
|
|
4
4
|
require 'pty'
|
|
5
|
+
require 'kuberun/kubectl/exec'
|
|
5
6
|
|
|
7
|
+
##
|
|
8
|
+
# Handles running kubectl
|
|
6
9
|
class Kubectl
|
|
7
10
|
CAT_MULTILINE = 'EOFCONFIG'
|
|
8
11
|
KUBECTL_OPTIONS = Kuberun::CLI::BASE_KUBECTL_OPTIONS.keys.map(&:to_s)
|
|
9
12
|
|
|
10
13
|
def load_options(options)
|
|
14
|
+
self.options = options
|
|
11
15
|
self.kubectl_options = parsed_options(options)
|
|
12
16
|
end
|
|
13
17
|
|
|
@@ -27,63 +31,28 @@ class Kubectl
|
|
|
27
31
|
end
|
|
28
32
|
|
|
29
33
|
def exec(pod:, command:)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
PTY.spawn("#{kubectl_base_command('exec', resource: pod)} #{command}") do |o, i, pid|
|
|
33
|
-
t_in = Thread.new do
|
|
34
|
-
until i.closed? do
|
|
35
|
-
input = $stdin.getch
|
|
36
|
-
i.write(input)
|
|
37
|
-
i.flush
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
t_out = Thread.new do
|
|
42
|
-
begin
|
|
43
|
-
until o.eof? do
|
|
44
|
-
$stdout.print(o.readchar)
|
|
45
|
-
$stdout.flush
|
|
46
|
-
end
|
|
47
|
-
rescue Errno::EIO, EOFError
|
|
48
|
-
nil
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
t_in.run
|
|
53
|
-
|
|
54
|
-
Process::waitpid(pid) rescue nil
|
|
55
|
-
# "rescue nil" is there in case process already ended.
|
|
56
|
-
|
|
57
|
-
t_out.join
|
|
58
|
-
t_in.kill
|
|
59
|
-
sleep 0.1
|
|
60
|
-
ensure
|
|
61
|
-
t_out&.kill
|
|
62
|
-
t_in&.kill
|
|
63
|
-
$stdout.puts
|
|
64
|
-
$stdout.flush
|
|
65
|
-
system "stty #{ old_state }"
|
|
66
|
-
end
|
|
34
|
+
Kubectl::Exec.new(self).exec(pod: pod, command: command)
|
|
67
35
|
end
|
|
68
36
|
|
|
69
37
|
def delete(resource:, resource_name:)
|
|
70
38
|
cmd.run(kubectl_base_command('delete', resource: resource, resource_name: resource_name))
|
|
71
39
|
end
|
|
72
40
|
|
|
41
|
+
def kubectl_base_command(verb, resource:, resource_name: nil, options: nil)
|
|
42
|
+
base = "#{kubectl} #{options} #{verb} #{resource}"
|
|
43
|
+
base = "#{base}/#{resource_name}" if resource_name
|
|
44
|
+
base
|
|
45
|
+
end
|
|
46
|
+
|
|
73
47
|
private
|
|
74
48
|
|
|
75
|
-
attr_accessor :kubectl_options
|
|
49
|
+
attr_accessor :kubectl_options, :options
|
|
76
50
|
|
|
77
51
|
def cmd(tty_options = {})
|
|
52
|
+
tty_options[:printer] = :progress unless options['debug']
|
|
78
53
|
TTY::Command.new(tty_options)
|
|
79
54
|
end
|
|
80
55
|
|
|
81
|
-
def kubectl_base_command(verb, resource:, resource_name: nil, options: nil)
|
|
82
|
-
base = "#{kubectl} #{options} #{verb} #{resource}"
|
|
83
|
-
base = "#{base}/#{resource_name}" if resource_name
|
|
84
|
-
base
|
|
85
|
-
end
|
|
86
|
-
|
|
87
56
|
def kubectl_base_input_command(verb, configuration:, options:)
|
|
88
57
|
"cat << '#{CAT_MULTILINE}' | #{kubectl} #{options} #{verb} -f - 2>&1\n#{configuration.to_json}\n#{CAT_MULTILINE}"
|
|
89
58
|
end
|
|
@@ -101,6 +70,6 @@ class Kubectl
|
|
|
101
70
|
end
|
|
102
71
|
|
|
103
72
|
def parsed_json
|
|
104
|
-
JSON.
|
|
73
|
+
JSON.parse(yield)
|
|
105
74
|
end
|
|
106
75
|
end
|
data/lib/kuberun/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kuberun
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- kruczjak
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2018-08-
|
|
11
|
+
date: 2018-08-11 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: pastel
|
|
@@ -363,6 +363,7 @@ files:
|
|
|
363
363
|
- lib/kuberun/commands/.gitkeep
|
|
364
364
|
- lib/kuberun/commands/run_pod.rb
|
|
365
365
|
- lib/kuberun/kubectl.rb
|
|
366
|
+
- lib/kuberun/kubectl/exec.rb
|
|
366
367
|
- lib/kuberun/templates/.gitkeep
|
|
367
368
|
- lib/kuberun/templates/run_pod/.gitkeep
|
|
368
369
|
- lib/kuberun/version.rb
|