kontena-cli 0.7.3 → 0.8.0
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/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
|