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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +1 -0
  3. data/.gitignore +3 -1
  4. data/VERSION +1 -1
  5. data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +32 -0
  6. data/lib/kontena/cli/apps/deploy_command.rb +2 -2
  7. data/lib/kontena/cli/apps/scale_command.rb +2 -2
  8. data/lib/kontena/cli/apps/show_command.rb +3 -2
  9. data/lib/kontena/cli/apps/yaml/validations.rb +10 -6
  10. data/lib/kontena/cli/apps/yaml/validator.rb +1 -0
  11. data/lib/kontena/cli/apps/yaml/validator_v2.rb +1 -0
  12. data/lib/kontena/cli/cloud/login_command.rb +66 -64
  13. data/lib/kontena/cli/common.rb +0 -10
  14. data/lib/kontena/cli/grids/logs_command.rb +0 -1
  15. data/lib/kontena/cli/localhost_web_server.rb +11 -3
  16. data/lib/kontena/cli/master/login_command.rb +213 -163
  17. data/lib/kontena/cli/nodes/label_command.rb +2 -0
  18. data/lib/kontena/cli/nodes/labels/add_command.rb +7 -8
  19. data/lib/kontena/cli/nodes/labels/list_command.rb +17 -0
  20. data/lib/kontena/cli/nodes/labels/remove_command.rb +7 -12
  21. data/lib/kontena/cli/nodes/show_command.rb +1 -0
  22. data/lib/kontena/cli/plugins/common.rb +8 -0
  23. data/lib/kontena/cli/plugins/install_command.rb +21 -2
  24. data/lib/kontena/cli/plugins/list_command.rb +4 -2
  25. data/lib/kontena/cli/plugins/search_command.rb +4 -2
  26. data/lib/kontena/cli/registry/create_command.rb +19 -12
  27. data/lib/kontena/cli/registry/remove_command.rb +4 -4
  28. data/lib/kontena/cli/registry_command.rb +0 -1
  29. data/lib/kontena/cli/services/create_command.rb +6 -6
  30. data/lib/kontena/cli/services/deploy_command.rb +8 -4
  31. data/lib/kontena/cli/services/list_command.rb +34 -21
  32. data/lib/kontena/cli/services/logs_command.rb +1 -1
  33. data/lib/kontena/cli/services/scale_command.rb +3 -3
  34. data/lib/kontena/cli/services/services_helper.rb +18 -14
  35. data/lib/kontena/cli/services/show_command.rb +1 -0
  36. data/lib/kontena/cli/services/update_command.rb +6 -6
  37. data/lib/kontena/cli/stack_command.rb +12 -6
  38. data/lib/kontena/cli/stacks/build_command.rb +110 -0
  39. data/lib/kontena/cli/stacks/common.rb +85 -20
  40. data/lib/kontena/cli/stacks/deploy_command.rb +30 -7
  41. data/lib/kontena/cli/stacks/install_command.rb +30 -0
  42. data/lib/kontena/cli/stacks/list_command.rb +74 -14
  43. data/lib/kontena/cli/stacks/logs_command.rb +31 -0
  44. data/lib/kontena/cli/stacks/monitor_command.rb +91 -0
  45. data/lib/kontena/cli/stacks/remove_command.rb +24 -7
  46. data/lib/kontena/cli/stacks/service_generator.rb +115 -0
  47. data/lib/kontena/cli/stacks/service_generator_v2.rb +27 -0
  48. data/lib/kontena/cli/stacks/show_command.rb +65 -13
  49. data/lib/kontena/cli/stacks/upgrade_command.rb +28 -0
  50. data/lib/kontena/cli/stacks/yaml/custom_validators/affinities_validator.rb +19 -0
  51. data/lib/kontena/cli/stacks/yaml/custom_validators/build_validator.rb +22 -0
  52. data/lib/kontena/cli/stacks/yaml/custom_validators/extends_validator.rb +21 -0
  53. data/lib/kontena/cli/stacks/yaml/custom_validators/hooks_validator.rb +54 -0
  54. data/lib/kontena/cli/stacks/yaml/custom_validators/secrets_validator.rb +22 -0
  55. data/lib/kontena/cli/stacks/yaml/reader.rb +219 -0
  56. data/lib/kontena/cli/stacks/yaml/service_extender.rb +78 -0
  57. data/lib/kontena/cli/stacks/yaml/validations.rb +71 -0
  58. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +52 -0
  59. data/lib/kontena/cli/version_command.rb +5 -1
  60. data/lib/kontena/cli/vpn/create_command.rb +20 -17
  61. data/lib/kontena/cli/vpn/remove_command.rb +4 -3
  62. data/lib/kontena/client.rb +21 -20
  63. data/lib/kontena/machine/cert_helper.rb +4 -0
  64. data/lib/kontena/machine/cloud_config/cloudinit.yml +1 -1
  65. data/lib/kontena/main_command.rb +1 -1
  66. data/spec/fixtures/kontena-build.yml +2 -2
  67. data/spec/fixtures/kontena-invalid.yml +1 -1
  68. data/spec/fixtures/kontena-not-hash-service-config.yml +1 -1
  69. data/spec/fixtures/kontena-with-env-file.yml +2 -2
  70. data/spec/fixtures/kontena_build_v3.yml +23 -0
  71. data/spec/fixtures/kontena_v3.yml +20 -0
  72. data/spec/fixtures/stack-internal-extend.yml +11 -0
  73. data/spec/fixtures/stack-with-env-file.yml +21 -0
  74. data/spec/fixtures/stack-with-variables.yml +22 -0
  75. data/spec/kontena/cli/app/scale_spec.rb +3 -1
  76. data/spec/kontena/cli/cloud/login_command_spec.rb +283 -0
  77. data/spec/kontena/cli/master/login_command_spec.rb +324 -145
  78. data/spec/kontena/cli/services/link_command_spec.rb +1 -1
  79. data/spec/kontena/cli/services/secrets/link_command_spec.rb +4 -4
  80. data/spec/kontena/cli/services/secrets/unlink_command_spec.rb +2 -2
  81. data/spec/kontena/cli/services/services_helper_spec.rb +15 -11
  82. data/spec/kontena/cli/services/unlink_command_spec.rb +1 -1
  83. data/spec/kontena/cli/stacks/deploy_command_spec.rb +26 -0
  84. data/spec/kontena/cli/stacks/install_command_spec.rb +54 -0
  85. data/spec/kontena/cli/stacks/list_command_spec.rb +27 -0
  86. data/spec/kontena/cli/stacks/remove_command_spec.rb +45 -0
  87. data/spec/kontena/cli/stacks/service_generator_spec.rb +385 -0
  88. data/spec/kontena/cli/stacks/service_generator_v2_spec.rb +74 -0
  89. data/spec/kontena/cli/stacks/show_command_spec.rb +26 -0
  90. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +50 -0
  91. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +370 -0
  92. data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +128 -0
  93. data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +302 -0
  94. data/spec/spec_helper.rb +6 -4
  95. data/spec/support/client_helpers.rb +1 -0
  96. metadata +57 -7
  97. data/lib/kontena/cli/registry/delete_command.rb +0 -18
  98. data/lib/kontena/cli/stacks/create_command.rb +0 -27
  99. 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", "Label"
