kontena-cli 0.16.0.pre5 → 0.16.0.pre6

Sign up to get free protection for your applications and to get access to all the features.
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?