kontena-cli 1.4.0.pre6 → 1.4.0.pre7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/bin/kontena +1 -1
- data/kontena-cli.gemspec +3 -3
- data/lib/kontena/cli/certificate/authorize_command.rb +67 -6
- data/lib/kontena/cli/certificate/get_command.rb +7 -0
- data/lib/kontena/cli/certificate/list_command.rb +75 -0
- data/lib/kontena/cli/certificate/register_command.rb +13 -2
- data/lib/kontena/cli/certificate/request_command.rb +20 -0
- data/lib/kontena/cli/certificate/show_command.rb +19 -0
- data/lib/kontena/cli/certificate_command.rb +4 -1
- data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
- data/lib/kontena/cli/common.rb +21 -33
- data/lib/kontena/cli/etcd/health_command.rb +21 -27
- data/lib/kontena/cli/helpers/exec_helper.rb +15 -6
- data/lib/kontena/cli/helpers/health_helper.rb +12 -0
- data/lib/kontena/cli/helpers/log_helper.rb +2 -2
- data/lib/kontena/cli/helpers/time_helper.rb +29 -0
- data/lib/kontena/cli/master/init_cloud_command.rb +19 -0
- data/lib/kontena/cli/master/list_command.rb +1 -1
- data/lib/kontena/cli/master/ssh_command.rb +3 -1
- data/lib/kontena/cli/master/use_command.rb +1 -2
- data/lib/kontena/cli/node_command.rb +1 -0
- data/lib/kontena/cli/nodes/health_command.rb +28 -13
- data/lib/kontena/cli/nodes/list_command.rb +19 -3
- data/lib/kontena/cli/nodes/show_command.rb +4 -2
- data/lib/kontena/cli/nodes/ssh_command.rb +5 -2
- data/lib/kontena/cli/nodes/update_command.rb +2 -0
- data/lib/kontena/cli/plugins/install_command.rb +11 -8
- data/lib/kontena/cli/plugins/list_command.rb +5 -3
- data/lib/kontena/cli/plugins/search_command.rb +4 -2
- data/lib/kontena/cli/plugins/show_command.rb +17 -0
- data/lib/kontena/cli/plugins/uninstall_command.rb +9 -13
- data/lib/kontena/cli/registry/create_command.rb +1 -1
- data/lib/kontena/cli/services/create_command.rb +6 -0
- data/lib/kontena/cli/services/services_helper.rb +33 -6
- data/lib/kontena/cli/services/update_command.rb +6 -0
- data/lib/kontena/cli/stacks/build_command.rb +3 -3
- data/lib/kontena/cli/stacks/common.rb +105 -90
- data/lib/kontena/cli/stacks/deploy_command.rb +7 -3
- data/lib/kontena/cli/stacks/install_command.rb +39 -6
- data/lib/kontena/cli/stacks/list_command.rb +36 -4
- data/lib/kontena/cli/stacks/logs_command.rb +9 -2
- data/lib/kontena/cli/stacks/registry/pull_command.rb +2 -2
- data/lib/kontena/cli/stacks/registry/push_command.rb +20 -9
- data/lib/kontena/cli/stacks/registry/remove_command.rb +4 -4
- data/lib/kontena/cli/stacks/registry/show_command.rb +4 -4
- data/lib/kontena/cli/stacks/remove_command.rb +27 -1
- data/lib/kontena/cli/stacks/service_generator.rb +12 -2
- data/lib/kontena/cli/stacks/show_command.rb +35 -5
- data/lib/kontena/cli/stacks/stack_name.rb +71 -0
- data/lib/kontena/cli/stacks/upgrade_command.rb +127 -14
- data/lib/kontena/cli/stacks/validate_command.rb +38 -10
- data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -2
- data/lib/kontena/cli/stacks/yaml/reader.rb +211 -185
- data/lib/kontena/cli/stacks/yaml/service_extender.rb +6 -12
- data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +97 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
- data/lib/kontena/cli/stacks/yaml/validations.rb +16 -0
- data/lib/kontena/cli/stacks/yaml/validator_v3.rb +25 -8
- data/lib/kontena/client.rb +2 -2
- data/lib/kontena/command.rb +11 -0
- data/lib/kontena/main_command.rb +3 -1
- data/lib/kontena/plugin_manager.rb +11 -198
- data/lib/kontena/plugin_manager/cleaner.rb +33 -0
- data/lib/kontena/plugin_manager/common.rb +86 -0
- data/lib/kontena/plugin_manager/installer.rb +54 -0
- data/lib/kontena/plugin_manager/loader.rb +93 -0
- data/lib/kontena/plugin_manager/rubygems_client.rb +42 -23
- data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
- data/lib/kontena/util.rb +24 -0
- data/lib/kontena_cli.rb +1 -0
- data/omnibus/config/projects/kontena.rb +7 -1
- data/omnibus/config/software/{kontena.rb → kontena-cli.rb} +2 -0
- data/spec/fixtures/api/node.json +2 -1
- data/spec/fixtures/stack-internal-extend.yml +6 -1
- data/spec/fixtures/stack-with-dependencies-dep-1-1.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-1.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep-2.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-3.yml +5 -0
- data/spec/fixtures/stack-with-dependencies-dep_2-removed.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep_3-added.yml +25 -0
- data/spec/fixtures/stack-with-dependencies.yml +22 -0
- data/spec/fixtures/stack-with-variables.yml +3 -0
- data/spec/kontena/cli/etcd/health_command_spec.rb +45 -33
- data/spec/kontena/cli/helpers/exec_helper_spec.rb +2 -1
- data/spec/kontena/cli/master/init_cloud_command_spec.rb +14 -0
- data/spec/kontena/cli/nodes/health_command_spec.rb +74 -10
- data/spec/kontena/cli/nodes/list_command_spec.rb +381 -232
- data/spec/kontena/cli/nodes/show_command_spec.rb +31 -0
- data/spec/kontena/cli/nodes/ssh_command_spec.rb +18 -3
- data/spec/kontena/cli/plugins/install_command_spec.rb +1 -1
- data/spec/kontena/cli/stacks/build_command_spec.rb +6 -12
- data/spec/kontena/cli/stacks/common_spec.rb +42 -69
- data/spec/kontena/cli/stacks/install_command_spec.rb +57 -31
- data/spec/kontena/cli/stacks/list_command_spec.rb +44 -0
- data/spec/kontena/cli/stacks/logs_command_spec.rb +12 -1
- data/spec/kontena/cli/stacks/remove_command_spec.rb +39 -0
- data/spec/kontena/cli/stacks/show_command_spec.rb +16 -0
- data/spec/kontena/cli/stacks/stack_name_spec.rb +21 -0
- data/spec/kontena/cli/stacks/upgrade_command_spec.rb +73 -56
- data/spec/kontena/cli/stacks/validate_command_spec.rb +81 -0
- data/spec/kontena/cli/stacks/yaml/custom_validators/affinities_validator_spec.rb +22 -0
- data/spec/kontena/cli/stacks/yaml/reader_spec.rb +173 -169
- data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +12 -3
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/file_loader_spec.rb +47 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/registry_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/uri_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader_spec.rb +104 -0
- data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +19 -0
- data/spec/kontena/plugin_manager/cleaner_spec.rb +20 -0
- data/spec/kontena/plugin_manager/common_spec.rb +39 -0
- data/spec/kontena/plugin_manager/installer_spec.rb +50 -0
- data/spec/kontena/plugin_manager/loader_spec.rb +5 -0
- data/spec/kontena/plugin_manager/rubygems_client_spec.rb +11 -25
- data/spec/kontena/plugin_manager/uninstaller_spec.rb +19 -0
- data/spec/kontena/plugin_manager_spec.rb +7 -7
- metadata +64 -97
- data/lib/kontena/cli/app_command.rb +0 -22
- data/lib/kontena/cli/apps/build_command.rb +0 -28
- data/lib/kontena/cli/apps/common.rb +0 -172
- data/lib/kontena/cli/apps/config_command.rb +0 -25
- data/lib/kontena/cli/apps/deploy_command.rb +0 -137
- data/lib/kontena/cli/apps/docker_compose_generator.rb +0 -61
- data/lib/kontena/cli/apps/docker_helper.rb +0 -80
- data/lib/kontena/cli/apps/dockerfile_generator.rb +0 -16
- data/lib/kontena/cli/apps/init_command.rb +0 -89
- data/lib/kontena/cli/apps/kontena_yml_generator.rb +0 -105
- data/lib/kontena/cli/apps/list_command.rb +0 -59
- data/lib/kontena/cli/apps/logs_command.rb +0 -37
- data/lib/kontena/cli/apps/monitor_command.rb +0 -93
- data/lib/kontena/cli/apps/remove_command.rb +0 -74
- data/lib/kontena/cli/apps/restart_command.rb +0 -39
- data/lib/kontena/cli/apps/scale_command.rb +0 -33
- data/lib/kontena/cli/apps/service_generator.rb +0 -114
- data/lib/kontena/cli/apps/service_generator_v2.rb +0 -27
- data/lib/kontena/cli/apps/show_command.rb +0 -23
- data/lib/kontena/cli/apps/start_command.rb +0 -40
- data/lib/kontena/cli/apps/stop_command.rb +0 -40
- data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +0 -19
- data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +0 -20
- data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +0 -54
- data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/reader.rb +0 -213
- data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -77
- data/lib/kontena/cli/apps/yaml/validations.rb +0 -71
- data/lib/kontena/cli/apps/yaml/validator.rb +0 -38
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +0 -53
- data/spec/fixtures/app.json +0 -42
- data/spec/fixtures/health.yml +0 -26
- data/spec/fixtures/kontena-build.yml +0 -16
- data/spec/fixtures/kontena-internal-extend.yml +0 -8
- data/spec/fixtures/kontena-invalid.yml +0 -4
- data/spec/fixtures/kontena-with-env-file.yml +0 -18
- data/spec/fixtures/kontena-with-variables.yml +0 -19
- data/spec/fixtures/kontena.yml +0 -17
- data/spec/fixtures/kontena_build_v2.yml +0 -26
- data/spec/fixtures/kontena_numeric_version.yml +0 -9
- data/spec/fixtures/kontena_v2.yml +0 -35
- data/spec/fixtures/mysql.yml +0 -3
- data/spec/fixtures/wordpress-scaled.yml +0 -3
- data/spec/fixtures/wordpress.yml +0 -2
- data/spec/kontena/cli/app/build_command_spec.rb +0 -55
- data/spec/kontena/cli/app/common_spec.rb +0 -110
- data/spec/kontena/cli/app/config_command_spec.rb +0 -78
- data/spec/kontena/cli/app/deploy_command_spec.rb +0 -217
- data/spec/kontena/cli/app/docker_helper_spec.rb +0 -155
- data/spec/kontena/cli/app/init_command_spec.rb +0 -109
- data/spec/kontena/cli/app/logs_command_spec.rb +0 -131
- data/spec/kontena/cli/app/scale_spec.rb +0 -51
- data/spec/kontena/cli/app/service_generator_spec.rb +0 -384
- data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -73
- data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -457
- data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -127
- data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -380
- data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +0 -301
@@ -15,12 +15,12 @@ module Kontena::Cli::Helpers
|
|
15
15
|
Kontena::Websocket::Logging.initialize_logger(STDERR, websocket_log_level)
|
16
16
|
|
17
17
|
WEBSOCKET_CLIENT_OPTIONS = {
|
18
|
-
connect_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f :
|
19
|
-
open_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f :
|
18
|
+
connect_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f : 10.0,
|
19
|
+
open_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f : 10.0,
|
20
20
|
ping_interval: ENV["EXCON_READ_TIMEOUT"] ? ENV["EXCON_READ_TIMEOUT"].to_f : 30.0,
|
21
|
-
ping_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f :
|
22
|
-
close_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f :
|
23
|
-
write_timeout: ENV["EXCON_WRITE_TIMEOUT"] ? ENV["EXCON_WRITE_TIMEOUT"].to_f :
|
21
|
+
ping_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f : 10.0,
|
22
|
+
close_timeout: ENV["EXCON_CONNECT_TIMEOUT"] ? ENV["EXCON_CONNECT_TIMEOUT"].to_f : 10.0,
|
23
|
+
write_timeout: ENV["EXCON_WRITE_TIMEOUT"] ? ENV["EXCON_WRITE_TIMEOUT"].to_f : 10.0,
|
24
24
|
}
|
25
25
|
|
26
26
|
# @param ws [Kontena::Websocket::Client]
|
@@ -59,6 +59,7 @@ module Kontena::Cli::Helpers
|
|
59
59
|
end
|
60
60
|
|
61
61
|
# @param ws [Kontena::Websocket::Client]
|
62
|
+
# @raise [RuntimeError] exec error
|
62
63
|
# @return [Integer] exit code
|
63
64
|
def websocket_exec_read(ws)
|
64
65
|
ws.read do |msg|
|
@@ -66,7 +67,9 @@ module Kontena::Cli::Helpers
|
|
66
67
|
|
67
68
|
logger.debug "websocket exec read: #{msg.inspect}"
|
68
69
|
|
69
|
-
if msg.has_key?('
|
70
|
+
if msg.has_key?('error')
|
71
|
+
raise msg['error']
|
72
|
+
elsif msg.has_key?('exit')
|
70
73
|
# breaks the read loop
|
71
74
|
return msg['exit'].to_i
|
72
75
|
elsif msg.has_key?('stream')
|
@@ -96,6 +99,12 @@ module Kontena::Cli::Helpers
|
|
96
99
|
def websocket_exec_write_thread(ws, tty: nil)
|
97
100
|
Thread.new do
|
98
101
|
begin
|
102
|
+
if tty
|
103
|
+
console_height, console_width = IO.console.winsize
|
104
|
+
websocket_exec_write(ws, 'tty_size' => {
|
105
|
+
width: console_width, height: console_height
|
106
|
+
})
|
107
|
+
end
|
99
108
|
read_stdin(tty: tty) do |stdin|
|
100
109
|
websocket_exec_write(ws, 'stdin' => stdin)
|
101
110
|
end
|
@@ -49,5 +49,17 @@ module Kontena::Cli::Helpers
|
|
49
49
|
return node['connected'] ? :ok : :offline
|
50
50
|
end
|
51
51
|
end
|
52
|
+
|
53
|
+
# @param node_etcd_health [Hash{health: String, error: String}]
|
54
|
+
# @return [Symbol, String]
|
55
|
+
def node_etcd_health(node_etcd_health)
|
56
|
+
if node_etcd_health['health']
|
57
|
+
return :ok, "healthy"
|
58
|
+
elsif node_etcd_health['error']
|
59
|
+
return :error, "unhealthy: #{node_etcd_health['error']}"
|
60
|
+
else
|
61
|
+
return :error, "unhealthy"
|
62
|
+
end
|
63
|
+
end
|
52
64
|
end
|
53
65
|
end
|
@@ -3,8 +3,8 @@ module Kontena::Cli::Helpers
|
|
3
3
|
|
4
4
|
def self.included(base)
|
5
5
|
if base.respond_to?(:option)
|
6
|
-
base.option ["-
|
7
|
-
base.option
|
6
|
+
base.option ["-f", "--follow"], :flag, "Follow log output", :attribute_name => :tail, default: false
|
7
|
+
base.option ['--tail', '--lines'], "LINES", "Number of lines to show from the end of the logs", :attribute_name => :lines, default: 100 do |s|
|
8
8
|
Integer(s)
|
9
9
|
end
|
10
10
|
base.option "--since", "SINCE", "Show logs since given timestamp"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Kontena::Cli::Helpers
|
2
|
+
module TimeHelper
|
3
|
+
# Return an approximation of how long ago the given time was.
|
4
|
+
# @param time [String]
|
5
|
+
# @param terse [Boolean] very terse output (2-3 chars wide)
|
6
|
+
def time_since(time, terse: false)
|
7
|
+
return '' if time.nil? || time.empty?
|
8
|
+
|
9
|
+
dt = Time.now - Time.parse(time)
|
10
|
+
|
11
|
+
dt_s = dt.to_i
|
12
|
+
dt_m, dt_s = dt_s / 60, dt_s % 60
|
13
|
+
dt_h, dt_m = dt_m / 60, dt_m % 60
|
14
|
+
dt_d, dt_h = dt_h / 60, dt_h % 60
|
15
|
+
|
16
|
+
parts = []
|
17
|
+
parts << "%dd" % dt_d if dt_d > 0
|
18
|
+
parts << "%dh" % dt_h if dt_h > 0
|
19
|
+
parts << "%dm" % dt_m if dt_m > 0
|
20
|
+
parts << "%ds" % dt_s
|
21
|
+
|
22
|
+
if terse
|
23
|
+
return parts.first
|
24
|
+
else
|
25
|
+
return parts.join('')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -14,7 +14,26 @@ module Kontena::Cli::Master
|
|
14
14
|
requires_current_master_token
|
15
15
|
requires_current_account_token
|
16
16
|
|
17
|
+
def master_config
|
18
|
+
@master_config ||= client.get('config')
|
19
|
+
end
|
20
|
+
|
21
|
+
def current_master_cloud_config
|
22
|
+
return @cloud_config if @cloud_config
|
23
|
+
master_client_id = master_config['oauth2.client_id']
|
24
|
+
@cloud_config = cloud_client.get('user/masters')['data'].find { |cm| cm['attributes']['client-id'] == master_client_id }
|
25
|
+
end
|
26
|
+
|
27
|
+
def current_master_cloud_name
|
28
|
+
@cloud_name ||= current_master_cloud_config.nil? ? nil : current_master_cloud_config['attributes']['name']
|
29
|
+
end
|
30
|
+
|
31
|
+
def already_cloud_enabled?
|
32
|
+
!current_master_cloud_config.nil?
|
33
|
+
end
|
34
|
+
|
17
35
|
def execute
|
36
|
+
exit_with_error "Current master is already registered to use Kontena Cloud as #{pastel.cyan(current_master_cloud_name)}" if already_cloud_enabled?
|
18
37
|
args = ["--current"]
|
19
38
|
args << "--force" if self.force?
|
20
39
|
args += ["--cloud-master-id", self.cloud_master_id.shellescape] if self.cloud_master_id
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'kontena/plugin_manager'
|
2
|
+
|
1
3
|
module Kontena::Cli::Master
|
2
4
|
class SshCommand < Kontena::Command
|
3
5
|
|
@@ -25,7 +27,7 @@ module Kontena::Cli::Master
|
|
25
27
|
end
|
26
28
|
|
27
29
|
def vagrant_plugin_installed?
|
28
|
-
Kontena::PluginManager.
|
30
|
+
Kontena::PluginManager::Common.installed?('vagrant')
|
29
31
|
end
|
30
32
|
|
31
33
|
def master_is_vagrant?
|
@@ -18,8 +18,7 @@ module Kontena::Cli::Master
|
|
18
18
|
|
19
19
|
master = config.find_server(name)
|
20
20
|
if master.nil?
|
21
|
-
exit_with_error
|
22
|
-
"\nFor a list of known masters please run: kontena master list"
|
21
|
+
exit_with_error "Could not resolve master by name '#{name}'. For a list of known masters please run: kontena master list"
|
23
22
|
else
|
24
23
|
config.current_master = master['name']
|
25
24
|
config.write
|
@@ -11,6 +11,7 @@ class Kontena::Cli::NodeCommand < Kontena::Command
|
|
11
11
|
subcommand "health", "Check node health", load_subcommand('nodes/health_command')
|
12
12
|
subcommand "env", "Generate kontena-agent.env configuration", load_subcommand('nodes/env_command')
|
13
13
|
|
14
|
+
|
14
15
|
def execute
|
15
16
|
end
|
16
17
|
end
|
@@ -1,32 +1,47 @@
|
|
1
1
|
require 'kontena/cli/helpers/health_helper'
|
2
|
+
require 'kontena/cli/helpers/time_helper'
|
2
3
|
|
3
4
|
module Kontena::Cli::Nodes
|
4
5
|
class HealthCommand < Kontena::Command
|
5
6
|
include Kontena::Cli::Common
|
6
7
|
include Kontena::Cli::GridOptions
|
7
8
|
include Kontena::Cli::Helpers::HealthHelper
|
9
|
+
include Kontena::Cli::Helpers::TimeHelper
|
8
10
|
|
9
11
|
parameter "NODE", "Node name"
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
require_current_grid
|
14
|
-
token = require_token
|
15
|
-
|
16
|
-
node = client(token).get("nodes/#{current_grid}/#{self.node}")
|
13
|
+
requires_current_master
|
14
|
+
requires_current_grid
|
17
15
|
|
18
|
-
|
16
|
+
def execute
|
17
|
+
return show_node_health("#{current_grid}/#{self.node}")
|
19
18
|
end
|
20
19
|
|
20
|
+
# @param id [String] :grid/:node
|
21
21
|
# @return [Boolean] true if healthy
|
22
|
-
def show_node_health(
|
23
|
-
|
24
|
-
|
25
|
-
|
22
|
+
def show_node_health(id)
|
23
|
+
node_health = client.get("nodes/#{id}/health")
|
24
|
+
|
25
|
+
if node_health['status'] == 'online'
|
26
|
+
puts "#{health_icon(:ok)} Node is online for #{time_since(node_health['connected_at'])}"
|
26
27
|
else
|
27
|
-
puts "#{health_icon(:
|
28
|
-
return false
|
28
|
+
puts "#{health_icon(:warning)} Node is #{node_health['status']}"
|
29
29
|
end
|
30
|
+
|
31
|
+
etcd_health, etcd_status = node_etcd_health(node_health['etcd_health'])
|
32
|
+
|
33
|
+
puts "#{health_icon etcd_health} Node #{node_health['name']} etcd is #{etcd_status}"
|
34
|
+
|
35
|
+
return etcd_health == :ok
|
36
|
+
|
37
|
+
rescue Kontena::Errors::StandardErrorHash => exc
|
38
|
+
raise unless exc.status == 422
|
39
|
+
|
40
|
+
exc.errors.each do |what, error|
|
41
|
+
puts "#{health_icon :offline} Node #{id} #{what} error: #{error}"
|
42
|
+
end
|
43
|
+
|
44
|
+
return false
|
30
45
|
end
|
31
46
|
end
|
32
47
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
require_relative '../helpers/health_helper'
|
2
|
+
require_relative '../helpers/time_helper'
|
2
3
|
|
3
4
|
module Kontena::Cli::Nodes
|
4
5
|
class ListCommand < Kontena::Command
|
5
6
|
include Kontena::Cli::Common
|
6
7
|
include Kontena::Cli::GridOptions
|
7
8
|
include Kontena::Cli::Helpers::HealthHelper
|
9
|
+
include Kontena::Cli::Helpers::TimeHelper
|
8
10
|
include Kontena::Cli::TableGenerator::Helper
|
9
11
|
|
10
12
|
option ['-a', '--all'], :flag, 'List nodes for all grids', default: false
|
@@ -19,7 +21,20 @@ module Kontena::Cli::Nodes
|
|
19
21
|
end
|
20
22
|
|
21
23
|
def node_status(node)
|
22
|
-
node['
|
24
|
+
case node_status = node['status']
|
25
|
+
when 'created'
|
26
|
+
"#{pastel.dark('created')} #{time_since(node['created_at'], terse: true)}"
|
27
|
+
when 'connecting'
|
28
|
+
"#{pastel.cyan('connecting')} #{time_since(node['connected_at'], terse: true)}"
|
29
|
+
when 'online'
|
30
|
+
"#{pastel.green('online')} #{time_since(node['connected_at'], terse: true)}"
|
31
|
+
when 'drain'
|
32
|
+
"#{pastel.yellow('drain')}"
|
33
|
+
when 'offline'
|
34
|
+
"#{pastel.red('offline')} #{time_since(node['disconnected_at'], terse: true)}"
|
35
|
+
else
|
36
|
+
pastel.white(node_status.to_s)
|
37
|
+
end
|
23
38
|
end
|
24
39
|
|
25
40
|
def node_initial(node, grid)
|
@@ -38,7 +53,7 @@ module Kontena::Cli::Nodes
|
|
38
53
|
version: 'agent_version',
|
39
54
|
status: 'status',
|
40
55
|
initial: 'initial',
|
41
|
-
labels: 'labels'
|
56
|
+
labels: 'labels',
|
42
57
|
}
|
43
58
|
end
|
44
59
|
|
@@ -58,6 +73,7 @@ module Kontena::Cli::Nodes
|
|
58
73
|
node['name'] = node_name(node, grid)
|
59
74
|
grid_nodes << node
|
60
75
|
next if quiet?
|
76
|
+
node['agent_version'] ||= '-'
|
61
77
|
node['initial'] = node_initial(node, grid)
|
62
78
|
node['status'] = node_status(node)
|
63
79
|
node['labels'] = node_labels(node)
|
@@ -66,7 +82,7 @@ module Kontena::Cli::Nodes
|
|
66
82
|
unless quiet?
|
67
83
|
grid_health = grid_health(grid, grid_nodes)
|
68
84
|
grid_nodes.each do |node|
|
69
|
-
node['name'] = health_icon(node_health(node, grid_health)) + " " + (node['name'] || '
|
85
|
+
node['name'] = health_icon(node_health(node, grid_health)) + " " + (node['name'] || node['node_id'])
|
70
86
|
end
|
71
87
|
end
|
72
88
|
|
@@ -19,6 +19,7 @@ module Kontena::Cli::Nodes
|
|
19
19
|
puts " connected: #{node['connected'] ? 'yes': 'no'}"
|
20
20
|
puts " last connect: #{node['connected_at']}"
|
21
21
|
puts " last seen: #{node['last_seen_at']}"
|
22
|
+
puts " availability: #{node['availability']}"
|
22
23
|
puts " public ip: #{node['public_ip']}"
|
23
24
|
puts " private ip: #{node['private_ip']}"
|
24
25
|
puts " overlay ip: #{node['overlay_ip']}"
|
@@ -43,9 +44,10 @@ module Kontena::Cli::Nodes
|
|
43
44
|
mem_used = mem['used'] - (mem['cached'] + mem['buffers'])
|
44
45
|
puts " memory: #{to_gigabytes(mem_used, 2)} of #{to_gigabytes(mem['total'], 2)} GB"
|
45
46
|
end
|
46
|
-
|
47
|
+
fs = node.dig('resource_usage','filesystem')
|
48
|
+
if fs
|
47
49
|
puts " filesystem:"
|
48
|
-
|
50
|
+
fs.each do |filesystem|
|
49
51
|
puts " - #{filesystem['name']}: #{to_gigabytes(filesystem['used'], 2)} of #{to_gigabytes(filesystem['total'], 2)} GB"
|
50
52
|
end
|
51
53
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'kontena/plugin_manager'
|
2
|
+
|
1
3
|
module Kontena::Cli::Nodes
|
2
4
|
class SshCommand < Kontena::Command
|
3
5
|
include Kontena::Cli::Common
|
@@ -21,7 +23,8 @@ module Kontena::Cli::Nodes
|
|
21
23
|
node = client.get("nodes/#{current_grid}/#{self.node}")
|
22
24
|
elsif any?
|
23
25
|
nodes = client.get("grids/#{current_grid}/nodes")['nodes']
|
24
|
-
node = nodes.
|
26
|
+
node = nodes.find{ |node| node['connected'] }
|
27
|
+
exit_with_error "There are no online nodes" if node.nil?
|
25
28
|
else
|
26
29
|
exit_with_error "No node name given. Use --any to connect to the first available node"
|
27
30
|
end
|
@@ -29,7 +32,7 @@ module Kontena::Cli::Nodes
|
|
29
32
|
provider = Array(node["labels"]).find{ |l| l.start_with?('provider=')}.to_s.split('=').last
|
30
33
|
|
31
34
|
if provider == 'vagrant'
|
32
|
-
unless Kontena::PluginManager.
|
35
|
+
unless Kontena::PluginManager::Common.installed?('vagrant')
|
33
36
|
exit_with_error 'You need to install vagrant plugin to ssh into this node. Use kontena plugin install vagrant'
|
34
37
|
end
|
35
38
|
cmd = ['vagrant', 'node', 'ssh', node['name']] + commands_list
|
@@ -11,6 +11,7 @@ module Kontena::Cli::Nodes
|
|
11
11
|
|
12
12
|
option ["-l", "--label"], "LABEL", "Node label", multivalued: true
|
13
13
|
option "--clear-labels", :flag, "Clear node labels"
|
14
|
+
option "--availability", "active|drain", "Node scheduling availability"
|
14
15
|
|
15
16
|
def execute
|
16
17
|
data = {}
|
@@ -18,6 +19,7 @@ module Kontena::Cli::Nodes
|
|
18
19
|
data[:labels] = self.label_list unless self.label_list.empty?
|
19
20
|
data[:labels] = [] if self.clear_labels?
|
20
21
|
|
22
|
+
data[:availability] = availability if availability
|
21
23
|
spinner "Updating #{self.node.colorize(:cyan)} node " do
|
22
24
|
client.put("nodes/#{current_grid}/#{self.node}", data)
|
23
25
|
end
|
@@ -1,29 +1,32 @@
|
|
1
|
-
require '
|
1
|
+
require 'kontena/plugin_manager'
|
2
2
|
|
3
3
|
module Kontena::Cli::Plugins
|
4
4
|
class InstallCommand < Kontena::Command
|
5
5
|
include Kontena::Util
|
6
6
|
include Kontena::Cli::Common
|
7
|
+
include Kontena::PluginManager::Common
|
7
8
|
|
8
9
|
parameter 'NAME', 'Plugin name'
|
9
10
|
|
10
11
|
option ['-v', '--version'], 'VERSION', 'Specify version of plugin to install'
|
11
12
|
option '--pre', :flag, 'Allow pre-release of a plugin to be installed', default: false
|
12
13
|
|
13
|
-
def
|
14
|
-
|
14
|
+
def installer
|
15
|
+
Kontena::PluginManager::Installer.new(name, pre: pre?, version: version)
|
16
|
+
end
|
15
17
|
|
16
|
-
|
18
|
+
def execute
|
19
|
+
if installed?(name)
|
17
20
|
installed = spinner "Upgrading plugin #{name.colorize(:cyan)}" do
|
18
|
-
|
21
|
+
installer.upgrade
|
19
22
|
end
|
20
23
|
|
21
|
-
spinner "Running cleanup" do
|
22
|
-
Kontena::PluginManager.
|
24
|
+
spinner "Running cleanup" do |spin|
|
25
|
+
Kontena::PluginManager::Cleaner.new(name).cleanup
|
23
26
|
end
|
24
27
|
else
|
25
28
|
installed = spinner "Installing plugin #{name.colorize(:cyan)}" do
|
26
|
-
|
29
|
+
installer.install
|
27
30
|
end
|
28
31
|
end
|
29
32
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'kontena/plugin_manager'
|
1
2
|
require_relative 'common'
|
2
3
|
|
3
4
|
module Kontena::Cli::Plugins
|
@@ -5,6 +6,7 @@ module Kontena::Cli::Plugins
|
|
5
6
|
include Kontena::Cli::Common
|
6
7
|
include Kontena::Cli::TableGenerator::Helper
|
7
8
|
include Common
|
9
|
+
include Kontena::PluginManager::Common
|
8
10
|
|
9
11
|
banner "List installed plugins"
|
10
12
|
|
@@ -12,8 +14,8 @@ module Kontena::Cli::Plugins
|
|
12
14
|
quiet? ? [:name] : %i(name version description)
|
13
15
|
end
|
14
16
|
|
15
|
-
def
|
16
|
-
|
17
|
+
def plugin_list
|
18
|
+
plugins.map do |plugin|
|
17
19
|
{
|
18
20
|
name: short_name(plugin.name),
|
19
21
|
version: plugin.version,
|
@@ -23,7 +25,7 @@ module Kontena::Cli::Plugins
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def execute
|
26
|
-
print_table(
|
28
|
+
print_table(plugin_list)
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -1,19 +1,21 @@
|
|
1
1
|
require_relative 'common'
|
2
|
+
require 'kontena/plugin_manager'
|
2
3
|
|
3
4
|
module Kontena::Cli::Plugins
|
4
5
|
class SearchCommand < Kontena::Command
|
5
6
|
include Common
|
7
|
+
include Kontena::PluginManager::Common
|
6
8
|
|
7
9
|
parameter '[NAME]', 'Search text'
|
8
10
|
option '--pre', :flag, 'Include pre-release versions'
|
9
11
|
|
10
12
|
def execute
|
11
|
-
results =
|
13
|
+
results = search_plugins(name)
|
12
14
|
exit_with_error("Cannot access plugin server") unless results
|
13
15
|
puts "%-50s %-10s %-60s" % ['NAME', 'VERSION', 'DESCRIPTION']
|
14
16
|
results.each do |item|
|
15
17
|
if pre?
|
16
|
-
latest =
|
18
|
+
latest = rubygems_client.latest_version(item['name'], pre: true)
|
17
19
|
item['version'] = latest.version.to_s
|
18
20
|
end
|
19
21
|
puts "%-50s %-10s %-60s" % [short_name(item['name']), item['version'], item['info']]
|