kontena-cli 0.16.0.pre7 → 0.16.0.pre8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/kontena-cli.gemspec +2 -5
  4. data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +15 -21
  5. data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +5 -3
  6. data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +3 -1
  7. data/lib/kontena/callbacks/master/deploy/60_configure_auth_provider_after_deploy.rb +7 -18
  8. data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +93 -0
  9. data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +33 -0
  10. data/lib/kontena/cli/apps/build_command.rb +2 -1
  11. data/lib/kontena/cli/apps/common.rb +3 -2
  12. data/lib/kontena/cli/apps/config_command.rb +3 -3
  13. data/lib/kontena/cli/apps/deploy_command.rb +1 -0
  14. data/lib/kontena/cli/apps/docker_helper.rb +7 -7
  15. data/lib/kontena/cli/apps/list_command.rb +1 -1
  16. data/lib/kontena/cli/apps/logs_command.rb +1 -1
  17. data/lib/kontena/cli/apps/monitor_command.rb +2 -2
  18. data/lib/kontena/cli/apps/remove_command.rb +1 -1
  19. data/lib/kontena/cli/apps/restart_command.rb +1 -1
  20. data/lib/kontena/cli/apps/scale_command.rb +1 -1
  21. data/lib/kontena/cli/apps/start_command.rb +1 -1
  22. data/lib/kontena/cli/apps/stop_command.rb +1 -1
  23. data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +19 -0
  24. data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +22 -0
  25. data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +21 -0
  26. data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +54 -0
  27. data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +22 -0
  28. data/lib/kontena/cli/apps/yaml/validations.rb +60 -90
  29. data/lib/kontena/cli/apps/yaml/validator.rb +9 -31
  30. data/lib/kontena/cli/apps/yaml/validator_v2.rb +13 -40
  31. data/lib/kontena/cli/cloud/login_command.rb +2 -2
  32. data/lib/kontena/cli/cloud/master/add_command.rb +114 -34
  33. data/lib/kontena/cli/cloud/master/list_command.rb +5 -2
  34. data/lib/kontena/cli/cloud/master/remove_command.rb +69 -0
  35. data/lib/kontena/cli/cloud/master_command.rb +2 -2
  36. data/lib/kontena/cli/common.rb +10 -17
  37. data/lib/kontena/cli/config.rb +4 -3
  38. data/lib/kontena/cli/grids/env_command.rb +5 -5
  39. data/lib/kontena/cli/localhost_web_server.rb +1 -1
  40. data/lib/kontena/cli/master/init_cloud_command.rb +21 -0
  41. data/lib/kontena/cli/master/login_command.rb +28 -29
  42. data/lib/kontena/cli/master/remove_command.rb +58 -0
  43. data/lib/kontena/cli/master/token/create_command.rb +6 -0
  44. data/lib/kontena/cli/master/users/invite_command.rb +4 -1
  45. data/lib/kontena/cli/master/users/roles/add_command.rb +4 -3
  46. data/lib/kontena/cli/master_command.rb +8 -9
  47. data/lib/kontena/cli/services/list_command.rb +3 -2
  48. data/lib/kontena/cli/services/services_helper.rb +1 -1
  49. data/lib/kontena/client.rb +31 -47
  50. data/lib/kontena/presets/kontena_auth_provider.yml +2 -2
  51. data/lib/kontena_cli.rb +12 -0
  52. data/spec/kontena/cli/app/docker_helper_spec.rb +9 -4
  53. data/spec/kontena/cli/app/yaml/validator_spec.rb +66 -71
  54. data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +51 -58
  55. metadata +25 -59
  56. data/lib/kontena/callbacks/master/deploy/90_suggest_inviting_yourself_after_deploy.rb +0 -24
  57. data/lib/kontena/cli/cloud/master/delete_command.rb +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d4aed1a465c25c662ace1bc38e6de0a8a6ccdca
4
- data.tar.gz: c000e53d82c7aa42fe5d12a187dcdaa39f6d75e3
3
+ metadata.gz: 549a20ff35d02d49d04d5589b5f5186b72de7ed6
4
+ data.tar.gz: e18b7450099a72993f8569ce271aaa72c5a3bf84
5
5
  SHA512:
