kontena-cli 0.16.0.pre5 → 0.16.0.pre6

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.
Files changed (100) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +3 -0
  3. data/VERSION +1 -1
  4. data/bin/kontena +4 -3
  5. data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +1 -3
  6. data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +1 -1
  7. data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +1 -8
  8. data/lib/kontena/callbacks/master/deploy/90_suggest_inviting_yourself_after_deploy.rb +1 -1
  9. data/lib/kontena/cli/apps/build_command.rb +2 -1
  10. data/lib/kontena/cli/apps/common.rb +3 -8
  11. data/lib/kontena/cli/apps/deploy_command.rb +25 -17
  12. data/lib/kontena/cli/apps/docker_helper.rb +5 -5
  13. data/lib/kontena/cli/apps/monitor_command.rb +4 -2
  14. data/lib/kontena/cli/apps/remove_command.rb +7 -7
  15. data/lib/kontena/cli/apps/restart_command.rb +4 -3
  16. data/lib/kontena/cli/apps/scale_command.rb +7 -5
  17. data/lib/kontena/cli/apps/start_command.rb +4 -3
  18. data/lib/kontena/cli/apps/stop_command.rb +4 -3
  19. data/lib/kontena/cli/apps/yaml/reader.rb +15 -5
  20. data/lib/kontena/cli/apps/yaml/validator.rb +4 -0
  21. data/lib/kontena/cli/apps/yaml/validator_v2.rb +5 -1
  22. data/lib/kontena/cli/cloud/login_command.rb +1 -1
  23. data/lib/kontena/cli/cloud/logout_command.rb +14 -0
  24. data/lib/kontena/cli/cloud/master/show_command.rb +0 -2
  25. data/lib/kontena/cli/cloud_command.rb +2 -0
  26. data/lib/kontena/cli/common.rb +98 -26
  27. data/lib/kontena/cli/containers/inspect_command.rb +1 -1
  28. data/lib/kontena/cli/etcd/get_command.rb +2 -2
  29. data/lib/kontena/cli/etcd/list_command.rb +2 -2
  30. data/lib/kontena/cli/etcd/mkdir_command.rb +1 -1
  31. data/lib/kontena/cli/etcd/remove_command.rb +1 -1
  32. data/lib/kontena/cli/etcd/set_command.rb +1 -1
  33. data/lib/kontena/cli/external_registries/add_command.rb +3 -1
  34. data/lib/kontena/cli/external_registries/delete_command.rb +1 -1
  35. data/lib/kontena/cli/external_registries/remove_command.rb +5 -1
  36. data/lib/kontena/cli/grids/cloud_config_command.rb +1 -1
  37. data/lib/kontena/cli/grids/create_command.rb +14 -6
  38. data/lib/kontena/cli/grids/current_command.rb +1 -1
  39. data/lib/kontena/cli/grids/env_command.rb +2 -2
  40. data/lib/kontena/cli/grids/list_command.rb +1 -1
  41. data/lib/kontena/cli/grids/remove_command.rb +6 -5
  42. data/lib/kontena/cli/grids/show_command.rb +2 -2
  43. data/lib/kontena/cli/grids/trusted_subnets/add_command.rb +3 -1
  44. data/lib/kontena/cli/grids/trusted_subnets/remove_command.rb +6 -2
  45. data/lib/kontena/cli/grids/use_command.rb +1 -1
  46. data/lib/kontena/cli/helpers/log_helper.rb +4 -2
  47. data/lib/kontena/cli/login_command.rb +1 -1
  48. data/lib/kontena/cli/logout_command.rb +3 -31
  49. data/lib/kontena/cli/master/config/export_command.rb +1 -2
  50. data/lib/kontena/cli/master/config/import_command.rb +3 -4
  51. data/lib/kontena/cli/master/create_command.rb +1 -2
  52. data/lib/kontena/cli/master/login_command.rb +10 -12
  53. data/lib/kontena/cli/master/logout_command.rb +23 -0
  54. data/lib/kontena/cli/master/use_command.rb +1 -1
  55. data/lib/kontena/cli/master_command.rb +2 -0
  56. data/lib/kontena/cli/nodes/labels/remove_command.rb +1 -1
  57. data/lib/kontena/cli/nodes/remove_command.rb +3 -1
  58. data/lib/kontena/cli/nodes/update_command.rb +3 -2
  59. data/lib/kontena/cli/plugins/install_command.rb +9 -2
  60. data/lib/kontena/cli/plugins/search_command.rb +1 -1
  61. data/lib/kontena/cli/registry/create_command.rb +9 -8
  62. data/lib/kontena/cli/registry/delete_command.rb +2 -2
  63. data/lib/kontena/cli/registry/remove_command.rb +6 -3
  64. data/lib/kontena/cli/services/create_command.rb +7 -5
  65. data/lib/kontena/cli/services/delete_command.rb +1 -1
  66. data/lib/kontena/cli/services/deploy_command.rb +4 -1
  67. data/lib/kontena/cli/services/envs/add_command.rb +3 -1
  68. data/lib/kontena/cli/services/envs/remove_command.rb +3 -1
  69. data/lib/kontena/cli/services/link_command.rb +4 -2
  70. data/lib/kontena/cli/services/remove_command.rb +15 -1
  71. data/lib/kontena/cli/services/restart_command.rb +3 -1
  72. data/lib/kontena/cli/services/scale_command.rb +4 -1
  73. data/lib/kontena/cli/services/secrets/link_command.rb +9 -7
  74. data/lib/kontena/cli/services/secrets/unlink_command.rb +1 -1
  75. data/lib/kontena/cli/services/services_helper.rb +21 -10
  76. data/lib/kontena/cli/services/start_command.rb +3 -1
  77. data/lib/kontena/cli/services/stop_command.rb +3 -1
  78. data/lib/kontena/cli/services/unlink_command.rb +1 -1
  79. data/lib/kontena/cli/services/update_command.rb +7 -5
  80. data/lib/kontena/cli/spinner.rb +99 -37
  81. data/lib/kontena/cli/stacks/common.rb +2 -4
  82. data/lib/kontena/cli/vault/remove_command.rb +3 -1
  83. data/lib/kontena/cli/vault/update_command.rb +4 -2
  84. data/lib/kontena/cli/vault/write_command.rb +4 -2
  85. data/lib/kontena/cli/vpn/create_command.rb +26 -10
  86. data/lib/kontena/cli/vpn/delete_command.rb +1 -1
  87. data/lib/kontena/cli/vpn/remove_command.rb +6 -4
  88. data/lib/kontena/client.rb +13 -5
  89. data/lib/kontena/errors.rb +3 -1
  90. data/lib/kontena_cli.rb +1 -1
  91. data/spec/fixtures/kontena-malformed-yaml.yml +6 -0
  92. data/spec/fixtures/kontena-not-hash-service-config.yml +3 -0
  93. data/spec/kontena/cli/app/docker_helper_spec.rb +2 -2
  94. data/spec/kontena/cli/app/yaml/reader_spec.rb +48 -0
  95. data/spec/kontena/cli/cloud/logout_command_spec.rb +37 -0
  96. data/spec/kontena/cli/common_spec.rb +46 -1
  97. data/spec/kontena/cli/grids/trusted_subnets/remove_command_spec.rb +3 -3
  98. data/spec/kontena/cli/master/logout_command_spec.rb +85 -0
  99. data/spec/kontena/cli/master/use_command_spec.rb +4 -0
  100. metadata +12 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 24c6e241c38b9d4dece50e6d97443dc68d7a4e38
