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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Kontena::Cli::Registry
|
|
2
|
+
class DeleteCommand < Clamp::Command
|
|
3
|
+
include Kontena::Cli::Common
|
|
4
|
+
|
|
5
|
+
def execute
|
|
6
|
+
require_api_url
|
|
7
|
+
token = require_token
|
|
8
|
+
|
|
9
|
+
registry = client(token).get("services/#{current_grid}/registry") rescue nil
|
|
10
|
+
abort("Docker Registry service does not exist") if registry.nil?
|
|
11
|
+
|
|
12
|
+
client(token).delete("services/#{current_grid}/registry")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
require_relative 'registry/create_command'
|
|
2
|
+
require_relative 'registry/delete_command'
|
|
3
|
+
|
|
4
|
+
class Kontena::Cli::RegistryCommand < Clamp::Command
|
|
5
|
+
|
|
6
|
+
subcommand "create", "Create Docker image registry service", Kontena::Cli::Registry::CreateCommand
|
|
7
|
+
subcommand "delete", "Delete Docker image registry service", Kontena::Cli::Registry::DeleteCommand
|
|
8
|
+
|
|
9
|
+
def execute
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
class Kontena::Cli::ResetPasswordCommand < Clamp::Command
|
|
2
|
+
include Kontena::Cli::Common
|
|
3
|
+
|
|
4
|
+
parameter "TOKEN", "Password reset token"
|
|
5
|
+
|
|
6
|
+
def execute
|
|
7
|
+
require_api_url
|
|
8
|
+
password = password("Password: ")
|
|
9
|
+
password2 = password("Password again: ")
|
|
10
|
+
if password != password2
|
|
11
|
+
abort("Passwords don't match")
|
|
12
|
+
end
|
|
13
|
+
params = {token: token, password: password}
|
|
14
|
+
client.put('user/password_reset', params)
|
|
15
|
+
puts 'Password is now changed. To login with the new password, please run: kontena login'
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require_relative 'services/list_command'
|
|
2
|
+
require_relative 'services/show_command'
|
|
3
|
+
require_relative 'services/update_command'
|
|
4
|
+
require_relative 'services/deploy_command'
|
|
5
|
+
require_relative 'services/stop_command'
|
|
6
|
+
require_relative 'services/start_command'
|
|
7
|
+
require_relative 'services/restart_command'
|
|
8
|
+
require_relative 'services/create_command'
|
|
9
|
+
require_relative 'services/scale_command'
|
|
10
|
+
require_relative 'services/delete_command'
|
|
11
|
+
require_relative 'services/containers_command'
|
|
12
|
+
require_relative 'services/logs_command'
|
|
13
|
+
require_relative 'services/stats_command'
|
|
14
|
+
|
|
15
|
+
class Kontena::Cli::ServiceCommand < Clamp::Command
|
|
16
|
+
|
|
17
|
+
subcommand "list", "List services", Kontena::Cli::Services::ListCommand
|
|
18
|
+
subcommand "create", "Create a new service", Kontena::Cli::Services::CreateCommand
|
|
19
|
+
subcommand "show", "Show service details", Kontena::Cli::Services::ShowCommand
|
|
20
|
+
subcommand "update", "Update service configuration", Kontena::Cli::Services::UpdateCommand
|
|
21
|
+
subcommand "deploy", "Deploy service", Kontena::Cli::Services::DeployCommand
|
|
22
|
+
subcommand "stop", "Stop service", Kontena::Cli::Services::StopCommand
|
|
23
|
+
subcommand "start", "Start service", Kontena::Cli::Services::StartCommand
|
|
24
|
+
subcommand "restart", "Restart service", Kontena::Cli::Services::RestartCommand
|
|
25
|
+
subcommand "scale", "Scale service", Kontena::Cli::Services::ScaleCommand
|
|
26
|
+
subcommand "delete", "Delete service", Kontena::Cli::Services::DeleteCommand
|
|
27
|
+
subcommand "containers", "List service containers", Kontena::Cli::Services::ContainersCommand
|
|
28
|
+
subcommand "logs", "Show service logs", Kontena::Cli::Services::LogsCommand
|
|
29
|
+
subcommand "stats", "Show service statistics", Kontena::Cli::Services::StatsCommand
|
|
30
|
+
|
|
31
|
+
def execute
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class ContainersCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
parameter "NAME", "Service name"
|
|
9
|
+
|
|
10
|
+
def execute
|
|
11
|
+
require_api_url
|
|
12
|
+
token = require_token
|
|
13
|
+
|
|
14
|
+
result = client(token).get("services/#{current_grid}/#{name}/containers")
|
|
15
|
+
result['containers'].each do |container|
|
|
16
|
+
puts "#{container['id']}:"
|
|
17
|
+
puts " rev: #{container['deploy_rev']}"
|
|
18
|
+
puts " node: #{container['node']['name']}"
|
|
19
|
+
puts " dns: #{container['name']}.#{current_grid}.kontena.local"
|
|
20
|
+
puts " ip: #{container['overlay_cidr'].split('/')[0]}"
|
|
21
|
+
puts " public ip: #{container['node']['public_ip']}"
|
|
22
|
+
if container['status'] == 'unknown'
|
|
23
|
+
puts " status: #{container['status'].colorize(:yellow)}"
|
|
24
|
+
else
|
|
25
|
+
puts " status: #{container['status']}"
|
|
26
|
+
end
|
|
27
|
+
puts ""
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class CreateCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
parameter "NAME", "Service name"
|
|
9
|
+
parameter "IMAGE", "Service image (example: redis:3.0)"
|
|
10
|
+
|
|
11
|
+
option ["-p", "--ports"], "PORTS", "Publish a service's port to the host", multivalued: true
|
|
12
|
+
option ["-e", "--env"], "ENV", "Set environment variables", multivalued: true
|
|
13
|
+
option ["-l", "--link"], "LINK", "Add link to another service in the form of name:alias", multivalued: true
|
|
14
|
+
option ["-v", "--volume"], "VOLUME", "Add a volume or bind mount it from the host", multivalued: true
|
|
15
|
+
option "--volumes-from", "VOLUMES_FROM", "Mount volumes from another container", multivalued: true
|
|
16
|
+
option ["-a", "--affinity"], "AFFINITY", "Set service affinity", multivalued: true
|
|
17
|
+
option ["-c", "--cpu-shares"], "CPU_SHARES", "CPU shares (relative weight)"
|
|
18
|
+
option ["-m", "--memory"], "MEMORY", "Memory limit (format: <number><optional unit>, where unit = b, k, m or g)"
|
|
19
|
+
option ["--memory-swap"], "MEMORY_SWAP", "Total memory usage (memory + swap), set \'-1\' to disable swap (format: <number><optional unit>, where unit = b, k, m or g)"
|
|
20
|
+
option "--cmd", "CMD", "Command to execute"
|
|
21
|
+
option "--instances", "INSTANCES", "How many instances should be deployed"
|
|
22
|
+
option ["-u", "--user"], "USER", "Username who executes first process inside container"
|
|
23
|
+
option "--stateful", :flag, "Set service as stateful", default: false
|
|
24
|
+
option "--cap-add", "CAP_ADD", "Add capabitilies", multivalued: true
|
|
25
|
+
option "--cap-drop", "CAP_DROP", "Drop capabitilies", multivalued: true
|
|
26
|
+
|
|
27
|
+
def execute
|
|
28
|
+
require_api_url
|
|
29
|
+
token = require_token
|
|
30
|
+
data = {
|
|
31
|
+
name: name,
|
|
32
|
+
image: image,
|
|
33
|
+
stateful: stateful?
|
|
34
|
+
}
|
|
35
|
+
data.merge!(parse_service_data_from_options)
|
|
36
|
+
create_service(token, current_grid, data)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
##
|
|
40
|
+
# parse given options to hash
|
|
41
|
+
# @return [Hash]
|
|
42
|
+
def parse_service_data_from_options
|
|
43
|
+
data = {}
|
|
44
|
+
data[:ports] = parse_ports(ports_list) if ports_list
|
|
45
|
+
data[:links] = parse_links(link_list) if link_list
|
|
46
|
+
data[:volumes] = volume_list if volume_list
|
|
47
|
+
data[:volumes_from] = volumes_from_list if volumes_from_list
|
|
48
|
+
data[:memory] = parse_memory(memory) if memory
|
|
49
|
+
data[:memory_swap] = parse_memory(memory_swap) if memory_swap
|
|
50
|
+
data[:cpu_shares] = cpu_shares if cpu_shares
|
|
51
|
+
data[:affinity] = affinity_list if affinity_list
|
|
52
|
+
data[:env] = env_list if env_list
|
|
53
|
+
data[:container_count] = instances if instances
|
|
54
|
+
data[:cmd] = cmd.split(" ") if cmd
|
|
55
|
+
data[:user] = user if user
|
|
56
|
+
data[:image] = image if image
|
|
57
|
+
data[:cap_add] = cap_add_list if cap_add_list
|
|
58
|
+
data[:cap_drop] = cap_drop_list if cap_drop_list
|
|
59
|
+
data
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class DeleteCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
parameter "NAME", "Service name"
|
|
9
|
+
|
|
10
|
+
def execute
|
|
11
|
+
require_api_url
|
|
12
|
+
token = require_token
|
|
13
|
+
|
|
14
|
+
result = client(token).delete("services/#{parse_service_id(name)}")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class DeployCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
parameter "NAME", "Service name"
|
|
9
|
+
option '--strategy', 'STRATEGY', 'Define deploy strategy (ha / random)'
|
|
10
|
+
option '--wait-for-port', 'WAIT_FOR_PORT', 'Wait for given container port to open before deploying next container'
|
|
11
|
+
|
|
12
|
+
def execute
|
|
13
|
+
require_api_url
|
|
14
|
+
token = require_token
|
|
15
|
+
service_id = name
|
|
16
|
+
data = {}
|
|
17
|
+
data[:strategy] = strategy if strategy
|
|
18
|
+
data[:wait_for_port] = wait_for_port if wait_for_port
|
|
19
|
+
deploy_service(token, service_id, data)
|
|
20
|
+
show_service(token, service_id)
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class ListCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
token = require_token
|
|
11
|
+
|
|
12
|
+
grids = client(token).get("grids/#{current_grid}/services")
|
|
13
|
+
puts "%-30.30s %-40.40s %-10s %-8s" % ['NAME', 'IMAGE', 'INSTANCES', 'STATEFUL']
|
|
14
|
+
grids['services'].each do |service|
|
|
15
|
+
state = service['stateful'] ? 'yes' : 'no'
|
|
16
|
+
puts "%-30.30s %-40.40s %-10.10s %-8s" % [service['name'], service['image'], service['container_count'], state]
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class LogsCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
parameter "NAME", "Service name"
|
|
9
|
+
option ["-f", "--follow"], :flag, "Follow (tail) logs", default: false
|
|
10
|
+
option ["-s", "--search"], "SEARCH", "Search from logs"
|
|
11
|
+
option ["-c", "--container"], "CONTAINER", "Show only specified container logs"
|
|
12
|
+
|
|
13
|
+
def execute
|
|
14
|
+
require_api_url
|
|
15
|
+
token = require_token
|
|
16
|
+
last_id = nil
|
|
17
|
+
loop do
|
|
18
|
+
query_params = []
|
|
19
|
+
query_params << "from=#{last_id}" unless last_id.nil?
|
|
20
|
+
query_params << "search=#{search}" if search
|
|
21
|
+
query_params << "container=#{container}" if container
|
|
22
|
+
|
|
23
|
+
result = client(token).get("services/#{current_grid}/#{name}/container_logs?#{query_params.join('&')}")
|
|
24
|
+
result['logs'].each do |log|
|
|
25
|
+
color = color_for_container(log['name'])
|
|
26
|
+
puts "#{log['name'].colorize(color)} | #{log['data']}"
|
|
27
|
+
last_id = log['id']
|
|
28
|
+
end
|
|
29
|
+
break unless follow?
|
|
30
|
+
sleep(2)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def color_for_container(container_id)
|
|
35
|
+
color_maps[container_id] = colors.shift unless color_maps[container_id]
|
|
36
|
+
color_maps[container_id].to_sym
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def color_maps
|
|
40
|
+
@color_maps ||= {}
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def colors
|
|
44
|
+
if(@colors.nil? || @colors.size == 0)
|
|
45
|
+
@colors = [:green, :yellow, :magenta, :cyan, :red,
|
|
46
|
+
:light_green, :light_yellow, :ligh_magenta, :light_cyan, :light_red]
|
|
47
|
+
end
|
|
48
|
+
@colors
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class RestartCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
parameter "NAME", "Service name"
|
|
9
|
+
|
|
10
|
+
def execute
|
|
11
|
+
require_api_url
|
|
12
|
+
token = require_token
|
|
13
|
+
result = client(token).post("services/#{parse_service_id(name)}/restart", {})
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class ScaleCommand < Clamp::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include ServicesHelper
|
|
7
|
+
|
|
8
|
+
parameter "NAME", "Service name"
|
|
9
|
+
parameter "INSTANCES", "Scales service to given number of instances"
|
|
10
|
+
option '--strategy', 'STRATEGY', 'Define deploy strategy (ha / random)'
|
|
11
|
+
|
|
12
|
+
def execute
|
|
13
|
+
token = require_token
|
|
14
|
+
client(token).put("services/#{parse_service_id(name)}", {container_count: instances})
|
|
15
|
+
opts = {}
|
|
16
|
+
opts[:strategy] = strategy if strategy
|
|
17
|
+
deploy_service(token, name, opts)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -29,6 +29,79 @@ module Kontena
|
|
|
29
29
|
client(token).get("services/#{param}")
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
+
# @param [String] token
|
|
33
|
+
# @param [String] service_id
|
|
34
|
+
def show_service(token, service_id)
|
|
35
|
+
service = get_service(token, service_id)
|
|
36
|
+
grid = service['id'].split('/')[0]
|
|
37
|
+
puts "#{service['id']}:"
|
|
38
|
+
puts " status: #{service['state'] }"
|
|
39
|
+
puts " stateful: #{service['stateful'] == true ? 'yes' : 'no' }"
|
|
40
|
+
puts " scaling: #{service['container_count'] }"
|
|
41
|
+
puts " image: #{service['image']}"
|
|
42
|
+
puts " dns: #{service['name']}.#{grid}.kontena.local"
|
|
43
|
+
|
|
44
|
+
puts " affinity: "
|
|
45
|
+
service['affinity'].to_a.each do |a|
|
|
46
|
+
puts " - #{a}"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
if service['cmd']
|
|
50
|
+
puts " cmd: #{service['cmd'].join(' ')}"
|
|
51
|
+
else
|
|
52
|
+
puts " cmd: "
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
puts " env: "
|
|
56
|
+
service['env'].to_a.each{|e| puts " - #{e}"}
|
|
57
|
+
|
|
58
|
+
puts " ports:"
|
|
59
|
+
service['ports'].to_a.each do |p|
|
|
60
|
+
puts " - #{p['node_port']}:#{p['container_port']}/#{p['protocol']}"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
puts " volumes:"
|
|
64
|
+
service['volumes'].to_a.each do |v|
|
|
65
|
+
puts " - #{v}"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
puts " volumes_from:"
|
|
69
|
+
service['volumes_from'].to_a.each do |v|
|
|
70
|
+
puts " - #{v}"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
puts " links: "
|
|
74
|
+
service['links'].to_a.each do |l|
|
|
75
|
+
puts " - #{l['alias']}"
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
puts " cap_add:"
|
|
79
|
+
service['cap_add'].to_a.each do |c|
|
|
80
|
+
puts " - #{c}"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
puts " cap_drop:"
|
|
84
|
+
service['cap_drop'].to_a.each do |c|
|
|
85
|
+
puts " - #{c}"
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
puts " containers:"
|
|
89
|
+
result = client(token).get("services/#{parse_service_id(service_id)}/containers")
|
|
90
|
+
result['containers'].each do |container|
|
|
91
|
+
puts " #{container['name']}:"
|
|
92
|
+
puts " rev: #{container['deploy_rev']}"
|
|
93
|
+
puts " node: #{container['node']['name']}"
|
|
94
|
+
puts " dns: #{container['name']}.#{grid}.kontena.local"
|
|
95
|
+
puts " ip: #{container['overlay_cidr'].split('/')[0]}"
|
|
96
|
+
puts " public ip: #{container['node']['public_ip']}"
|
|
97
|
+
if container['status'] == 'unknown'
|
|
98
|
+
puts " status: #{container['status'].colorize(:yellow)}"
|
|
99
|
+
else
|
|
100
|
+
puts " status: #{container['status']}"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
32
105
|
# @param [String] token
|
|
33
106
|
# @param [String] service_id
|
|
34
107
|
# @param [Hash] data
|
|
@@ -44,6 +117,27 @@ module Kontena
|
|
|
44
117
|
puts ''
|
|
45
118
|
end
|
|
46
119
|
|
|
120
|
+
# @param [String] token
|
|
121
|
+
# @param [String] service_id
|
|
122
|
+
def start_service(token, service_id)
|
|
123
|
+
param = parse_service_id(service_id)
|
|
124
|
+
client(token).post("services/#{param}/start", {})
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @param [String] token
|
|
128
|
+
# @param [String] service_id
|
|
129
|
+
def stop_service(token, service_id)
|
|
130
|
+
param = parse_service_id(service_id)
|
|
131
|
+
client(token).post("services/#{param}/stop", {})
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# @param [String] token
|
|
135
|
+
# @param [String] service_id
|
|
136
|
+
def delete_service(token, service_id)
|
|
137
|
+
param = parse_service_id(service_id)
|
|
138
|
+
client(token).delete("services/#{param}")
|
|
139
|
+
end
|
|
140
|
+
|
|
47
141
|
# @param [String] service_id
|
|
48
142
|
# @return [String]
|
|
49
143
|
def parse_service_id(service_id)
|