kontena-cli 0.7.3 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/kontena +64 -2
- data/kontena-cli.gemspec +4 -2
- data/lib/kontena/cli/app_command.rb +20 -0
- data/lib/kontena/cli/apps/common.rb +53 -0
- data/lib/kontena/cli/{stacks/stacks.rb → apps/deploy_command.rb} +17 -31
- data/lib/kontena/cli/apps/init_command.rb +101 -0
- data/lib/kontena/cli/apps/list_command.rb +41 -0
- data/lib/kontena/cli/apps/logs_command.rb +58 -0
- data/lib/kontena/cli/apps/remove_command.rb +64 -0
- data/lib/kontena/cli/apps/start_command.rb +38 -0
- data/lib/kontena/cli/apps/stop_command.rb +38 -0
- data/lib/kontena/cli/container_command.rb +9 -0
- data/lib/kontena/cli/containers/{containers.rb → exec_command.rb} +5 -5
- data/lib/kontena/cli/deploy_command.rb +159 -0
- data/lib/kontena/cli/external_registries/add_command.rb +22 -0
- data/lib/kontena/cli/external_registries/delete_command.rb +13 -0
- data/lib/kontena/cli/external_registries/list_command.rb +16 -0
- data/lib/kontena/cli/external_registry_command.rb +14 -0
- data/lib/kontena/cli/forgot_password_command.rb +13 -0
- data/lib/kontena/cli/grid_command.rb +27 -0
- data/lib/kontena/cli/grids/add_user_command.rb +17 -0
- data/lib/kontena/cli/grids/{audit_log.rb → audit_log_command.rb} +7 -6
- data/lib/kontena/cli/grids/common.rb +24 -0
- data/lib/kontena/cli/grids/create_command.rb +26 -0
- data/lib/kontena/cli/grids/current_command.rb +18 -0
- data/lib/kontena/cli/grids/list_command.rb +26 -0
- data/lib/kontena/cli/grids/list_users_command.rb +18 -0
- data/lib/kontena/cli/grids/remove_command.rb +26 -0
- data/lib/kontena/cli/grids/remove_user_command.rb +16 -0
- data/lib/kontena/cli/grids/show_command.rb +19 -0
- data/lib/kontena/cli/grids/use_command.rb +21 -0
- data/lib/kontena/cli/invite_command.rb +13 -0
- data/lib/kontena/cli/login_command.rb +114 -0
- data/lib/kontena/cli/logout_command.rb +8 -0
- data/lib/kontena/cli/node_command.rb +21 -0
- data/lib/kontena/cli/nodes/digital_ocean/create_command.rb +31 -0
- data/lib/kontena/cli/nodes/digital_ocean/restart_command.rb +26 -0
- data/lib/kontena/cli/nodes/digital_ocean/terminate_command.rb +18 -0
- data/lib/kontena/cli/nodes/digital_ocean_command.rb +15 -0
- data/lib/kontena/cli/nodes/list_command.rb +28 -0
- data/lib/kontena/cli/nodes/remove_command.rb +15 -0
- data/lib/kontena/cli/nodes/show_command.rb +31 -0
- data/lib/kontena/cli/nodes/update_command.rb +18 -0
- data/lib/kontena/cli/nodes/vagrant/create_command.rb +26 -0
- data/lib/kontena/cli/nodes/vagrant/restart_command.rb +25 -0
- data/lib/kontena/cli/nodes/vagrant/ssh_command.rb +20 -0
- data/lib/kontena/cli/nodes/vagrant/start_command.rb +25 -0
- data/lib/kontena/cli/nodes/vagrant/stop_command.rb +25 -0
- data/lib/kontena/cli/nodes/vagrant/terminate_command.rb +16 -0
- data/lib/kontena/cli/nodes/vagrant_command.rb +21 -0
- data/lib/kontena/cli/register_command.rb +21 -0
- data/lib/kontena/cli/{grids/registry.rb → registry/create_command.rb} +32 -35
- data/lib/kontena/cli/registry/delete_command.rb +15 -0
- data/lib/kontena/cli/registry_command.rb +11 -0
- data/lib/kontena/cli/reset_password_command.rb +17 -0
- data/lib/kontena/cli/service_command.rb +33 -0
- data/lib/kontena/cli/services/container_command.rb +9 -0
- data/lib/kontena/cli/services/containers_command.rb +31 -0
- data/lib/kontena/cli/services/create_command.rb +62 -0
- data/lib/kontena/cli/services/delete_command.rb +17 -0
- data/lib/kontena/cli/services/deploy_command.rb +23 -0
- data/lib/kontena/cli/services/list_command.rb +20 -0
- data/lib/kontena/cli/services/logs_command.rb +51 -0
- data/lib/kontena/cli/services/restart_command.rb +16 -0
- data/lib/kontena/cli/services/scale_command.rb +20 -0
- data/lib/kontena/cli/services/services_helper.rb +94 -0
- data/lib/kontena/cli/services/show_command.rb +17 -0
- data/lib/kontena/cli/services/start_command.rb +16 -0
- data/lib/kontena/cli/services/{stats.rb → stats_command.rb} +11 -10
- data/lib/kontena/cli/services/stop_command.rb +16 -0
- data/lib/kontena/cli/services/update_command.rb +51 -0
- data/lib/kontena/cli/verify_account_command.rb +13 -0
- data/lib/kontena/cli/version_command.rb +8 -0
- data/lib/kontena/cli/vpn/config_command.rb +12 -0
- data/lib/kontena/cli/{grids/vpn.rb → vpn/create_command.rb} +12 -29
- data/lib/kontena/cli/vpn/delete_command.rb +15 -0
- data/lib/kontena/cli/vpn_command.rb +13 -0
- data/lib/kontena/cli/whoami_command.rb +19 -0
- data/lib/kontena/client.rb +14 -11
- data/lib/kontena/machine/common.rb +17 -0
- data/lib/kontena/machine/digital_ocean.rb +11 -0
- data/lib/kontena/machine/digital_ocean/cloudinit.yml +66 -0
- data/lib/kontena/machine/digital_ocean/node_destroyer.rb +38 -0
- data/lib/kontena/machine/digital_ocean/node_provisioner.rb +74 -0
- data/lib/kontena/machine/random_name.rb +42 -0
- data/lib/kontena/machine/vagrant.rb +10 -0
- data/lib/kontena/machine/vagrant/Vagrantfile.coreos.rb.erb +32 -0
- data/lib/kontena/machine/vagrant/cloudinit.yml +65 -0
- data/lib/kontena/machine/vagrant/node_destroyer.rb +36 -0
- data/lib/kontena/machine/vagrant/node_provisioner.rb +68 -0
- data/lib/kontena/scripts/completer +5 -5
- data/spec/kontena/cli/app/deploy_command_spec.rb +227 -0
- data/spec/kontena/cli/deploy_command_spec.rb +213 -0
- data/spec/kontena/cli/login_command_spec.rb +22 -0
- data/spec/kontena/cli/register_command_spec.rb +57 -0
- data/spec/spec_helper.rb +5 -1
- metadata +132 -36
- data/lib/kontena/cli/commands.rb +0 -20
- data/lib/kontena/cli/containers/commands.rb +0 -12
- data/lib/kontena/cli/grids/commands.rb +0 -169
- data/lib/kontena/cli/grids/external_registries.rb +0 -40
- data/lib/kontena/cli/grids/grids.rb +0 -108
- data/lib/kontena/cli/grids/users.rb +0 -32
- data/lib/kontena/cli/nodes/commands.rb +0 -27
- data/lib/kontena/cli/nodes/nodes.rb +0 -64
- data/lib/kontena/cli/server/commands.rb +0 -69
- data/lib/kontena/cli/server/server.rb +0 -45
- data/lib/kontena/cli/server/user.rb +0 -174
- data/lib/kontena/cli/services/commands.rb +0 -138
- data/lib/kontena/cli/services/containers.rb +0 -24
- data/lib/kontena/cli/services/logs.rb +0 -44
- data/lib/kontena/cli/services/services.rb +0 -175
- data/lib/kontena/cli/stacks/commands.rb +0 -13
- data/spec/kontena/cli/server/user_spec.rb +0 -59
- data/spec/kontena/cli/stacks/stacks_spec.rb +0 -212
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7509ba73a33bfc06a0e681f8d61a7ab3d7288284
|
4
|
+
data.tar.gz: 5f7bdc77590bebc819880d555f55d779188a634b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1c92dabc02bdf30be79976ccfff1e2f1a1422d1e91676a882782f02f64f92892eb7b49f2d70d9dbc67d55f2cddd7eec3816db202e9d2e98e603cca4f3955cd6
|
7
|
+
data.tar.gz: ada1b9cd60a4b602b1e9ac6eda9773e99cd6ca8364a9d5f992b91a983d86e3603716b74efabbe4d13b9060ed34cf77bf8ef9ed894445b4756da89dd80b2fc7e3
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.0
|
data/bin/kontena
CHANGED
@@ -10,5 +10,67 @@ $:.unshift File.expand_path('../../lib', bin_file)
|
|
10
10
|
|
11
11
|
STDOUT.sync = true
|
12
12
|
|
13
|
-
require '
|
14
|
-
require 'kontena/
|
13
|
+
require 'clamp'
|
14
|
+
require 'kontena/client'
|
15
|
+
require 'kontena/cli/common'
|
16
|
+
require 'kontena/cli/app_command'
|
17
|
+
require 'kontena/cli/register_command'
|
18
|
+
require 'kontena/cli/login_command'
|
19
|
+
require 'kontena/cli/logout_command'
|
20
|
+
require 'kontena/cli/whoami_command'
|
21
|
+
require 'kontena/cli/verify_account_command'
|
22
|
+
require 'kontena/cli/invite_command'
|
23
|
+
require 'kontena/cli/forgot_password_command'
|
24
|
+
require 'kontena/cli/container_command'
|
25
|
+
require 'kontena/cli/grid_command'
|
26
|
+
require 'kontena/cli/node_command'
|
27
|
+
require 'kontena/cli/service_command'
|
28
|
+
require 'kontena/cli/vpn_command'
|
29
|
+
require 'kontena/cli/registry_command'
|
30
|
+
require 'kontena/cli/external_registry_command'
|
31
|
+
require 'kontena/cli/deploy_command'
|
32
|
+
require 'kontena/cli/app_command'
|
33
|
+
require 'kontena/cli/version_command'
|
34
|
+
|
35
|
+
class MainCommand < Clamp::Command
|
36
|
+
|
37
|
+
subcommand "app", "Grid specific commands", Kontena::Cli::AppCommand
|
38
|
+
subcommand "grid", "Grid specific commands", Kontena::Cli::GridCommand
|
39
|
+
subcommand "app", "App specific commands", Kontena::Cli::AppCommand
|
40
|
+
subcommand "service", "Service specific commands", Kontena::Cli::ServiceCommand
|
41
|
+
subcommand "deploy", "Create and deploy multiple services from YAML file", Kontena::Cli::DeployCommand
|
42
|
+
subcommand "node", "Node specific commands", Kontena::Cli::NodeCommand
|
43
|
+
subcommand "vpn", "VPN specific commands", Kontena::Cli::VpnCommand
|
44
|
+
subcommand "registry", "Registry specific commands", Kontena::Cli::RegistryCommand
|
45
|
+
subcommand "container", "Container specific commands", Kontena::Cli::ContainerCommand
|
46
|
+
subcommand "external-registry", "External registry specific commands", Kontena::Cli::ExternalRegistryCommand
|
47
|
+
subcommand "register", "Register Kontena Account", Kontena::Cli::RegisterCommand
|
48
|
+
subcommand "login", "Login to Kontena Master", Kontena::Cli::LoginCommand
|
49
|
+
subcommand "logout", "Logout from Kontena Master", Kontena::Cli::LogoutCommand
|
50
|
+
subcommand "whoami", "Shows current logged in user", Kontena::Cli::WhoamiCommand
|
51
|
+
subcommand "verify-account", "Verify registered account", Kontena::Cli::VerifyAccountCommand
|
52
|
+
subcommand "invite", "Invite user to Kontena Master", Kontena::Cli::InviteCommand
|
53
|
+
subcommand "forgot-password", "Request password reset for Kontena account", Kontena::Cli::ForgotPasswordCommand
|
54
|
+
subcommand "version", "Show version", Kontena::Cli::VersionCommand
|
55
|
+
|
56
|
+
def execute
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
begin
|
61
|
+
MainCommand.run
|
62
|
+
rescue Excon::Errors::SocketError => exc
|
63
|
+
if exc.message.include?('Unable to verify certificate')
|
64
|
+
puts "The server uses a certificate signed by an unknown authority.".colorize(:red)
|
65
|
+
puts "Protip: you can bypass the certificate check by setting #{'SSL_IGNORE_ERRORS=true'.colorize(:yellow)} env variable, but any data you send to the server could be intercepted by others."
|
66
|
+
exit(1)
|
67
|
+
else
|
68
|
+
abort(exc.message)
|
69
|
+
end
|
70
|
+
rescue => exc
|
71
|
+
if ENV['DEBUG']
|
72
|
+
raise exc
|
73
|
+
else
|
74
|
+
abort(exc.message)
|
75
|
+
end
|
76
|
+
end
|
data/kontena-cli.gemspec
CHANGED
@@ -20,7 +20,9 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
-
spec.add_runtime_dependency '
|
24
|
-
spec.add_runtime_dependency 'commander'
|
23
|
+
spec.add_runtime_dependency 'excon'
|
25
24
|
spec.add_runtime_dependency 'colorize'
|
25
|
+
spec.add_runtime_dependency 'clamp'
|
26
|
+
spec.add_runtime_dependency 'highline'
|
27
|
+
spec.add_runtime_dependency 'shell-spinner'
|
26
28
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'apps/init_command'
|
2
|
+
require_relative 'apps/deploy_command'
|
3
|
+
require_relative 'apps/start_command'
|
4
|
+
require_relative 'apps/stop_command'
|
5
|
+
require_relative 'apps/remove_command'
|
6
|
+
require_relative 'apps/list_command'
|
7
|
+
require_relative 'apps/logs_command'
|
8
|
+
|
9
|
+
class Kontena::Cli::AppCommand < Clamp::Command
|
10
|
+
|
11
|
+
subcommand "init", "Init Kontena application", Kontena::Cli::Apps::InitCommand
|
12
|
+
subcommand "deploy", "Deploy Kontena services", Kontena::Cli::Apps::DeployCommand
|
13
|
+
subcommand "start", "Start services", Kontena::Cli::Apps::StartCommand
|
14
|
+
subcommand "stop", "Stop services", Kontena::Cli::Apps::StopCommand
|
15
|
+
subcommand ["remove","rm"], "Remove services", Kontena::Cli::Apps::RemoveCommand
|
16
|
+
subcommand ["ps", "list"], "List services", Kontena::Cli::Apps::ListCommand
|
17
|
+
subcommand ["logs"], "Show service logs", Kontena::Cli::Apps::LogsCommand
|
18
|
+
def execute
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative '../services/services_helper'
|
2
|
+
|
3
|
+
module Kontena::Cli::Apps
|
4
|
+
module Common
|
5
|
+
include Kontena::Cli::Services::ServicesHelper
|
6
|
+
|
7
|
+
def load_services_from_yml
|
8
|
+
@service_prefix = project_name || current_dir
|
9
|
+
|
10
|
+
abort("File #{filename} does not exist") unless File.exists?(filename)
|
11
|
+
services = parse_yml_file(filename, nil, service_prefix)
|
12
|
+
|
13
|
+
services.delete_if { |name, service| !service_list.include?(name)} unless service_list.empty?
|
14
|
+
services
|
15
|
+
end
|
16
|
+
|
17
|
+
def token
|
18
|
+
@token ||= require_token
|
19
|
+
end
|
20
|
+
|
21
|
+
def prefixed_name(name)
|
22
|
+
"#{service_prefix}-#{name}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def current_dir
|
26
|
+
File.basename(Dir.getwd)
|
27
|
+
end
|
28
|
+
|
29
|
+
def service_exists?(name)
|
30
|
+
get_service(token, prefixed_name(name)) rescue false
|
31
|
+
end
|
32
|
+
|
33
|
+
def parse_yml_file(file, name = nil, prefix='')
|
34
|
+
services = YAML.load(File.read(file) % {prefix: prefix})
|
35
|
+
services.each do |name, options|
|
36
|
+
if options.has_key?('extends')
|
37
|
+
extends = options['extends']
|
38
|
+
options.delete('extends')
|
39
|
+
services[name] = parse_yml_file(extends['file'], extends['service']).merge(options)
|
40
|
+
end
|
41
|
+
if options.has_key?('build')
|
42
|
+
options.delete('build')
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
if name.nil?
|
47
|
+
services
|
48
|
+
else
|
49
|
+
services[name]
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -1,28 +1,22 @@
|
|
1
|
-
require 'kontena/client'
|
2
1
|
require 'yaml'
|
3
|
-
require_relative '
|
4
|
-
require_relative '../services/services_helper'
|
2
|
+
require_relative 'common'
|
5
3
|
|
6
|
-
module Kontena::Cli::
|
7
|
-
class
|
4
|
+
module Kontena::Cli::Apps
|
5
|
+
class DeployCommand < Clamp::Command
|
8
6
|
include Kontena::Cli::Common
|
9
|
-
include
|
7
|
+
include Common
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
@deploy_queue = []
|
14
|
-
end
|
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)'
|
15
11
|
|
16
|
-
|
17
|
-
require_api_url
|
18
|
-
require_token
|
12
|
+
parameter "[SERVICE] ...", "Services to start"
|
19
13
|
|
20
|
-
|
21
|
-
@service_prefix = options.prefix || current_dir
|
22
|
-
|
23
|
-
@services = YAML.load(File.read(filename) % {prefix: service_prefix})
|
24
|
-
@services = @services.delete_if { |name, service| !options.service.include?(name)} if options.service
|
14
|
+
attr_reader :services, :service_prefix
|
25
15
|
|
16
|
+
def execute
|
17
|
+
require_api_url
|
18
|
+
require_token
|
19
|
+
@services = load_services_from_yml
|
26
20
|
Dir.chdir(File.dirname(filename))
|
27
21
|
init_services(services)
|
28
22
|
deploy_services(deploy_queue)
|
@@ -65,7 +59,7 @@ module Kontena::Cli::Stacks
|
|
65
59
|
|
66
60
|
merge_env_vars(options)
|
67
61
|
|
68
|
-
if
|
62
|
+
if service_exists?(name)
|
69
63
|
service = update(name, options)
|
70
64
|
else
|
71
65
|
service = create(name, options)
|
@@ -100,14 +94,6 @@ module Kontena::Cli::Stacks
|
|
100
94
|
deploy_queue.find {|service| service['id'] == prefixed_name(name)} != nil
|
101
95
|
end
|
102
96
|
|
103
|
-
def prefixed_name(name)
|
104
|
-
"#{service_prefix}-#{name}"
|
105
|
-
end
|
106
|
-
|
107
|
-
def current_dir
|
108
|
-
File.basename(Dir.getwd)
|
109
|
-
end
|
110
|
-
|
111
97
|
def merge_env_vars(options)
|
112
98
|
return unless options['env_file']
|
113
99
|
|
@@ -137,7 +123,7 @@ module Kontena::Cli::Stacks
|
|
137
123
|
data[:memory] = parse_memory(options['mem_limit']) if options['mem_limit']
|
138
124
|
data[:memory_swap] = parse_memory(options['memswap_limit']) if options['memswap_limit']
|
139
125
|
data[:cpu_shares] = options['cpu_shares'] if options['cpu_shares']
|
140
|
-
data[:volumes] = options['
|
126
|
+
data[:volumes] = options['volumes'] if options['volumes']
|
141
127
|
data[:volumes_from] = options['volumes_from'] if options['volumes_from']
|
142
128
|
data[:cmd] = options['command'].split(" ") if options['command']
|
143
129
|
data[:affinity] = options['affinity'] if options['affinity']
|
@@ -148,8 +134,8 @@ module Kontena::Cli::Stacks
|
|
148
134
|
data
|
149
135
|
end
|
150
136
|
|
151
|
-
def
|
152
|
-
@
|
137
|
+
def deploy_queue
|
138
|
+
@deploy_queue ||= []
|
153
139
|
end
|
154
140
|
end
|
155
|
-
end
|
141
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Kontena::Cli::Apps
|
4
|
+
class InitCommand < Clamp::Command
|
5
|
+
include Kontena::Cli::Common
|
6
|
+
|
7
|
+
option ["-f", "--file"], "FILE", "Specify a docker-compose file", attribute_name: :docker_compose_file, default: 'docker-compose.yml'
|
8
|
+
option ["-i", "--image-name"], "IMAGE_NAME", "Specify a docker image name"
|
9
|
+
option ["-b", "--base-image"], "BASE_IMAGE_NAME", "Specify a docker base image name", default: "kontena/buildstep"
|
10
|
+
|
11
|
+
def execute
|
12
|
+
require 'highline/import'
|
13
|
+
|
14
|
+
if File.exist?('Dockerfile')
|
15
|
+
puts 'Found Dockerfile'
|
16
|
+
else
|
17
|
+
create_dockerfile if create_dockerfile?
|
18
|
+
end
|
19
|
+
|
20
|
+
if File.exist?(docker_compose_file)
|
21
|
+
puts "Found #{docker_compose_file}."
|
22
|
+
else
|
23
|
+
create_docker_compose_yml if create_docker_compose_yml?
|
24
|
+
end
|
25
|
+
|
26
|
+
services = generate_kontena_services(docker_compose_file)
|
27
|
+
if File.exist?('kontena.yml')
|
28
|
+
merge_kontena_yml!(services)
|
29
|
+
puts "#{'kontena.yml'.colorize(:cyan)} updated."
|
30
|
+
else
|
31
|
+
puts "Creating #{'kontena.yml'.colorize(:cyan)}"
|
32
|
+
end
|
33
|
+
create_yml(services, 'kontena.yml')
|
34
|
+
|
35
|
+
puts "You are ready to go!".colorize(:green)
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
protected
|
40
|
+
def create_dockerfile?
|
41
|
+
%w(y yes).include? ask('Dockerfile not found. Do you want to create it? [Yn]: ').downcase
|
42
|
+
end
|
43
|
+
|
44
|
+
def current_user
|
45
|
+
token = require_token
|
46
|
+
client(token).get('user')
|
47
|
+
end
|
48
|
+
|
49
|
+
def create_dockerfile
|
50
|
+
puts "Creating #{'Dockerfile'.colorize(:cyan)}"
|
51
|
+
dockerfile = File.new('Dockerfile', 'w')
|
52
|
+
dockerfile.puts "FROM #{base_image}"
|
53
|
+
dockerfile.puts "MAINTAINER #{current_user['email']}"
|
54
|
+
dockerfile.close
|
55
|
+
end
|
56
|
+
|
57
|
+
def merge_kontena_yml!(services)
|
58
|
+
puts "kontena.yml already exists. Merging changes."
|
59
|
+
kontena_services = YAML.load(File.read('kontena.yml'))
|
60
|
+
services.each do |name, options|
|
61
|
+
if kontena_services[name]
|
62
|
+
services[name].merge!(kontena_services[name])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def create_docker_compose_yml?
|
68
|
+
%w(y yes).include? ask("#{docker_compose_file} not found. Do you want to create it? [Yn]: ").downcase
|
69
|
+
end
|
70
|
+
|
71
|
+
def create_docker_compose_yml
|
72
|
+
puts "Creating #{docker_compose_file.colorize(:cyan)}"
|
73
|
+
create_yml({'app' => { 'build' => '.'}}, docker_compose_file)
|
74
|
+
end
|
75
|
+
|
76
|
+
def generate_kontena_services(docker_compose = nil)
|
77
|
+
services = {}
|
78
|
+
if docker_compose && File.exist?(docker_compose)
|
79
|
+
compose_services = YAML.load(File.read(docker_compose))
|
80
|
+
compose_services.each do |name, options|
|
81
|
+
services[name] = {'extends' => { 'file' => 'docker-compose.yml', 'service' => name }}
|
82
|
+
if options.has_key?('build')
|
83
|
+
image = image_name || "registry.kontena.local/#{File.basename(Dir.getwd)}-#{name}:latest"
|
84
|
+
services[name]['image'] = image
|
85
|
+
options.delete('build')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
else
|
89
|
+
services = {'app' => { 'image' => "registry.kontena.local/#{File.basename(Dir.getwd)}:latest" }}
|
90
|
+
end
|
91
|
+
services
|
92
|
+
end
|
93
|
+
|
94
|
+
def create_yml(services, file='kontena.yml')
|
95
|
+
yml = File.new(file, 'w')
|
96
|
+
yml.puts services.to_yaml
|
97
|
+
yml.close
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require_relative 'common'
|
3
|
+
|
4
|
+
module Kontena::Cli::Apps
|
5
|
+
class ListCommand < Clamp::Command
|
6
|
+
include Kontena::Cli::Common
|
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, :service_prefix
|
15
|
+
|
16
|
+
def execute
|
17
|
+
@services = load_services_from_yml
|
18
|
+
if services.size > 0
|
19
|
+
Dir.chdir(File.dirname(filename))
|
20
|
+
show_services(services)
|
21
|
+
elsif !service_list.empty?
|
22
|
+
puts "No such service: #{service_list.join(', ')}".colorize(:red)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def show_services(services)
|
28
|
+
puts "%-30.30s %-50.50s %-15s %-10.10s %-15.20s %-50s" % ['NAME', 'IMAGE', 'INSTANCES', 'STATEFUL', 'STATE', 'PORTS']
|
29
|
+
|
30
|
+
services.each do |service_name, opts|
|
31
|
+
service = get_service(token, prefixed_name(service_name)) rescue false
|
32
|
+
if service
|
33
|
+
state = service['stateful'] ? 'yes' : 'no'
|
34
|
+
|
35
|
+
ports = service['ports'].map{|p| "#{p['ip']}:#{p['node_port']}->#{p['container_port']}/#{p['protocol']}"}.join(", ")
|
36
|
+
puts "%-30.30s %-50.50s %-15.10s %-10.10s %-15.20s %-50s" % [service['name'], service['image'], service['container_count'], state, service['state'], ports]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require_relative 'common'
|
3
|
+
|
4
|
+
module Kontena::Cli::Apps
|
5
|
+
class LogsCommand < Clamp::Command
|
6
|
+
include Kontena::Cli::Common
|
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, :service_prefix
|
15
|
+
|
16
|
+
def execute
|
17
|
+
@services = load_services_from_yml
|
18
|
+
if services.size > 0
|
19
|
+
Dir.chdir(File.dirname(filename))
|
20
|
+
show_logs(services)
|
21
|
+
elsif !service_list.empty?
|
22
|
+
puts "No such service: #{service_list.join(', ')}".colorize(:red)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def show_logs(services)
|
28
|
+
logs = []
|
29
|
+
services.each do |service_name, opts|
|
30
|
+
service = get_service(token, prefixed_name(service_name)) rescue false
|
31
|
+
result = client(token).get("services/#{service['id']}/container_logs")
|
32
|
+
logs = logs + result['logs']
|
33
|
+
end
|
34
|
+
logs.sort!{|x,y| DateTime.parse(x['created_at']) <=> DateTime.parse(y['created_at'])}
|
35
|
+
logs.each do |log|
|
36
|
+
color = color_for_container(log['name'])
|
37
|
+
puts "#{log['name'].colorize(color)} | #{log['data']}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def color_for_container(container_id)
|
42
|
+
color_maps[container_id] = colors.shift unless color_maps[container_id]
|
43
|
+
color_maps[container_id].to_sym
|
44
|
+
end
|
45
|
+
|
46
|
+
def color_maps
|
47
|
+
@color_maps ||= {}
|
48
|
+
end
|
49
|
+
|
50
|
+
def colors
|
51
|
+
if(@colors.nil? || @colors.size == 0)
|
52
|
+
@colors = [:green, :magenta, :yellow, :cyan, :red,
|
53
|
+
:light_green, :light_yellow, :ligh_magenta, :light_cyan, :light_red]
|
54
|
+
end
|
55
|
+
@colors
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|