6
- metadata.gz: 34c99fe148e3d789cf87462b22dd33f1f74f9cb91c5bffd092854d8967add751307d20d39f196a8aa78dcb6aaa785eb2e01f7c9bef55793276dbacc1285c1828
7
- data.tar.gz: 911f92be23c389ef095ddb579acd3f778d275eda7073be1422fb2404bf072b8e0d3e7cee7b32060f16a63cc2e1fc2004e0a49bc4853cfdbb978cd9da0479d3d1
6
+ metadata.gz: ffe9ff495c0eab3b8e7076b429a24916a6c2f8fd459f2bb6142b50f97e4f52b54fa52342c1b80d117975653c6d39e3ec5f4e7a60c0f9479019fd6cd613a06410
7
+ data.tar.gz: aeb28936bece1fe439c6d57d1293cf94a922f8d9bf741e982872f5db44b14a3bcc1e532fc463c8ed9c200100cf32fdfa7fb4fcf737e81c6cf93f177bdb43318c
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.16.0.pre7
1
+ 0.16.0.pre8
data/kontena-cli.gemspec CHANGED
@@ -26,10 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.add_runtime_dependency "tty-prompt", "~> 0.7.1"
27
27
  spec.add_runtime_dependency "clamp", "~> 1.0.0"
28
28
  spec.add_runtime_dependency "ruby_dig", "~> 0.0.2"
29
- spec.add_runtime_dependency "dry-validation", "0.8.0"
30
- spec.add_runtime_dependency "dry-types", "0.8.0"
31
- spec.add_runtime_dependency "dry-configurable", "0.1.6"
32
- spec.add_runtime_dependency "dry-monads", "0.1.1"
33
- spec.add_runtime_dependency "dry-logic", "0.3.0"
34
29
  spec.add_runtime_dependency "launchy", "~> 2.4.3"
30
+ spec.add_runtime_dependency "hash_validator", "~> 0.7.0"
31
+ spec.add_runtime_dependency "retriable", "~> 2.1.0"
35
32
  end
@@ -10,6 +10,7 @@ module Kontena
10
10
  command.class_eval do
11
11
  option ['--no-prompt'], :flag, "Don't ask questions"
12
12
  option ['--skip-auth-provider'], :flag, "Skip auth provider configuration (single user mode)"
13
+ option ['--use-kontena-cloud'], :flag, "Use Kontena Cloud as authentication provider"
13
14
  option ['--cloud-master-id'], '[ID]', "Use Kontena Cloud Master ID for auth provider configuration"
14
15
  end
15
16
  end
@@ -32,34 +33,30 @@ module Kontena
32
33
  end
33
34
 
34
35
  def login_to_kontena
35
- if kontena_auth?
36
+ if cloud_auth?
36
37
  return true if cloud_client.authentication_ok?(kontena_account.userinfo_endpoint)
37
38
  end
38
39
  puts
39
40
  puts "You don't seem to be logged in to Kontena Cloud"
40
41
  puts
41
42
  Kontena.run("cloud login --verbose")
42
- cloud_client.authentication_ok?(kontena_account.userinfo_endpoint)
43
- end
44
-
45
- def create_cloud_master
46
- master_id = nil
47
- begin
48
- spinner "Registering a new master '#{command.name}' to Kontena Cloud" do
49
- master_id = Kontena.run("cloud master add --return #{command.name}", returning: :result)
50
- end
51
- rescue SystemExit
52
- end
53
- if master_id.to_s =~ /^[0-9a-f]{16,32}$/
54
- master_id
55
- else
56
- exit_with_error 'Cloud Master registration failed'
43
+ Retriable.retriable do
44
+ cloud_client.authentication_ok?(kontena_account.userinfo_endpoint)
57
45
  end
58
46
  end
59
47
 
60
48
  def before
61
49
  unless_param(:name) do
62
- if command.no_prompt?
50
+ if command.cloud_master_id
51
+ response = spinner "Receiving Master information from Kontena Cloud" do
52
+ cloud_client.get("user/masters/#{command.cloud_master_id}")
53
+ end
54
+ if response.kind_of?(Hash) && response.has_key?('data')
55
+ command.name = response['data']['attributes']['name']
56
+ else
57
+ exit_with_error "Unable to receive Master information using id"
58
+ end
59
+ elsif command.no_prompt?
63
60
  command.name = next_default_name
