kontena-cli 1.4.0.pre6 → 1.4.0.pre7
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/Gemfile +1 -1
- data/VERSION +1 -1
- data/bin/kontena +1 -1
- data/kontena-cli.gemspec +3 -3
- data/lib/kontena/cli/certificate/authorize_command.rb +67 -6
- data/lib/kontena/cli/certificate/get_command.rb +7 -0
- data/lib/kontena/cli/certificate/list_command.rb +75 -0
- data/lib/kontena/cli/certificate/register_command.rb +13 -2
- data/lib/kontena/cli/certificate/request_command.rb +20 -0
- data/lib/kontena/cli/certificate/show_command.rb +19 -0
- data/lib/kontena/cli/certificate_command.rb +4 -1
- data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
- data/lib/kontena/cli/common.rb +21 -33
- data/lib/kontena/cli/etcd/health_command.rb +21 -27
- data/lib/kontena/cli/helpers/exec_helper.rb +15 -6
- data/lib/kontena/cli/helpers/health_helper.rb +12 -0
- data/lib/kontena/cli/helpers/log_helper.rb +2 -2
- data/lib/kontena/cli/helpers/time_helper.rb +29 -0
- data/lib/kontena/cli/master/init_cloud_command.rb +19 -0
- data/lib/kontena/cli/master/list_command.rb +1 -1
- data/lib/kontena/cli/master/ssh_command.rb +3 -1
- data/lib/kontena/cli/master/use_command.rb +1 -2
- data/lib/kontena/cli/node_command.rb +1 -0
- data/lib/kontena/cli/nodes/health_command.rb +28 -13
- data/lib/kontena/cli/nodes/list_command.rb +19 -3
- data/lib/kontena/cli/nodes/show_command.rb +4 -2
- data/lib/kontena/cli/nodes/ssh_command.rb +5 -2
- data/lib/kontena/cli/nodes/update_command.rb +2 -0
- data/lib/kontena/cli/plugins/install_command.rb +11 -8
- data/lib/kontena/cli/plugins/list_command.rb +5 -3
- data/lib/kontena/cli/plugins/search_command.rb +4 -2
- data/lib/kontena/cli/plugins/show_command.rb +17 -0
- data/lib/kontena/cli/plugins/uninstall_command.rb +9 -13
- data/lib/kontena/cli/registry/create_command.rb +1 -1
- data/lib/kontena/cli/services/create_command.rb +6 -0
- data/lib/kontena/cli/services/services_helper.rb +33 -6
- data/lib/kontena/cli/services/update_command.rb +6 -0
- data/lib/kontena/cli/stacks/build_command.rb +3 -3
- data/lib/kontena/cli/stacks/common.rb +105 -90
- data/lib/kontena/cli/stacks/deploy_command.rb +7 -3
- data/lib/kontena/cli/stacks/install_command.rb +39 -6
- data/lib/kontena/cli/stacks/list_command.rb +36 -4
- data/lib/kontena/cli/stacks/logs_command.rb +9 -2
- data/lib/kontena/cli/stacks/registry/pull_command.rb +2 -2
- data/lib/kontena/cli/stacks/registry/push_command.rb +20 -9
- data/lib/kontena/cli/stacks/registry/remove_command.rb +4 -4
- data/lib/kontena/cli/stacks/registry/show_command.rb +4 -4
- data/lib/kontena/cli/stacks/remove_command.rb +27 -1
- data/lib/kontena/cli/stacks/service_generator.rb +12 -2
- data/lib/kontena/cli/stacks/show_command.rb +35 -5
- data/lib/kontena/cli/stacks/stack_name.rb +71 -0
- data/lib/kontena/cli/stacks/upgrade_command.rb +127 -14
- data/lib/kontena/cli/stacks/validate_command.rb +38 -10
- data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -2
- data/lib/kontena/cli/stacks/yaml/reader.rb +211 -185
- data/lib/kontena/cli/stacks/yaml/service_extender.rb +6 -12
- data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +97 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
- data/lib/kontena/cli/stacks/yaml/validations.rb +16 -0
- data/lib/kontena/cli/stacks/yaml/validator_v3.rb +25 -8
- data/lib/kontena/client.rb +2 -2
- data/lib/kontena/command.rb +11 -0
- data/lib/kontena/main_command.rb +3 -1
- data/lib/kontena/plugin_manager.rb +11 -198
- data/lib/kontena/plugin_manager/cleaner.rb +33 -0
- data/lib/kontena/plugin_manager/common.rb +86 -0
- data/lib/kontena/plugin_manager/installer.rb +54 -0
- data/lib/kontena/plugin_manager/loader.rb +93 -0
- data/lib/kontena/plugin_manager/rubygems_client.rb +42 -23
- data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
- data/lib/kontena/util.rb +24 -0
- data/lib/kontena_cli.rb +1 -0
- data/omnibus/config/projects/kontena.rb +7 -1
- data/omnibus/config/software/{kontena.rb → kontena-cli.rb} +2 -0
- data/spec/fixtures/api/node.json +2 -1
- data/spec/fixtures/stack-internal-extend.yml +6 -1
- data/spec/fixtures/stack-with-dependencies-dep-1-1.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-1.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep-2.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-3.yml +5 -0
- data/spec/fixtures/stack-with-dependencies-dep_2-removed.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep_3-added.yml +25 -0
- data/spec/fixtures/stack-with-dependencies.yml +22 -0
- data/spec/fixtures/stack-with-variables.yml +3 -0
- data/spec/kontena/cli/etcd/health_command_spec.rb +45 -33
- data/spec/kontena/cli/helpers/exec_helper_spec.rb +2 -1
- data/spec/kontena/cli/master/init_cloud_command_spec.rb +14 -0
- data/spec/kontena/cli/nodes/health_command_spec.rb +74 -10
- data/spec/kontena/cli/nodes/list_command_spec.rb +381 -232
- data/spec/kontena/cli/nodes/show_command_spec.rb +31 -0
- data/spec/kontena/cli/nodes/ssh_command_spec.rb +18 -3
- data/spec/kontena/cli/plugins/install_command_spec.rb +1 -1
- data/spec/kontena/cli/stacks/build_command_spec.rb +6 -12
- data/spec/kontena/cli/stacks/common_spec.rb +42 -69
- data/spec/kontena/cli/stacks/install_command_spec.rb +57 -31
- data/spec/kontena/cli/stacks/list_command_spec.rb +44 -0
- data/spec/kontena/cli/stacks/logs_command_spec.rb +12 -1
- data/spec/kontena/cli/stacks/remove_command_spec.rb +39 -0
- data/spec/kontena/cli/stacks/show_command_spec.rb +16 -0
- data/spec/kontena/cli/stacks/stack_name_spec.rb +21 -0
- data/spec/kontena/cli/stacks/upgrade_command_spec.rb +73 -56
- data/spec/kontena/cli/stacks/validate_command_spec.rb +81 -0
- data/spec/kontena/cli/stacks/yaml/custom_validators/affinities_validator_spec.rb +22 -0
- data/spec/kontena/cli/stacks/yaml/reader_spec.rb +173 -169
- data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +12 -3
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/file_loader_spec.rb +47 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/registry_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/uri_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader_spec.rb +104 -0
- data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +19 -0
- data/spec/kontena/plugin_manager/cleaner_spec.rb +20 -0
- data/spec/kontena/plugin_manager/common_spec.rb +39 -0
- data/spec/kontena/plugin_manager/installer_spec.rb +50 -0
- data/spec/kontena/plugin_manager/loader_spec.rb +5 -0
- data/spec/kontena/plugin_manager/rubygems_client_spec.rb +11 -25
- data/spec/kontena/plugin_manager/uninstaller_spec.rb +19 -0
- data/spec/kontena/plugin_manager_spec.rb +7 -7
- metadata +64 -97
- data/lib/kontena/cli/app_command.rb +0 -22
- data/lib/kontena/cli/apps/build_command.rb +0 -28
- data/lib/kontena/cli/apps/common.rb +0 -172
- data/lib/kontena/cli/apps/config_command.rb +0 -25
- data/lib/kontena/cli/apps/deploy_command.rb +0 -137
- data/lib/kontena/cli/apps/docker_compose_generator.rb +0 -61
- data/lib/kontena/cli/apps/docker_helper.rb +0 -80
- data/lib/kontena/cli/apps/dockerfile_generator.rb +0 -16
- data/lib/kontena/cli/apps/init_command.rb +0 -89
- data/lib/kontena/cli/apps/kontena_yml_generator.rb +0 -105
- data/lib/kontena/cli/apps/list_command.rb +0 -59
- data/lib/kontena/cli/apps/logs_command.rb +0 -37
- data/lib/kontena/cli/apps/monitor_command.rb +0 -93
- data/lib/kontena/cli/apps/remove_command.rb +0 -74
- data/lib/kontena/cli/apps/restart_command.rb +0 -39
- data/lib/kontena/cli/apps/scale_command.rb +0 -33
- data/lib/kontena/cli/apps/service_generator.rb +0 -114
- data/lib/kontena/cli/apps/service_generator_v2.rb +0 -27
- data/lib/kontena/cli/apps/show_command.rb +0 -23
- data/lib/kontena/cli/apps/start_command.rb +0 -40
- data/lib/kontena/cli/apps/stop_command.rb +0 -40
- data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +0 -19
- data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +0 -20
- data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +0 -54
- data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/reader.rb +0 -213
- data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -77
- data/lib/kontena/cli/apps/yaml/validations.rb +0 -71
- data/lib/kontena/cli/apps/yaml/validator.rb +0 -38
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +0 -53
- data/spec/fixtures/app.json +0 -42
- data/spec/fixtures/health.yml +0 -26
- data/spec/fixtures/kontena-build.yml +0 -16
- data/spec/fixtures/kontena-internal-extend.yml +0 -8
- data/spec/fixtures/kontena-invalid.yml +0 -4
- data/spec/fixtures/kontena-with-env-file.yml +0 -18
- data/spec/fixtures/kontena-with-variables.yml +0 -19
- data/spec/fixtures/kontena.yml +0 -17
- data/spec/fixtures/kontena_build_v2.yml +0 -26
- data/spec/fixtures/kontena_numeric_version.yml +0 -9
- data/spec/fixtures/kontena_v2.yml +0 -35
- data/spec/fixtures/mysql.yml +0 -3
- data/spec/fixtures/wordpress-scaled.yml +0 -3
- data/spec/fixtures/wordpress.yml +0 -2
- data/spec/kontena/cli/app/build_command_spec.rb +0 -55
- data/spec/kontena/cli/app/common_spec.rb +0 -110
- data/spec/kontena/cli/app/config_command_spec.rb +0 -78
- data/spec/kontena/cli/app/deploy_command_spec.rb +0 -217
- data/spec/kontena/cli/app/docker_helper_spec.rb +0 -155
- data/spec/kontena/cli/app/init_command_spec.rb +0 -109
- data/spec/kontena/cli/app/logs_command_spec.rb +0 -131
- data/spec/kontena/cli/app/scale_spec.rb +0 -51
- data/spec/kontena/cli/app/service_generator_spec.rb +0 -384
- data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -73
- data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -457
- data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -127
- data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -380
- data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +0 -301
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
require 'yaml'
|
|
2
|
-
require_relative 'common'
|
|
3
|
-
|
|
4
|
-
module Kontena::Cli::Apps
|
|
5
|
-
class DockerfileGenerator
|
|
6
|
-
include Common
|
|
7
|
-
|
|
8
|
-
def generate(base_image)
|
|
9
|
-
|
|
10
|
-
dockerfile = File.new('Dockerfile', 'w')
|
|
11
|
-
dockerfile.puts "FROM #{base_image}"
|
|
12
|
-
dockerfile.puts 'CMD ["/start", "web"]'
|
|
13
|
-
dockerfile.close
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
require 'securerandom'
|
|
2
|
-
require_relative 'common'
|
|
3
|
-
require_relative 'dockerfile_generator'
|
|
4
|
-
require_relative 'docker_compose_generator'
|
|
5
|
-
require_relative 'kontena_yml_generator'
|
|
6
|
-
|
|
7
|
-
module Kontena::Cli::Apps
|
|
8
|
-
class InitCommand < Kontena::Command
|
|
9
|
-
include Kontena::Cli::Common
|
|
10
|
-
include Common
|
|
11
|
-
|
|
12
|
-
option ["-f", "--file"], "FILE", "Specify a docker-compose file", attribute_name: :docker_compose_file, default: 'docker-compose.yml'
|
|
13
|
-
option ["-i", "--image-name"], "IMAGE_NAME", "Specify a docker image name"
|
|
14
|
-
option ["-b", "--base-image"], "BASE_IMAGE_NAME", "Specify a docker base image name", default: "kontena/buildstep"
|
|
15
|
-
option ["-p", "--project-name"], "NAME", "Specify an alternate project name (default: directory name)"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def execute
|
|
19
|
-
if File.exist?('Dockerfile')
|
|
20
|
-
puts 'Found Dockerfile'
|
|
21
|
-
elsif create_dockerfile?
|
|
22
|
-
puts "Creating #{'Dockerfile'.colorize(:cyan)}"
|
|
23
|
-
DockerfileGenerator.new.generate(base_image)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
if File.exist?('Procfile')
|
|
27
|
-
procfile = ::YAML.safe_load(File.read('Procfile'))
|
|
28
|
-
else
|
|
29
|
-
procfile = {}
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
app_env = create_env_file(app_json['env']) if app_json['env']
|
|
33
|
-
addons = app_json['addons'] || []
|
|
34
|
-
|
|
35
|
-
if File.exist?(docker_compose_file)
|
|
36
|
-
puts "Found #{docker_compose_file}."
|
|
37
|
-
elsif create_docker_compose_yml?
|
|
38
|
-
puts "Creating #{docker_compose_file.colorize(:cyan)}"
|
|
39
|
-
docker_compose_generator = DockerComposeGenerator.new(docker_compose_file)
|
|
40
|
-
docker_compose_generator.generate(procfile, addons, app_env)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
if File.exist?('kontena.yml')
|
|
44
|
-
puts "Updating #{'kontena.yml'.colorize(:cyan)}"
|
|
45
|
-
else
|
|
46
|
-
puts "Creating #{'kontena.yml'.colorize(:cyan)}"
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
kontena_yml_generator = KontenaYmlGenerator.new(image_name, service_prefix)
|
|
50
|
-
if File.exist?(docker_compose_file)
|
|
51
|
-
kontena_yml_generator.generate_from_compose_file(docker_compose_file)
|
|
52
|
-
else
|
|
53
|
-
kontena_yml_generator.generate(procfile, addons, app_env)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
puts "Your app is ready! Deploy with 'kontena app deploy'.".colorize(:green)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
protected
|
|
61
|
-
|
|
62
|
-
def service_prefix
|
|
63
|
-
@service_prefix ||= project_name || current_dir
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def create_dockerfile?
|
|
67
|
-
prompt.yes?('Dockerfile not found. Do you want to create it?')
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def create_env_file(env)
|
|
71
|
-
app_env = File.new('.env', 'w')
|
|
72
|
-
app_json['env'].each do |key, env|
|
|
73
|
-
if env['generator'] == 'secret'
|
|
74
|
-
value = SecureRandom.hex(64)
|
|
75
|
-
else
|
|
76
|
-
value = env['value']
|
|
77
|
-
end
|
|
78
|
-
app_env.puts "#{key}=#{value}"
|
|
79
|
-
end
|
|
80
|
-
app_env.close
|
|
81
|
-
'.env'
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def create_docker_compose_yml?
|
|
85
|
-
prompt.yes?("#{docker_compose_file} not found. Do you want to create it?")
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
end
|
|
89
|
-
end
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
require_relative 'common'
|
|
2
|
-
|
|
3
|
-
module Kontena::Cli::Apps
|
|
4
|
-
class KontenaYmlGenerator
|
|
5
|
-
include Common
|
|
6
|
-
|
|
7
|
-
attr_reader :image_name, :service_prefix
|
|
8
|
-
|
|
9
|
-
def initialize(image_name, service_prefix)
|
|
10
|
-
@image_name = image_name
|
|
11
|
-
@service_prefix = service_prefix
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def generate_from_compose_file(docker_compose_file)
|
|
15
|
-
services = {}
|
|
16
|
-
# extend services from docker-compose.yml
|
|
17
|
-
file = File.read(docker_compose_file)
|
|
18
|
-
|
|
19
|
-
yml_services(file).each do |name, options|
|
|
20
|
-
services[name] = {'extends' => { 'file' => 'docker-compose.yml', 'service' => name }}
|
|
21
|
-
if options.has_key?('build')
|
|
22
|
-
image = image_name || "registry.kontena.local/#{File.basename(Dir.getwd)}:latest"
|
|
23
|
-
services[name]['image'] = image
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
# set Heroku addon service as stateful by default
|
|
27
|
-
if valid_addons.has_key?(name)
|
|
28
|
-
services[name]['stateful'] = true
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# we have to generate Kontena urls to env vars for Heroku addons
|
|
32
|
-
# redis://openredis:6379 -> redis://project-name-openredis:6379
|
|
33
|
-
if options['links']
|
|
34
|
-
options['links'].each do |link|
|
|
35
|
-
service_link = link.split(':').first
|
|
36
|
-
if valid_addons.has_key?(service_link)
|
|
37
|
-
services[name]['environment'] ||= []
|
|
38
|
-
services[name]['environment'] += valid_addons(service_prefix)[service_link]['environment']
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
create_yml(services, 'kontena.yml')
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def yml_services(file)
|
|
47
|
-
yml = ::YAML.safe_load(file)
|
|
48
|
-
if yml['version'] == '2'
|
|
49
|
-
yml['services']
|
|
50
|
-
else
|
|
51
|
-
yml
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def generate(procfile, addons, env_file)
|
|
56
|
-
image = image_name || "registry.kontena.local/#{File.basename(Dir.getwd)}:latest"
|
|
57
|
-
if procfile.keys.size > 0
|
|
58
|
-
# generate services found in Procfile
|
|
59
|
-
services = {}
|
|
60
|
-
procfile.keys.each do |name|
|
|
61
|
-
services[name] = {'image' => image}
|
|
62
|
-
services[name]['environment'] = ['PORT=5000'] if app_json && name == 'web' # Heroku generates PORT env variable so should we do too
|
|
63
|
-
services[name]['command'] = "/start #{name}" if name != 'web'
|
|
64
|
-
services[name]['env_file'] = env_file if env_file
|
|
65
|
-
|
|
66
|
-
# generate addon services
|
|
67
|
-
addons.each do |addon|
|
|
68
|
-
addon_service = addon.split(":")[0]
|
|
69
|
-
addon_service.slice!('heroku-')
|
|
70
|
-
if valid_addons.has_key?(addon_service)
|
|
71
|
-
services[name]['links'] ||= []
|
|
72
|
-
services[name]['links'] << "#{addon_service}:#{addon_service}"
|
|
73
|
-
services[name]['environment'] ||= []
|
|
74
|
-
services[name]['environment'] += valid_addons(service_prefix)[addon_service]['environment']
|
|
75
|
-
services[addon_service] = {'image' => valid_addons[addon_service]['image'], 'stateful' => true}
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
else
|
|
80
|
-
# no Procfile found, create dummy web service
|
|
81
|
-
services = {'web' => { 'image' => image}}
|
|
82
|
-
services['web']['env_file'] = env_file if env_file
|
|
83
|
-
end
|
|
84
|
-
# create kontena.yml file
|
|
85
|
-
create_yml(services, 'kontena.yml')
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def create_yml(services, filename)
|
|
89
|
-
if File.exist?(filename) && !File.zero?(filename)
|
|
90
|
-
kontena_services = yml_services(File.read(filename))
|
|
91
|
-
services.each do |name, options|
|
|
92
|
-
if kontena_services[name]
|
|
93
|
-
services[name].merge!(kontena_services[name])
|
|
94
|
-
end
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
kontena_services = {
|
|
98
|
-
'version' => '2',
|
|
99
|
-
'name' => service_prefix,
|
|
100
|
-
'services' => services
|
|
101
|
-
}
|
|
102
|
-
super(kontena_services, filename)
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
end
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
require_relative 'common'
|
|
2
|
-
|
|
3
|
-
module Kontena::Cli::Apps
|
|
4
|
-
class ListCommand < Kontena::Command
|
|
5
|
-
include Kontena::Cli::Common
|
|
6
|
-
include Kontena::Cli::GridOptions
|
|
7
|
-
include Common
|
|
8
|
-
|
|
9
|
-
option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
|
|
10
|
-
option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
|
|
11
|
-
|
|
12
|
-
option ['-q', '--quiet'], :flag, "Output the identifying column only"
|
|
13
|
-
|
|
14
|
-
parameter "[SERVICE] ...", "Services to list"
|
|
15
|
-
|
|
16
|
-
attr_reader :services
|
|
17
|
-
|
|
18
|
-
def execute
|
|
19
|
-
require_config_file(filename)
|
|
20
|
-
|
|
21
|
-
@services = services_from_yaml(filename, service_list, service_prefix, true)
|
|
22
|
-
|
|
23
|
-
if quiet?
|
|
24
|
-
puts services.map(&:first).join("\n")
|
|
25
|
-
exit 0
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
if services.size > 0
|
|
29
|
-
show_services(services)
|
|
30
|
-
elsif !service_list.empty?
|
|
31
|
-
puts "No such service: #{service_list.join(', ')}".colorize(:red)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def show_services(services)
|
|
37
|
-
titles = ['NAME', 'IMAGE', 'INSTANCES', 'STATEFUL', 'STATE', 'PORTS']
|
|
38
|
-
puts "%-30.30s %-50.50s %-15s %-10.10s %-15.20s %-50s" % titles
|
|
39
|
-
|
|
40
|
-
services.each do |service_name, opts|
|
|
41
|
-
service = get_service(token, prefixed_name(service_name)) rescue false
|
|
42
|
-
if service
|
|
43
|
-
name = service['name'].sub("#{service_prefix}-", '')
|
|
44
|
-
state = service['stateful'] ? 'yes' : 'no'
|
|
45
|
-
ports = service['ports'].map{|p|
|
|
46
|
-
"#{p['ip']}:#{p['node_port']}->#{p['container_port']}/#{p['protocol']}"
|
|
47
|
-
}.join(", ")
|
|
48
|
-
running = service['instance_counts']['running']
|
|
49
|
-
desired = service['instances']
|
|
50
|
-
instances = "#{running} / #{desired}"
|
|
51
|
-
vars = [name, service['image'], instances, state, service['state'], ports]
|
|
52
|
-
else
|
|
53
|
-
vars = [service_name, '-', '-', '-', '-', '-']
|
|
54
|
-
end
|
|
55
|
-
puts "%-30.30s %-50.50s %-15.10s %-10.10s %-15.20s %-50s" % vars
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
require_relative 'common'
|
|
2
|
-
require_relative '../helpers/log_helper'
|
|
3
|
-
|
|
4
|
-
module Kontena::Cli::Apps
|
|
5
|
-
class LogsCommand < Kontena::Command
|
|
6
|
-
include Kontena::Cli::Common
|
|
7
|
-
include Kontena::Cli::GridOptions
|
|
8
|
-
include Kontena::Cli::Helpers::LogHelper
|
|
9
|
-
|
|
10
|
-
include Common
|
|
11
|
-
|
|
12
|
-
option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
|
|
13
|
-
option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
|
|
14
|
-
parameter "[SERVICE] ...", "Show only specified service logs"
|
|
15
|
-
|
|
16
|
-
def execute
|
|
17
|
-
require_config_file(filename)
|
|
18
|
-
|
|
19
|
-
services = services_from_yaml(filename, service_list, service_prefix, true)
|
|
20
|
-
|
|
21
|
-
if services.empty? && !service_list.empty?
|
|
22
|
-
signal_error "No such service: #{service_list.join(', ')}"
|
|
23
|
-
elsif services.empty?
|
|
24
|
-
signal_error "No services for application"
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
query_services = services.map{|service_name, opts| prefixed_name(service_name)}.join ','
|
|
28
|
-
query_params = {
|
|
29
|
-
services: query_services,
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
show_logs("grids/#{current_grid}/container_logs", query_params) do |log|
|
|
33
|
-
show_log(log)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
end
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
require_relative 'common'
|
|
2
|
-
|
|
3
|
-
module Kontena::Cli::Apps
|
|
4
|
-
class MonitorCommand < Kontena::Command
|
|
5
|
-
include Kontena::Cli::Common
|
|
6
|
-
include Kontena::Cli::GridOptions
|
|
7
|
-
include Common
|
|
8
|
-
|
|
9
|
-
option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
|
|
10
|
-
option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
|
|
11
|
-
|
|
12
|
-
parameter "[SERVICE] ...", "Services to start"
|
|
13
|
-
|
|
14
|
-
attr_reader :services
|
|
15
|
-
|
|
16
|
-
def execute
|
|
17
|
-
require_config_file(filename)
|
|
18
|
-
|
|
19
|
-
@services = services_from_yaml(filename, service_list, service_prefix, true)
|
|
20
|
-
if services.size > 0
|
|
21
|
-
show_monitor(services)
|
|
22
|
-
elsif !service_list.empty?
|
|
23
|
-
puts "No such service: #{service_list.join(', ')}".colorize(:red)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def show_monitor(services)
|
|
28
|
-
require_api_url
|
|
29
|
-
token = require_token
|
|
30
|
-
loop do
|
|
31
|
-
nodes = {}
|
|
32
|
-
services.each do |name, data|
|
|
33
|
-
service = prefixed_name(name)
|
|
34
|
-
result = client(token).get("services/#{current_grid}/#{service}/containers") rescue nil
|
|
35
|
-
if result
|
|
36
|
-
services[name]['instances'] = result['containers'].size
|
|
37
|
-
result['containers'].each do |container|
|
|
38
|
-
container['service'] = name
|
|
39
|
-
nodes[container['node']['name']] ||= []
|
|
40
|
-
nodes[container['node']['name']] << container
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
clear_terminal
|
|
45
|
-
puts "services:"
|
|
46
|
-
services.each do |name, data|
|
|
47
|
-
color = color_for_service(name)
|
|
48
|
-
puts " #{"■".colorize(color)} #{name} (#{data['instances']} instances)"
|
|
49
|
-
end
|
|
50
|
-
puts "nodes:"
|
|
51
|
-
node_names = nodes.keys.sort
|
|
52
|
-
node_names.each do |name|
|
|
53
|
-
containers = nodes[name]
|
|
54
|
-
puts " #{name} (#{containers.size} instances)"
|
|
55
|
-
print " "
|
|
56
|
-
containers.each do |container|
|
|
57
|
-
icon = "■"
|
|
58
|
-
if container['status'] != 'running'
|
|
59
|
-
icon = "□"
|
|
60
|
-
end
|
|
61
|
-
color = color_for_service(container['service'])
|
|
62
|
-
print icon.colorize(color)
|
|
63
|
-
end
|
|
64
|
-
puts ''
|
|
65
|
-
end
|
|
66
|
-
sleep 1
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def color_for_service(service)
|
|
71
|
-
color_maps[service] = colors.shift unless color_maps[service]
|
|
72
|
-
color_maps[service].to_sym
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def color_maps
|
|
76
|
-
@color_maps ||= {}
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def colors
|
|
80
|
-
if(@colors.nil? || @colors.size == 0)
|
|
81
|
-
@colors = %i(
|
|
82
|
-
red green yellow blue magenta cyan bright_red bright_green
|
|
83
|
-
bright_yellow bright_blue bright_magenta bright_cyan
|
|
84
|
-
)
|
|
85
|
-
end
|
|
86
|
-
@colors
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def clear_terminal
|
|
90
|
-
print "\e[H\e[2J"
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
require_relative 'common'
|
|
2
|
-
|
|
3
|
-
module Kontena::Cli::Apps
|
|
4
|
-
class RemoveCommand < Kontena::Command
|
|
5
|
-
include Kontena::Cli::Common
|
|
6
|
-
include Kontena::Cli::GridOptions
|
|
7
|
-
include Common
|
|
8
|
-
|
|
9
|
-
option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
|
|
10
|
-
option ['-p', '--project-name'], 'NAME', 'Specify an alternate project name (default: directory name)'
|
|
11
|
-
option '--force', :flag, 'Force remove', default: false, attribute_name: :forced
|
|
12
|
-
|
|
13
|
-
parameter "[SERVICE] ...", "Remove services"
|
|
14
|
-
|
|
15
|
-
attr_reader :services
|
|
16
|
-
|
|
17
|
-
def execute
|
|
18
|
-
require_api_url
|
|
19
|
-
require_token
|
|
20
|
-
require_config_file(filename)
|
|
21
|
-
confirm unless forced?
|
|
22
|
-
|
|
23
|
-
@services = services_from_yaml(filename, service_list, service_prefix, true)
|
|
24
|
-
if services.size > 0
|
|
25
|
-
remove_services(services)
|
|
26
|
-
elsif !service_list.empty?
|
|
27
|
-
puts "No such service: #{service_list.join(', ')}".colorize(:red)
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
private
|
|
32
|
-
|
|
33
|
-
def remove_services(services)
|
|
34
|
-
services.find_all {|service_name, options| options['links'] && options['links'].size > 0 }.each do |service_name, options|
|
|
35
|
-
delete(service_name, options, false)
|
|
36
|
-
services.delete(service_name)
|
|
37
|
-
end
|
|
38
|
-
services.each do |service_name, options|
|
|
39
|
-
delete(service_name, options)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def delete(name, options, async = true)
|
|
44
|
-
unless deleted_services.include?(name)
|
|
45
|
-
service = get_service(token, prefixed_name(name)) rescue nil
|
|
46
|
-
if(service)
|
|
47
|
-
spinner "removing #{pastel.cyan(name)}" do
|
|
48
|
-
delete_service(token, prefixed_name(name))
|
|
49
|
-
unless async
|
|
50
|
-
wait_for_delete_to_finish(service)
|
|
51
|
-
end
|
|
52
|
-
end
|
|
53
|
-
deleted_services << name
|
|
54
|
-
else
|
|
55
|
-
warning "No such service #{name}"
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def wait_for_delete_to_finish(service)
|
|
61
|
-
until service.nil?
|
|
62
|
-
service = get_service(token, service['name']) rescue nil
|
|
63
|
-
sleep 0.5
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
|
|
67
|
-
##
|
|
68
|
-
#
|
|
69
|
-
# @return [Array]
|
|
70
|
-
def deleted_services
|
|
71
|
-
@deleted_services ||= []
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|