4
- data.tar.gz: 9fdd643f7b747b5898d1d40a651f98dba8b216aa
3
+ metadata.gz: 35b0390bffba7709f3efa1c42838fa47483991e5
4
+ data.tar.gz: 1dc946fc0f3b3e498df9b3a8a766edf7d38ca0ed
5
5
  SHA512:
6
- metadata.gz: 185b33efb5684e45c185af579c6c777a824fdb0a04db46f48dc470f1ba1c57577fa9cbc2a797c853913e07ec9b18708ef92a86ca6f8305c5fc7dc0e61b2611c4
7
- data.tar.gz: 2278e96ea747b84bea482dc92b62dbdd799f890067978881084aa2b1cd77a7af4713cbffb27fc3f8545b81d6e3fa1a158fb5255550287ff529c62d08cc647984
6
+ metadata.gz: 4bf3bda5f481fb4648465cb0fb687fc59341557bf94c78dbb20773fa9fc7ff889c891cab3063f81100a5f00986fd1cebe2847914c1c34f00962563cba2d59101
7
+ data.tar.gz: a3c18982f577d7cdc29d08d93c963a41414dbc770af349d97cc43f7d2c434f2958c5bade13ef8e6768073de63cebd87e193ebff84dd0ff11f4beac616c5d1389
data/Dockerfile CHANGED
@@ -9,9 +9,12 @@ RUN apk update && \
9
9
  ca-certificates libssl1.0 openssl libstdc++ && \