64
61
  else
65
62
  command.name = prompt.ask("Enter a name for this Kontena Master: ", default: next_default_name, required: true) do |q|
@@ -69,9 +66,7 @@ module Kontena
69
66
  end
70
67
 
71
68
  unless_param(:skip_auth_provider) do
72
- if command.no_prompt?
73
- command.cloud_master_id ||= create_cloud_master
74
- elsif command.cloud_master_id.nil?
69
+ unless command.no_prompt? || command.use_kontena_cloud? || command.cloud_master_id
75
70
  answer = prompt.select("Select OAuth2 authentication provider: ") do |menu|
76
71
  menu.choice 'Kontena Cloud (recommended)', :kontena_new
77
72
  menu.choice 'Custom', :custom
@@ -80,7 +75,6 @@ module Kontena
80
75
  case answer
81
76
  when :kontena_new
82
77
  login_to_kontena || abort('You must login to Kontena Cloud')
83
- command.cloud_master_id = create_cloud_master
84
78
  command.skip_auth_provider = false
85
79
  when :custom
86
80
  puts
@@ -44,9 +44,11 @@ module Kontena
44
44
  end
45
45
 
46
46
  require 'shellwords'
47
- cmd = "master login --skip-grid-auto-select --verbose --name #{command.result[:name].shellescape} --code #{command.result[:code].shellescape} #{new_master.url.shellescape}"
48
- ENV["DEBUG"] && puts("Running: #{cmd}")
49
- Kontena.run(cmd)
47
+ cmd = "master login --no-login-info --skip-grid-auto-select --verbose --name #{command.result[:name].shellescape} --code #{command.result[:code].shellescape} #{new_master.url.shellescape}"
48
+ Retriable.retriable do
49
+ ENV["DEBUG"] && puts("Running: #{cmd}")
50
+ Kontena.run(cmd)
51
+ end
50
52
  end
51
53
  end
52
54
  end
@@ -13,7 +13,9 @@ module Kontena
13
13
 
14
14
  cmd = "grid create --silent test"
15
15
  ENV["DEBUG"] && puts("Running: #{cmd}")
16
- Kontena.run(cmd)
16
+ Retriable.retriable do
17
+ Kontena.run(cmd)
18
+ end
17
19
  end
18
20
  end
19
21
  end
@@ -6,22 +6,12 @@ module Kontena
6
6
 
7
7
  matches_commands 'master create'
8
8
 
9
- def get_oauth_app_config(master_id)
10
- attrs = nil
11
- spinner "Retrieving master OAuth2 application settings from Kontena Cloud" do
12
- attrs = cloud_client.get("user/masters/#{master_id}")["data"]["attributes"]
13
- end
14
- attrs
15
- rescue
16
- nil
9
+ def configure_auth_provider_using_id(cloud_id)
10
+ Kontena.run("master init-cloud --force --cloud-master-id #{cloud_id.shellescape}")
17
11
  end
18
12
 
19
- def configure_auth_provider(oauth_config)
20
- require 'shellwords'
21
- spinner "Setting Kontena Cloud authentication provider settings to Master config" do
22
- Kontena.run("master config import --force --preset kontena_auth_provider")
23
- Kontena.run("master config set oauth2.client_id=#{oauth_config['client-id'].shellescape} oauth2.client_secret=#{oauth_config['client-secret'].shellescape} server.root_url=#{config.current_master.url.shellescape}")
24
- end
13
+ def configure_auth_provider
14
+ Kontena.run("master init-cloud --force")
25
15
  end
26
16
 
27
17
  def after
@@ -35,10 +25,9 @@ module Kontena
35
25
  end
36
26
 
37
27
  if command.respond_to?(:cloud_master_id) && command.cloud_master_id
38
- oauth_config = get_oauth_app_config(command.cloud_master_id)
39
- if oauth_config
40
- configure_auth_provider(oauth_config)
41
- end
28
+ configure_auth_provider_using_id(command.cloud_master_id)
29
+ else
30
+ configure_auth_provider
42
31
  end
