kontena-cli 0.16.0.pre6 → 0.16.0.pre7
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/.dockerignore +5 -0
- data/VERSION +1 -1
- data/bin/kontena +5 -5
- data/examples/kontena-plugin-hello/kontena-plugin-hello.gemspec +1 -1
- data/lib/kontena/cli/apps/logs_command.rb +1 -27
- data/lib/kontena/cli/common.rb +1 -5
- data/lib/kontena/cli/container_command.rb +2 -0
- data/lib/kontena/cli/containers/logs_command.rb +22 -0
- data/lib/kontena/cli/grids/common.rb +0 -1
- data/lib/kontena/cli/grids/create_command.rb +4 -5
- data/lib/kontena/cli/grids/logs_command.rb +9 -31
- data/lib/kontena/cli/grids/show_command.rb +7 -1
- data/lib/kontena/cli/helpers/log_helper.rb +44 -1
- data/lib/kontena/cli/services/logs_command.rb +4 -49
- data/lib/kontena/cli/services/monitor_command.rb +1 -1
- data/lib/kontena/plugin_manager.rb +21 -3
- data/spec/kontena/cli/app/logs_command_spec.rb +5 -5
- data/spec/kontena/cli/containers/logs_command_spec.rb +53 -0
- data/spec/kontena/plugin_manager_spec.rb +42 -0
- data/spec/spec_helper.rb +10 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4d4aed1a465c25c662ace1bc38e6de0a8a6ccdca
|
4
|
+
data.tar.gz: c000e53d82c7aa42fe5d12a187dcdaa39f6d75e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34c99fe148e3d789cf87462b22dd33f1f74f9cb91c5bffd092854d8967add751307d20d39f196a8aa78dcb6aaa785eb2e01f7c9bef55793276dbacc1285c1828
|
7
|
+
data.tar.gz: 911f92be23c389ef095ddb579acd3f778d275eda7073be1422fb2404bf072b8e0d3e7cee7b32060f16a63cc2e1fc2004e0a49bc4853cfdbb978cd9da0479d3d1
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.16.0.
|
1
|
+
0.16.0.pre7
|
data/bin/kontena
CHANGED
@@ -16,17 +16,17 @@ begin
|
|
16
16
|
Kontena::MainCommand.run
|
17
17
|
rescue Excon::Errors::SocketError => exc
|
18
18
|
if exc.message.include?('Unable to verify certificate')
|
19
|
-
$stderr.puts "The server uses a certificate signed by an unknown authority."
|
20
|
-
$stderr.puts "You can trust this server by copying server CA pem file to: #{"~/.kontena/certs/<hostname>.pem"
|
21
|
-
$stderr.puts "Protip: you can bypass the certificate check by setting #{'SSL_IGNORE_ERRORS=true'
|
22
|
-
|
19
|
+
$stderr.puts " [#{Kontena.pastel.red('error')}] The server uses a certificate signed by an unknown authority."
|
20
|
+
$stderr.puts " You can trust this server by copying server CA pem file to: #{Kontena.pastel.yellow("~/.kontena/certs/<hostname>.pem")}"
|
21
|
+
$stderr.puts " Protip: you can bypass the certificate check by setting #{Kontena.pastel.yellow('SSL_IGNORE_ERRORS=true')} env variable, but any data you send to the server could be intercepted by others."
|
22
|
+
abort
|
23
23
|
else
|
24
24
|
abort(exc.message)
|
25
25
|
end
|
26
26
|
rescue Kontena::Errors::StandardError => exc
|
27
27
|
raise exc if ENV['DEBUG']
|
28
28
|
puts " [#{Kontena.pastel.red('error')}] #{exc.message}"
|
29
|
-
|
29
|
+
abort
|
30
30
|
rescue => exc
|
31
31
|
raise exc if ENV['DEBUG']
|
32
32
|
$stderr.puts " [#{Kontena.pastel.red('error')}] #{exc.message}"
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
17
17
|
spec.require_paths = ["lib"]
|
18
18
|
|
19
|
-
spec.add_runtime_dependency 'kontena-cli', '
|
19
|
+
spec.add_runtime_dependency 'kontena-cli', '>= 0.16.0.pre2'
|
20
20
|
spec.add_development_dependency "bundler", "~> 1.11"
|
21
21
|
spec.add_development_dependency "rake", "~> 10.0"
|
22
22
|
end
|
@@ -11,9 +11,6 @@ module Kontena::Cli::Apps
|
|
11
11
|
|
12
12
|
option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
|
13
13
|
option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
|
14
|
-
option ["-l", "--lines"], "LINES", "How many lines to show", default: '100'
|
15
|
-
option "--since", "SINCE", "Show logs since given timestamp"
|
16
|
-
option ["-t", "--tail"], :flag, "Tail (follow) logs", default: false
|
17
14
|
parameter "[SERVICE] ...", "Show only specified service logs"
|
18
15
|
|
19
16
|
def execute
|
@@ -30,34 +27,11 @@ module Kontena::Cli::Apps
|
|
30
27
|
query_services = services.map{|service_name, opts| prefixed_name(service_name)}.join ','
|
31
28
|
query_params = {
|
32
29
|
services: query_services,
|
33
|
-
limit: lines,
|
34
30
|
}
|
35
|
-
query_params[:since] = since if since
|
36
31
|
|
37
|
-
|
38
|
-
tail_logs(services, query_params)
|
39
|
-
else
|
40
|
-
show_logs(services, query_params)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
def tail_logs(services, query_params)
|
45
|
-
stream_logs("grids/#{current_grid}/container_logs", query_params) do |log|
|
32
|
+
show_logs("grids/#{current_grid}/container_logs", query_params) do |log|
|
46
33
|
show_log(log)
|
47
34
|
end
|
48
35
|
end
|
49
|
-
|
50
|
-
def show_logs(services, query_params)
|
51
|
-
result = client(token).get("grids/#{current_grid}/container_logs", query_params)
|
52
|
-
result['logs'].each do |log|
|
53
|
-
show_log(log)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def show_log(log)
|
58
|
-
color = color_for_container(log['name'])
|
59
|
-
prefix = "#{log['created_at']} #{log['name']}:".colorize(color)
|
60
|
-
puts "#{prefix} #{log['data']}"
|
61
|
-
end
|
62
36
|
end
|
63
37
|
end
|
data/lib/kontena/cli/common.rb
CHANGED
@@ -10,10 +10,6 @@ module Kontena
|
|
10
10
|
module Cli
|
11
11
|
module Common
|
12
12
|
|
13
|
-
def pastel
|
14
|
-
::Kontena.pastel
|
15
|
-
end
|
16
|
-
|
17
13
|
def logger
|
18
14
|
return @logger if @logger
|
19
15
|
@logger = Logger.new(STDOUT)
|
@@ -77,7 +73,7 @@ module Kontena
|
|
77
73
|
# Only show spinner when in verbose mode
|
78
74
|
def vspinner(msg, &block)
|
79
75
|
return vfakespinner(msg) unless block_given?
|
80
|
-
|
76
|
+
|
81
77
|
if running_verbose?
|
82
78
|
spinner(msg, &block)
|
83
79
|
else
|
@@ -1,10 +1,12 @@
|
|
1
1
|
require_relative 'containers/exec_command'
|
2
2
|
require_relative 'containers/inspect_command'
|
3
|
+
require_relative 'containers/logs_command'
|
3
4
|
|
4
5
|
class Kontena::Cli::ContainerCommand < Kontena::Command
|
5
6
|
|
6
7
|
subcommand "exec", "Execute command inside a container", Kontena::Cli::Containers::ExecCommand
|
7
8
|
subcommand "inspect", "Inspect the container", Kontena::Cli::Containers::InspectCommand
|
9
|
+
subcommand "logs", "Show container logs", Kontena::Cli::Containers::LogsCommand
|
8
10
|
|
9
11
|
def execute
|
10
12
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '../grid_options'
|
2
|
+
require_relative '../helpers/log_helper'
|
3
|
+
|
4
|
+
module Kontena::Cli::Containers
|
5
|
+
class LogsCommand < Clamp::Command
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
include Kontena::Cli::GridOptions
|
8
|
+
include Kontena::Cli::Helpers::LogHelper
|
9
|
+
|
10
|
+
parameter "CONTAINER_ID", "Container id"
|
11
|
+
|
12
|
+
def execute
|
13
|
+
require_api_url
|
14
|
+
|
15
|
+
service_name = container_id.match(/(.+)-(\d+)/)[1] rescue nil
|
16
|
+
|
17
|
+
show_logs("containers/#{current_grid}/#{service_name}/#{container_id}/logs") do |log|
|
18
|
+
show_log(log)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -7,7 +7,6 @@ module Kontena::Cli::Grids
|
|
7
7
|
host = ENV['KONTENA_URL'] || self.current_master['url']
|
8
8
|
puts "#{grid['name']}:"
|
9
9
|
puts " uri: #{host.sub('http', 'ws')}"
|
10
|
-
puts " token: #{grid['token']}"
|
11
10
|
root_dir = grid['engine_root_dir']
|
12
11
|
nodes = client(require_token).get("grids/#{grid['name']}/nodes")
|
13
12
|
nodes = nodes['nodes'].select{|n| n['connected'] == true }
|
@@ -11,21 +11,20 @@ module Kontena::Cli::Grids
|
|
11
11
|
option "--silent", :flag, "Reduce output verbosity"
|
12
12
|
option "--token", "[TOKEN]", "Set grid token"
|
13
13
|
|
14
|
-
|
15
|
-
require_api_url
|
14
|
+
requires_current_master_token
|
16
15
|
|
17
|
-
|
16
|
+
def execute
|
18
17
|
payload = {
|
19
18
|
name: name
|
20
19
|
}
|
21
|
-
payload[:token] = token if token
|
20
|
+
payload[:token] = self.token if self.token
|
22
21
|
payload[:initial_size] = initial_size if initial_size
|
23
22
|
grid = nil
|
24
23
|
if initial_size == 1
|
25
24
|
warning "Option --initial-size=1 is only recommended for test/dev usage" unless running_silent?
|
26
25
|
end
|
27
26
|
spinner "Creating #{pastel.cyan(name)} grid " do
|
28
|
-
grid = client
|
27
|
+
grid = client.post('grids', payload)
|
29
28
|
end
|
30
29
|
if grid
|
31
30
|
spinner "Switching scope to #{pastel.cyan(name)} grid " do
|
@@ -5,18 +5,10 @@ module Kontena::Cli::Grids
|
|
5
5
|
include Kontena::Cli::Common
|
6
6
|
include Kontena::Cli::Helpers::LogHelper
|
7
7
|
|
8
|
-
option ["-t", "--tail"], :flag, "Tail (follow) logs", default: false
|
9
|
-
option "--lines", "LINES", "Number of lines to show from the end of the logs"
|
10
|
-
option "--since", "SINCE", "Show logs since given timestamp"
|
11
8
|
option "--node", "NODE", "Filter by node name", multivalued: true
|
12
9
|
option "--service", "SERVICE", "Filter by service name", multivalued: true
|
13
10
|
option ["-c", "--container"], "CONTAINER", "Filter by container", multivalued: true
|
14
11
|
|
15
|
-
# @return [String]
|
16
|
-
def token
|
17
|
-
@token ||= require_token
|
18
|
-
end
|
19
|
-
|
20
12
|
def execute
|
21
13
|
require_api_url
|
22
14
|
|
@@ -24,35 +16,21 @@ module Kontena::Cli::Grids
|
|
24
16
|
query_params[:nodes] = node_list.join(",") unless node_list.empty?
|
25
17
|
query_params[:services] = service_list.join(",") unless service_list.empty?
|
26
18
|
query_params[:containers] = container_list.join(",") unless container_list.empty?
|
27
|
-
query_params[:limit] = lines if lines
|
28
|
-
query_params[:since] = since if since
|
29
19
|
|
30
|
-
|
31
|
-
|
32
|
-
else
|
33
|
-
list_logs(query_params)
|
20
|
+
show_logs("grids/#{current_grid}/container_logs", query_params) do |log|
|
21
|
+
show_log(log)
|
34
22
|
end
|
35
23
|
end
|
36
24
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
prefix
|
43
|
-
prefix << "#{log['name']}:"
|
44
|
-
prefix = prefix.colorize(color)
|
45
|
-
puts "#{prefix} #{log['data']}"
|
25
|
+
def show_log(log)
|
26
|
+
color = color_for_container(log['name'])
|
27
|
+
if tail?
|
28
|
+
prefix = "#{log['name']} |"
|
29
|
+
else
|
30
|
+
prefix = "#{log['created_at']} #{log['name']}:"
|
46
31
|
end
|
47
|
-
end
|
48
32
|
|
49
|
-
|
50
|
-
# @param [Hash] query_params
|
51
|
-
def tail_logs(query_params)
|
52
|
-
stream_logs("grids/#{current_grid}/container_logs", query_params) do |log|
|
53
|
-
color = color_for_container(log['name'])
|
54
|
-
puts "#{log['name'].colorize(color)} | #{log['data']}"
|
55
|
-
end
|
33
|
+
puts "#{prefix.colorize(color)} #{log['data']}"
|
56
34
|
end
|
57
35
|
end
|
58
36
|
end
|
@@ -7,13 +7,19 @@ module Kontena::Cli::Grids
|
|
7
7
|
|
8
8
|
parameter "NAME", "Grid name"
|
9
9
|
|
10
|
+
option '--token', :flag, 'Just output grid token'
|
11
|
+
|
10
12
|
def execute
|
11
13
|
require_api_url
|
12
14
|
|
13
15
|
grid = find_grid_by_name(name)
|
14
16
|
exit_with_error("Grid not found") unless grid
|
15
17
|
|
16
|
-
|
18
|
+
if self.token?
|
19
|
+
puts grid['token']
|
20
|
+
else
|
21
|
+
print_grid(grid)
|
22
|
+
end
|
17
23
|
end
|
18
24
|
end
|
19
25
|
end
|
@@ -1,9 +1,46 @@
|
|
1
1
|
module Kontena::Cli::Helpers
|
2
2
|
module LogHelper
|
3
3
|
|
4
|
+
def self.included(base)
|
5
|
+
if base.respond_to?(:option)
|
6
|
+
base.option ["-t", "--tail"], :flag, "Tail (follow) logs", default: false
|
7
|
+
base.option "--lines", "LINES", "Number of lines to show from the end of the logs", default: 100 do |s|
|
8
|
+
Integer(s)
|
9
|
+
end
|
10
|
+
base.option "--since", "SINCE", "Show logs since given timestamp"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [String]
|
15
|
+
def token
|
16
|
+
@token ||= require_token
|
17
|
+
end
|
18
|
+
|
19
|
+
def show_logs(url, query_params = { }, &block)
|
20
|
+
if tail?
|
21
|
+
stream_logs(url, query_params, &block)
|
22
|
+
else
|
23
|
+
get_logs(url, query_params, &block)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_logs(url, query_params)
|
28
|
+
query_params[:limit] = lines if lines
|
29
|
+
query_params[:since] = since if since
|
30
|
+
|
31
|
+
result = client(token).get(url, query_params)
|
32
|
+
result['logs'].each do |log|
|
33
|
+
yield log
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
4
37
|
# @param [String] url
|
5
38
|
# @param [Hash] query_params
|
6
39
|
def stream_logs(url, query_params)
|
40
|
+
query_params[:limit] = lines if lines
|
41
|
+
query_params[:since] = since if since
|
42
|
+
query_params[:follow] = 1
|
43
|
+
|
7
44
|
last_seen = nil
|
8
45
|
streamer = lambda do |chunk, remaining_bytes, total_bytes|
|
9
46
|
log = buffered_log_json(chunk)
|
@@ -14,7 +51,6 @@ module Kontena::Cli::Helpers
|
|
14
51
|
end
|
15
52
|
|
16
53
|
begin
|
17
|
-
query_params[:follow] = 1
|
18
54
|
query_params[:from] = last_seen if last_seen
|
19
55
|
result = client(token).get_stream(url, streamer, query_params)
|
20
56
|
rescue => exc
|
@@ -44,6 +80,13 @@ module Kontena::Cli::Helpers
|
|
44
80
|
end
|
45
81
|
end
|
46
82
|
|
83
|
+
def show_log(log)
|
84
|
+
color = color_for_container(log['name'])
|
85
|
+
prefix = "#{log['created_at']} #{log['name']}:"
|
86
|
+
|
87
|
+
puts "#{prefix.colorize(color)} #{log['data']}"
|
88
|
+
end
|
89
|
+
|
47
90
|
# @param [String] container_id
|
48
91
|
# @return [Symbol]
|
49
92
|
def color_for_container(container_id)
|
@@ -9,70 +9,25 @@ module Kontena::Cli::Services
|
|
9
9
|
include ServicesHelper
|
10
10
|
|
11
11
|
parameter "NAME", "Service name"
|
12
|
-
option ["-t", "--tail"], :flag, "Tail (follow) logs", default: false
|
13
|
-
option ["-l", "--lines"], "LINES", "How many lines to show", default: '100'
|
14
|
-
option "--since", "SINCE", "Show logs since given timestamp"
|
15
12
|
option ["-i", "--instance"], "INSTANCE", "Show only given instance specific logs"
|
16
|
-
|
13
|
+
|
17
14
|
def execute
|
18
15
|
require_api_url
|
19
|
-
token = require_token
|
20
|
-
|
21
16
|
|
22
17
|
query_params = {}
|
23
|
-
query_params[:limit] = lines if lines
|
24
|
-
query_params[:since] = since if since
|
25
18
|
query_params[:container] = "#{name}-#{instance}" if instance
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
query_params[:follow] = 1
|
30
|
-
stream_logs(token, query_params)
|
31
|
-
else
|
32
|
-
list_logs(token, query_params)
|
20
|
+
show_logs("services/#{current_grid}/#{name}/container_logs", query_params) do |log|
|
21
|
+
show_log(log)
|
33
22
|
end
|
34
|
-
|
35
23
|
end
|
36
24
|
|
37
|
-
def
|
25
|
+
def show_log(log)
|
38
26
|
color = color_for_container(log['name'])
|
39
27
|
instance_number = log['name'].match(/^.+-(\d+)$/)[1]
|
40
28
|
name = instance_number.nil? ? log['name'] : instance_number
|
41
29
|
prefix = "#{log['created_at']} [#{name}]:".colorize(color)
|
42
30
|
puts "#{prefix} #{log['data']}"
|
43
31
|
end
|
44
|
-
|
45
|
-
def list_logs(token, query_params)
|
46
|
-
result = client(token).get("services/#{current_grid}/#{name}/container_logs", query_params)
|
47
|
-
result['logs'].each do |log|
|
48
|
-
render_log_line(log)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# @param [String] token
|
53
|
-
# @param [Hash] query_params
|
54
|
-
def stream_logs(token, query_params)
|
55
|
-
last_seen = nil
|
56
|
-
streamer = lambda do |chunk, remaining_bytes, total_bytes|
|
57
|
-
log = buffered_log_json(chunk)
|
58
|
-
if log
|
59
|
-
last_seen = log['id']
|
60
|
-
render_log_line(log)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
begin
|
65
|
-
query_params[:follow] = true
|
66
|
-
if last_seen
|
67
|
-
query_params[:from] = last_seen
|
68
|
-
end
|
69
|
-
result = client(token).get_stream(
|
70
|
-
"services/#{current_grid}/#{name}/container_logs", streamer, query_params
|
71
|
-
)
|
72
|
-
rescue => exc
|
73
|
-
retry if exc.cause.is_a?(EOFError) # Excon wraps the EOFerror into SocketError
|
74
|
-
raise
|
75
|
-
end
|
76
|
-
end
|
77
32
|
end
|
78
33
|
end
|
@@ -4,6 +4,9 @@ module Kontena
|
|
4
4
|
class PluginManager
|
5
5
|
include Singleton
|
6
6
|
|
7
|
+
CLI_GEM = 'kontena-cli'.freeze
|
8
|
+
MIN_CLI_VERSION = '0.15.99'.freeze
|
9
|
+
|
7
10
|
attr_reader :plugins
|
8
11
|
|
9
12
|
def initialize
|
@@ -17,10 +20,16 @@ module Kontena
|
|
17
20
|
plugin = File.join(spec.gem_dir, require_path, 'kontena_cli_plugin.rb')
|
18
21
|
if File.exist?(plugin) && !@plugins.find{ |p| p.name == spec.name }
|
19
22
|
begin
|
20
|
-
|
21
|
-
|
23
|
+
if spec_has_valid_dependency?(spec)
|
24
|
+
load(plugin)
|
25
|
+
@plugins << spec
|
26
|
+
else
|
27
|
+
plugin_name = spec.name.sub('kontena-plugin-', '')
|
28
|
+
STDERR.puts " [#{Kontena.pastel.red('error')}] Plugin #{Kontena.pastel.cyan(plugin_name)} (#{spec.version}) is not compatible with the current cli version."
|
29
|
+
STDERR.puts " To update plugin, run 'kontena plugin install #{plugin_name}'"
|
30
|
+
end
|
22
31
|
rescue LoadError => exc
|
23
|
-
STDERR.puts "
|
32
|
+
STDERR.puts " [#{Kontena.pastel.red('error')}] Failed to load plugin: #{spec.name}"
|
24
33
|
if ENV['DEBUG']
|
25
34
|
STDERR.puts exc.message
|
26
35
|
STDERR.puts exc.backtrace.join("\n")
|
@@ -34,5 +43,14 @@ module Kontena
|
|
34
43
|
rescue => exc
|
35
44
|
STDERR.puts exc.message
|
36
45
|
end
|
46
|
+
|
47
|
+
# @param [Gem::Specification] spec
|
48
|
+
# @return [Boolean]
|
49
|
+
def spec_has_valid_dependency?(spec)
|
50
|
+
kontena_cli = spec.runtime_dependencies.find{ |d| d.name == CLI_GEM }
|
51
|
+
!kontena_cli.match?(CLI_GEM, MIN_CLI_VERSION)
|
52
|
+
rescue
|
53
|
+
false
|
54
|
+
end
|
37
55
|
end
|
38
56
|
end
|
@@ -18,8 +18,8 @@ describe Kontena::Cli::Apps::LogsCommand do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
let(:current_grid) do
|
21
|
-
|
22
|
-
end
|
21
|
+
'test-grid'
|
22
|
+
end
|
23
23
|
|
24
24
|
let(:service_prefix) do
|
25
25
|
'test'
|
@@ -94,7 +94,7 @@ end
|
|
94
94
|
it "shows all service logs" do
|
95
95
|
expect(client).to receive(:get).with('grids/test-grid/container_logs', {
|
96
96
|
services: 'test-wordpress,test-mysql',
|
97
|
-
limit:
|
97
|
+
limit: 100,
|
98
98
|
}) { { 'logs' => logs } }
|
99
99
|
|
100
100
|
subject.run([])
|
@@ -107,7 +107,7 @@ end
|
|
107
107
|
|
108
108
|
expect(client).to receive(:get).with('grids/test-grid/container_logs', {
|
109
109
|
services: 'test-mysql',
|
110
|
-
limit:
|
110
|
+
limit: 100,
|
111
111
|
}) { { 'logs' => mysql_logs } }
|
112
112
|
|
113
113
|
subject.run(["mysql"])
|
@@ -121,7 +121,7 @@ end
|
|
121
121
|
|
122
122
|
expect(client).to receive(:get).with('grids/test-grid/container_logs', {
|
123
123
|
services: 'test-wordpress,test-mysql',
|
124
|
-
limit:
|
124
|
+
limit: 100,
|
125
125
|
since: since,
|
126
126
|
}) { { 'logs' => since_logs } }
|
127
127
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require 'kontena/cli/grid_options'
|
3
|
+
require "kontena/cli/containers/logs_command"
|
4
|
+
|
5
|
+
describe Kontena::Cli::Containers::LogsCommand do
|
6
|
+
include ClientHelpers
|
7
|
+
|
8
|
+
context "for a single container with logs" do
|
9
|
+
let(:logs) do
|
10
|
+
[
|
11
|
+
{
|
12
|
+
'id' => '57cff2e8cfee65c8b6efc8bd',
|
13
|
+
'name' => 'test-mysql-1',
|
14
|
+
'created_at' => '2016-09-07T15:19:04.362690',
|
15
|
+
'data' => "mysql log message 1",
|
16
|
+
},
|
17
|
+
{
|
18
|
+
'id' => '57cff2e8cfee65c8b6efc8be',
|
19
|
+
'name' => 'test-mysql-1',
|
20
|
+
'created_at' => '2016-09-07T15:19:04.500000',
|
21
|
+
'data' => "mysql log message 2",
|
22
|
+
},
|
23
|
+
{
|
24
|
+
'id' => '57cff2e8cfee65c8b6efc8c1',
|
25
|
+
'name' => 'test-mysql-1',
|
26
|
+
'created_at' => '2016-09-07T15:19:06.100000',
|
27
|
+
'data' => "mysql log message 3",
|
28
|
+
},
|
29
|
+
]
|
30
|
+
end
|
31
|
+
|
32
|
+
before(:each) do
|
33
|
+
Kontena.pastel.resolver.color.disable!
|
34
|
+
end
|
35
|
+
|
36
|
+
it "shows all logs" do
|
37
|
+
allow(client).to receive(:get).with('containers/test-grid/test-mysql/test-mysql-1/logs', {
|
38
|
+
limit: 100,
|
39
|
+
}) { { 'logs' => logs } }
|
40
|
+
|
41
|
+
expect { subject.run(['test-mysql-1']) }.to output(<<LOGS
|
42
|
+
2016-09-07T15:19:04.362690 test-mysql-1: mysql log message 1
|
43
|
+
2016-09-07T15:19:04.500000 test-mysql-1: mysql log message 2
|
44
|
+
2016-09-07T15:19:06.100000 test-mysql-1: mysql log message 3
|
45
|
+
LOGS
|
46
|
+
).to_stdout
|
47
|
+
end
|
48
|
+
|
49
|
+
it "errors for an invalid --lines" do
|
50
|
+
expect { subject.run(["--lines=invalid", "test-mysql-1"]) }.to raise_error(Clamp::UsageError, "option '--lines': invalid value for Integer(): \"invalid\"")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -19,4 +19,46 @@ describe Kontena::PluginManager do
|
|
19
19
|
}.to raise_error(Clamp::HelpWanted)
|
20
20
|
end
|
21
21
|
end
|
22
|
+
|
23
|
+
describe 'spec_has_valid_dependency?' do
|
24
|
+
before(:each) do
|
25
|
+
stub_const('Kontena::PluginManager::MIN_CLI_VERSION', '0.15.99999')
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'returns true if spec dependency > than MIN_CLI_VERSION' do
|
29
|
+
spec = Gem::Specification.new do |s|
|
30
|
+
s.name = 'kontena-plugin-foo'
|
31
|
+
s.version = '0.1.0'
|
32
|
+
s.add_runtime_dependency 'kontena-cli', '>= 0.16.0'
|
33
|
+
end
|
34
|
+
expect(subject.spec_has_valid_dependency?(spec)).to be_truthy
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'returns true if spec dependency > than MIN_CLI_VERSION and is prerelease' do
|
38
|
+
spec = Gem::Specification.new do |s|
|
39
|
+
s.name = 'kontena-plugin-foo'
|
40
|
+
s.version = '0.1.0'
|
41
|
+
s.add_runtime_dependency 'kontena-cli', '>= 0.16.0.pre2'
|
42
|
+
end
|
43
|
+
expect(subject.spec_has_valid_dependency?(spec)).to be_truthy
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'returns false if spec dependency < than MIN_CLI_VERSION' do
|
47
|
+
spec = Gem::Specification.new do |s|
|
48
|
+
s.name = 'kontena-plugin-foo'
|
49
|
+
s.version = '0.1.0'
|
50
|
+
s.add_runtime_dependency 'kontena-cli', '>= 0.15.0'
|
51
|
+
end
|
52
|
+
expect(subject.spec_has_valid_dependency?(spec)).to be_falsey
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'returns false if spec dependency < than MIN_CLI_VERSION and is prerelease' do
|
56
|
+
spec = Gem::Specification.new do |s|
|
57
|
+
s.name = 'kontena-plugin-foo'
|
58
|
+
s.version = '0.1.0'
|
59
|
+
s.add_runtime_dependency 'kontena-cli', '>= 0.15.0.beta1'
|
60
|
+
end
|
61
|
+
expect(subject.spec_has_valid_dependency?(spec)).to be_falsey
|
62
|
+
end
|
63
|
+
end
|
22
64
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,6 +11,7 @@ begin
|
|
11
11
|
rescue LoadError
|
12
12
|
end
|
13
13
|
|
14
|
+
require 'stringio'
|
14
15
|
require 'clamp'
|
15
16
|
require 'ruby_dig'
|
16
17
|
require 'kontena_cli'
|
@@ -30,7 +31,7 @@ RSpec.configure do |config|
|
|
30
31
|
allow(ENV).to receive(:[]).with('DEBUG').and_call_original
|
31
32
|
Kontena::Cli::Config.reset_instance
|
32
33
|
end
|
33
|
-
|
34
|
+
|
34
35
|
config.after(:each) do
|
35
36
|
RSpec::Mocks.space.proxy_for(File).reset
|
36
37
|
RSpec::Mocks.space.proxy_for(Kontena::Cli::Config).reset
|
@@ -44,6 +45,14 @@ RSpec.configure do |config|
|
|
44
45
|
puts "Got SystemExit: #{$!.message} - Exit code: #{$!.status}"
|
45
46
|
end
|
46
47
|
end
|
48
|
+
|
49
|
+
config.before(:each) do
|
50
|
+
$stdout = StringIO.new
|
51
|
+
end
|
52
|
+
|
53
|
+
config.after(:each) do
|
54
|
+
$stdout = STDOUT
|
55
|
+
end
|
47
56
|
end
|
48
57
|
|
49
58
|
require_relative 'support/client_helpers'
|
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: 0.16.0.
|
4
|
+
version: 0.16.0.pre7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kontena, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -186,6 +186,7 @@ executables:
|
|
186
186
|
extensions: []
|
187
187
|
extra_rdoc_files: []
|
188
188
|
files:
|
189
|
+
- ".dockerignore"
|
189
190
|
- ".gitignore"
|
190
191
|
- Dockerfile
|
191
192
|
- Gemfile
|
@@ -264,6 +265,7 @@ files:
|
|
264
265
|
- lib/kontena/cli/containers/containers_helper.rb
|
265
266
|
- lib/kontena/cli/containers/exec_command.rb
|
266
267
|
- lib/kontena/cli/containers/inspect_command.rb
|
268
|
+
- lib/kontena/cli/containers/logs_command.rb
|
267
269
|
- lib/kontena/cli/etcd/common.rb
|
268
270
|
- lib/kontena/cli/etcd/get_command.rb
|
269
271
|
- lib/kontena/cli/etcd/list_command.rb
|
@@ -450,6 +452,7 @@ files:
|
|
450
452
|
- spec/kontena/cli/cloud/logout_command_spec.rb
|
451
453
|
- spec/kontena/cli/common_spec.rb
|
452
454
|
- spec/kontena/cli/containers/containers_helper_spec.rb
|
455
|
+
- spec/kontena/cli/containers/logs_command_spec.rb
|
453
456
|
- spec/kontena/cli/grids/trusted_subnets/add_command_spec.rb
|
454
457
|
- spec/kontena/cli/grids/trusted_subnets/list_command_spec.rb
|
455
458
|
- spec/kontena/cli/grids/trusted_subnets/remove_command_spec.rb
|
@@ -541,6 +544,7 @@ test_files:
|
|
541
544
|
- spec/kontena/cli/cloud/logout_command_spec.rb
|
542
545
|
- spec/kontena/cli/common_spec.rb
|
543
546
|
- spec/kontena/cli/containers/containers_helper_spec.rb
|
547
|
+
- spec/kontena/cli/containers/logs_command_spec.rb
|
544
548
|
- spec/kontena/cli/grids/trusted_subnets/add_command_spec.rb
|
545
549
|
- spec/kontena/cli/grids/trusted_subnets/list_command_spec.rb
|
546
550
|
- spec/kontena/cli/grids/trusted_subnets/remove_command_spec.rb
|