6
+ parameter "LABEL ...", "Labels"
7
7
 
8
- def execute
9
- require_api_url
10
- require_current_grid
11
- token = require_token
8
+ requires_current_master
9
+ requires_current_master_token
10
+ requires_current_grid
12
11
 
13
- node = client(token).get("grids/#{current_grid}/nodes/#{node_id}")
14
- data = {}
15
- data[:labels] = node['labels'].to_a | [label]
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", "Label"
6
+ parameter "LABEL ...", "Labels"
7
7
 
8
- def execute
9
- require_api_url
10
- require_current_grid
11
- token = require_token
8
+ requires_current_master
9
+ requires_current_master_token
10
+ requires_current_grid
12
11
 
13
- node = client(token).get("grids/#{current_grid}/nodes/#{node_id}")
14
- unless node['labels'].include?(label)
15
- exit_with_error("Node #{node['name']} does not have label #{label}")
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']}"
@@ -0,0 +1,8 @@
1
+ module Kontena::Cli::Plugins
2
+ module Common
3
+
4
+ def short_name(name)
5
+ name.sub('kontena-plugin-', '')
6
+ end
7
+ end
8
+ end
@@ -16,13 +16,13 @@ module Kontena::Cli::Plugins
16
16
 
17
17
  def install_plugin(name)
