kontena-cli 0.16.3 → 0.17.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.dockerignore +1 -0
- data/.gitignore +3 -1
- data/VERSION +1 -1
- data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +32 -0
- data/lib/kontena/cli/apps/deploy_command.rb +2 -2
- data/lib/kontena/cli/apps/scale_command.rb +2 -2
- data/lib/kontena/cli/apps/show_command.rb +3 -2
- data/lib/kontena/cli/apps/yaml/validations.rb +10 -6
- data/lib/kontena/cli/apps/yaml/validator.rb +1 -0
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +1 -0
- data/lib/kontena/cli/cloud/login_command.rb +66 -64
- data/lib/kontena/cli/common.rb +0 -10
- data/lib/kontena/cli/grids/logs_command.rb +0 -1
- data/lib/kontena/cli/localhost_web_server.rb +11 -3
- data/lib/kontena/cli/master/login_command.rb +213 -163
- data/lib/kontena/cli/nodes/label_command.rb +2 -0
- data/lib/kontena/cli/nodes/labels/add_command.rb +7 -8
- data/lib/kontena/cli/nodes/labels/list_command.rb +17 -0
- data/lib/kontena/cli/nodes/labels/remove_command.rb +7 -12
- data/lib/kontena/cli/nodes/show_command.rb +1 -0
- data/lib/kontena/cli/plugins/common.rb +8 -0
- data/lib/kontena/cli/plugins/install_command.rb +21 -2
- data/lib/kontena/cli/plugins/list_command.rb +4 -2
- data/lib/kontena/cli/plugins/search_command.rb +4 -2
- data/lib/kontena/cli/registry/create_command.rb +19 -12
- data/lib/kontena/cli/registry/remove_command.rb +4 -4
- data/lib/kontena/cli/registry_command.rb +0 -1
- data/lib/kontena/cli/services/create_command.rb +6 -6
- data/lib/kontena/cli/services/deploy_command.rb +8 -4
- data/lib/kontena/cli/services/list_command.rb +34 -21
- data/lib/kontena/cli/services/logs_command.rb +1 -1
- data/lib/kontena/cli/services/scale_command.rb +3 -3
- data/lib/kontena/cli/services/services_helper.rb +18 -14
- data/lib/kontena/cli/services/show_command.rb +1 -0
- data/lib/kontena/cli/services/update_command.rb +6 -6
- data/lib/kontena/cli/stack_command.rb +12 -6
- data/lib/kontena/cli/stacks/build_command.rb +110 -0
- data/lib/kontena/cli/stacks/common.rb +85 -20
- data/lib/kontena/cli/stacks/deploy_command.rb +30 -7
- data/lib/kontena/cli/stacks/install_command.rb +30 -0
- data/lib/kontena/cli/stacks/list_command.rb +74 -14
- data/lib/kontena/cli/stacks/logs_command.rb +31 -0
- data/lib/kontena/cli/stacks/monitor_command.rb +91 -0
- data/lib/kontena/cli/stacks/remove_command.rb +24 -7
- data/lib/kontena/cli/stacks/service_generator.rb +115 -0
- data/lib/kontena/cli/stacks/service_generator_v2.rb +27 -0
- data/lib/kontena/cli/stacks/show_command.rb +65 -13
- data/lib/kontena/cli/stacks/upgrade_command.rb +28 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/affinities_validator.rb +19 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/build_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/extends_validator.rb +21 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/hooks_validator.rb +54 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/secrets_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/reader.rb +219 -0
- data/lib/kontena/cli/stacks/yaml/service_extender.rb +78 -0
- data/lib/kontena/cli/stacks/yaml/validations.rb +71 -0
- data/lib/kontena/cli/stacks/yaml/validator_v3.rb +52 -0
- data/lib/kontena/cli/version_command.rb +5 -1
- data/lib/kontena/cli/vpn/create_command.rb +20 -17
- data/lib/kontena/cli/vpn/remove_command.rb +4 -3
- data/lib/kontena/client.rb +21 -20
- data/lib/kontena/machine/cert_helper.rb +4 -0
- data/lib/kontena/machine/cloud_config/cloudinit.yml +1 -1
- data/lib/kontena/main_command.rb +1 -1
- data/spec/fixtures/kontena-build.yml +2 -2
- data/spec/fixtures/kontena-invalid.yml +1 -1
- data/spec/fixtures/kontena-not-hash-service-config.yml +1 -1
- data/spec/fixtures/kontena-with-env-file.yml +2 -2
- data/spec/fixtures/kontena_build_v3.yml +23 -0
- data/spec/fixtures/kontena_v3.yml +20 -0
- data/spec/fixtures/stack-internal-extend.yml +11 -0
- data/spec/fixtures/stack-with-env-file.yml +21 -0
- data/spec/fixtures/stack-with-variables.yml +22 -0
- data/spec/kontena/cli/app/scale_spec.rb +3 -1
- data/spec/kontena/cli/cloud/login_command_spec.rb +283 -0
- data/spec/kontena/cli/master/login_command_spec.rb +324 -145
- data/spec/kontena/cli/services/link_command_spec.rb +1 -1
- data/spec/kontena/cli/services/secrets/link_command_spec.rb +4 -4
- data/spec/kontena/cli/services/secrets/unlink_command_spec.rb +2 -2
- data/spec/kontena/cli/services/services_helper_spec.rb +15 -11
- data/spec/kontena/cli/services/unlink_command_spec.rb +1 -1
- data/spec/kontena/cli/stacks/deploy_command_spec.rb +26 -0
- data/spec/kontena/cli/stacks/install_command_spec.rb +54 -0
- data/spec/kontena/cli/stacks/list_command_spec.rb +27 -0
- data/spec/kontena/cli/stacks/remove_command_spec.rb +45 -0
- data/spec/kontena/cli/stacks/service_generator_spec.rb +385 -0
- data/spec/kontena/cli/stacks/service_generator_v2_spec.rb +74 -0
- data/spec/kontena/cli/stacks/show_command_spec.rb +26 -0
- data/spec/kontena/cli/stacks/upgrade_command_spec.rb +50 -0
- data/spec/kontena/cli/stacks/yaml/reader_spec.rb +370 -0
- data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +128 -0
- data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +302 -0
- data/spec/spec_helper.rb +6 -4
- data/spec/support/client_helpers.rb +1 -0
- metadata +57 -7
- data/lib/kontena/cli/registry/delete_command.rb +0 -18
- data/lib/kontena/cli/stacks/create_command.rb +0 -27
- data/lib/kontena/cli/stacks/update_command.rb +0 -27
@@ -2,9 +2,11 @@ module Kontena::Cli::Nodes
|
|
2
2
|
|
3
3
|
require_relative 'labels/add_command'
|
4
4
|
require_relative 'labels/remove_command'
|
5
|
+
require_relative 'labels/list_command'
|
5
6
|
|
6
7
|
class LabelCommand < Kontena::Command
|
7
8
|
|
9
|
+
subcommand ["list", "ls"], "List node labels", Labels::ListCommand
|
8
10
|
subcommand "add", "Add label to node", Labels::AddCommand
|
9
11
|
subcommand ["remove", "rm"], "Remove label from node", Labels::RemoveCommand
|
10
12
|
|
@@ -3,16 +3,15 @@ module Kontena::Cli::Nodes::Labels
|
|
3
3
|
include Kontena::Cli::Common
|
4
4
|
|
5
5
|
parameter "NODE_ID", "Node id"
|
6
|
-
parameter "LABEL", "
|
6
|
+
parameter "LABEL ...", "Labels"
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
token = require_token
|
8
|
+
requires_current_master
|
9
|
+
requires_current_master_token
|
10
|
+
requires_current_grid
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
data
|
12
|
+
def execute
|
13
|
+
node = client.get("grids/#{current_grid}/nodes/#{node_id}")
|
14
|
+
data = { labels: (Array(node['labels']) + label_list).uniq }
|
16
15
|
client.put("nodes/#{node['id']}", data, {}, {'Kontena-Grid-Token' => node['grid']['token']})
|
17
16
|
end
|
18
17
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Kontena::Cli::Nodes::Labels
|
2
|
+
class ListCommand < Kontena::Command
|
3
|
+
include Kontena::Cli::Common
|
4
|
+
|
5
|
+
parameter "NODE_ID", "Node id"
|
6
|
+
|
7
|
+
requires_current_master
|
8
|
+
requires_current_master_token
|
9
|
+
requires_current_grid
|
10
|
+
|
11
|
+
def execute
|
12
|
+
node = client.get("grids/#{current_grid}/nodes/#{node_id}")
|
13
|
+
puts Array(node['labels']).join("\n")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -3,20 +3,15 @@ module Kontena::Cli::Nodes::Labels
|
|
3
3
|
include Kontena::Cli::Common
|
4
4
|
|
5
5
|
parameter "NODE_ID", "Node id"
|
6
|
-
parameter "LABEL", "
|
6
|
+
parameter "LABEL ...", "Labels"
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
token = require_token
|
8
|
+
requires_current_master
|
9
|
+
requires_current_master_token
|
10
|
+
requires_current_grid
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
end
|
17
|
-
node['labels'].delete(label)
|
18
|
-
data = {}
|
19
|
-
data[:labels] = node['labels']
|
12
|
+
def execute
|
13
|
+
node = client.get("grids/#{current_grid}/nodes/#{node_id}")
|
14
|
+
data = { labels: Array(node['labels']).reject {|label| label_list.include?(label) } }
|
20
15
|
client.put("nodes/#{node['id']}", data, {}, {'Kontena-Grid-Token' => node['grid']['token']})
|
21
16
|
end
|
22
17
|
end
|
@@ -15,6 +15,7 @@ module Kontena::Cli::Nodes
|
|
15
15
|
puts "#{node['name']}:"
|
16
16
|
puts " id: #{node['id']}"
|
17
17
|
puts " agent version: #{node['agent_version']}"
|
18
|
+
puts " docker version: #{node['docker_version']}"
|
18
19
|
puts " connected: #{node['connected'] ? 'yes': 'no'}"
|
19
20
|
puts " last connect: #{node['updated_at']}"
|
20
21
|
puts " last seen: #{node['last_seen_at']}"
|
@@ -16,13 +16,13 @@ module Kontena::Cli::Plugins
|
|
16
16
|
|
17
17
|
def install_plugin(name)
|
18
18
|
plugin = "kontena-plugin-#{name}"
|
19
|
-
|
19
|
+
uninstall_previous(plugin) if plugin_exists?(plugin)
|
20
20
|
install_options = ['--no-ri', '--no-doc']
|
21
21
|
install_options << "--version #{version}" if version
|
22
22
|
install_options << "--pre" if pre?
|
23
23
|
install_command = "#{gem_bin} install #{install_options.join(' ')} #{plugin}"
|
24
24
|
success = false
|
25
|
-
spinner "
|
25
|
+
spinner "Installing plugin #{name.colorize(:cyan)}" do
|
26
26
|
stdout, stderr, status = Open3.capture3(install_command)
|
27
27
|
unless stderr.empty?
|
28
28
|
raise stderr
|
@@ -31,5 +31,24 @@ module Kontena::Cli::Plugins
|
|
31
31
|
rescue => exc
|
32
32
|
puts exc.message
|
33
33
|
end
|
34
|
+
|
35
|
+
def plugin_exists?(name)
|
36
|
+
Kontena::PluginManager.instance.plugins.any? { |p| p.name == name}
|
37
|
+
end
|
38
|
+
|
39
|
+
def gem_bin
|
40
|
+
@gem_bin ||= which('gem')
|
41
|
+
end
|
42
|
+
|
43
|
+
def uninstall_previous(name)
|
44
|
+
uninstall_command = "#{gem_bin} uninstall -q #{name}"
|
45
|
+
success = false
|
46
|
+
spinner "Uninstalling previous version of plugin" do
|
47
|
+
stdout, stderr, status = Open3.capture3(uninstall_command)
|
48
|
+
unless stderr.empty?
|
49
|
+
raise stderr
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
34
53
|
end
|
35
54
|
end
|
@@ -1,13 +1,15 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
1
3
|
module Kontena::Cli::Plugins
|
2
4
|
class ListCommand < Kontena::Command
|
5
|
+
include Common
|
3
6
|
|
4
7
|
def execute
|
5
8
|
titles = ['NAME', 'VERSION', 'DESCRIPTION']
|
6
9
|
puts "%-40s %-10s %-40s" % titles
|
7
10
|
Kontena::PluginManager.instance.plugins.each do |plugin|
|
8
|
-
puts "%-40s %-10s %-40s" % [plugin.name, plugin.version, plugin.description]
|
11
|
+
puts "%-40s %-10s %-40s" % [short_name(plugin.name), plugin.version, plugin.description]
|
9
12
|
end
|
10
13
|
end
|
11
|
-
|
12
14
|
end
|
13
15
|
end
|
@@ -1,5 +1,8 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
1
3
|
module Kontena::Cli::Plugins
|
2
4
|
class SearchCommand < Kontena::Command
|
5
|
+
include Common
|
3
6
|
|
4
7
|
parameter '[NAME]', 'Search text'
|
5
8
|
|
@@ -8,8 +11,7 @@ module Kontena::Cli::Plugins
|
|
8
11
|
exit_with_error("Cannot access plugin server") unless results
|
9
12
|
puts "%-50s %-10s %-60s" % ['NAME', 'VERSION', 'DESCRIPTION']
|
10
13
|
results.each do |item|
|
11
|
-
|
12
|
-
puts "%-50s %-10s %-60s" % [name, item['version'], item['info']]
|
14
|
+
puts "%-50s %-10s %-60s" % [short_name(item['name']), item['version'], item['info']]
|
13
15
|
end
|
14
16
|
end
|
15
17
|
|
@@ -86,19 +86,26 @@ module Kontena::Cli::Registry
|
|
86
86
|
env << "REGISTRY_HTTP_SECRET=#{SecureRandom.hex(24)}"
|
87
87
|
|
88
88
|
data = {
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
89
|
+
name: 'registry',
|
90
|
+
services: [
|
91
|
+
{
|
92
|
+
name: 'api',
|
93
|
+
stateful: stateful,
|
94
|
+
container_count: instances,
|
95
|
+
image: "kontena/registry:#{REGISTRY_VERSION}",
|
96
|
+
volumes: ['/registry'],
|
97
|
+
env: env,
|
98
|
+
secrets: secrets,
|
99
|
+
affinity: affinity
|
100
|
+
}
|
101
|
+
]
|
97
102
|
}
|
98
|
-
|
99
|
-
client(token).post("
|
100
|
-
|
101
|
-
|
103
|
+
|
104
|
+
client(token).post("grids/#{current_grid}/stacks", data)
|
105
|
+
client(token).post("stacks/#{current_grid}/registry/deploy", {})
|
106
|
+
spinner "Deploying #{data[:name].colorize(:cyan)} stack " do
|
107
|
+
sleep 1 until client(token).get("stacks/#{current_grid}/registry")['state'] == 'deploying'
|
108
|
+
sleep 1 until client(token).get("stacks/#{current_grid}/registry")['state'] == 'running'
|
102
109
|
end
|
103
110
|
puts "\n"
|
104
111
|
puts "Docker Registry #{REGISTRY_VERSION} is now running at registry.#{current_grid}.kontena.local."
|
@@ -10,11 +10,11 @@ module Kontena::Cli::Registry
|
|
10
10
|
confirm unless forced?
|
11
11
|
name = 'registry'
|
12
12
|
|
13
|
-
registry = client(token).get("
|
14
|
-
exit_with_error("
|
13
|
+
registry = client(token).get("stacks/#{current_grid}/#{name}") rescue nil
|
14
|
+
exit_with_error("Stack #{name.colorize(:cyan)} does not exist") if registry.nil?
|
15
15
|
|
16
|
-
spinner "Removing #{name.colorize(:cyan)}
|
17
|
-
client(token).delete("
|
16
|
+
spinner "Removing #{name.colorize(:cyan)} stack " do
|
17
|
+
client(token).delete("stacks/#{current_grid}/#{name}")
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
@@ -35,12 +35,12 @@ module Kontena::Cli::Services
|
|
35
35
|
option "--deploy-interval", "TIME", "Auto-deploy with given interval (format: <number><unit>, where unit = min, h, d)"
|
36
36
|
option "--pid", "PID", "Pid namespace to use"
|
37
37
|
option "--secret", "SECRET", "Import secret from Vault (format: <secret>:<name>:<env>)", multivalued: true
|
38
|
-
option "--health-check-uri", "
|
39
|
-
option "--health-check-timeout", "
|
40
|
-
option "--health-check-interval", "
|
41
|
-
option "--health-check-initial-delay", "
|
42
|
-
option "--health-check-port", "
|
43
|
-
option "--health-check-protocol", "
|
38
|
+
option "--health-check-uri", "URI", "URI path for HTTP health check"
|
39
|
+
option "--health-check-timeout", "TIMEOUT", "Timeout for health check"
|
40
|
+
option "--health-check-interval", "INTERVAL", "Interval for health check"
|
41
|
+
option "--health-check-initial-delay", "DELAY", "Initial delay for health check"
|
42
|
+
option "--health-check-port", "PORT", "Port for health check"
|
43
|
+
option "--health-check-protocol", "PROTOCOL", "Protocol of health check"
|
44
44
|
|
45
45
|
def execute
|
46
46
|
require_api_url
|
@@ -7,17 +7,21 @@ module Kontena::Cli::Services
|
|
7
7
|
include ServicesHelper
|
8
8
|
|
9
9
|
parameter "NAME", "Service name"
|
10
|
-
option '--force
|
10
|
+
option '--force', :flag, 'Force deploy even if service does not have any changes'
|
11
|
+
option '--force-deploy', :flag, '[DEPRECATED: use --force]'
|
11
12
|
|
12
13
|
def execute
|
13
14
|
require_api_url
|
14
15
|
token = require_token
|
15
16
|
service_id = name
|
16
17
|
data = {}
|
17
|
-
data[:force] = true if force_deploy?
|
18
|
+
data[:force] = true if force? || force_deploy? # deprecated
|
19
|
+
if force_deploy?
|
20
|
+
warning "--force-deploy will deprecate in the future, use --force"
|
21
|
+
end
|
18
22
|
spinner "Deploying service #{name.colorize(:cyan)} " do
|
19
|
-
deploy_service(token, name, data)
|
20
|
-
wait_for_deploy_to_finish(token,
|
23
|
+
deployment = deploy_service(token, name, data)
|
24
|
+
wait_for_deploy_to_finish(token, deployment)
|
21
25
|
end
|
22
26
|
end
|
23
27
|
end
|
@@ -6,33 +6,46 @@ module Kontena::Cli::Services
|
|
6
6
|
include Kontena::Cli::GridOptions
|
7
7
|
include ServicesHelper
|
8
8
|
|
9
|
+
option ["-q", "--quiet"], :flag, "Show only service names"
|
10
|
+
option '--stack', 'STACK', 'Stack name'
|
11
|
+
|
9
12
|
def execute
|
10
13
|
require_api_url
|
11
14
|
token = require_token
|
12
15
|
|
13
|
-
grids = client(token).get("grids/#{current_grid}/services")
|
16
|
+
grids = client(token).get("grids/#{current_grid}/services?stack=#{stack}")
|
14
17
|
services = grids['services'].sort_by{|s| s['updated_at'] }.reverse
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
health = health_status(service)
|
26
|
-
vars = [
|
27
|
-
health_status_icon(health),
|
28
|
-
"#{service['name']}",
|
29
|
-
instances,
|
30
|
-
stateful,
|
31
|
-
service['state'],
|
32
|
-
ports
|
33
|
-
]
|
34
|
-
puts "%s %-58s %-10.10s %-8s %-10s %-50s" % vars
|
18
|
+
if quiet?
|
19
|
+
services.each do |service|
|
20
|
+
puts "#{service.dig('stack', 'id')}/#{service['name']}"
|
21
|
+
end
|
22
|
+
else
|
23
|
+
titles = ['NAME', 'INSTANCES', 'STATEFUL', 'STATE', 'EXPOSED PORTS']
|
24
|
+
puts "%-60s %-10s %-8s %-10s %-50s" % titles
|
25
|
+
services.each do |service|
|
26
|
+
print_service_row(service)
|
27
|
+
end
|
35
28
|
end
|
36
29
|
end
|
30
|
+
|
31
|
+
def print_service_row(service)
|
32
|
+
stateful = service['stateful'] ? 'yes' : 'no'
|
33
|
+
running = service['instances']['running']
|
34
|
+
desired = service['container_count']
|
35
|
+
instances = "#{running} / #{desired}"
|
36
|
+
ports = service['ports'].map{|p|
|
37
|
+
"#{p['ip']}:#{p['node_port']}->#{p['container_port']}/#{p['protocol']}"
|
38
|
+
}.join(", ")
|
39
|
+
health = health_status(service)
|
40
|
+
vars = [
|
41
|
+
health_status_icon(health),
|
42
|
+
"#{service.dig('stack', 'name')}/#{service['name']}",
|
43
|
+
instances,
|
44
|
+
stateful,
|
45
|
+
service['state'],
|
46
|
+
ports
|
47
|
+
]
|
48
|
+
puts "%s %-58s %-10.10s %-8s %-10s %-50s" % vars
|
49
|
+
end
|
37
50
|
end
|
38
51
|
end
|
@@ -11,9 +11,9 @@ module Kontena::Cli::Services
|
|
11
11
|
|
12
12
|
def execute
|
13
13
|
token = require_token
|
14
|
-
spinner "Scaling #{name} " do
|
15
|
-
scale_service(token, name, instances)
|
16
|
-
wait_for_deploy_to_finish(token,
|
14
|
+
spinner "Scaling #{pastel.cyan(name)} to #{instances} instances " do
|
15
|
+
deployment = scale_service(token, name, instances)
|
16
|
+
wait_for_deploy_to_finish(token, deployment)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -43,6 +43,7 @@ module Kontena
|
|
43
43
|
service = get_service(token, service_id)
|
44
44
|
grid = service['id'].split('/')[0]
|
45
45
|
puts "#{service['id']}:"
|
46
|
+
puts " stack: #{service['stack']['id'] }"
|
46
47
|
puts " status: #{service['state'] }"
|
47
48
|
puts " image: #{service['image']}"
|
48
49
|
puts " revision: #{service['revision']}"
|
@@ -57,7 +58,7 @@ module Kontena
|
|
57
58
|
if service['deploy_opts']['interval']
|
58
59
|
puts " interval: #{service['deploy_opts']['interval']}"
|
59
60
|
end
|
60
|
-
puts " dns: #{service['
|
61
|
+
puts " dns: #{service['dns']}"
|
61
62
|
|
62
63
|
if service['affinity'].to_a.size > 0
|
63
64
|
puts " affinity: "
|
@@ -181,7 +182,9 @@ module Kontena
|
|
181
182
|
puts " healthy: #{service['health_status']['healthy']}"
|
182
183
|
puts " total: #{service['health_status']['total']}"
|
183
184
|
end
|
185
|
+
end
|
184
186
|
|
187
|
+
def show_service_instances(token, service_id)
|
185
188
|
puts " instances:"
|
186
189
|
result = client(token).get("services/#{parse_service_id(service_id)}/containers")
|
187
190
|
result['containers'].each do |container|
|
@@ -189,8 +192,8 @@ module Kontena
|
|
189
192
|
puts " rev: #{container['deploy_rev']}"
|
190
193
|
puts " service_rev: #{container['service_rev']}"
|
191
194
|
puts " node: #{container['node']['name'] rescue 'unknown'}"
|
192
|
-
puts " dns: #{container['
|
193
|
-
puts " ip: #{container['
|
195
|
+
puts " dns: #{container['hostname']}.#{container['domainname']}"
|
196
|
+
puts " ip: #{container['ip_address']}"
|
194
197
|
puts " public ip: #{container['node']['public_ip'] rescue 'unknown'}"
|
195
198
|
if container['health_status']
|
196
199
|
health_time = Time.now - Time.parse(container.dig('health_status', 'updated_at'))
|
@@ -219,21 +222,19 @@ module Kontena
|
|
219
222
|
end
|
220
223
|
|
221
224
|
# @param [String] token
|
222
|
-
# @param [
|
225
|
+
# @param [Hash] deployment
|
223
226
|
# @return [Boolean]
|
224
|
-
def wait_for_deploy_to_finish(token,
|
225
|
-
service = client(token).get("services/#{name}")
|
226
|
-
desired_count = service['container_count']
|
227
|
-
updated_at = DateTime.parse(service['updated_at']) rescue DateTime.now
|
227
|
+
def wait_for_deploy_to_finish(token, deployment, timeout = 600)
|
228
228
|
deployed = false
|
229
229
|
Timeout::timeout(timeout) do
|
230
230
|
until deployed
|
231
|
-
|
232
|
-
deployed =
|
233
|
-
DateTime.parse(c['created_at']) >= updated_at rescue false
|
234
|
-
}
|
231
|
+
deployment = client(token).get("services/#{deployment['service_id']}/deploys/#{deployment['id']}")
|
232
|
+
deployed = true if deployment['finished_at']
|
235
233
|
sleep 1
|
236
234
|
end
|
235
|
+
if deployment['state'] == 'error'
|
236
|
+
raise Kontena::Errors::StandardError.new(500, deployment['reason'])
|
237
|
+
end
|
237
238
|
end
|
238
239
|
|
239
240
|
deployed
|
@@ -272,10 +273,13 @@ module Kontena
|
|
272
273
|
# @param [String] service_id
|
273
274
|
# @return [String]
|
274
275
|
def parse_service_id(service_id)
|
275
|
-
|
276
|
+
count = service_id.to_s.count('/')
|
277
|
+
if count == 2
|
276
278
|
param = service_id
|
277
|
-
|
279
|
+
elsif count == 1
|
278
280
|
param = "#{current_grid}/#{service_id}"
|
281
|
+
else
|
282
|
+
param = "#{current_grid}/default/#{service_id}"
|
279
283
|
end
|
280
284
|
end
|
281
285
|
|