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.
- checksums.yaml +4 -4
- data/Dockerfile +3 -0
- data/VERSION +1 -1
- data/bin/kontena +4 -3
- data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +1 -3
- data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +1 -1
- data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +1 -8
- data/lib/kontena/callbacks/master/deploy/90_suggest_inviting_yourself_after_deploy.rb +1 -1
- data/lib/kontena/cli/apps/build_command.rb +2 -1
- data/lib/kontena/cli/apps/common.rb +3 -8
- data/lib/kontena/cli/apps/deploy_command.rb +25 -17
- data/lib/kontena/cli/apps/docker_helper.rb +5 -5
- data/lib/kontena/cli/apps/monitor_command.rb +4 -2
- data/lib/kontena/cli/apps/remove_command.rb +7 -7
- data/lib/kontena/cli/apps/restart_command.rb +4 -3
- data/lib/kontena/cli/apps/scale_command.rb +7 -5
- data/lib/kontena/cli/apps/start_command.rb +4 -3
- data/lib/kontena/cli/apps/stop_command.rb +4 -3
- data/lib/kontena/cli/apps/yaml/reader.rb +15 -5
- data/lib/kontena/cli/apps/yaml/validator.rb +4 -0
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +5 -1
- data/lib/kontena/cli/cloud/login_command.rb +1 -1
- data/lib/kontena/cli/cloud/logout_command.rb +14 -0
- data/lib/kontena/cli/cloud/master/show_command.rb +0 -2
- data/lib/kontena/cli/cloud_command.rb +2 -0
- data/lib/kontena/cli/common.rb +98 -26
- data/lib/kontena/cli/containers/inspect_command.rb +1 -1
- data/lib/kontena/cli/etcd/get_command.rb +2 -2
- data/lib/kontena/cli/etcd/list_command.rb +2 -2
- data/lib/kontena/cli/etcd/mkdir_command.rb +1 -1
- data/lib/kontena/cli/etcd/remove_command.rb +1 -1
- data/lib/kontena/cli/etcd/set_command.rb +1 -1
- data/lib/kontena/cli/external_registries/add_command.rb +3 -1
- data/lib/kontena/cli/external_registries/delete_command.rb +1 -1
- data/lib/kontena/cli/external_registries/remove_command.rb +5 -1
- data/lib/kontena/cli/grids/cloud_config_command.rb +1 -1
- data/lib/kontena/cli/grids/create_command.rb +14 -6
- data/lib/kontena/cli/grids/current_command.rb +1 -1
- data/lib/kontena/cli/grids/env_command.rb +2 -2
- data/lib/kontena/cli/grids/list_command.rb +1 -1
- data/lib/kontena/cli/grids/remove_command.rb +6 -5
- data/lib/kontena/cli/grids/show_command.rb +2 -2
- data/lib/kontena/cli/grids/trusted_subnets/add_command.rb +3 -1
- data/lib/kontena/cli/grids/trusted_subnets/remove_command.rb +6 -2
- data/lib/kontena/cli/grids/use_command.rb +1 -1
- data/lib/kontena/cli/helpers/log_helper.rb +4 -2
- data/lib/kontena/cli/login_command.rb +1 -1
- data/lib/kontena/cli/logout_command.rb +3 -31
- data/lib/kontena/cli/master/config/export_command.rb +1 -2
- data/lib/kontena/cli/master/config/import_command.rb +3 -4
- data/lib/kontena/cli/master/create_command.rb +1 -2
- data/lib/kontena/cli/master/login_command.rb +10 -12
- data/lib/kontena/cli/master/logout_command.rb +23 -0
- data/lib/kontena/cli/master/use_command.rb +1 -1
- data/lib/kontena/cli/master_command.rb +2 -0
- data/lib/kontena/cli/nodes/labels/remove_command.rb +1 -1
- data/lib/kontena/cli/nodes/remove_command.rb +3 -1
- data/lib/kontena/cli/nodes/update_command.rb +3 -2
- data/lib/kontena/cli/plugins/install_command.rb +9 -2
- data/lib/kontena/cli/plugins/search_command.rb +1 -1
- data/lib/kontena/cli/registry/create_command.rb +9 -8
- data/lib/kontena/cli/registry/delete_command.rb +2 -2
- data/lib/kontena/cli/registry/remove_command.rb +6 -3
- data/lib/kontena/cli/services/create_command.rb +7 -5
- data/lib/kontena/cli/services/delete_command.rb +1 -1
- data/lib/kontena/cli/services/deploy_command.rb +4 -1
- data/lib/kontena/cli/services/envs/add_command.rb +3 -1
- data/lib/kontena/cli/services/envs/remove_command.rb +3 -1
- data/lib/kontena/cli/services/link_command.rb +4 -2
- data/lib/kontena/cli/services/remove_command.rb +15 -1
- data/lib/kontena/cli/services/restart_command.rb +3 -1
- data/lib/kontena/cli/services/scale_command.rb +4 -1
- data/lib/kontena/cli/services/secrets/link_command.rb +9 -7
- data/lib/kontena/cli/services/secrets/unlink_command.rb +1 -1
- data/lib/kontena/cli/services/services_helper.rb +21 -10
- data/lib/kontena/cli/services/start_command.rb +3 -1
- data/lib/kontena/cli/services/stop_command.rb +3 -1
- data/lib/kontena/cli/services/unlink_command.rb +1 -1
- data/lib/kontena/cli/services/update_command.rb +7 -5
- data/lib/kontena/cli/spinner.rb +99 -37
- data/lib/kontena/cli/stacks/common.rb +2 -4
- data/lib/kontena/cli/vault/remove_command.rb +3 -1
- data/lib/kontena/cli/vault/update_command.rb +4 -2
- data/lib/kontena/cli/vault/write_command.rb +4 -2
- data/lib/kontena/cli/vpn/create_command.rb +26 -10
- data/lib/kontena/cli/vpn/delete_command.rb +1 -1
- data/lib/kontena/cli/vpn/remove_command.rb +6 -4
- data/lib/kontena/client.rb +13 -5
- data/lib/kontena/errors.rb +3 -1
- data/lib/kontena_cli.rb +1 -1
- data/spec/fixtures/kontena-malformed-yaml.yml +6 -0
- data/spec/fixtures/kontena-not-hash-service-config.yml +3 -0
- data/spec/kontena/cli/app/docker_helper_spec.rb +2 -2
- data/spec/kontena/cli/app/yaml/reader_spec.rb +48 -0
- data/spec/kontena/cli/cloud/logout_command_spec.rb +37 -0
- data/spec/kontena/cli/common_spec.rb +46 -1
- data/spec/kontena/cli/grids/trusted_subnets/remove_command_spec.rb +3 -3
- data/spec/kontena/cli/master/logout_command_spec.rb +85 -0
- data/spec/kontena/cli/master/use_command_spec.rb +4 -0
- metadata +12 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 35b0390bffba7709f3efa1c42838fa47483991e5
|
|
4
|
+
data.tar.gz: 1dc946fc0f3b3e498df9b3a8a766edf7d38ca0ed
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
94
|
-
name = prefixed_name(name)
|
|
95
|
-
data = { 'name' => name }
|
|
96
|
+
data = { 'name' => prefixed_name(name) }
|
|
96
97
|
data.merge!(options)
|
|
97
|
-
|
|
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]
|
|
105
|
+
# @param [String] name
|
|
101
106
|
# @param [Hash] options
|
|
102
|
-
def update(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
82
|
-
|
|
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
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
|
|
31
|
-
|
|
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
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
-
|
|
31
|
+
spinner "Starting #{service_name.colorize(:cyan)} " do
|
|
32
|
+
start_service(token, prefixed_name(service_name))
|
|
33
|
+
end
|
|
33
34
|
else
|
|
34
|
-
|
|
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
|
-
|
|
32
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
91
|
+
services.each do |name, config|
|
|
92
|
+
services[name] = process_config(config)
|
|
93
|
+
end
|
|
84
94
|
services
|
|
85
95
|
else
|
|
86
|
-
|
|
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
|
-
|
|
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?
|