18
18
  plugin = "kontena-plugin-#{name}"
19
- gem_bin = which('gem')
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 "installing plugin #{name.colorize(:cyan)}" do
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
- name = item['name'].sub('kontena-plugin-', '')
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
- name: 'registry',
90
- stateful: stateful,
91
- container_count: instances,
92
- image: "kontena/registry:#{REGISTRY_VERSION}",
93
- volumes: ['/registry'],
94
- env: env,
95
- secrets: secrets,
96
- affinity: affinity
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
- client(token).post("grids/#{current_grid}/services", data)
99
- client(token).post("services/#{current_grid}/registry/deploy", {})
100
- spinner "deploying #{data[:name].colorize(:cyan)} service " do
101
- wait_for_deploy_to_finish(token, parse_service_id(data[:name]))
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("services/#{current_grid}/#{name}") rescue nil
14
- exit_with_error("Service #{name.colorize(:cyan)} does not exist") if registry.nil?
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)} service " do
17
- client(token).delete("services/#{current_grid}/#{name}")
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
@@ -1,5 +1,4 @@
1
1
  require_relative 'registry/create_command'
2
- require_relative 'registry/delete_command'
3
2
  require_relative 'registry/remove_command'
4
3
 
5
4
  class Kontena::Cli::RegistryCommand < Kontena::Command
@@ -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", "HEALTH CHECK URI", "URI path for HTTP health check"
39
- option "--health-check-timeout", "HEALTH CHECK TIMEOUT", "Timeout for health check"
40
- option "--health-check-interval", "HEALTH CHECK INTERVAL", "Interval for health check"
41
- option "--health-check-initial-delay", "HEALTH CHECK INITIAL DELAY", "Initial delay for health check"
42
- option "--health-check-port", "HEALTH CHECK PORT", "Port for health check"
43
- option "--health-check-protocol", "HEALTH CHECK PROTOCOL", "Protocol of health check"
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-deploy', :flag, 'Force deploy even if service does not have any changes'
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, parse_service_id(name))
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
- titles = ['NAME', 'INSTANCES', 'STATEFUL', 'STATE', 'EXPOSED PORTS']
16
- puts "%-60s %-10s %-8s %-10s %-50s" % titles
17
- services.each do |service|
18
- stateful = service['stateful'] ? 'yes' : 'no'
19
- running = service['instances']['running']
20
- desired = service['container_count']
21
- instances = "#{running} / #{desired}"
22
- ports = service['ports'].map{|p|
23
- "#{p['ip']}:#{p['node_port']}->#{p['container_port']}/#{p['protocol']}"
24
- }.join(", ")
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
@@ -10,7 +10,7 @@ module Kontena::Cli::Services
10
10
 
11
11
  parameter "NAME", "Service name"
12
12
  option ["-i", "--instance"], "INSTANCE", "Show only given instance specific logs"
13
-
13
+
14
14
  def execute
15
15
  require_api_url
16
16
 
@@ -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, parse_service_id(name))
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['name']}.#{grid}.kontena.local"
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['name']}.#{grid}.kontena.local"
193
- puts " ip: #{container['overlay_cidr'].to_s.split('/')[0]}"
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 [String] name
225
+ # @param [Hash] deployment
223
226
  # @return [Boolean]
224
- def wait_for_deploy_to_finish(token, name, timeout = 600)
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
- containers = client(token).get("services/#{name}/containers")['containers']
232
- deployed = containers.size == desired_count && containers.all?{ |c|
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
- if service_id.to_s.include?('/')
276
+ count = service_id.to_s.count('/')
277
+ if count == 2
276
278
  param = service_id
277
- else
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