10
10
  gem install kontena-cli --no-rdoc --no-ri -v ${CLI_VERSION} && \
11
11
  adduser kontena -D -h /home/kontena -s /bin/sh && \
12
+ echo "gem: --user-install" > /home/kontena/.gemrc && \
12
13
  chown -R kontena.kontena /home/kontena && \
13
14
  chmod +sx /usr/local/bin/docker
14
15
 
16
+ ENV PATH=$PATH:/home/kontena/.gem/ruby/2.3.0/bin
17
+
15
18
  VOLUME ["/home/kontena"]
16
19
  WORKDIR /home/kontena
17
20
  USER kontena
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.16.0.pre5
1
+ 0.16.0.pre6
data/bin/kontena CHANGED
@@ -25,10 +25,11 @@ rescue Excon::Errors::SocketError => exc
25
25
  end
26
26
  rescue Kontena::Errors::StandardError => exc
27
27
  raise exc if ENV['DEBUG']
28
- abort(exc.message)
28
+ puts " [#{Kontena.pastel.red('error')}] #{exc.message}"
29
+ exit 1
29
30
  rescue => exc
30
31
  raise exc if ENV['DEBUG']
31
- $stderr.puts "Kontena error: #{exc.message}"
32
- $stderr.puts "Rerun the command with environment DEBUG=true set to get the full exception"
32
+ $stderr.puts " [#{Kontena.pastel.red('error')}] #{exc.message}"
33
+ $stderr.puts " Rerun the command with environment DEBUG=true set to get the full exception"
33
34
  abort
34
35
  end
@@ -53,7 +53,7 @@ module Kontena
53
53
  if master_id.to_s =~ /^[0-9a-f]{16,32}$/
54
54
  master_id
55
55
  else
56
- abort 'Cloud Master registration failed'
56
+ exit_with_error 'Cloud Master registration failed'
57
57
  end
58
58
  end
59
59
 
@@ -104,5 +104,3 @@ module Kontena
104
104
  end
105
105
  end
106
106
  end
107
-
108
-
@@ -33,7 +33,7 @@ module Kontena
33
33
  ENV["DEBUG"] && puts("Trying to request / from #{new_master.url}")
34
34
  client = Kontena::Client.new(new_master.url, nil, ignore_ssl_errors: true)
35
35
  client.get('/')
36
- rescue
36
+ rescue
37
37
  ENV["DEBUG"] && puts("HTTPS test failed: #{$!} #{$!.message}")
38
38
  unless retried
39
39
  new_master.url = "http://#{command.result[:public_ip]}"
@@ -13,14 +13,7 @@ module Kontena
13
13
 
14
14
  cmd = "grid create --silent test"
15
15
  ENV["DEBUG"] && puts("Running: #{cmd}")
