kontena-cli 1.2.0.pre3 → 1.2.0.rc1
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/VERSION +1 -1
- data/kontena-cli.gemspec +3 -3
- data/lib/kontena/cli/common.rb +13 -0
- data/lib/kontena/cli/grid_command.rb +1 -0
- data/lib/kontena/cli/grids/events_command.rb +50 -0
- data/lib/kontena/cli/helpers/log_helper.rb +2 -2
- data/lib/kontena/cli/master/config/import_command.rb +2 -2
- data/lib/kontena/cli/master/logout_command.rb +19 -17
- data/lib/kontena/cli/service_command.rb +1 -0
- data/lib/kontena/cli/services/events_command.rb +36 -0
- data/lib/kontena/cli/services/remove_command.rb +28 -4
- data/lib/kontena/cli/services/services_helper.rb +39 -4
- data/lib/kontena/cli/services/show_command.rb +8 -1
- data/lib/kontena/cli/stack_command.rb +1 -0
- data/lib/kontena/cli/stacks/events_command.rb +33 -0
- data/lib/kontena/cli/stacks/logs_command.rb +2 -0
- data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -1
- data/lib/kontena/cli/vault/import_command.rb +2 -2
- data/lib/kontena/cli/vault/update_command.rb +9 -12
- data/lib/kontena/cli/vault/write_command.rb +8 -15
- data/lib/kontena/cli/volume_command.rb +3 -0
- data/lib/kontena/cli/volumes/show_command.rb +38 -0
- data/lib/kontena/main_command.rb +1 -1
- data/lib/kontena_cli.rb +5 -1
- data/spec/kontena/cli/grids/events_command_spec.rb +15 -0
- data/spec/kontena/cli/services/events_command_spec.rb +22 -0
- data/spec/kontena/cli/stacks/events_command_spec.rb +22 -0
- data/spec/kontena/cli/stacks/logs_command_spec.rb +32 -0
- data/spec/kontena/cli/vault/update_command_spec.rb +79 -0
- data/spec/kontena/cli/vault/write_command_spec.rb +60 -0
- data/spec/kontena/kontena_cli_spec.rb +6 -3
- metadata +26 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d1303357caabb58711e52c64fef54b12a9afc989
|
4
|
+
data.tar.gz: 8ce9069dcf068450f990cb23fddac6792a7956c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7df9880f68b96488d865427015884e99af34a56c9b4b0c52df1c4614e15e5e3686f386fa672ea1310c42801cb6e8b6d82a2387dca9439800f3b2e980e06ae01a
|
7
|
+
data.tar.gz: d1447a0ac64a834660c7b4857e50e533757247af83664d875644c812075b6622bdd53397e18c2fb1bb12cc4924319e17c9b9c788d46b6dbb6de1288d034e1399
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.0.
|
1
|
+
1.2.0.rc1
|
data/kontena-cli.gemspec
CHANGED
@@ -23,13 +23,13 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.7"
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
25
25
|
spec.add_runtime_dependency "excon", "~> 0.49.0"
|
26
|
-
spec.add_runtime_dependency "tty-prompt", "
|
26
|
+
spec.add_runtime_dependency "tty-prompt", "0.12.0"
|
27
27
|
spec.add_runtime_dependency "clamp", "~> 1.1.0"
|
28
28
|
spec.add_runtime_dependency "ruby_dig", "~> 0.0.2"
|
29
29
|
spec.add_runtime_dependency "launchy", "~> 2.4.3"
|
30
|
-
spec.add_runtime_dependency "hash_validator", "~> 0.7.
|
30
|
+
spec.add_runtime_dependency "hash_validator", "~> 0.7.1"
|
31
31
|
spec.add_runtime_dependency "retriable", "~> 2.1.0"
|
32
|
-
spec.add_runtime_dependency "opto", "1.8.
|
32
|
+
spec.add_runtime_dependency "opto", "1.8.5"
|
33
33
|
spec.add_runtime_dependency "semantic", "~> 1.5"
|
34
34
|
spec.add_runtime_dependency "safe_yaml", "~> 1.0"
|
35
35
|
spec.add_runtime_dependency "liquid", "~> 4.0.0"
|
data/lib/kontena/cli/common.rb
CHANGED
@@ -22,6 +22,19 @@ module Kontena
|
|
22
22
|
@pastel ||= Pastel.new(enabled: $stdout.tty?)
|
23
23
|
end
|
24
24
|
|
25
|
+
# Read from STDIN. If stdin is a console, use prompt to ask.
|
26
|
+
# @param [String] message
|
27
|
+
# @param [Symbol] mode (prompt method: :ask, :multiline, etc)
|
28
|
+
def stdin_input(message = nil, mode = :ask)
|
29
|
+
if $stdin.tty?
|
30
|
+
Array(prompt.send(mode, message)).join.chomp
|
31
|
+
elsif !$stdin.eof?
|
32
|
+
$stdin.read.chomp
|
33
|
+
else
|
34
|
+
exit_with_error 'Missing input'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
25
38
|
def running_silent?
|
26
39
|
self.respond_to?(:silent?) && self.silent?
|
27
40
|
end
|
@@ -6,6 +6,7 @@ class Kontena::Cli::GridCommand < Kontena::Command
|
|
6
6
|
subcommand "use", "Switch to use specific grid", load_subcommand('grids/use_command')
|
7
7
|
subcommand "show", "Show grid details", load_subcommand('grids/show_command')
|
8
8
|
subcommand "logs", "Show logs from grid containers", load_subcommand('grids/logs_command')
|
9
|
+
subcommand "events", "Show events from grid", load_subcommand('grids/events_command')
|
9
10
|
subcommand ["remove","rm"], "Remove a grid", load_subcommand('grids/remove_command')
|
10
11
|
subcommand "current", "Show current grid details", load_subcommand('grids/current_command')
|
11
12
|
subcommand "env", "Show the current grid environment details", load_subcommand('grids/env_command')
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require_relative '../helpers/log_helper'
|
2
|
+
|
3
|
+
module Kontena::Cli::Grids
|
4
|
+
class EventsCommand < Kontena::Command
|
5
|
+
include Kontena::Cli::Common
|
6
|
+
include Kontena::Cli::Helpers::LogHelper
|
7
|
+
|
8
|
+
SKIP_TYPES = ['grid']
|
9
|
+
|
10
|
+
option "--node", "NODE", "Filter by node name", multivalued: true
|
11
|
+
option "--service", "SERVICE", "Filter by service name", multivalued: true
|
12
|
+
|
13
|
+
def execute
|
14
|
+
require_api_url
|
15
|
+
|
16
|
+
query_params = {}
|
17
|
+
query_params[:nodes] = node_list.join(",") unless node_list.empty?
|
18
|
+
query_params[:services] = service_list.join(",") unless service_list.empty?
|
19
|
+
|
20
|
+
titles = ['TIME', 'TYPE', 'RELATIONSHIPS', 'MESSAGE']
|
21
|
+
puts "%-25s %-25s %-40s %s" % titles
|
22
|
+
show_logs("grids/#{current_grid}/event_logs", query_params) do |log|
|
23
|
+
show_log(log)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def show_log(log)
|
28
|
+
msg = log['message']
|
29
|
+
rels = log['relationships'].
|
30
|
+
delete_if { |r| SKIP_TYPES.include?(r['type']) }.
|
31
|
+
map { |r|
|
32
|
+
id = r['id'].split('/')[1..-1].delete_if{ |s| s == 'null'}.join('/')
|
33
|
+
unless id.empty?
|
34
|
+
"#{r['type']}=#{id}"
|
35
|
+
end
|
36
|
+
}.compact
|
37
|
+
|
38
|
+
time = log['created_at']
|
39
|
+
if log['severity'] == 2
|
40
|
+
time = time.colorize(:yellow)
|
41
|
+
elsif log['severity'] >= 3
|
42
|
+
time = time.colorize(:red)
|
43
|
+
end
|
44
|
+
|
45
|
+
puts '%-25s %-25s %-40s %s' % [
|
46
|
+
time, log['type'], rels.join(','), msg
|
47
|
+
]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -52,7 +52,7 @@ module Kontena::Cli::Helpers
|
|
52
52
|
|
53
53
|
begin
|
54
54
|
query_params[:from] = last_seen if last_seen
|
55
|
-
|
55
|
+
client(token).get_stream(url, streamer, query_params)
|
56
56
|
rescue => exc
|
57
57
|
retry if exc.cause.is_a?(EOFError) # Excon wraps the EOFerror into SocketError
|
58
58
|
raise
|
@@ -74,7 +74,7 @@ module Kontena::Cli::Helpers
|
|
74
74
|
end
|
75
75
|
@buffer = ''
|
76
76
|
log
|
77
|
-
rescue
|
77
|
+
rescue
|
78
78
|
@buffer << orig_chunk
|
79
79
|
nil
|
80
80
|
end
|
@@ -8,7 +8,7 @@ module Kontena::Cli::Master::Config
|
|
8
8
|
|
9
9
|
banner "Updates configuration from a file into Master"
|
10
10
|
|
11
|
-
parameter '[PATH]', "Input from file in PATH
|
11
|
+
parameter '[PATH]', "Input from file in PATH (default: STDIN)", required: false
|
12
12
|
|
13
13
|
option ['--preset'], '[NAME]', 'Load preset', hidden: true
|
14
14
|
|
@@ -30,7 +30,7 @@ module Kontena::Cli::Master::Config
|
|
30
30
|
path = File.join(Kontena.root, 'lib/kontena/presets', "#{self.preset}.yml")
|
31
31
|
File.read(path)
|
32
32
|
else
|
33
|
-
|
33
|
+
stdin_input("Enter master configuration as #{format.upcase}", :multiline)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -1,23 +1,25 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Kontena::Cli::Master
|
2
|
+
class LogoutCommand < Kontena::Command
|
3
|
+
include Kontena::Cli::Common
|
3
4
|
|
4
|
-
|
5
|
+
option ['-A', '--all'], :flag, 'Log out from all masters. By default only log out from current master.'
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
def execute
|
8
|
+
if self.all?
|
9
|
+
config.servers.each do |server|
|
10
|
+
use_refresh_token(server)
|
11
|
+
server.token = nil
|
12
|
+
puts "Logged out of #{server.name.colorize(:green)}"
|
13
|
+
end
|
14
|
+
elsif config.current_master
|
15
|
+
use_refresh_token(config.current_master)
|
16
|
+
config.current_master.token = nil
|
17
|
+
puts "Logged out of #{config.current_master.name.colorize(:green)}"
|
18
|
+
else
|
19
|
+
warn "Current master has not been selected"
|
20
|
+
exit 0 # exiting with 0 not 1, it's not really an error situation (kontena logout && kontena master login...)
|
12
21
|
end
|
13
|
-
|
14
|
-
use_refresh_token(config.current_master)
|
15
|
-
config.current_master.token = nil
|
16
|
-
puts "Logged out of #{config.current_master.name.colorize(:green)}"
|
17
|
-
else
|
18
|
-
warn "Current master has not been selected"
|
19
|
-
exit 0 # exiting with 0 not 1, it's not really an error situation (kontena logout && kontena master login...)
|
22
|
+
config.write
|
20
23
|
end
|
21
|
-
config.write
|
22
24
|
end
|
23
25
|
end
|
@@ -11,6 +11,7 @@ class Kontena::Cli::ServiceCommand < Kontena::Command
|
|
11
11
|
subcommand ["remove", "rm"], "Remove service", load_subcommand('services/remove_command')
|
12
12
|
subcommand "containers", "List service containers", load_subcommand('services/containers_command')
|
13
13
|
subcommand "logs", "Show service logs", load_subcommand('services/logs_command')
|
14
|
+
subcommand "events", "Show service events", load_subcommand('services/events_command')
|
14
15
|
subcommand "stats", "Show service statistics", load_subcommand('services/stats_command')
|
15
16
|
subcommand "monitor", "Monitor", load_subcommand('services/monitor_command')
|
16
17
|
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'services_helper'
|
2
|
+
require_relative '../helpers/log_helper'
|
3
|
+
|
4
|
+
module Kontena::Cli::Services
|
5
|
+
class EventsCommand < Kontena::Command
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
include Kontena::Cli::GridOptions
|
8
|
+
include Kontena::Cli::Helpers::LogHelper
|
9
|
+
include ServicesHelper
|
10
|
+
|
11
|
+
parameter "NAME", "Service name"
|
12
|
+
|
13
|
+
def execute
|
14
|
+
require_api_url
|
15
|
+
|
16
|
+
query_params = {}
|
17
|
+
|
18
|
+
titles = ['TIME', 'TYPE', 'MESSAGE']
|
19
|
+
puts "%-25s %-20s %s" % titles
|
20
|
+
show_logs("services/#{parse_service_id(name)}/event_logs", query_params) do |log|
|
21
|
+
show_log(log)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def show_log(log)
|
26
|
+
msg = log['message']
|
27
|
+
node = log['relationships'].find { |r| r['type'] == 'node' }
|
28
|
+
if node
|
29
|
+
msg = "#{msg} (#{node['id'].split('/')[-1]})"
|
30
|
+
end
|
31
|
+
puts '%-25s %-20s %s' % [
|
32
|
+
log['created_at'], log['type'].sub('service:'.freeze, ''.freeze), msg
|
33
|
+
]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -6,20 +6,32 @@ module Kontena::Cli::Services
|
|
6
6
|
include ServicesHelper
|
7
7
|
|
8
8
|
parameter "NAME", "Service name"
|
9
|
+
option "--instance", "INSTANCE", "Remove only given instance"
|
9
10
|
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
10
11
|
|
12
|
+
banner "Remove a service"
|
13
|
+
|
14
|
+
requires_current_master
|
15
|
+
requires_current_master_token
|
16
|
+
|
11
17
|
def execute
|
12
|
-
|
13
|
-
|
18
|
+
if instance
|
19
|
+
remove_instance
|
20
|
+
else
|
21
|
+
remove
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def remove
|
14
26
|
confirm_command(name) unless forced?
|
15
27
|
|
16
28
|
spinner "Removing service #{name.colorize(:cyan)} " do
|
17
|
-
client
|
29
|
+
client.delete("services/#{parse_service_id(name)}")
|
18
30
|
removed = false
|
19
31
|
until removed == true
|
20
32
|
sleep 1
|
21
33
|
begin
|
22
|
-
client
|
34
|
+
client.get("services/#{parse_service_id(name)}")
|
23
35
|
rescue Kontena::Errors::StandardError => exc
|
24
36
|
if exc.status == 404
|
25
37
|
removed = true
|
@@ -30,5 +42,17 @@ module Kontena::Cli::Services
|
|
30
42
|
end
|
31
43
|
end
|
32
44
|
end
|
45
|
+
|
46
|
+
def remove_instance
|
47
|
+
instance_name = "#{name}/#{instance}"
|
48
|
+
confirm_command("#{name}/#{instance}") unless forced?
|
49
|
+
service_instance = client.get("services/#{parse_service_id(name)}/instances")['instances'].find{ |i|
|
50
|
+
i['instance_number'] == instance.to_i
|
51
|
+
}
|
52
|
+
exit_with_error("Instance not found") unless service_instance
|
53
|
+
spinner "Removing service instance #{instance_name.colorize(:cyan)} " do
|
54
|
+
client.delete("services/#{parse_service_id(name)}/instances/#{service_instance['id']}")
|
55
|
+
end
|
56
|
+
end
|
33
57
|
end
|
34
58
|
end
|
@@ -41,12 +41,11 @@ module Kontena
|
|
41
41
|
# @param [String] service_id
|
42
42
|
def show_service(token, service_id)
|
43
43
|
service = get_service(token, service_id)
|
44
|
-
grid = service['id'].split('/')[0]
|
45
44
|
puts "#{service['id']}:"
|
46
45
|
puts " created: #{service['created_at']}"
|
47
46
|
puts " updated: #{service['updated_at']}"
|
48
47
|
puts " stack: #{service['stack']['id'] }"
|
49
|
-
puts "
|
48
|
+
puts " desired_state: #{service['state'] }"
|
50
49
|
puts " image: #{service['image']}"
|
51
50
|
puts " revision: #{service['revision']}"
|
52
51
|
puts " stack_revision: #{service['stack_revision']}" if service['stack_revision']
|
@@ -54,7 +53,9 @@ module Kontena
|
|
54
53
|
puts " scaling: #{service['instances'] }"
|
55
54
|
puts " strategy: #{service['strategy']}"
|
56
55
|
puts " deploy_opts:"
|
57
|
-
|
56
|
+
if service['deploy_opts']['min_health']
|
57
|
+
puts " min_health: #{service['deploy_opts']['min_health']}"
|
58
|
+
end
|
58
59
|
if service['deploy_opts']['wait_for_port']
|
59
60
|
puts " wait_for_port: #{service['deploy_opts']['wait_for_port']}"
|
60
61
|
end
|
@@ -104,7 +105,7 @@ module Kontena
|
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
107
|
-
|
108
|
+
if service['net'].to_s != 'bridge'
|
108
109
|
puts " net: #{service['net']}"
|
109
110
|
end
|
110
111
|
|
@@ -188,6 +189,40 @@ module Kontena
|
|
188
189
|
end
|
189
190
|
|
190
191
|
def show_service_instances(token, service_id)
|
192
|
+
puts " instances:"
|
193
|
+
instances = client(token).get("services/#{parse_service_id(service_id)}/instances")['instances']
|
194
|
+
containers = client(token).get("services/#{parse_service_id(service_id)}/containers")['containers']
|
195
|
+
instances.each do |i|
|
196
|
+
puts " #{name}/#{i['instance_number']}:"
|
197
|
+
puts " scheduled_to: #{i.dig('node', 'name') || '-'}"
|
198
|
+
puts " deploy_rev: #{i['deploy_rev']}"
|
199
|
+
puts " rev: #{i['rev']}"
|
200
|
+
puts " state: #{i['state']}"
|
201
|
+
puts " error: #{i['error'] || '-'}" if i['error']
|
202
|
+
puts " containers:"
|
203
|
+
containers.select { |c|
|
204
|
+
c['instance_number'] == i['instance_number']
|
205
|
+
}.each do |container|
|
206
|
+
puts " #{container['name']} (on #{container.dig('node', 'name')}):"
|
207
|
+
puts " dns: #{container['hostname']}.#{container['domainname']}"
|
208
|
+
puts " ip: #{container['ip_address']}"
|
209
|
+
puts " public ip: #{container['node']['public_ip'] rescue 'unknown'}"
|
210
|
+
if container['health_status']
|
211
|
+
health_time = Time.now - Time.parse(container.dig('health_status', 'updated_at'))
|
212
|
+
puts " health: #{container.dig('health_status', 'status')} (#{health_time.to_i}s ago)"
|
213
|
+
end
|
214
|
+
puts " status: #{container['status']}"
|
215
|
+
if container.dig('state', 'error') != ''
|
216
|
+
puts " reason: #{container['state']['error']}"
|
217
|
+
end
|
218
|
+
if container.dig('state', 'exit_code').to_i != 0
|
219
|
+
puts " exit code: #{container['state']['exit_code']}"
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def show_service_containers(token, service_id)
|
191
226
|
puts " instances:"
|
192
227
|
result = client(token).get("services/#{parse_service_id(service_id)}/containers")
|
193
228
|
result['containers'].each do |container|
|
@@ -13,7 +13,14 @@ module Kontena::Cli::Services
|
|
13
13
|
token = require_token
|
14
14
|
|
15
15
|
show_service(token, name)
|
16
|
-
|
16
|
+
begin
|
17
|
+
show_service_instances(token, name)
|
18
|
+
rescue Kontena::Errors::StandardError => exc
|
19
|
+
if exc.status == 404
|
20
|
+
# fallback to old behaviour
|
21
|
+
show_service_containers(token, name)
|
22
|
+
end
|
23
|
+
end
|
17
24
|
end
|
18
25
|
end
|
19
26
|
end
|
@@ -6,6 +6,7 @@ class Kontena::Cli::StackCommand < Kontena::Command
|
|
6
6
|
subcommand "upgrade", "Upgrade a stack in a grid", load_subcommand('stacks/upgrade_command')
|
7
7
|
subcommand ["start", "deploy"], "Deploy an installed stack in a grid", load_subcommand('stacks/deploy_command')
|
8
8
|
subcommand "logs", "Show logs from services in a stack", load_subcommand('stacks/logs_command')
|
9
|
+
subcommand "events", "Show events from services in a stack", load_subcommand('stacks/events_command')
|
9
10
|
subcommand "monitor", "Monitor services in a stack", load_subcommand('stacks/monitor_command')
|
10
11
|
subcommand "build", "Build images listed in a stack file and push them to an image registry", load_subcommand('stacks/build_command')
|
11
12
|
subcommand ["reg", "registry"], "Stack registry related commands", load_subcommand('stacks/registry_command')
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative '../helpers/log_helper'
|
2
|
+
|
3
|
+
module Kontena::Cli::Stacks
|
4
|
+
class EventsCommand < Kontena::Command
|
5
|
+
include Kontena::Cli::Common
|
6
|
+
include Kontena::Cli::GridOptions
|
7
|
+
include Kontena::Cli::Helpers::LogHelper
|
8
|
+
|
9
|
+
parameter "NAME", "Service name"
|
10
|
+
|
11
|
+
def execute
|
12
|
+
require_api_url
|
13
|
+
|
14
|
+
query_params = {}
|
15
|
+
titles = ['TIME', 'TYPE', 'MESSAGE']
|
16
|
+
puts "%-25s %-25s %s" % titles
|
17
|
+
show_logs("stacks/#{current_grid}/#{name}/event_logs", query_params) do |log|
|
18
|
+
show_log(log)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def show_log(log)
|
23
|
+
msg = log['message']
|
24
|
+
node = log['relationships'].find { |r| r['type'] == 'node' }
|
25
|
+
if node
|
26
|
+
msg = "#{msg} (#{node['id'].split('/')[-1]})"
|
27
|
+
end
|
28
|
+
puts '%-25s %-25s %s' % [
|
29
|
+
log['created_at'], log['type'], msg
|
30
|
+
]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -10,7 +10,7 @@ module Kontena::Cli::Vault
|
|
10
10
|
option '--skip-null', :flag, "Do not remove keys with null values"
|
11
11
|
option '--empty-is-null', :flag, "Treat empty values as null"
|
12
12
|
|
13
|
-
parameter '[PATH]', "Input from file in PATH
|
13
|
+
parameter '[PATH]', "Input from file in PATH (default: STDIN)"
|
14
14
|
|
15
15
|
requires_current_master
|
16
16
|
|
@@ -23,7 +23,7 @@ module Kontena::Cli::Vault
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def input
|
26
|
-
path ? File.read(path) :
|
26
|
+
path ? File.read(path) : stdin_input("Enter secrets YAML", :multiline)
|
27
27
|
end
|
28
28
|
|
29
29
|
def execute
|
@@ -1,26 +1,23 @@
|
|
1
1
|
module Kontena::Cli::Vault
|
2
2
|
class UpdateCommand < Kontena::Command
|
3
3
|
include Kontena::Cli::Common
|
4
|
+
include Kontena::Cli::GridOptions
|
4
5
|
|
5
6
|
parameter 'NAME', 'Secret name'
|
6
|
-
parameter '[VALUE]', 'Secret value'
|
7
|
+
parameter '[VALUE]', 'Secret value (default: STDIN)'
|
7
8
|
|
8
9
|
option ['-u', '--upsert'], :flag, 'Create secret unless already exists', default: false
|
9
10
|
option '--silent', :flag, "Reduce output verbosity"
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
12
|
+
requires_current_master
|
13
|
+
|
14
|
+
def default_value
|
15
|
+
stdin_input("Enter value for secret '#{name}'", :mask)
|
16
|
+
end
|
14
17
|
|
15
|
-
|
16
|
-
value ||= STDIN.read.chomp
|
17
|
-
data = {
|
18
|
-
name: name,
|
19
|
-
value: value,
|
20
|
-
upsert: upsert?
|
21
|
-
}
|
18
|
+
def execute
|
22
19
|
vspinner "Updating #{name.colorize(:cyan)} value in the vault " do
|
23
|
-
client
|
20
|
+
client.put("secrets/#{current_grid}/#{name}", {name: name, value: value, upsert: upsert? })
|
24
21
|
end
|
25
22
|
end
|
26
23
|
end
|
@@ -4,26 +4,19 @@ module Kontena::Cli::Vault
|
|
4
4
|
include Kontena::Cli::GridOptions
|
5
5
|
|
6
6
|
parameter 'NAME', 'Secret name'
|
7
|
-
parameter '[VALUE]', 'Secret value'
|
7
|
+
parameter '[VALUE]', 'Secret value (default: STDIN)'
|
8
8
|
|
9
9
|
option '--silent', :flag, "Reduce output verbosity"
|
10
10
|
|
11
|
-
|
12
|
-
require_api_url
|
13
|
-
require_current_grid
|
11
|
+
requires_current_master
|
14
12
|
|
15
|
-
|
16
|
-
secret
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
exit_with_error('No value provided') if secret.to_s == ''
|
21
|
-
data = {
|
22
|
-
name: name,
|
23
|
-
value: secret
|
24
|
-
}
|
13
|
+
def default_value
|
14
|
+
stdin_input("Enter value for secret '#{name}'", :mask)
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute
|
25
18
|
vspinner "Writing #{name.colorize(:cyan)} to the vault " do
|
26
|
-
client
|
19
|
+
client.post("grids/#{current_grid}/secrets", { name: name, value: value })
|
27
20
|
end
|
28
21
|
end
|
29
22
|
end
|
@@ -1,7 +1,10 @@
|
|
1
1
|
|
2
2
|
class Kontena::Cli::VolumeCommand < Kontena::Command
|
3
3
|
|
4
|
+
warn Kontena.pastel.yellow("[EXPERIMENTAL] The `kontena volume` commands are still experimental in Kontena #{Kontena.minor_version}, and may change in future releases")
|
5
|
+
|
4
6
|
subcommand "create", "Create a managed volume", load_subcommand('volumes/create_command')
|
7
|
+
subcommand "show", "Show details of a volume", load_subcommand('volumes/show_command')
|
5
8
|
subcommand ["remove", "rm"], "Remove a managed volume", load_subcommand('volumes/remove_command')
|
6
9
|
subcommand ["list", "ls"], "List managed volumes", load_subcommand('volumes/list_command')
|
7
10
|
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
module Kontena::Cli::Volumes
|
3
|
+
class ShowCommand < Kontena::Command
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
include Kontena::Cli::GridOptions
|
6
|
+
|
7
|
+
banner "Show details of a volume"
|
8
|
+
|
9
|
+
parameter 'VOLUME', 'Volume'
|
10
|
+
|
11
|
+
requires_current_master
|
12
|
+
requires_current_master_token
|
13
|
+
|
14
|
+
def execute
|
15
|
+
vol = client.get("volumes/#{current_grid}/#{volume}")
|
16
|
+
puts "#{vol['name']}:"
|
17
|
+
puts " id: #{vol['id']}"
|
18
|
+
puts " created: #{vol['created_at']}"
|
19
|
+
puts " scope: #{vol['scope']}"
|
20
|
+
puts " driver: #{vol['driver']}"
|
21
|
+
puts " driver_opts:"
|
22
|
+
vol['driver_opts'].each do |k,v|
|
23
|
+
puts " #{k}: #{v}"
|
24
|
+
end
|
25
|
+
puts " instances:"
|
26
|
+
vol['instances'].each do |instance|
|
27
|
+
puts " - name: #{instance['name']}"
|
28
|
+
puts " node: #{instance['node']}"
|
29
|
+
end
|
30
|
+
puts " services:"
|
31
|
+
vol['services'].each do |service|
|
32
|
+
puts " - #{service['id']}"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
data/lib/kontena/main_command.rb
CHANGED
@@ -36,7 +36,7 @@ class Kontena::MainCommand < Kontena::Command
|
|
36
36
|
subcommand "whoami", "Shows current logged in user", load_subcommand('whoami_command')
|
37
37
|
subcommand "plugin", "Plugin related commands", load_subcommand('plugin_command')
|
38
38
|
subcommand "version", "Show CLI and current master version", load_subcommand('version_command')
|
39
|
-
subcommand "volume", "Volume specific commands", load_subcommand('volume_command')
|
39
|
+
subcommand "volume", "Volume specific commands [EXPERIMENTAL]", load_subcommand('volume_command')
|
40
40
|
|
41
41
|
def execute
|
42
42
|
end
|
data/lib/kontena_cli.rb
CHANGED
@@ -28,6 +28,11 @@ module Kontena
|
|
28
28
|
end
|
29
29
|
|
30
30
|
|
31
|
+
# @return [String] x.y
|
32
|
+
def self.minor_version
|
33
|
+
Kontena::Cli::VERSION.split('.')[0..1].join('.')
|
34
|
+
end
|
35
|
+
|
31
36
|
def self.version
|
32
37
|
"kontena-cli/#{Kontena::Cli::VERSION}"
|
33
38
|
end
|
@@ -111,4 +116,3 @@ require_relative 'kontena/stacks_cache'
|
|
111
116
|
require_relative 'kontena/plugin_manager'
|
112
117
|
require_relative 'kontena/main_command'
|
113
118
|
require_relative 'kontena/cli/spinner'
|
114
|
-
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'kontena/cli/grids/events_command'
|
2
|
+
|
3
|
+
describe Kontena::Cli::Grids::EventsCommand do
|
4
|
+
include ClientHelpers
|
5
|
+
include OutputHelpers
|
6
|
+
|
7
|
+
describe '#execute' do
|
8
|
+
it 'requests events from master' do
|
9
|
+
expect(client).to receive(:get).with(
|
10
|
+
'grids/test-grid/event_logs', {limit: 100}
|
11
|
+
).and_return({'logs' => []})
|
12
|
+
subject.run([])
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require "kontena/cli/services/events_command"
|
3
|
+
|
4
|
+
describe Kontena::Cli::Services::EventsCommand do
|
5
|
+
|
6
|
+
include ClientHelpers
|
7
|
+
|
8
|
+
describe '#execute' do
|
9
|
+
before(:each) do
|
10
|
+
allow(client).to receive(:get).and_return({
|
11
|
+
'logs' => []
|
12
|
+
})
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'requests logs from master' do
|
16
|
+
expect(client).to receive(:get).with(
|
17
|
+
'services/test-grid/null/service-a/event_logs', {limit: 100}
|
18
|
+
)
|
19
|
+
subject.run(['service-a'])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require "kontena/cli/stacks/events_command"
|
3
|
+
|
4
|
+
describe Kontena::Cli::Stacks::EventsCommand do
|
5
|
+
|
6
|
+
include ClientHelpers
|
7
|
+
|
8
|
+
describe '#execute' do
|
9
|
+
before(:each) do
|
10
|
+
allow(client).to receive(:get).and_return({
|
11
|
+
'logs' => []
|
12
|
+
})
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'requests logs from master' do
|
16
|
+
expect(client).to receive(:get).with(
|
17
|
+
'stacks/test-grid/redish/event_logs', {limit: 100}
|
18
|
+
)
|
19
|
+
subject.run(['redish'])
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "kontena/cli/stacks/logs_command"
|
2
|
+
|
3
|
+
describe Kontena::Cli::Stacks::LogsCommand do
|
4
|
+
include ClientHelpers
|
5
|
+
include OutputHelpers
|
6
|
+
|
7
|
+
let (:logs) do
|
8
|
+
[
|
9
|
+
{
|
10
|
+
'id' => '57cff2e8cfee65c8b6efc8bd',
|
11
|
+
'name' => 'test-stack.mysql-1',
|
12
|
+
'created_at' => '2016-09-07T15:19:04.362690',
|
13
|
+
'data' => "mysql log message 1",
|
14
|
+
},
|
15
|
+
]
|
16
|
+
end
|
17
|
+
|
18
|
+
before(:each) do
|
19
|
+
Kontena.pastel.resolver.color.disable!
|
20
|
+
end
|
21
|
+
|
22
|
+
it "shows stack logs" do
|
23
|
+
expect(client).to receive(:get).with('stacks/test-grid/test-stack/container_logs', {
|
24
|
+
limit: 100,
|
25
|
+
}) { { 'logs' => logs } }
|
26
|
+
|
27
|
+
expect{subject.run(['test-stack'])}.to output_lines [
|
28
|
+
"2016-09-07T15:19:04.362690 [test-stack.mysql-1]: mysql log message 1",
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require 'kontena/cli/vault/update_command'
|
3
|
+
|
4
|
+
describe Kontena::Cli::Vault::UpdateCommand do
|
5
|
+
|
6
|
+
include RequirementsHelper
|
7
|
+
include ClientHelpers
|
8
|
+
|
9
|
+
let(:subject) { described_class.new(File.basename($0)) }
|
10
|
+
|
11
|
+
describe '#execute' do
|
12
|
+
|
13
|
+
context 'without value parameter' do
|
14
|
+
|
15
|
+
let(:stdin) { double(:stdin) }
|
16
|
+
|
17
|
+
before(:each) do
|
18
|
+
@old_stdin = $stdin
|
19
|
+
$stdin = stdin
|
20
|
+
end
|
21
|
+
|
22
|
+
after(:each) { $stdin = @old_stdin }
|
23
|
+
|
24
|
+
context 'without tty' do
|
25
|
+
before(:each) { allow(stdin).to receive(:tty?).and_return(false) }
|
26
|
+
after(:each) { $stdin = @old_stdin }
|
27
|
+
|
28
|
+
context 'nothing in stdin' do
|
29
|
+
before(:each) do
|
30
|
+
allow(stdin).to receive(:eof?).and_return(true)
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'returns error if value not provided' do
|
34
|
+
expect{subject.run(['mysql_password'])}.to exit_with_error.and output(/Missing/).to_stderr
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'value in stdin' do
|
39
|
+
it 'sends update request' do
|
40
|
+
expect(stdin).to receive(:eof?).and_return(false)
|
41
|
+
expect(stdin).to receive(:read).and_return('secret')
|
42
|
+
expect(client).to receive(:put).with('secrets/test-grid/mysql_password', { name: 'mysql_password', value: 'secret', upsert: false})
|
43
|
+
expect{subject.run(['mysql_password'])}.not_to exit_with_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context 'with tty' do
|
49
|
+
before(:each) do
|
50
|
+
allow(stdin).to receive(:tty?).and_return(true)
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when value not given' do
|
54
|
+
let(:prompt) { double(:prompt) }
|
55
|
+
it 'prompts for value' do
|
56
|
+
expect(subject).to receive(:prompt).and_return(prompt)
|
57
|
+
expect(prompt).to receive(:mask).once.and_return('very-secret')
|
58
|
+
expect(client).to receive(:put).with('secrets/test-grid/mysql_password', { name: 'mysql_password', value: 'very-secret', upsert: false})
|
59
|
+
expect{subject.run(['mysql_password'])}.not_to exit_with_error
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with value parameter' do
|
66
|
+
it 'sends update request' do
|
67
|
+
expect(client).to receive(:put).with('secrets/test-grid/mysql_password', { name: 'mysql_password', value: 'secret', upsert: false})
|
68
|
+
expect{subject.run(['mysql_password', 'secret'])}.not_to exit_with_error
|
69
|
+
end
|
70
|
+
|
71
|
+
context 'when giving --upsert flag' do
|
72
|
+
it 'sets upsert true' do
|
73
|
+
expect(client).to receive(:put).with('secrets/test-grid/mysql_password', { name: 'mysql_password', value: 'secret', upsert: true})
|
74
|
+
subject.run(['-u', 'mysql_password', 'secret'])
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require 'kontena/cli/vault/write_command'
|
3
|
+
|
4
|
+
describe Kontena::Cli::Vault::WriteCommand do
|
5
|
+
|
6
|
+
include RequirementsHelper
|
7
|
+
include ClientHelpers
|
8
|
+
|
9
|
+
let(:subject) { described_class.new(File.basename($0)) }
|
10
|
+
|
11
|
+
describe '#execute' do
|
12
|
+
context 'without value parameter' do
|
13
|
+
|
14
|
+
let(:stdin) { double(:stdin) }
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
@old_stdin = $stdin
|
18
|
+
$stdin = stdin
|
19
|
+
end
|
20
|
+
|
21
|
+
after(:each) { $stdin = @old_stdin }
|
22
|
+
|
23
|
+
context 'no tty' do
|
24
|
+
context 'stdin empty' do
|
25
|
+
it 'returns an error' do
|
26
|
+
expect(stdin).to receive(:tty?).and_return(false)
|
27
|
+
expect(stdin).to receive(:eof?).and_return(true)
|
28
|
+
expect{subject.run(['mysql_password'])}.to exit_with_error.and output(/Missing/).to_stderr
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context 'stdin has a value' do
|
33
|
+
it 'sends create request' do
|
34
|
+
expect(stdin).to receive(:tty?).and_return(false)
|
35
|
+
expect(stdin).to receive(:eof?).and_return(false)
|
36
|
+
expect(stdin).to receive(:read).and_return('secret')
|
37
|
+
expect(client).to receive(:post).with('grids/test-grid/secrets', { name: 'mysql_password', value: 'secret'})
|
38
|
+
expect{subject.run(['mysql_password'])}.not_to exit_with_error
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context 'with tty' do
|
44
|
+
let(:prompt) { double(:prompt) }
|
45
|
+
it 'prompts value from STDIN' do
|
46
|
+
expect(stdin).to receive(:tty?).and_return(true)
|
47
|
+
expect(subject).to receive(:prompt).and_return(prompt)
|
48
|
+
expect(prompt).to receive(:mask).and_return('secret')
|
49
|
+
expect(client).to receive(:post).with('grids/test-grid/secrets', { name: 'mysql_password', value: 'secret'})
|
50
|
+
expect{subject.run(['mysql_password'])}.not_to exit_with_error
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'sends create request' do
|
56
|
+
expect(client).to receive(:post).with('grids/test-grid/secrets', { name: 'mysql_password', value: 'secret'})
|
57
|
+
subject.run(['mysql_password', 'secret'])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -18,6 +18,12 @@ describe Kontena do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
describe '#minor_version' do
|
22
|
+
it "returns a version string" do
|
23
|
+
expect(Kontena.minor_version).to match /^\d+\.\d+$/
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
21
27
|
describe '#run' do
|
22
28
|
let(:whoami) { double(:whoami) }
|
23
29
|
|
@@ -39,6 +45,3 @@ describe Kontena do
|
|
39
45
|
end
|
40
46
|
end
|
41
47
|
end
|
42
|
-
|
43
|
-
|
44
|
-
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kontena-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.0.
|
4
|
+
version: 1.2.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kontena, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -56,16 +56,16 @@ dependencies:
|
|
56
56
|
name: tty-prompt
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.12.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.12.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: clamp
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.7.
|
117
|
+
version: 0.7.1
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.7.
|
124
|
+
version: 0.7.1
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: retriable
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -142,14 +142,14 @@ dependencies:
|
|
142
142
|
requirements:
|
143
143
|
- - '='
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 1.8.
|
145
|
+
version: 1.8.5
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
150
|
- - '='
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 1.8.
|
152
|
+
version: 1.8.5
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: semantic
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
@@ -309,6 +309,7 @@ files:
|
|
309
309
|
- lib/kontena/cli/grids/create_command.rb
|
310
310
|
- lib/kontena/cli/grids/current_command.rb
|
311
311
|
- lib/kontena/cli/grids/env_command.rb
|
312
|
+
- lib/kontena/cli/grids/events_command.rb
|
312
313
|
- lib/kontena/cli/grids/health_command.rb
|
313
314
|
- lib/kontena/cli/grids/list_command.rb
|
314
315
|
- lib/kontena/cli/grids/logs_command.rb
|
@@ -390,6 +391,7 @@ files:
|
|
390
391
|
- lib/kontena/cli/services/envs/add_command.rb
|
391
392
|
- lib/kontena/cli/services/envs/list_command.rb
|
392
393
|
- lib/kontena/cli/services/envs/remove_command.rb
|
394
|
+
- lib/kontena/cli/services/events_command.rb
|
393
395
|
- lib/kontena/cli/services/exec_command.rb
|
394
396
|
- lib/kontena/cli/services/link_command.rb
|
395
397
|
- lib/kontena/cli/services/list_command.rb
|
@@ -413,6 +415,7 @@ files:
|
|
413
415
|
- lib/kontena/cli/stacks/build_command.rb
|
414
416
|
- lib/kontena/cli/stacks/common.rb
|
415
417
|
- lib/kontena/cli/stacks/deploy_command.rb
|
418
|
+
- lib/kontena/cli/stacks/events_command.rb
|
416
419
|
- lib/kontena/cli/stacks/install_command.rb
|
417
420
|
- lib/kontena/cli/stacks/list_command.rb
|
418
421
|
- lib/kontena/cli/stacks/logs_command.rb
|
@@ -461,6 +464,7 @@ files:
|
|
461
464
|
- lib/kontena/cli/volumes/create_command.rb
|
462
465
|
- lib/kontena/cli/volumes/list_command.rb
|
463
466
|
- lib/kontena/cli/volumes/remove_command.rb
|
467
|
+
- lib/kontena/cli/volumes/show_command.rb
|
464
468
|
- lib/kontena/cli/vpn/config_command.rb
|
465
469
|
- lib/kontena/cli/vpn/create_command.rb
|
466
470
|
- lib/kontena/cli/vpn/remove_command.rb
|
@@ -561,6 +565,7 @@ files:
|
|
561
565
|
- spec/kontena/cli/containers/list_command_spec.rb
|
562
566
|
- spec/kontena/cli/containers/logs_command_spec.rb
|
563
567
|
- spec/kontena/cli/etcd/health_command_spec.rb
|
568
|
+
- spec/kontena/cli/grids/events_command_spec.rb
|
564
569
|
- spec/kontena/cli/grids/health_command_spec.rb
|
565
570
|
- spec/kontena/cli/grids/trusted_subnets/add_command_spec.rb
|
566
571
|
- spec/kontena/cli/grids/trusted_subnets/list_command_spec.rb
|
@@ -581,6 +586,7 @@ files:
|
|
581
586
|
- spec/kontena/cli/nodes/health_command_spec.rb
|
582
587
|
- spec/kontena/cli/nodes/list_command_spec.rb
|
583
588
|
- spec/kontena/cli/services/containers_command_spec.rb
|
589
|
+
- spec/kontena/cli/services/events_command_spec.rb
|
584
590
|
- spec/kontena/cli/services/exec_command_spec.rb
|
585
591
|
- spec/kontena/cli/services/link_command_spec.rb
|
586
592
|
- spec/kontena/cli/services/logs_command_spec.rb
|
@@ -592,8 +598,10 @@ files:
|
|
592
598
|
- spec/kontena/cli/services/update_command_spec.rb
|
593
599
|
- spec/kontena/cli/stacks/build_command_spec.rb
|
594
600
|
- spec/kontena/cli/stacks/deploy_command_spec.rb
|
601
|
+
- spec/kontena/cli/stacks/events_command_spec.rb
|
595
602
|
- spec/kontena/cli/stacks/install_command_spec.rb
|
596
603
|
- spec/kontena/cli/stacks/list_command_spec.rb
|
604
|
+
- spec/kontena/cli/stacks/logs_command_spec.rb
|
597
605
|
- spec/kontena/cli/stacks/remove_command_spec.rb
|
598
606
|
- spec/kontena/cli/stacks/service_generator_spec.rb
|
599
607
|
- spec/kontena/cli/stacks/service_generator_v2_spec.rb
|
@@ -607,6 +615,8 @@ files:
|
|
607
615
|
- spec/kontena/cli/stacks/yaml/validator_v3_spec.rb
|
608
616
|
- spec/kontena/cli/vault/export_spec.rb
|
609
617
|
- spec/kontena/cli/vault/import_spec.rb
|
618
|
+
- spec/kontena/cli/vault/update_command_spec.rb
|
619
|
+
- spec/kontena/cli/vault/write_command_spec.rb
|
610
620
|
- spec/kontena/cli/version_command_spec.rb
|
611
621
|
- spec/kontena/cli/vpn/create_command_spec.rb
|
612
622
|
- spec/kontena/client_spec.rb
|
@@ -700,6 +710,7 @@ test_files:
|
|
700
710
|
- spec/kontena/cli/containers/list_command_spec.rb
|
701
711
|
- spec/kontena/cli/containers/logs_command_spec.rb
|
702
712
|
- spec/kontena/cli/etcd/health_command_spec.rb
|
713
|
+
- spec/kontena/cli/grids/events_command_spec.rb
|
703
714
|
- spec/kontena/cli/grids/health_command_spec.rb
|
704
715
|
- spec/kontena/cli/grids/trusted_subnets/add_command_spec.rb
|
705
716
|
- spec/kontena/cli/grids/trusted_subnets/list_command_spec.rb
|
@@ -720,6 +731,7 @@ test_files:
|
|
720
731
|
- spec/kontena/cli/nodes/health_command_spec.rb
|
721
732
|
- spec/kontena/cli/nodes/list_command_spec.rb
|
722
733
|
- spec/kontena/cli/services/containers_command_spec.rb
|
734
|
+
- spec/kontena/cli/services/events_command_spec.rb
|
723
735
|
- spec/kontena/cli/services/exec_command_spec.rb
|
724
736
|
- spec/kontena/cli/services/link_command_spec.rb
|
725
737
|
- spec/kontena/cli/services/logs_command_spec.rb
|
@@ -731,8 +743,10 @@ test_files:
|
|
731
743
|
- spec/kontena/cli/services/update_command_spec.rb
|
732
744
|
- spec/kontena/cli/stacks/build_command_spec.rb
|
733
745
|
- spec/kontena/cli/stacks/deploy_command_spec.rb
|
746
|
+
- spec/kontena/cli/stacks/events_command_spec.rb
|
734
747
|
- spec/kontena/cli/stacks/install_command_spec.rb
|
735
748
|
- spec/kontena/cli/stacks/list_command_spec.rb
|
749
|
+
- spec/kontena/cli/stacks/logs_command_spec.rb
|
736
750
|
- spec/kontena/cli/stacks/remove_command_spec.rb
|
737
751
|
- spec/kontena/cli/stacks/service_generator_spec.rb
|
738
752
|
- spec/kontena/cli/stacks/service_generator_v2_spec.rb
|
@@ -746,6 +760,8 @@ test_files:
|
|
746
760
|
- spec/kontena/cli/stacks/yaml/validator_v3_spec.rb
|
747
761
|
- spec/kontena/cli/vault/export_spec.rb
|
748
762
|
- spec/kontena/cli/vault/import_spec.rb
|
763
|
+
- spec/kontena/cli/vault/update_command_spec.rb
|
764
|
+
- spec/kontena/cli/vault/write_command_spec.rb
|
749
765
|
- spec/kontena/cli/version_command_spec.rb
|
750
766
|
- spec/kontena/cli/vpn/create_command_spec.rb
|
751
767
|
- spec/kontena/client_spec.rb
|