43
32
  end
44
33
  end
@@ -0,0 +1,93 @@
1
+ module Kontena
2
+ module Callbacks
3
+ class InviteSelfAfterDeploy < Kontena::Callback
4
+
5
+ include Kontena::Cli::Common
6
+
7
+ matches_commands 'master create'
8
+
9
+ def cloud_user_data
10
+ return @cloud_user_data if @cloud_user_data
11
+ return nil unless cloud_auth?
12
+ user_data = {}
13
+ response = nil
14
+ spinner "Retrieving user information from Kontena Cloud" do
15
+ response = cloud_client.get(kontena_account.userinfo_endpoint)
16
+ end
17
+ if response && response.kind_of?(Hash) && response.has_key?('data') && response['data'].has_key?('attributes')
18
+ user_data[:email] = response['data']['attributes']['email']
19
+ user_data[:username] = response['data']['attributes']['username']
20
+ user_data[:verified] = response['data']['attributes']['verified']
21
+ @cloud_user_data = user_data
22
+ end
23
+ @cloud_user_data
24
+ end
25
+
26
+ def after
27
+ return unless current_master
28
+ return unless command.exit_code == 0
29
+ return unless current_master.username.to_s == 'admin'
30
+ return nil if command.skip_auth_provider?
31
+ return nil unless cloud_user_data
32
+
33
+ invite_response = nil
34
+ spinner "Creating user #{cloud_user_data[:email]} into Kontena Master" do |spin|
35
+ invite_response = Kontena.run("master users invite --return #{cloud_user_data[:email].shellescape}", returning: :result)
36
+ unless invite_response.kind_of?(Hash) && invite_response.has_key?('invite_code')
37
+ spin.fail
38
+ end
39
+ end
40
+
41
+ return nil unless invite_response
42
+ ENV["DEBUG"] && puts("Got invite code: #{invite_response['invite_code']}")
43
+
44
+ role_status = nil
45
+
46
+ spinner "Adding master_admin role for #{cloud_user_data[:email]}" do |spin|
47
+ role_status = Kontena.run("master users role add --silent master_admin #{cloud_user_data[:email].shellescape}")
48
+ spin.fail if role_status.to_i > 0
49
+ end
50
+
51
+ return nil if role_status.to_i > 0
52
+
53
+ new_user_token = nil
54
+ spinner "Creating an access token for #{cloud_user_data[:email]}" do |spin|
55
+ new_user_token = Kontena.run("master token create -e 0 -s user --return -u #{cloud_user_data[:email].shellescape}", returning: :result)
56
+ end
57
+
58
+ master_name = current_master.name.dup
59
+ master_url = current_master.url
60
+ old_master = current_master
61
+
62
+ spinner "Copying server '#{current_master.name}' to '#{current_master.name}-admin' in configuration" do
63
+ config.servers << Kontena::Cli::Config::Server.new(
64
+ name: "#{current_master.name}-admin",
65
+ url: current_master.url,
66
+ username: 'admin',
67
+ grid: current_master.grid,
68
+ token: Kontena::Cli::Config::Token.new(
69
+ access_token: current_master.token.access_token,
70
+ refresh_token: current_master.token.refresh_token,
71
+ expires_at: current_master.token.expires_at,
72
+ parent_type: :master,
73
+ parent_name: "#{current_master.name}-admin"
74
+ ),
75
+ account: 'master'
76
+ )
77
+ end
78
+
79
+ spinner "Authenticating as #{cloud_user_data[:email]} to Kontena Master '#{current_master.name}'" do
80
+ current_master.token = Kontena::Cli::Config::Token.new(
81
+ access_token: new_user_token[:access_token],
82
+ refresh_token: new_user_token[:refresh_token],
83
+ expires_at: new_user_token[:expires_in].to_i > 0 ? Time.now.utc.to_i + new_user_token[:expires_in].to_i : nil,
84
+ parent_type: :master,
85
+ parent_name: "#{current_master.name}"
86
+ )
87
+ current_master.username = new_user_token[:user_name].to_s == "" ? new_user_token[:user_email] : new_user_token[:user_name]
88
+ config.write
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,33 @@
1
+ module Kontena
2
+ module Callbacks
3
+ class SuggestInvitingYourself < Kontena::Callback
4
+
5
+ include Kontena::Cli::Common
6
+
7
+ matches_commands 'master create'
8
+
9
+ def after
10
+ return unless current_master
11
+ return unless command.exit_code == 0
12
+ return if current_master.username.to_s == 'admin'
13
+
14
+ puts
15
+ puts Kontena.pastel.green("Protip:")
16
+
17
+ if config.find_server("#{current_master.name}-admin")
18
+ puts " You are currently using the Kontena Master '#{Kontena.pastel.yellow(current_master.name)}' as"
19
+ puts " #{Kontena.pastel.yellow(current_master.username)}. To switch to the Kontena Master internal"
20
+ puts " administrator you can use:"
21
+ puts " #{Kontena.pastel.green.on_black(" kontena master use #{current_master.name}-admin ")}"
22
+ puts
23
+ end
24
+ puts " To invite more users you can use:"
25
+ puts " #{Kontena.pastel.green.on_black(" kontena master users invite email_address@example.com ")}"
26
+ puts
27
+ puts " The users can then join the master by using the invite code: "
28
+ puts " #{Kontena.pastel.green.on_black(" kontena master join #{current_master.url} <invite_code> ")}"
29
+ puts
30
+ end
31
+ end
32
+ end
33
+ end
@@ -10,13 +10,14 @@ module Kontena::Cli::Apps
10
10
  option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