16
-
17
- spinner "Creating initial grid 'test'" do
18
- Kontena.run(cmd)
19
- end
20
-
21
- spinner "Selecting 'test' as current grid" do
22
- Kontena.run("grid use --silent test")
23
- end
16
+ Kontena.run(cmd)
24
17
  end
25
18
  end
26
19
  end
@@ -15,7 +15,7 @@ module Kontena
15
15
  puts "Protip:"
16
16
  puts " You are currently using Kontena Master administrator account."
17
17
  puts " Consider inviting yourself as a regular user. Use: "
18
- puts " kontena master users invite -r master_admin your@email.address.example.com"
18
+ puts " kontena master users invite --roles master_admin your@email.address.example.com"
19
19
  puts " kontena master join <master_url> <invite_code>"
20
20
  puts
21
21
  end
@@ -18,7 +18,8 @@ module Kontena::Cli::Apps
18
18
  require_config_file(filename)
19
19
  @services = services_from_yaml(filename, service_list, service_prefix)
20
20
  if services.none?{ |name, service| service['build'] }
21
- abort 'Not found any service with build option'.colorize(:red)
21
+ error 'Not found any service with build option'
22
+ abort
22
23
  end
23
24
  process_docker_images(services, true, no_cache?)
24
25
  end
@@ -9,7 +9,7 @@ module Kontena::Cli::Apps
9
9
  include Kontena::Cli::Services::ServicesHelper
10
10
 
11
11
  def require_config_file(filename)
12
- abort("File #{filename} does not exist") unless File.exists?(filename)
12
+ exit_with_error("File #{filename} does not exist") unless File.exists?(filename)
13
13
  end
14
14
 
15
15
  # @param [String] filename
@@ -39,7 +39,7 @@ module Kontena::Cli::Apps
39
39
  generator_klass = ServiceGenerator
40
40
  end
41
41
  yaml_services.each do |service_name, config|
42
- abort("Image is missing for #{service_name}. Aborting.") unless config['image']
42
+ exit_with_error("Image is missing for #{service_name}. Aborting.") unless config['image']
43
43
  services[service_name] = generator_klass.new(config).generate
44
44
  end
45
45
  services
@@ -62,12 +62,7 @@ module Kontena::Cli::Apps
62
62
 
63
63
  def project_name_from_yaml(file)
64
64
  reader = YAML::Reader.new(file, true)
65
- outcome = reader.execute
66
- if outcome[:version].to_i == 2
67
- outcome[:name]
68
- else
69
- nil
70
- end
65
+ reader.stack_name
71
66
  end
72
67
 
73
68
  # @return [String]
@@ -13,7 +13,8 @@ module Kontena::Cli::Apps
13
13
  option ['--no-build'], :flag, 'Don\'t build an image, even if it\'s missing', default: false
14
14
  option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
15
15
  option '--async', :flag, 'Run deploys async/parallel'
16
- option '--force-deploy', :flag, 'Force deploy even if service does not have any changes'
16
+ option '--force', :flag, 'Force deploy even if service does not have any changes'
17
+ option '--force-deploy', :flag, '[DEPRECATED: use --force]'
17
18
 
18
19
  parameter "[SERVICE] ...", "Services to start"
19
20
 
@@ -44,13 +45,15 @@ module Kontena::Cli::Apps
44
45
  queue.each do |service|
45
46
  name = service['id'].split('/').last
46
47
  options = {}
47
- options[:force] = true if force_deploy?
48
- deploy_service(token, name, options)
49
- print "deploying #{unprefixed_name(name).colorize(:cyan)}"
50
- unless async?
51
- wait_for_deploy_to_finish(token, service['id'])
52
- else
53
- puts ''
48
+ options[:force] = true if force? || force_deploy? # deprecated
49
+ if force_deploy?
50
+ warning " --force-deploy will deprecate in the future, use --force"
51
+ end
52
+ spinner "Deploying #{unprefixed_name(name).colorize(:cyan)} " do
53
+ deploy_service(token, name, options)
54
+ unless async?
55
+ wait_for_deploy_to_finish(token, service['id'])
56
+ end
54
57
  end
