kubecontrol 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +4 -0
- data/lib/kubecontrol/client.rb +7 -5
- data/lib/kubecontrol/pod.rb +9 -2
- data/lib/kubecontrol/version.rb +1 -1
- data/spec/kubecontrol/client_spec.rb +15 -8
- data/spec/kubecontrol/pod_spec.rb +36 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 78e24714ab4e03f425c86d2391a2952e34acacda235c312dcd66e49632c9b9a9
|
4
|
+
data.tar.gz: b3e7aac86f9053f4bb266f8701a1f1b756a98011ba43f1b3e398a99f342982ea
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b3fb70722607a2c54b322f13c49e5960fcc428f34e9682af831f4a006ae3863196b648c174fe92ab09317ba9013dd0204de523b35cf85cf3fe9006fa647e36da
|
7
|
+
data.tar.gz: c741103c7f8f6797706f6156368b8bbef588fe8c1876f4fd44ec639b830e44d655256d3fa67a410c2ebd9374588560f86bb0c1efc21d8a3961a9e02814ac21a4
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
data/lib/kubecontrol/client.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'open3'
|
1
2
|
require_relative 'pod'
|
2
3
|
|
3
4
|
module Kubecontrol
|
@@ -11,13 +12,13 @@ module Kubecontrol
|
|
11
12
|
end
|
12
13
|
|
13
14
|
def pods
|
14
|
-
get_pods_result = kubectl_command('get pods')
|
15
|
+
get_pods_result, _stderr, _exit_code = kubectl_command('get pods')
|
15
16
|
return [] if get_pods_result.empty?
|
16
17
|
|
17
18
|
pods_array = get_pods_result.split
|
18
19
|
pods_array.shift 5 # remove output table headers
|
19
20
|
pods_array.each_slice(5).map do |pod_data|
|
20
|
-
Pod.new(*pod_data)
|
21
|
+
Pod.new(*pod_data, namespace: namespace, client: self)
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
@@ -25,10 +26,11 @@ module Kubecontrol
|
|
25
26
|
pods.find { |pod| pod.name.match?(name_regex) }
|
26
27
|
end
|
27
28
|
|
28
|
-
private
|
29
|
-
|
30
29
|
def kubectl_command(command)
|
31
|
-
|
30
|
+
stdout_data, stderr_data, status = Open3.capture3("kubectl -n #{namespace} #{command}")
|
31
|
+
exit_code = status.exitstatus
|
32
|
+
|
33
|
+
[stdout_data, stderr_data, exit_code]
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
data/lib/kubecontrol/pod.rb
CHANGED
@@ -2,14 +2,16 @@ module Kubecontrol
|
|
2
2
|
class Pod
|
3
3
|
RUNNING = 'Running'.freeze
|
4
4
|
|
5
|
-
attr_reader :name, :ready, :status, :restarts, :age
|
5
|
+
attr_reader :name, :ready, :status, :restarts, :age, :namespace, :client
|
6
6
|
|
7
|
-
def initialize(name, ready, status, restarts, age)
|
7
|
+
def initialize(name, ready, status, restarts, age, namespace:, client:)
|
8
8
|
@name = name
|
9
9
|
@ready = ready
|
10
10
|
@status = status
|
11
11
|
@restarts = restarts
|
12
12
|
@age = age
|
13
|
+
@namespace = namespace
|
14
|
+
@client = client
|
13
15
|
end
|
14
16
|
|
15
17
|
def stopped?
|
@@ -19,5 +21,10 @@ module Kubecontrol
|
|
19
21
|
def running?
|
20
22
|
@status == RUNNING
|
21
23
|
end
|
24
|
+
|
25
|
+
def exec(command)
|
26
|
+
stdout_data, stderr_data, exit_code = @client.kubectl_command("exec -i #{name} -- sh -c \"#{command.gsub('"', '\"')}\"")
|
27
|
+
[stdout_data, stderr_data, exit_code]
|
28
|
+
end
|
22
29
|
end
|
23
30
|
end
|
data/lib/kubecontrol/version.rb
CHANGED
@@ -7,12 +7,19 @@ RSpec.describe Kubecontrol::Client do
|
|
7
7
|
let(:pod_status) { 'Running' }
|
8
8
|
let(:pod_restarts) { '0' }
|
9
9
|
let(:pod_age) { '20d' }
|
10
|
-
|
10
|
+
|
11
|
+
let(:get_pods_std_out) do
|
11
12
|
<<~RUBY
|
12
13
|
NAME READY STATUS RESTARTS AGE
|
13
14
|
#{pod_name} #{pod_ready} #{pod_status} #{pod_restarts} #{pod_age}
|
14
15
|
RUBY
|
15
16
|
end
|
17
|
+
let(:get_pods_std_err) { '' }
|
18
|
+
let(:process_status) do
|
19
|
+
fork { exit }
|
20
|
+
$CHILD_STATUS
|
21
|
+
end
|
22
|
+
let(:get_pods_response) { [get_pods_std_out, get_pods_std_err, process_status] }
|
16
23
|
|
17
24
|
describe '#initialize' do
|
18
25
|
subject { Kubecontrol::Client }
|
@@ -47,12 +54,12 @@ RSpec.describe Kubecontrol::Client do
|
|
47
54
|
subject { Kubecontrol::Client.new.pods }
|
48
55
|
|
49
56
|
it 'send a kubectl request to the command line' do
|
50
|
-
|
57
|
+
expect(Open3).to receive(:capture3).with('kubectl -n default get pods').and_return get_pods_response
|
51
58
|
subject
|
52
59
|
end
|
53
60
|
|
54
61
|
it 'returns an array of Kubecontrol::Pods' do
|
55
|
-
|
62
|
+
allow(Open3).to receive(:capture3).and_return get_pods_response
|
56
63
|
result = subject
|
57
64
|
expect(result).to be_an_instance_of Array
|
58
65
|
expect(result.length).to eq 1
|
@@ -60,8 +67,10 @@ RSpec.describe Kubecontrol::Client do
|
|
60
67
|
end
|
61
68
|
|
62
69
|
context 'no pods found' do
|
70
|
+
let(:get_pods_std_out) { '' }
|
71
|
+
|
63
72
|
before do
|
64
|
-
|
73
|
+
allow(Open3).to receive(:capture3).and_return get_pods_response
|
65
74
|
end
|
66
75
|
|
67
76
|
it { is_expected.to be_empty }
|
@@ -72,7 +81,7 @@ RSpec.describe Kubecontrol::Client do
|
|
72
81
|
subject { Kubecontrol::Client.new.find_pod_by_name(pod_name) }
|
73
82
|
|
74
83
|
before do
|
75
|
-
|
84
|
+
allow(Open3).to receive(:capture3).and_return get_pods_response
|
76
85
|
end
|
77
86
|
|
78
87
|
it { is_expected.to be_an_instance_of Kubecontrol::Pod }
|
@@ -82,9 +91,7 @@ RSpec.describe Kubecontrol::Client do
|
|
82
91
|
end
|
83
92
|
|
84
93
|
context 'pod does not exist' do
|
85
|
-
|
86
|
-
allow_any_instance_of(Kubecontrol::Client).to receive(:`).and_return ''
|
87
|
-
end
|
94
|
+
let(:get_pods_std_out) { '' }
|
88
95
|
|
89
96
|
it { is_expected.to be_nil }
|
90
97
|
end
|
@@ -6,9 +6,11 @@ RSpec.describe Kubecontrol::Pod do
|
|
6
6
|
let(:pod_status) { 'Running' }
|
7
7
|
let(:pod_restarts) { '0' }
|
8
8
|
let(:pod_age) { '20d' }
|
9
|
+
let(:namespace) { 'default' }
|
10
|
+
let(:client) { Kubecontrol::Client.new }
|
9
11
|
|
10
12
|
describe '#initialize' do
|
11
|
-
subject { Kubecontrol::Pod.new(pod_name, pod_ready, pod_status, pod_restarts, pod_age) }
|
13
|
+
subject { Kubecontrol::Pod.new(pod_name, pod_ready, pod_status, pod_restarts, pod_age, namespace: namespace, client: client) }
|
12
14
|
|
13
15
|
it 'sets the pod name field' do
|
14
16
|
expect(subject.name).to eq pod_name
|
@@ -29,6 +31,14 @@ RSpec.describe Kubecontrol::Pod do
|
|
29
31
|
it 'sets the pod age field' do
|
30
32
|
expect(subject.age).to eq pod_age
|
31
33
|
end
|
34
|
+
|
35
|
+
it 'sets the pod namespace' do
|
36
|
+
expect(subject.namespace).to eq namespace
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'sets the client' do
|
40
|
+
expect(subject.client).to eq client
|
41
|
+
end
|
32
42
|
end
|
33
43
|
|
34
44
|
describe '#running?' do
|
@@ -58,4 +68,29 @@ RSpec.describe Kubecontrol::Pod do
|
|
58
68
|
it { is_expected.to eq true }
|
59
69
|
end
|
60
70
|
end
|
71
|
+
|
72
|
+
describe '#exec' do
|
73
|
+
let(:command) { 'ls' }
|
74
|
+
let(:kubectl_command) { "exec -i #{pod.name} -- sh -c \"#{command.gsub('"', '\"')}\"" }
|
75
|
+
let(:std_out) { "bin\ndev\netc\nhome\nlib" }
|
76
|
+
let(:std_err) { '' }
|
77
|
+
let(:status_code) { 0 }
|
78
|
+
let(:kubectl_command_response) { [std_out, std_err, status_code] }
|
79
|
+
let(:pod) { Kubecontrol::Pod.new(pod_name, pod_ready, pod_status, pod_restarts, pod_age, namespace: namespace, client: client) }
|
80
|
+
|
81
|
+
subject { pod.exec(command) }
|
82
|
+
|
83
|
+
it 'sends the exec command via Kubecontrol::Client#kubectl_command' do
|
84
|
+
expect(pod.client).to receive(:kubectl_command).with(kubectl_command).and_return kubectl_command_response
|
85
|
+
subject
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'returns an array of std_out, std_err, and status code' do
|
89
|
+
allow(pod.client).to receive(:kubectl_command).with(kubectl_command).and_return kubectl_command_response
|
90
|
+
std_out_response, std_err_response, status_code_response = subject
|
91
|
+
expect(std_out_response).to eq std_out
|
92
|
+
expect(std_err_response).to eq std_err
|
93
|
+
expect(status_code_response).to eq status_code
|
94
|
+
end
|
95
|
+
end
|
61
96
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kubecontrol
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marco Adkins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-12-
|
11
|
+
date: 2019-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|