11
11
  option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
12
12
  option ['--no-cache'], :flag, 'Do not use cache when building the image', default: false
13
+ option '--skip-validation', :flag, 'Skip YAML file validation', default: false
13
14
  parameter "[SERVICE] ...", "Services to build"
14
15
 
15
16
  attr_reader :services
16
17
 
17
18
  def execute
18
19
  require_config_file(filename)
19
- @services = services_from_yaml(filename, service_list, service_prefix)
20
+ @services = services_from_yaml(filename, service_list, service_prefix, skip_validation?)
20
21
  if services.none?{ |name, service| service['build'] }
21
22
  error 'Not found any service with build option'
22
23
  abort
@@ -15,10 +15,11 @@ module Kontena::Cli::Apps
15
15
  # @param [String] filename
16
16
  # @param [Array<String>] service_list
17
17
  # @param [String] prefix
18
+ # @param [TrueClass|FalseClass] skip_validation
18
19
  # @return [Hash]
19
- def services_from_yaml(filename, service_list, prefix)
20
+ def services_from_yaml(filename, service_list, prefix, skip_validation = false)
20
21
  set_env_variables(prefix, current_grid)
21
- reader = YAML::Reader.new(filename)
22
+ reader = YAML::Reader.new(filename, skip_validation)
22
23
  outcome = reader.execute
23
24
  hint_on_validation_notifications(outcome[:notifications]) if outcome[:notifications].size > 0
24
25
  abort_on_validation_errors(outcome[:errors]) if outcome[:errors].size > 0
@@ -3,17 +3,17 @@ require 'pp'
3
3
 
4
4
  module Kontena::Cli::Apps
5
5
  class ConfigCommand < Kontena::Command
6
- include Kontena::Cli::Common
6
+ include Kontena::Cli::Common
7
7
  include Common
8
8
 
9
9
  option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
10
10
  option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
11
-
11
+ option '--skip-validation', :flag, 'Skip YAML file validation', default: false
12
12
  parameter "[SERVICE] ...", "Services to view"
13
13
 
14
14
  def execute
15
15
  require_config_file(filename)
16
- services = services_from_yaml(filename, service_list, service_prefix)
16
+ services = services_from_yaml(filename, service_list, service_prefix, skip_validation?)
17
17
  services.each do |name, config|
18
18
  config['cmd'] = config['cmd'].join(" ") if config['cmd']
19
19
  config.delete_if {|key, value| value.nil? || (value.respond_to?(:empty?) && value.empty?) }