55
58
  end
56
59
  end
@@ -90,19 +93,24 @@ module Kontena::Cli::Apps
90
93
  # @param [String] name
91
94
  # @param [Hash] options
92
95
  def create(name, options)
93
- puts "creating #{name.colorize(:cyan)}"
94
- name = prefixed_name(name)
95
- data = { 'name' => name }
96
+ data = { 'name' => prefixed_name(name) }
96
97
  data.merge!(options)
97
- create_service(token, current_grid, data)
98
+ result = nil
99
+ spinner "Creating #{name.colorize(:cyan)} " do
100
+ result = create_service(token, current_grid, data)
101
+ end
102
+ result
98
103
  end
99
104
 
100
- # @param [String] id
105
+ # @param [String] name
101
106
  # @param [Hash] options
102
- def update(id, options)
103
- puts "updating #{id.colorize(:cyan)}"
104
- id = prefixed_name(id)
105
- update_service(token, id, options)
107
+ def update(name, options)
108
+ prefixed_name = prefixed_name(name)
109
+ result = nil
110
+ spinner "Updating #{name.colorize(:cyan)} " do
111
+ result = update_service(token, prefixed_name, options)
112
+ end
113
+ result
106
114
  end
107
115
 
108
116
  # @param [String] name
@@ -8,8 +8,8 @@ module Kontena::Cli::Apps
8
8
  services.each do |name, service|
9
9
  if service['build'] && (!image_exist?(service['image']) || force_build)
10
10
  dockerfile = service['build']['dockerfile'] || 'Dockerfile'
