kontena-cli 1.3.5 → 1.4.0.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 +5 -5
- data/VERSION +1 -1
- data/lib/kontena/cli/etcd/health_command.rb +1 -1
- data/lib/kontena/cli/grids/common.rb +51 -0
- data/lib/kontena/cli/grids/create_command.rb +13 -9
- data/lib/kontena/cli/grids/update_command.rb +11 -44
- data/lib/kontena/cli/node_command.rb +3 -0
- data/lib/kontena/cli/nodes/create_command.rb +25 -0
- data/lib/kontena/cli/nodes/env_command.rb +32 -0
- data/lib/kontena/cli/nodes/health_command.rb +2 -2
- data/lib/kontena/cli/nodes/labels/add_command.rb +3 -3
- data/lib/kontena/cli/nodes/labels/list_command.rb +2 -2
- data/lib/kontena/cli/nodes/labels/remove_command.rb +3 -3
- data/lib/kontena/cli/nodes/remove_command.rb +9 -7
- data/lib/kontena/cli/nodes/reset_token_command.rb +31 -0
- data/lib/kontena/cli/nodes/show_command.rb +4 -4
- data/lib/kontena/cli/nodes/ssh_command.rb +4 -4
- data/lib/kontena/cli/nodes/update_command.rb +13 -8
- data/lib/kontena/cli/services/create_command.rb +4 -0
- data/lib/kontena/cli/services/services_helper.rb +2 -0
- data/lib/kontena/cli/services/update_command.rb +2 -0
- data/lib/kontena/cli/stacks/service_generator.rb +2 -0
- data/lib/kontena/cli/stacks/show_command.rb +1 -0
- data/lib/kontena/cli/stacks/stacks_helper.rb +2 -3
- data/lib/kontena/cli/stacks/yaml/validations.rb +3 -1
- data/lib/kontena/machine/cloud_config/cloudinit.yml +17 -4
- data/omnibus/package-scripts/kontena/postinst +0 -4
- data/omnibus/package-scripts/kontena/postrm +1 -1
- data/omnibus/package-scripts/kontena/preinst +0 -2
- data/spec/fixtures/api/node.json +93 -0
- data/spec/kontena/cli/containers/logs_command_spec.rb +0 -4
- data/spec/kontena/cli/etcd/health_command_spec.rb +128 -63
- data/spec/kontena/cli/nodes/create_command_spec.rb +24 -0
- data/spec/kontena/cli/nodes/env_command_spec.rb +49 -0
- data/spec/kontena/cli/nodes/health_command_spec.rb +15 -173
- data/spec/kontena/cli/nodes/labels/add_command_spec.rb +56 -0
- data/spec/kontena/cli/nodes/labels/list_command_spec.rb +43 -0
- data/spec/kontena/cli/nodes/labels/remove_command_spec.rb +57 -0
- data/spec/kontena/cli/nodes/list_command_spec.rb +0 -2
- data/spec/kontena/cli/nodes/remove_command_spec.rb +76 -0
- data/spec/kontena/cli/nodes/reset_token_command_spec.rb +38 -0
- data/spec/kontena/cli/nodes/show_command_spec.rb +46 -0
- data/spec/kontena/cli/nodes/ssh_command_spec.rb +5 -0
- data/spec/kontena/cli/nodes/update_command_spec.rb +24 -0
- data/spec/kontena/cli/stacks/deploy_command_spec.rb +21 -0
- data/spec/kontena/cli/stacks/logs_command_spec.rb +0 -4
- data/spec/kontena/cli/table_generator_spec.rb +0 -4
- data/spec/spec_helper.rb +5 -0
- data/spec/support/output_helpers.rb +3 -14
- data/tasks/release.rake +2 -2
- metadata +28 -5
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'kontena/cli/nodes/create_command'
|
2
|
+
|
3
|
+
describe Kontena::Cli::Nodes::CreateCommand do
|
4
|
+
include ClientHelpers
|
5
|
+
include OutputHelpers
|
6
|
+
|
7
|
+
it 'POSTs the node' do
|
8
|
+
expect(client).to receive(:post).with('grids/test-grid/nodes', {name: 'node-4', labels: []})
|
9
|
+
|
10
|
+
subject.run(['node-4'])
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'POSTs the node with labels' do
|
14
|
+
expect(client).to receive(:post).with('grids/test-grid/nodes', {name: 'node-4', labels: ['test=4']})
|
15
|
+
|
16
|
+
subject.run(['-l', 'test=4', 'node-4'])
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'POSTs with given token' do
|
20
|
+
expect(client).to receive(:post).with('grids/test-grid/nodes', {name: 'node-4', labels: [], token: 'asdf'})
|
21
|
+
|
22
|
+
subject.run(['--token=asdf', 'node-4'])
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'kontena/cli/nodes/env_command'
|
2
|
+
|
3
|
+
describe Kontena::Cli::Nodes::EnvCommand do
|
4
|
+
include ClientHelpers
|
5
|
+
include OutputHelpers
|
6
|
+
|
7
|
+
context 'for a node created with a token' do
|
8
|
+
let :node_token do
|
9
|
+
{
|
10
|
+
"id" => 'test-grid/node-4',
|
11
|
+
"token" => 'TPnBKanfXJpi47CCvuv+Gq319AXvXBi0LL/8grXrhPr9MyqcXHsWbUy0Q3stmPGHhjaqubi5ZCwa7LbnSvZ/Iw=='
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
before do
|
16
|
+
expect(client).to receive(:get).with('nodes/test-grid/node-4/token').and_return(node_token)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'shows the node env' do
|
20
|
+
expect{subject.run(['node-4'])}.to output_lines [
|
21
|
+
'KONTENA_URI=ws://someurl.example.com/',
|
22
|
+
'KONTENA_NODE_TOKEN=TPnBKanfXJpi47CCvuv+Gq319AXvXBi0LL/8grXrhPr9MyqcXHsWbUy0Q3stmPGHhjaqubi5ZCwa7LbnSvZ/Iw==',
|
23
|
+
]
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'shows the --token' do
|
27
|
+
expect{subject.run(['--token', 'node-4'])}.to output_lines [
|
28
|
+
'TPnBKanfXJpi47CCvuv+Gq319AXvXBi0LL/8grXrhPr9MyqcXHsWbUy0Q3stmPGHhjaqubi5ZCwa7LbnSvZ/Iw==',
|
29
|
+
]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'for a node without any token' do
|
34
|
+
let :node_token do
|
35
|
+
{
|
36
|
+
"id" => nil,
|
37
|
+
"token" => nil,
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
before do
|
42
|
+
expect(client).to receive(:get).with('nodes/test-grid/node-1/token').and_return(node_token)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'uses the grid token' do
|
46
|
+
expect{subject.run(['node-1'])}.to exit_with_error.and output(" [error] Node node-1 was not created with a node token. Use `kontena grid env` instead\n").to_stderr
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -8,199 +8,41 @@ describe Kontena::Cli::Nodes::HealthCommand do
|
|
8
8
|
allow(subject).to receive(:health_icon) {|health| health.inspect }
|
9
9
|
end
|
10
10
|
|
11
|
+
before do
|
12
|
+
allow(client).to receive(:get).with('nodes/test-grid/node').and_return(node)
|
13
|
+
end
|
14
|
+
|
11
15
|
context "for an online node" do
|
12
16
|
let :node do
|
13
17
|
{
|
14
|
-
"
|
15
|
-
"name" => "node-4",
|
18
|
+
"name" => "node",
|
16
19
|
"node_number" => 4,
|
17
20
|
"initial_member" => false,
|
21
|
+
"connected" => true,
|
18
22
|
}
|
19
23
|
end
|
20
24
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
describe '#node_health' do
|
26
|
-
it "returns ok" do
|
27
|
-
expect(subject.node_health(node, grid_health)).to eq(:ok)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
describe '#show_node_health' do
|
32
|
-
it "returns true" do
|
33
|
-
expect{subject.show_node_health(node)}.to return_and_output true,
|
34
|
-
":ok Node is online"
|
35
|
-
end
|
25
|
+
it "outputs ok" do
|
26
|
+
expect{subject.run(['node'])}.to output_lines [
|
27
|
+
":ok Node is online",
|
28
|
+
]
|
36
29
|
end
|
37
30
|
end
|
38
31
|
|
39
32
|
context "for an offline node" do
|
40
33
|
let :node do
|
41
34
|
{
|
42
|
-
"
|
43
|
-
"name" => "node-4",
|
35
|
+
"name" => "node",
|
44
36
|
"node_number" => 4,
|
45
37
|
"initial_member" => false,
|
46
|
-
}
|
47
|
-
end
|
48
|
-
|
49
|
-
let :grid_health do
|
50
|
-
:ok
|
51
|
-
end
|
52
|
-
|
53
|
-
describe '#node_health' do
|
54
|
-
it "returns offline" do
|
55
|
-
expect(subject.node_health(node, grid_health)).to eq(:offline)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe '#show_node_health' do
|
60
|
-
it "returns false" do
|
61
|
-
expect{subject.show_node_health(node)}.to return_and_output false,
|
62
|
-
":offline Node is offline"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
context "for an online initial node in an ok grid" do
|
68
|
-
let :node do
|
69
|
-
{
|
70
|
-
"connected" => true,
|
71
|
-
"name" => "node-1",
|
72
|
-
"node_number" => 1,
|
73
|
-
"initial_member" => true,
|
74
|
-
}
|
75
|
-
end
|
76
|
-
|
77
|
-
let :grid_health do
|
78
|
-
:ok
|
79
|
-
end
|
80
|
-
|
81
|
-
describe '#node_health' do
|
82
|
-
it "returns ok" do
|
83
|
-
expect(subject.node_health(node, grid_health)).to eq(:ok)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe '#show_node_health' do
|
88
|
-
it "returns true" do
|
89
|
-
expect{subject.show_node_health(node)}.to return_and_output true,
|
90
|
-
":ok Node is online"
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
context "for an online initial node in a warning grid" do
|
96
|
-
let :node do
|
97
|
-
{
|
98
|
-
"connected" => true,
|
99
|
-
"name" => "node-1",
|
100
|
-
"node_number" => 1,
|
101
|
-
"initial_member" => true,
|
102
|
-
}
|
103
|
-
end
|
104
|
-
|
105
|
-
let :grid_health do
|
106
|
-
:warning
|
107
|
-
end
|
108
|
-
|
109
|
-
describe '#node_health' do
|
110
|
-
it "returns ok" do
|
111
|
-
expect(subject.node_health(node, grid_health)).to eq(:warning)
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
describe '#show_node_health' do
|
116
|
-
it "returns true" do
|
117
|
-
expect{subject.show_node_health(node)}.to return_and_output true,
|
118
|
-
":ok Node is online"
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
context "for an online initial node in an error grid" do
|
124
|
-
let :node do
|
125
|
-
{
|
126
|
-
"connected" => true,
|
127
|
-
"name" => "node-1",
|
128
|
-
"node_number" => 1,
|
129
|
-
"initial_member" => true,
|
130
|
-
}
|
131
|
-
end
|
132
|
-
|
133
|
-
let :grid_health do
|
134
|
-
:error
|
135
|
-
end
|
136
|
-
|
137
|
-
describe '#node_health' do
|
138
|
-
it "returns ok" do
|
139
|
-
expect(subject.node_health(node, grid_health)).to eq(:error)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
describe '#show_node_health' do
|
144
|
-
it "returns true" do
|
145
|
-
expect{subject.show_node_health(node)}.to return_and_output true,
|
146
|
-
":ok Node is online"
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
context "for an offline initial node in a warning grid" do
|
152
|
-
let :node do
|
153
|
-
{
|
154
38
|
"connected" => false,
|
155
|
-
"name" => "node-1",
|
156
|
-
"node_number" => 1,
|
157
|
-
"initial_member" => true,
|
158
39
|
}
|
159
40
|
end
|
160
41
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
describe '#node_health' do
|
166
|
-
it "returns offline" do
|
167
|
-
expect(subject.node_health(node, grid_health)).to eq(:offline)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
describe '#show_node_health' do
|
172
|
-
it "returns false" do
|
173
|
-
expect{subject.show_node_health(node)}.to return_and_output false,
|
174
|
-
":offline Node is offline"
|
175
|
-
end
|
176
|
-
end
|
177
|
-
end
|
178
|
-
|
179
|
-
context "for an offline initial node in a error grid" do
|
180
|
-
let :node do
|
181
|
-
{
|
182
|
-
"connected" => false,
|
183
|
-
"name" => "node-1",
|
184
|
-
"node_number" => 1,
|
185
|
-
"initial_member" => true,
|
186
|
-
}
|
187
|
-
end
|
188
|
-
|
189
|
-
let :grid_health do
|
190
|
-
:error
|
191
|
-
end
|
192
|
-
|
193
|
-
describe '#node_health' do
|
194
|
-
it "returns offline" do
|
195
|
-
expect(subject.node_health(node, grid_health)).to eq(:offline)
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
describe '#show_node_health' do
|
200
|
-
it "returns false" do
|
201
|
-
expect{subject.show_node_health(node)}.to return_and_output false,
|
202
|
-
":offline Node is offline"
|
203
|
-
end
|
42
|
+
it "fails as error" do
|
43
|
+
expect{subject.run(['node'])}.to exit_with_error.and output_lines [
|
44
|
+
":offline Node is offline",
|
45
|
+
]
|
204
46
|
end
|
205
47
|
end
|
206
48
|
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'kontena/cli/nodes/label_command'
|
2
|
+
require 'kontena/cli/nodes/labels/add_command'
|
3
|
+
|
4
|
+
describe Kontena::Cli::Nodes::Labels::AddCommand do
|
5
|
+
include ClientHelpers
|
6
|
+
include OutputHelpers
|
7
|
+
|
8
|
+
before do
|
9
|
+
allow(client).to receive(:get).with('nodes/test-grid/node').and_return(node)
|
10
|
+
end
|
11
|
+
|
12
|
+
context "for a node without any labels" do
|
13
|
+
let :node do
|
14
|
+
{
|
15
|
+
"id" => 'test-grid/node',
|
16
|
+
"name" => "node",
|
17
|
+
"labels" => [],
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
it "adds the labels" do
|
22
|
+
expect(client).to receive(:put).with('nodes/test-grid/node', {
|
23
|
+
labels: ['test=yes'],
|
24
|
+
})
|
25
|
+
subject.run(['node', 'test=yes'])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "for a node with labels" do
|
30
|
+
let :node do
|
31
|
+
{
|
32
|
+
"id" => 'test-grid/node',
|
33
|
+
"name" => "node",
|
34
|
+
"labels" => [
|
35
|
+
'test=yes',
|
36
|
+
],
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
it "adds new labels" do
|
41
|
+
expect(client).to receive(:put).with('nodes/test-grid/node', {
|
42
|
+
labels: ['test=yes', 'test=no'],
|
43
|
+
})
|
44
|
+
|
45
|
+
subject.run(['node', 'test=no'])
|
46
|
+
end
|
47
|
+
|
48
|
+
it "deduplicates labels" do
|
49
|
+
expect(client).to receive(:put).with('nodes/test-grid/node', {
|
50
|
+
labels: ['test=yes'],
|
51
|
+
})
|
52
|
+
|
53
|
+
subject.run(['node', 'test=yes'])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'kontena/cli/nodes/label_command'
|
2
|
+
require 'kontena/cli/nodes/labels/list_command'
|
3
|
+
|
4
|
+
describe Kontena::Cli::Nodes::Labels::ListCommand do
|
5
|
+
include ClientHelpers
|
6
|
+
include OutputHelpers
|
7
|
+
|
8
|
+
before do
|
9
|
+
allow(client).to receive(:get).with('nodes/test-grid/node').and_return(node)
|
10
|
+
end
|
11
|
+
|
12
|
+
context "for a node without any labels" do
|
13
|
+
let :node do
|
14
|
+
{
|
15
|
+
"id" => 'test-grid/node',
|
16
|
+
"name" => "node",
|
17
|
+
"labels" => [],
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
it "outputs nothing" do
|
22
|
+
expect{subject.run(['node'])}.to output_lines [ ]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context "for a node with labels" do
|
27
|
+
let :node do
|
28
|
+
{
|
29
|
+
"id" => 'test-grid/node',
|
30
|
+
"name" => "node",
|
31
|
+
"labels" => [
|
32
|
+
'test=yes',
|
33
|
+
],
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
it "outputs nothing" do
|
38
|
+
expect{subject.run(['node'])}.to output_lines [
|
39
|
+
'test=yes',
|
40
|
+
]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'kontena/cli/nodes/label_command'
|
2
|
+
require 'kontena/cli/nodes/labels/remove_command'
|
3
|
+
|
4
|
+
describe Kontena::Cli::Nodes::Labels::RemoveCommand do
|
5
|
+
include ClientHelpers
|
6
|
+
include OutputHelpers
|
7
|
+
|
8
|
+
before do
|
9
|
+
allow(client).to receive(:get).with('nodes/test-grid/node').and_return(node)
|
10
|
+
end
|
11
|
+
|
12
|
+
context "for a node without any labels" do
|
13
|
+
let :node do
|
14
|
+
{
|
15
|
+
"id" => 'test-grid/node',
|
16
|
+
"name" => "node",
|
17
|
+
"labels" => [],
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
it "doesn't remove anything" do
|
22
|
+
expect(client).to receive(:put).with('nodes/test-grid/node', {
|
23
|
+
labels: [],
|
24
|
+
})
|
25
|
+
subject.run(['node', 'test=yes'])
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
context "for a node with labels" do
|
30
|
+
let :node do
|
31
|
+
{
|
32
|
+
"id" => 'test-grid/node',
|
33
|
+
"name" => "node",
|
34
|
+
"labels" => [
|
35
|
+
'test=yes',
|
36
|
+
'test=no',
|
37
|
+
],
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
it "removes labels" do
|
42
|
+
expect(client).to receive(:put).with('nodes/test-grid/node', {
|
43
|
+
labels: ['test=no'],
|
44
|
+
})
|
45
|
+
|
46
|
+
subject.run(['node', 'test=yes'])
|
47
|
+
end
|
48
|
+
|
49
|
+
it "removes all labels" do
|
50
|
+
expect(client).to receive(:put).with('nodes/test-grid/node', {
|
51
|
+
labels: [],
|
52
|
+
})
|
53
|
+
|
54
|
+
subject.run(['node', 'test=yes', 'test=no'])
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|