@@ -16,6 +16,7 @@ module Kontena::Cli::Apps
16
16
  option '--force', :flag, 'Force deploy even if service does not have any changes'
17
17
  option '--force-deploy', :flag, '[DEPRECATED: use --force]'
18
18
 
19
+ option '--skip-validation', :flag, 'Skip YAML file validation', default: false
19
20
  parameter "[SERVICE] ...", "Services to start"
20
21
 
21
22
  attr_reader :services, :deploy_queue
@@ -34,15 +34,15 @@ module Kontena::Cli::Apps
34
34
  def build_docker_image(service, no_cache = false)
35
35
  dockerfile = dockerfile = service['build']['dockerfile'] || 'Dockerfile'
36
36
  build_context = service['build']['context']
37
- cmd = ["docker build -t #{service['image']}"]
38
- cmd << "-f #{File.join(File.expand_path(build_context), dockerfile)}" if dockerfile != "Dockerfile"
39
- cmd << "--no-cache" if no_cache
37
+ cmd = ['docker', 'build', '-t', service['image']]
38
+ cmd << ['-f', File.join(File.expand_path(build_context), dockerfile)] if dockerfile != "Dockerfile"
39
+ cmd << '--no-cache' if no_cache
40
40
  args = service['build']['args'] || {}
41
41
  args.each do |k, v|
42
- cmd << "--build-arg #{k}=#{v}"
42
+ cmd << "--build-arg=#{k}=#{v}"
43
43
  end
44
44
  cmd << build_context
45
- ret = system(cmd.join(' '))
45
+ ret = system(*cmd.flatten)
46
46
  raise ("Failed to build image #{service['image'].colorize(:cyan)}") unless ret
47
47
  ret
48
48
  end
@@ -50,7 +50,7 @@ module Kontena::Cli::Apps
50
50
  # @param [String] image
51
51
  # @return [Integer]
52
52
  def push_docker_image(image)
53
- ret = system("docker push #{image}")
53
+ ret = system('docker', 'push', image)
54
54
  raise ("Failed to push image #{image.colorize(:cyan)}") unless ret
55
55
  ret
56
56
  end
@@ -58,7 +58,7 @@ module Kontena::Cli::Apps
58
58
  # @param [String] image
59
59
  # @return [Boolean]
60
60
  def image_exist?(image)
61
- `docker history #{image} 2>&1` ; $?.success?
61
+ system("docker history '#{image}' >/dev/null 2>/dev/null")
62
62
  end
63
63
 
64
64
  # @param [String] path
@@ -16,7 +16,7 @@ module Kontena::Cli::Apps
16
16
  def execute
17
17
  require_config_file(filename)
18
18
 
19
- @services = services_from_yaml(filename, service_list, service_prefix)
19
+ @services = services_from_yaml(filename, service_list, service_prefix, true)
20
20
  if services.size > 0
21
21
  show_services(services)
22
22
  elsif !service_list.empty?
@@ -16,7 +16,7 @@ module Kontena::Cli::Apps
16
16
  def execute
17
17
  require_config_file(filename)
18
18
 
19
- services = services_from_yaml(filename, service_list, service_prefix)
19
+ services = services_from_yaml(filename, service_list, service_prefix, true)
20
20
 
21
21
  if services.empty? && !service_list.empty?
22
22
  signal_error "No such service: #{service_list.join(', ')}"
@@ -15,8 +15,8 @@ module Kontena::Cli::Apps
15
15
 
16
16
  def execute
17
17
  require_config_file(filename)
18
-
19
- @services = services_from_yaml(filename, service_list, service_prefix)
18
+
19
+ @services = services_from_yaml(filename, service_list, service_prefix, true)
20
20
  if services.size > 0
21
21
  show_monitor(services)
22
22
  elsif !service_list.empty?
@@ -20,7 +20,7 @@ module Kontena::Cli::Apps
20
20
  require_config_file(filename)
21
21
  confirm unless forced?
22
22
 
23
- @services = services_from_yaml(filename, service_list, service_prefix)
23
+ @services = services_from_yaml(filename, service_list, service_prefix, true)
24
24
  if services.size > 0
25
25
  remove_services(services)
26
26
  elsif !service_list.empty?