11
- abort("'#{service['image']}' is not valid Docker image name") unless validate_image_name(service['image'])
12
- abort("'#{service['build']['context']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build']['context'], dockerfile)
11
+ raise ("'#{service['image']}' is not valid Docker image name") unless validate_image_name(service['image'])
12
+ raise ("'#{service['build']['context']}' does not have #{dockerfile}") unless dockerfile_exist?(service['build']['context'], dockerfile)
13
13
  if service['hooks'] && service['hooks']['pre_build']
14
14
  puts "Running pre_build hook".colorize(:cyan)
15
15
  run_pre_build_hook(service['hooks']['pre_build'])
@@ -43,7 +43,7 @@ module Kontena::Cli::Apps
43
43
  end
44
44
  cmd << build_context
45
45
  ret = system(cmd.join(' '))
46
- abort("Failed to build image #{service['image'].colorize(:cyan)}") unless ret
46
+ raise ("Failed to build image #{service['image'].colorize(:cyan)}") unless ret
47
47
  ret
48
48
  end
49
49
 
@@ -51,7 +51,7 @@ module Kontena::Cli::Apps
51
51
  # @return [Integer]
52
52
  def push_docker_image(image)
53
53
  ret = system("docker push #{image}")
54
- abort("Failed to push image #{image.colorize(:cyan)}") unless ret
54
+ raise ("Failed to push image #{image.colorize(:cyan)}") unless ret
55
55
  ret
56
56
  end
57
57
 
@@ -73,7 +73,7 @@ module Kontena::Cli::Apps
73
73
  def run_pre_build_hook(hook)
74
74
  hook.each do |h|
75
75
  ret = system(h['cmd'])
76
- abort("Failed to run pre_build hook: #{h['name']}!".colorize(:red)) unless ret
76
+ raise ("Failed to run pre_build hook: #{h['name']}!") unless ret
77
77
  end
78
78
  end
79
79
  end
@@ -78,8 +78,10 @@ module Kontena::Cli::Apps
78
78
 
79
79
  def colors
80
80
  if(@colors.nil? || @colors.size == 0)
81
- @colors = [:green, :magenta, :yellow, :cyan, :red,
82
- :light_green, :light_yellow, :ligh_magenta, :light_cyan, :light_red]
81
+ @colors = %i(
82
+ red green yellow blue magenta cyan bright_red bright_green
83
+ bright_yellow bright_blue bright_magenta bright_cyan
84
+ )
83
85
  end
84
86
  @colors
85
87
  end
@@ -29,6 +29,7 @@ module Kontena::Cli::Apps
29
29
  end
30
30
 
31
31
  private
32
+
32
33
  def remove_services(services)
33
34
  services.find_all {|service_name, options| options['links'] && options['links'].size > 0 }.each do |service_name, options|
34
35
  delete(service_name, options, false)
@@ -41,17 +42,17 @@ module Kontena::Cli::Apps
41
42
 
42
43
  def delete(name, options, async = true)
43
44
  unless deleted_services.include?(name)
44
- spinner "deleting #{name.colorize(:cyan)}" do
45
- service = get_service(token, prefixed_name(name)) rescue nil
46
- if(service)
45
+ service = get_service(token, prefixed_name(name)) rescue nil
46
+ if(service)
47
+ spinner "removing #{pastel.cyan(name)}" do
47
48
  delete_service(token, prefixed_name(name))
48
49
  unless async
49
50
  wait_for_delete_to_finish(service)
50
51
  end
51
- deleted_services << name
52
- else
53
- puts "No such service: #{name}".colorize(:red)
54
52
  end
53
+ deleted_services << name
54
+ else
55
+ warning "No such service #{name}"
55
56
  end
56
57
  end
57
58
  end
@@ -63,7 +64,6 @@ module Kontena::Cli::Apps
63
64
  end
64
65
  end
65
66
 
66
-
67
67
  ##
68
68
  #
69
69
  # @return [Array]
@@ -27,10 +27,11 @@ module Kontena::Cli::Apps
27
27
  def restart_services(services)
28
28
  services.each do |service_name, opts|
29
29
  if service_exists?(service_name)
30
- puts "restarting #{prefixed_name(service_name)}"
31
- restart_service(token, prefixed_name(service_name))
30
+ spinner "Sending restart signal to #{service_name.colorize(:cyan)} " do
31
+ restart_service(token, prefixed_name(service_name))
32
+ end
32
33
  else
33
- puts "No such service: #{service_name}".colorize(:red)
34
+ warning "No such service: #{service_name}"
34
35
  end
35
36
  end
36
37
  end
@@ -19,13 +19,15 @@ module Kontena::Cli::Apps
19
19
  yml_service = services_from_yaml(filename, [service], service_prefix)
20
20
  if yml_service[service]
21
21
  options = yml_service[service]
22
- abort("Service has already instances defined in #{filename}. Please update #{filename} and deploy service instead") if options['container_count']
23
- scale_service(require_token, prefixed_name(service), instances)
22
+ exit_with_error("Service has already instances defined in #{filename}. Please update #{filename} and deploy service instead") if options['container_count']
23
+ spinner "Scaling #{service.colorize(:cyan)} " do
24
+ scale_service(require_token, prefixed_name(service), instances)
25
+ wait_for_deploy_to_finish(token, parse_service_id(prefixed_name(service)))
26
+ end
27
+
24
28
  else
25
- abort("Service not found")
29
+ exit_with_error("Service not found")
26
30
  end
27
31
  end
28
-
29
-
30
32
  end
31
33
  end
@@ -28,10 +28,11 @@ module Kontena::Cli::Apps
28
28
  def start_services(services)
29
29
  services.each do |service_name, opts|
30
30
  if service_exists?(service_name)
31
- puts "starting #{prefixed_name(service_name)}"
32
- start_service(token, prefixed_name(service_name))
31
+ spinner "Starting #{service_name.colorize(:cyan)} " do
32
+ start_service(token, prefixed_name(service_name))
33
+ end
33
34
  else
34
- puts "No such service: #{service_name}".colorize(:red)
35
+ warning "No such service: #{service_name}"
35
36
  end
36
37
  end
37
38
  end
@@ -28,10 +28,11 @@ module Kontena::Cli::Apps
28
28
  def stop_services(services)
29
29
  services.each do |service_name, opts|
30
30
  if service_exists?(service_name)
31
- puts "stopping #{prefixed_name(service_name)}"
32
- stop_service(token, prefixed_name(service_name))
31
+ spinner "Sending stop signal to #{service_name.colorize(:cyan)} " do
32
+ stop_service(token, prefixed_name(service_name))
33
+ end
33
34
  else
34
- puts "No such service: #{service_name}".colorize(:red)
35
+ warning "No such service: #{service_name}"
35
36
  end
36
37
  end
37
38
  end
@@ -27,13 +27,17 @@ module Kontena::Cli::Apps
27
27
  Dir.chdir(File.dirname(File.expand_path(file))) do
28
28
  result[:version] = yaml['version'] || '1'
29
29
  result[:name] = yaml['name']
30
- result[:services] = parse_services(service_name)
31
30
  result[:errors] = errors
32
31
  result[:notifications] = notifications
32
+ result[:services] = parse_services(service_name) unless errors.count > 0
33
33
  end
34
34
  result
35
35
  end
36
36
 
37
+ def stack_name
38
+ yaml['name'] if v2?
39
+ end
40
+
37
41
  ##
38
42
  # @return [true|false]
39
43
  def v2?
@@ -47,7 +51,11 @@ module Kontena::Cli::Apps
47
51
  content = content % { project: ENV['project'], grid: ENV['grid'] }
48
52
  interpolate(content)
49
53
  replace_dollar_dollars(content)
50
- @yaml = ::YAML.load(content)
54
+ begin
55
+ @yaml = ::YAML.load(content)
56
+ rescue Psych::SyntaxError => e
57
+ raise "Error while parsing #{file}".colorize(:red)+ " "+e.message
58
+ end
51
59
  end
52
60
 
53
61
  # @return [Array] array of validation errors
@@ -80,10 +88,12 @@ module Kontena::Cli::Apps
80
88
  # @return [Hash]
81
89
  def parse_services(service_name = nil)
82
90
  if service_name.nil?
83
- services.each { |name, config| services[name] = process_config(config) }
91
+ services.each do |name, config|
92
+ services[name] = process_config(config)
93
+ end
84
94
  services
85
95
  else
86
- abort("Service '#{service_name}' not found in #{file}".colorize(:red)) unless services.key?(service_name)
96
+ raise ("Service '#{service_name}' not found in #{file}") unless services.key?(service_name)
87
97
  process_config(services[service_name])
88
98
  end
89
99
  end
@@ -132,7 +142,7 @@ module Kontena::Cli::Apps
132
142
  if filename
133
143
  parent_config = from_external_file(filename, extended_service)
134
144
  else
135
- abort("Service '#{extended_service}' not found in #{file}".colorize(:red)) unless services.key?(extended_service)
145
+ raise ("Service '#{extended_service}' not found in #{file}") unless services.key?(extended_service)
136
146
  parent_config = process_config(services[extended_service])
137
147
  end
138
148
  ServiceExtender.new(service_config).extend(parent_config)
@@ -43,6 +43,10 @@ module Kontena::Cli::Apps
43
43
  }
44
44
 
45
45
  yaml.each do |service, options|
46
+ unless options.is_a?(Hash)
47
+ result[:errors] << { service => { 'options' => 'must be a mapping not a string'} }
48
+ next
49
+ end
46
50
  key_errors = validate_keys(options)
47
51
  option_errors = validate_options(options)
48
52
  result[:errors] << { service => option_errors.messages } if option_errors.failure?
@@ -53,7 +53,11 @@ module Kontena::Cli::Apps
53
53
  notifications: []
54
54
  }
55
55
  if yaml.key?('services')
56
- yaml['services'].each do |service, options|
56
+ yaml['services'].each do |service, options|
57
+ unless options.is_a?(Hash)
58
+ result[:errors] << { service => { 'options' => 'must be a mapping not a string'} }
59
+ next
60
+ end
57
61
  key_errors = validate_keys(options)
58
62
  option_errors = validate_options(options)
59
63
  result[:errors] << { service => option_errors.messages } if option_errors.failure?