central-cli 0.6.3
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 +7 -0
- data/.dockerignore +3 -0
- data/.gitignore +15 -0
- data/.rspec +6 -0
- data/.rubocop.yml +5 -0
- data/Dockerfile +15 -0
- data/Gemfile +10 -0
- data/LICENSE +191 -0
- data/README.md +39 -0
- data/Rakefile +9 -0
- data/VERSION +1 -0
- data/bin/cm +85 -0
- data/central-cli.gemspec +35 -0
- data/central-docker.sh +6 -0
- data/lib/central/cli/app_command.rb +29 -0
- data/lib/central/cli/apps/build_command.rb +24 -0
- data/lib/central/cli/apps/central_yml_generator.rb +88 -0
- data/lib/central/cli/apps/common.rb +166 -0
- data/lib/central/cli/apps/deploy_command.rb +191 -0
- data/lib/central/cli/apps/docker_compose_generator.rb +48 -0
- data/lib/central/cli/apps/docker_helper.rb +85 -0
- data/lib/central/cli/apps/dockerfile_generator.rb +15 -0
- data/lib/central/cli/apps/init_command.rb +91 -0
- data/lib/central/cli/apps/list_command.rb +68 -0
- data/lib/central/cli/apps/logs_command.rb +76 -0
- data/lib/central/cli/apps/monitor_command.rb +93 -0
- data/lib/central/cli/apps/remove_command.rb +80 -0
- data/lib/central/cli/apps/restart_command.rb +38 -0
- data/lib/central/cli/apps/scale_command.rb +31 -0
- data/lib/central/cli/apps/show_command.rb +23 -0
- data/lib/central/cli/apps/start_command.rb +39 -0
- data/lib/central/cli/apps/stop_command.rb +39 -0
- data/lib/central/cli/auth/aws/create_command.rb +34 -0
- data/lib/central/cli/auth/aws_command.rb +7 -0
- data/lib/central/cli/auth/list_command.rb +28 -0
- data/lib/central/cli/auth_command.rb +9 -0
- data/lib/central/cli/bytes_helper.rb +38 -0
- data/lib/central/cli/common.rb +148 -0
- data/lib/central/cli/container_command.rb +10 -0
- data/lib/central/cli/containers/exec_command.rb +21 -0
- data/lib/central/cli/containers/inspect_command.rb +22 -0
- data/lib/central/cli/etcd/common.rb +7 -0
- data/lib/central/cli/etcd/get_command.rb +26 -0
- data/lib/central/cli/etcd/list_command.rb +31 -0
- data/lib/central/cli/etcd/mkdir_command.rb +21 -0
- data/lib/central/cli/etcd/remove_command.rb +25 -0
- data/lib/central/cli/etcd/set_command.rb +22 -0
- data/lib/central/cli/etcd_command.rb +16 -0
- data/lib/central/cli/external_registries/add_command.rb +21 -0
- data/lib/central/cli/external_registries/delete_command.rb +15 -0
- data/lib/central/cli/external_registries/list_command.rb +27 -0
- data/lib/central/cli/external_registries/remove_command.rb +13 -0
- data/lib/central/cli/external_registry_command.rb +14 -0
- data/lib/central/cli/login_command.rb +121 -0
- data/lib/central/cli/logout_command.rb +7 -0
- data/lib/central/cli/master/aws/create_command.rb +41 -0
- data/lib/central/cli/master/aws_command.rb +7 -0
- data/lib/central/cli/master/azure/create_command.rb +39 -0
- data/lib/central/cli/master/azure_command.rb +11 -0
- data/lib/central/cli/master/digital_ocean/create_command.rb +35 -0
- data/lib/central/cli/master/digital_ocean_command.rb +11 -0
- data/lib/central/cli/master/list_command.rb +28 -0
- data/lib/central/cli/master/use_command.rb +34 -0
- data/lib/central/cli/master/users/add_role_command.rb +26 -0
- data/lib/central/cli/master/users/invite_command.rb +24 -0
- data/lib/central/cli/master/users/list_command.rb +18 -0
- data/lib/central/cli/master/users/remove_command.rb +22 -0
- data/lib/central/cli/master/users/remove_role_command.rb +25 -0
- data/lib/central/cli/master/users_command.rb +15 -0
- data/lib/central/cli/master/vagrant/create_command.rb +25 -0
- data/lib/central/cli/master/vagrant/restart_command.rb +20 -0
- data/lib/central/cli/master/vagrant/ssh_command.rb +15 -0
- data/lib/central/cli/master/vagrant/start_command.rb +20 -0
- data/lib/central/cli/master/vagrant/stop_command.rb +20 -0
- data/lib/central/cli/master/vagrant/terminate_command.rb +13 -0
- data/lib/central/cli/master/vagrant_command.rb +21 -0
- data/lib/central/cli/master_command.rb +19 -0
- data/lib/central/cli/node_command.rb +30 -0
- data/lib/central/cli/nodes/add_label_command.rb +19 -0
- data/lib/central/cli/nodes/aws/create_command.rb +40 -0
- data/lib/central/cli/nodes/aws/restart_command.rb +29 -0
- data/lib/central/cli/nodes/aws/terminate_command.rb +21 -0
- data/lib/central/cli/nodes/aws_command.rb +14 -0
- data/lib/central/cli/nodes/azure/create_command.rb +40 -0
- data/lib/central/cli/nodes/azure/restart_command.rb +31 -0
- data/lib/central/cli/nodes/azure/terminate_command.rb +21 -0
- data/lib/central/cli/nodes/azure_command.rb +14 -0
- data/lib/central/cli/nodes/digital_ocean/create_command.rb +32 -0
- data/lib/central/cli/nodes/digital_ocean/restart_command.rb +27 -0
- data/lib/central/cli/nodes/digital_ocean/terminate_command.rb +19 -0
- data/lib/central/cli/nodes/digital_ocean_command.rb +14 -0
- data/lib/central/cli/nodes/label_command.rb +12 -0
- data/lib/central/cli/nodes/labels/add_command.rb +19 -0
- data/lib/central/cli/nodes/labels/remove_command.rb +23 -0
- data/lib/central/cli/nodes/list_command.rb +62 -0
- data/lib/central/cli/nodes/remove_command.rb +16 -0
- data/lib/central/cli/nodes/remove_label_command.rb +23 -0
- data/lib/central/cli/nodes/show_command.rb +49 -0
- data/lib/central/cli/nodes/ssh_command.rb +31 -0
- data/lib/central/cli/nodes/update_command.rb +20 -0
- data/lib/central/cli/nodes/vagrant/create_command.rb +27 -0
- data/lib/central/cli/nodes/vagrant/restart_command.rb +26 -0
- data/lib/central/cli/nodes/vagrant/ssh_command.rb +21 -0
- data/lib/central/cli/nodes/vagrant/start_command.rb +26 -0
- data/lib/central/cli/nodes/vagrant/stop_command.rb +26 -0
- data/lib/central/cli/nodes/vagrant/terminate_command.rb +17 -0
- data/lib/central/cli/nodes/vagrant_command.rb +20 -0
- data/lib/central/cli/register_command.rb +21 -0
- data/lib/central/cli/registry/create_command.rb +144 -0
- data/lib/central/cli/registry/delete_command.rb +22 -0
- data/lib/central/cli/registry/remove_command.rb +19 -0
- data/lib/central/cli/registry_command.rb +11 -0
- data/lib/central/cli/service_command.rb +49 -0
- data/lib/central/cli/services/add_env_command.rb +19 -0
- data/lib/central/cli/services/add_secret_command.rb +24 -0
- data/lib/central/cli/services/container_command.rb +8 -0
- data/lib/central/cli/services/containers_command.rb +32 -0
- data/lib/central/cli/services/create_command.rb +90 -0
- data/lib/central/cli/services/delete_command.rb +19 -0
- data/lib/central/cli/services/deploy_command.rb +21 -0
- data/lib/central/cli/services/env_command.rb +11 -0
- data/lib/central/cli/services/envs/add_command.rb +19 -0
- data/lib/central/cli/services/envs/list_command.rb +20 -0
- data/lib/central/cli/services/envs/remove_command.rb +18 -0
- data/lib/central/cli/services/envs_command.rb +20 -0
- data/lib/central/cli/services/link_command.rb +26 -0
- data/lib/central/cli/services/list_command.rb +42 -0
- data/lib/central/cli/services/logs_command.rb +57 -0
- data/lib/central/cli/services/monitor_command.rb +58 -0
- data/lib/central/cli/services/remove_command.rb +17 -0
- data/lib/central/cli/services/remove_env_command.rb +18 -0
- data/lib/central/cli/services/remove_secret_command.rb +28 -0
- data/lib/central/cli/services/restart_command.rb +17 -0
- data/lib/central/cli/services/scale_command.rb +17 -0
- data/lib/central/cli/services/secret_command.rb +9 -0
- data/lib/central/cli/services/secrets/link_command.rb +24 -0
- data/lib/central/cli/services/secrets/unlink_command.rb +28 -0
- data/lib/central/cli/services/services_helper.rb +360 -0
- data/lib/central/cli/services/show_command.rb +18 -0
- data/lib/central/cli/services/start_command.rb +17 -0
- data/lib/central/cli/services/stats_command.rb +74 -0
- data/lib/central/cli/services/stop_command.rb +17 -0
- data/lib/central/cli/services/unlink_command.rb +25 -0
- data/lib/central/cli/services/update_command.rb +78 -0
- data/lib/central/cli/stack_command.rb +32 -0
- data/lib/central/cli/stack_options.rb +11 -0
- data/lib/central/cli/stacks/add_user_command.rb +18 -0
- data/lib/central/cli/stacks/audit_log_command.rb +21 -0
- data/lib/central/cli/stacks/cloud_config_command.rb +41 -0
- data/lib/central/cli/stacks/common.rb +95 -0
- data/lib/central/cli/stacks/create_command.rb +26 -0
- data/lib/central/cli/stacks/current_command.rb +25 -0
- data/lib/central/cli/stacks/env_command.rb +32 -0
- data/lib/central/cli/stacks/list_command.rb +35 -0
- data/lib/central/cli/stacks/list_users_command.rb +26 -0
- data/lib/central/cli/stacks/logs_command.rb +81 -0
- data/lib/central/cli/stacks/remove_command.rb +26 -0
- data/lib/central/cli/stacks/remove_user_command.rb +17 -0
- data/lib/central/cli/stacks/show_command.rb +19 -0
- data/lib/central/cli/stacks/trusted_subnets/add_command.rb +16 -0
- data/lib/central/cli/stacks/trusted_subnets/list_command.rb +17 -0
- data/lib/central/cli/stacks/trusted_subnets/remove_command.rb +20 -0
- data/lib/central/cli/stacks/update_command.rb +27 -0
- data/lib/central/cli/stacks/use_command.rb +21 -0
- data/lib/central/cli/stacks/user_command.rb +11 -0
- data/lib/central/cli/stacks/users/add_command.rb +18 -0
- data/lib/central/cli/stacks/users/list_command.rb +18 -0
- data/lib/central/cli/stacks/users/remove_command.rb +17 -0
- data/lib/central/cli/user/forgot_password_command.rb +16 -0
- data/lib/central/cli/user/reset_password_command.rb +21 -0
- data/lib/central/cli/user/verify_command.rb +22 -0
- data/lib/central/cli/user_command.rb +12 -0
- data/lib/central/cli/vault/list_command.rb +25 -0
- data/lib/central/cli/vault/read_command.rb +17 -0
- data/lib/central/cli/vault/remove_command.rb +14 -0
- data/lib/central/cli/vault/update_command.rb +18 -0
- data/lib/central/cli/vault/write_command.rb +22 -0
- data/lib/central/cli/vault_command.rb +16 -0
- data/lib/central/cli/version.rb +5 -0
- data/lib/central/cli/version_command.rb +22 -0
- data/lib/central/cli/vpn/config_command.rb +25 -0
- data/lib/central/cli/vpn/create_command.rb +71 -0
- data/lib/central/cli/vpn/delete_command.rb +21 -0
- data/lib/central/cli/vpn/remove_command.rb +19 -0
- data/lib/central/cli/vpn_command.rb +13 -0
- data/lib/central/cli/whoami_command.rb +20 -0
- data/lib/central/client.rb +208 -0
- data/lib/central/errors.rb +10 -0
- data/lib/central/machine/aws.rb +14 -0
- data/lib/central/machine/aws/auth_provisioner.rb +161 -0
- data/lib/central/machine/aws/cloudinit.yml +71 -0
- data/lib/central/machine/aws/cloudinit_master.yml +118 -0
- data/lib/central/machine/aws/cloudinit_oauth.yml +76 -0
- data/lib/central/machine/aws/common.rb +31 -0
- data/lib/central/machine/aws/master_provisioner.rb +171 -0
- data/lib/central/machine/aws/node_destroyer.rb +46 -0
- data/lib/central/machine/aws/node_provisioner.rb +214 -0
- data/lib/central/machine/azure.rb +13 -0
- data/lib/central/machine/azure/cloudinit.yml +64 -0
- data/lib/central/machine/azure/cloudinit_master.yml +106 -0
- data/lib/central/machine/azure/logger.rb +26 -0
- data/lib/central/machine/azure/master_provisioner.rb +125 -0
- data/lib/central/machine/azure/node_destroyer.rb +52 -0
- data/lib/central/machine/azure/node_provisioner.rb +126 -0
- data/lib/central/machine/cert_helper.rb +39 -0
- data/lib/central/machine/cloud_config/cloudinit.yml +70 -0
- data/lib/central/machine/cloud_config/node_generator.rb +27 -0
- data/lib/central/machine/common.rb +16 -0
- data/lib/central/machine/digital_ocean.rb +13 -0
- data/lib/central/machine/digital_ocean/cloudinit.yml +64 -0
- data/lib/central/machine/digital_ocean/cloudinit_master.yml +118 -0
- data/lib/central/machine/digital_ocean/master_provisioner.rb +99 -0
- data/lib/central/machine/digital_ocean/node_destroyer.rb +40 -0
- data/lib/central/machine/digital_ocean/node_provisioner.rb +81 -0
- data/lib/central/machine/random_name.rb +39 -0
- data/lib/central/machine/vagrant.rb +12 -0
- data/lib/central/machine/vagrant/Vagrantfile.master.rb.erb +116 -0
- data/lib/central/machine/vagrant/Vagrantfile.node.rb.erb +32 -0
- data/lib/central/machine/vagrant/cloudinit.yml +73 -0
- data/lib/central/machine/vagrant/master_destroyer.rb +34 -0
- data/lib/central/machine/vagrant/master_provisioner.rb +79 -0
- data/lib/central/machine/vagrant/node_destroyer.rb +38 -0
- data/lib/central/machine/vagrant/node_provisioner.rb +68 -0
- data/lib/central/scripts/completer +157 -0
- data/lib/central/scripts/init +11 -0
- data/spec/central/cli/app/common_spec.rb +150 -0
- data/spec/central/cli/app/deploy_command_spec.rb +598 -0
- data/spec/central/cli/app/docker_helper_spec.rb +102 -0
- data/spec/central/cli/app/scale_spec.rb +49 -0
- data/spec/central/cli/common_spec.rb +117 -0
- data/spec/central/cli/login_command_spec.rb +31 -0
- data/spec/central/cli/master/current_command_spec.rb +55 -0
- data/spec/central/cli/master/use_command_spec.rb +37 -0
- data/spec/central/cli/master/users/invite_command_spec.rb +34 -0
- data/spec/central/cli/master/users/remove_command_spec.rb +26 -0
- data/spec/central/cli/master/users/roles/add_command_spec.rb +34 -0
- data/spec/central/cli/master/users/roles/remove_command_spec.rb +34 -0
- data/spec/central/cli/register_command_spec.rb +56 -0
- data/spec/central/cli/services/containers_command_spec.rb +40 -0
- data/spec/central/cli/services/link_command_spec.rb +38 -0
- data/spec/central/cli/services/restart_command_spec.rb +27 -0
- data/spec/central/cli/services/secrets/link_command_spec.rb +59 -0
- data/spec/central/cli/services/secrets/unlink_command_spec.rb +48 -0
- data/spec/central/cli/services/services_helper_spec.rb +170 -0
- data/spec/central/cli/services/unlink_command_spec.rb +38 -0
- data/spec/central/cli/stacks/trusted_subnets/add_command_spec.rb +37 -0
- data/spec/central/cli/stacks/trusted_subnets/list_command_spec.rb +30 -0
- data/spec/central/cli/stacks/trusted_subnets/remove_command_spec.rb +37 -0
- data/spec/central/cli/version_command_spec.rb +16 -0
- data/spec/fixtures/central.yml +17 -0
- data/spec/fixtures/docker-compose.yml +8 -0
- data/spec/fixtures/mysql.yml +3 -0
- data/spec/fixtures/wordpress-scaled.yml +3 -0
- data/spec/fixtures/wordpress.yml +2 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/support/client_helpers.rb +30 -0
- data/spec/support/fixtures_helpers.rb +7 -0
- data/tasks/rspec.rake +5 -0
- metadata +463 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Central::Cli::Nodes::Labels
|
|
2
|
+
class RemoveCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
|
|
5
|
+
parameter 'NODE_ID', 'Node id'
|
|
6
|
+
parameter 'LABEL', 'Label'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
token = require_token
|
|
12
|
+
|
|
13
|
+
node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
|
|
14
|
+
unless node['labels'].include?(label)
|
|
15
|
+
abort("Node #{node['name']} does not have label #{label}")
|
|
16
|
+
end
|
|
17
|
+
node['labels'].delete(label)
|
|
18
|
+
data = {}
|
|
19
|
+
data[:labels] = node['labels']
|
|
20
|
+
client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
|
|
2
|
+
require 'tty'
|
|
3
|
+
|
|
4
|
+
module Central::Cli::Nodes
|
|
5
|
+
class ListCommand < Clamp::Command
|
|
6
|
+
include Central::Cli::Common
|
|
7
|
+
include Central::Cli::StackOptions
|
|
8
|
+
|
|
9
|
+
option ['--all'], :flag, 'List nodes for all stacks', default: false
|
|
10
|
+
|
|
11
|
+
def execute
|
|
12
|
+
require_api_url
|
|
13
|
+
require_current_stack
|
|
14
|
+
token = require_token
|
|
15
|
+
rows = []
|
|
16
|
+
|
|
17
|
+
if all?
|
|
18
|
+
stacks = client(token).get('stacks')
|
|
19
|
+
header = ['Name', 'Public IP', 'Status', 'Labels']
|
|
20
|
+
|
|
21
|
+
stacks['stacks'].each do |stack|
|
|
22
|
+
nodes = client(token).get("stacks/#{stack['name']}/nodes")
|
|
23
|
+
nodes['nodes'].each do |node|
|
|
24
|
+
status = if node['connected']
|
|
25
|
+
' ✓ '.colorize(:green)
|
|
26
|
+
else
|
|
27
|
+
' ✘ '.colorize(:red)
|
|
28
|
+
end
|
|
29
|
+
rows << [
|
|
30
|
+
"#{stack['name']}/#{node['name']}",
|
|
31
|
+
node['public_ip'],
|
|
32
|
+
status,
|
|
33
|
+
(node['labels'] || ['-']).join(', ')
|
|
34
|
+
]
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
nodes = client(token).get("stacks/#{current_stack}/nodes")
|
|
39
|
+
header = ['Name', 'Public IP', 'Status', 'Labels']
|
|
40
|
+
nodes['nodes'].each do |node|
|
|
41
|
+
status = if node['connected']
|
|
42
|
+
' ✓ '.colorize(:green)
|
|
43
|
+
else
|
|
44
|
+
' ✘ '.colorize(:red)
|
|
45
|
+
end
|
|
46
|
+
rows << [
|
|
47
|
+
node['name'],
|
|
48
|
+
node['public_ip'],
|
|
49
|
+
status,
|
|
50
|
+
(node['labels'] || ['-']).join(', ')
|
|
51
|
+
]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
ttable = TTY::Table.new header: header, rows: Array.new(rows)
|
|
55
|
+
renderer = TTY::Table::Renderer::Unicode.new(ttable)
|
|
56
|
+
renderer.border.style = :cyan
|
|
57
|
+
renderer.padding = [0, 1, 0, 1]
|
|
58
|
+
puts renderer.render
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Central::Cli::Nodes
|
|
2
|
+
class RemoveCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NODE_ID', 'Node id'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
token = require_token
|
|
12
|
+
|
|
13
|
+
client(token).delete("stacks/#{current_stack}/nodes/#{node_id}")
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Central::Cli::Nodes
|
|
2
|
+
class RemoveLabelCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
|
|
5
|
+
parameter 'NODE_ID', 'Node id'
|
|
6
|
+
parameter 'LABEL', 'Label'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
token = require_token
|
|
12
|
+
|
|
13
|
+
node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
|
|
14
|
+
unless node['labels'].include?(label)
|
|
15
|
+
abort("Node #{node['name']} does not have label #{label}")
|
|
16
|
+
end
|
|
17
|
+
node['labels'].delete(label)
|
|
18
|
+
data = {}
|
|
19
|
+
data[:labels] = node['labels']
|
|
20
|
+
client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Central::Cli::Nodes
|
|
2
|
+
class ShowCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
include Central::Cli::BytesHelper
|
|
6
|
+
|
|
7
|
+
parameter 'NODE_ID', 'Node id'
|
|
8
|
+
|
|
9
|
+
def execute
|
|
10
|
+
require_api_url
|
|
11
|
+
require_current_stack
|
|
12
|
+
token = require_token
|
|
13
|
+
|
|
14
|
+
node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
|
|
15
|
+
puts "#{node['name']}:"
|
|
16
|
+
puts " id: #{node['id']}"
|
|
17
|
+
puts " connected: #{node['connected'] ? 'yes' : 'no'}"
|
|
18
|
+
puts " last connect: #{node['updated_at']}"
|
|
19
|
+
puts " last seen: #{node['last_seen_at']}"
|
|
20
|
+
puts " public ip: #{node['public_ip']}"
|
|
21
|
+
puts " private ip: #{node['private_ip']}"
|
|
22
|
+
puts " overlay network: 10.81.#{node['node_number']}.0/24"
|
|
23
|
+
puts " os: #{node['os']}"
|
|
24
|
+
puts " driver: #{node['driver']}"
|
|
25
|
+
puts " kernel: #{node['kernel_version']}"
|
|
26
|
+
puts " cpus: #{node['cpus']}"
|
|
27
|
+
puts " memory: #{node['mem_total'] / 1024 / 1024}M"
|
|
28
|
+
puts ' labels:'
|
|
29
|
+
node['labels'].each { |l| puts " - #{l}" } if node['labels']
|
|
30
|
+
puts ' stats:'
|
|
31
|
+
puts " cpus: #{node['cpus']}"
|
|
32
|
+
loads = node.dig('resource_usage', 'load')
|
|
33
|
+
if loads
|
|
34
|
+
puts " load: #{loads['1m'].round(2)} #{loads['5m'].round(2)} #{loads['15m'].round(2)}"
|
|
35
|
+
end
|
|
36
|
+
mem = node.dig('resource_usage', 'memory')
|
|
37
|
+
if mem
|
|
38
|
+
mem_used = mem['used'] - (mem['cached'] + mem['buffers'])
|
|
39
|
+
puts " memory: #{to_gigabytes(mem_used, 2)} of #{to_gigabytes(mem['total'], 2)} GB"
|
|
40
|
+
end
|
|
41
|
+
if node['resource_usage']['filesystem']
|
|
42
|
+
puts ' filesystem:'
|
|
43
|
+
node['resource_usage']['filesystem'].each do |filesystem|
|
|
44
|
+
puts " - #{filesystem['name']}: #{to_gigabytes(filesystem['used'], 2)} of #{to_gigabytes(filesystem['total'], 2)} GB"
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Central::Cli::Nodes
|
|
2
|
+
class SshCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NODE_ID', 'Node id'
|
|
7
|
+
option ['-i', '--identity-file'], 'IDENTITY_FILE', 'Path to ssh private key'
|
|
8
|
+
option ['-u', '--user'], 'USER', 'Login as a user', default: 'core'
|
|
9
|
+
option '--private-ip', :flag, "Connect to node's private IP address"
|
|
10
|
+
option '--internal-ip', :flag, "Connect to node's internal IP address (requires VPN connection)"
|
|
11
|
+
|
|
12
|
+
def execute
|
|
13
|
+
require_api_url
|
|
14
|
+
require_current_stack
|
|
15
|
+
token = require_token
|
|
16
|
+
|
|
17
|
+
node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
|
|
18
|
+
cmd = ['ssh']
|
|
19
|
+
cmd << "-i #{identity_file}" if identity_file
|
|
20
|
+
ip = if internal_ip?
|
|
21
|
+
"10.81.0.#{node['node_number']}"
|
|
22
|
+
elsif private_ip?
|
|
23
|
+
node['private_ip']
|
|
24
|
+
else
|
|
25
|
+
node['public_ip']
|
|
26
|
+
end
|
|
27
|
+
cmd << "#{user}@#{ip}"
|
|
28
|
+
exec(cmd.join(' '))
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Central::Cli::Nodes
|
|
2
|
+
class UpdateCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NODE_ID', 'Node id'
|
|
7
|
+
option ['-l', '--label'], 'LABEL', 'Node label', multivalued: true
|
|
8
|
+
|
|
9
|
+
def execute
|
|
10
|
+
require_api_url
|
|
11
|
+
require_current_stack
|
|
12
|
+
token = require_token
|
|
13
|
+
|
|
14
|
+
node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
|
|
15
|
+
data = {}
|
|
16
|
+
data[:labels] = label_list if label_list
|
|
17
|
+
client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Central::Cli::Nodes::Vagrant
|
|
2
|
+
class CreateCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter '[NAME]', 'Node name'
|
|
7
|
+
option '--memory', 'MEMORY', 'How much memory node has', default: '1024'
|
|
8
|
+
option '--version', 'VERSION', 'Define installed Central version', default: 'latest'
|
|
9
|
+
|
|
10
|
+
def execute
|
|
11
|
+
require_api_url
|
|
12
|
+
require_current_stack
|
|
13
|
+
|
|
14
|
+
require 'central/machine/vagrant'
|
|
15
|
+
stack = client(require_token).get("stacks/#{current_stack}")
|
|
16
|
+
provisioner = Central::Machine::Vagrant::NodeProvisioner.new(client(require_token))
|
|
17
|
+
provisioner.run!(
|
|
18
|
+
master_uri: api_url,
|
|
19
|
+
stack_token: stack['token'],
|
|
20
|
+
stack: current_stack,
|
|
21
|
+
name: name,
|
|
22
|
+
memory: memory,
|
|
23
|
+
version: version
|
|
24
|
+
)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Central::Cli::Nodes::Vagrant
|
|
2
|
+
class RestartCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NAME', 'Node name'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
|
|
12
|
+
require 'central/machine/vagrant'
|
|
13
|
+
vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
|
|
14
|
+
abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
|
|
15
|
+
Dir.chdir(vagrant_path) do
|
|
16
|
+
ShellSpinner "Restarting Vagrant machine #{name.colorize(:cyan)} " do
|
|
17
|
+
Open3.popen2('vagrant reload') do |_stdin, output, _wait|
|
|
18
|
+
while o = output.gets
|
|
19
|
+
print o if ENV['DEBUG']
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Central::Cli::Nodes::Vagrant
|
|
2
|
+
class SshCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NAME', 'Node name'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
|
|
12
|
+
require 'central/machine/vagrant'
|
|
13
|
+
vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
|
|
14
|
+
abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
|
|
15
|
+
|
|
16
|
+
Dir.chdir(vagrant_path) do
|
|
17
|
+
system('vagrant ssh')
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Central::Cli::Nodes::Vagrant
|
|
2
|
+
class StartCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NAME', 'Node name'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
|
|
12
|
+
require 'central/machine/vagrant'
|
|
13
|
+
vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
|
|
14
|
+
abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
|
|
15
|
+
Dir.chdir(vagrant_path) do
|
|
16
|
+
ShellSpinner "Starting Vagrant machine #{name.colorize(:cyan)} " do
|
|
17
|
+
Open3.popen2('vagrant up') do |_stdin, output, _wait|
|
|
18
|
+
while o = output.gets
|
|
19
|
+
print o if ENV['DEBUG']
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Central::Cli::Nodes::Vagrant
|
|
2
|
+
class StopCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NAME', 'Node name'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
|
|
12
|
+
require 'central/machine/vagrant'
|
|
13
|
+
vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
|
|
14
|
+
abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
|
|
15
|
+
Dir.chdir(vagrant_path) do
|
|
16
|
+
ShellSpinner "Stopping Vagrant machine #{name.colorize(:cyan)} " do
|
|
17
|
+
Open3.popen2('vagrant halt') do |_stdin, output, _wait|
|
|
18
|
+
while o = output.gets
|
|
19
|
+
print o if ENV['DEBUG']
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Central::Cli::Nodes::Vagrant
|
|
2
|
+
class TerminateCommand < Clamp::Command
|
|
3
|
+
include Central::Cli::Common
|
|
4
|
+
include Central::Cli::StackOptions
|
|
5
|
+
|
|
6
|
+
parameter 'NAME', 'Node name'
|
|
7
|
+
|
|
8
|
+
def execute
|
|
9
|
+
require_api_url
|
|
10
|
+
require_current_stack
|
|
11
|
+
|
|
12
|
+
require 'central/machine/vagrant'
|
|
13
|
+
destroyer = Central::Machine::Vagrant::NodeDestroyer.new(client(require_token))
|
|
14
|
+
destroyer.run!(current_stack, name)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require_relative 'vagrant/create_command'
|
|
2
|
+
require_relative 'vagrant/start_command'
|
|
3
|
+
require_relative 'vagrant/stop_command'
|
|
4
|
+
require_relative 'vagrant/restart_command'
|
|
5
|
+
require_relative 'vagrant/terminate_command'
|
|
6
|
+
require_relative 'vagrant/ssh_command'
|
|
7
|
+
|
|
8
|
+
module Central::Cli::Nodes
|
|
9
|
+
class VagrantCommand < Clamp::Command
|
|
10
|
+
subcommand 'create', 'Create a new Vagrant node', Vagrant::CreateCommand
|
|
11
|
+
subcommand 'ssh', 'SSH into Vagrant node', Vagrant::SshCommand
|
|
12
|
+
subcommand 'start', 'Start Vagrant node', Vagrant::StartCommand
|
|
13
|
+
subcommand 'stop', 'Stop Vagrant node', Vagrant::StopCommand
|
|
14
|
+
subcommand 'restart', 'Restart Vagrant node', Vagrant::RestartCommand
|
|
15
|
+
subcommand 'terminate', 'Terminate Vagrant node', Vagrant::TerminateCommand
|
|
16
|
+
|
|
17
|
+
def execute
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
class Central::Cli::RegisterCommand < Clamp::Command
|
|
2
|
+
include Central::Cli::Common
|
|
3
|
+
|
|
4
|
+
option '--auth-provider-url', 'AUTH_PROVIDER_URL', 'Auth provider URL'
|
|
5
|
+
|
|
6
|
+
def execute
|
|
7
|
+
require 'highline/import'
|
|
8
|
+
|
|
9
|
+
auth_api_url = auth_provider_url || 'https://auth.bluebeluga.io'
|
|
10
|
+
if !auth_api_url.start_with?('http://') && !auth_api_url.start_with?('https://')
|
|
11
|
+
auth_api_url = "https://#{auth_api_url}"
|
|
12
|
+
end
|
|
13
|
+
email = ask('Email: ')
|
|
14
|
+
password = ask('Password: ') { |q| q.echo = '*' }
|
|
15
|
+
password2 = ask('Password again: ') { |q| q.echo = '*' }
|
|
16
|
+
abort("Passwords don't match".colorize(:red)) if password != password2
|
|
17
|
+
params = { email: email, password: password }
|
|
18
|
+
auth_client = Central::Client.new(auth_api_url)
|
|
19
|
+
auth_client.post('users', params)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
require 'shell-spinner'
|
|
2
|
+
|
|
3
|
+
module Central::Cli::Registry
|
|
4
|
+
class CreateCommand < Clamp::Command
|
|
5
|
+
include Central::Cli::Common
|
|
6
|
+
include Central::Cli::StackOptions
|
|
7
|
+
|
|
8
|
+
REGISTRY_VERSION = '2.2.0'.freeze
|
|
9
|
+
|
|
10
|
+
option '--node', 'NODE', 'Node name'
|
|
11
|
+
option '--s3-bucket', 'S3_BUCKET', 'S3 bucket'
|
|
12
|
+
option '--s3-region', 'S3_REGION', 'S3 region', default: 'us-west-2'
|
|
13
|
+
option '--s3-encrypt', :flag, 'Encrypt S3 objects', default: false
|
|
14
|
+
option '--s3-secure', :flag, 'Use secure connection in S3', default: true
|
|
15
|
+
option '--azure-account-name', 'AZURE_ACCOUNT_NAME', 'Azure account name'
|
|
16
|
+
option '--azure-container-name', 'AZURE_CONTAINER_NAME', 'Azure container name'
|
|
17
|
+
|
|
18
|
+
def execute
|
|
19
|
+
require_api_url
|
|
20
|
+
token = require_token
|
|
21
|
+
preferred_node = node
|
|
22
|
+
secrets = []
|
|
23
|
+
affinity = []
|
|
24
|
+
stateful = true
|
|
25
|
+
instances = 1
|
|
26
|
+
|
|
27
|
+
registry = begin
|
|
28
|
+
client(token).get("services/#{current_stack}/registry")
|
|
29
|
+
rescue
|
|
30
|
+
nil
|
|
31
|
+
end
|
|
32
|
+
abort('Registry already exists') if registry
|
|
33
|
+
|
|
34
|
+
nodes = client(token).get("stacks/#{current_stack}/nodes")
|
|
35
|
+
|
|
36
|
+
if s3_bucket
|
|
37
|
+
%w(REGISTRY_STORAGE_S3_ACCESSKEY REGISTRY_STORAGE_S3_SECRETKEY).each do |secret|
|
|
38
|
+
abort("#{secret} secret is missing from the vault") unless vault_secret_exists?(secret)
|
|
39
|
+
end
|
|
40
|
+
env = [
|
|
41
|
+
'REGISTRY_STORAGE=s3',
|
|
42
|
+
"REGISTRY_STORAGE_S3_REGION=#{s3_region}",
|
|
43
|
+
"REGISTRY_STORAGE_S3_BUCKET=#{s3_bucket}",
|
|
44
|
+
"REGISTRY_STORAGE_S3_ENCRYPT=#{s3_encrypt?}",
|
|
45
|
+
"REGISTRY_STORAGE_S3_SECURE=#{s3_secure?}"
|
|
46
|
+
]
|
|
47
|
+
secrets = [
|
|
48
|
+
{ secret: 'REGISTRY_STORAGE_S3_ACCESSKEY', name: 'REGISTRY_STORAGE_S3_ACCESSKEY', type: 'env' },
|
|
49
|
+
{ secret: 'REGISTRY_STORAGE_S3_SECRETKEY', name: 'REGISTRY_STORAGE_S3_SECRETKEY', type: 'env' }
|
|
50
|
+
]
|
|
51
|
+
stateful = false
|
|
52
|
+
instances = 2 if nodes['nodes'].size > 1
|
|
53
|
+
elsif azure_account_name || azure_container_name
|
|
54
|
+
abort('--azure-account-name is missing') if azure_account_name.nil?
|
|
55
|
+
abort('--azure-container-name is missing') if azure_container_name.nil?
|
|
56
|
+
abort('REGISTRY_STORAGE_AZURE_ACCOUNTKEY is not saved to vault') unless vault_secret_exists?('REGISTRY_STORAGE_AZURE_ACCOUNTKEY')
|
|
57
|
+
env = [
|
|
58
|
+
'REGISTRY_STORAGE=azure',
|
|
59
|
+
"REGISTRY_STORAGE_AZURE_ACCOUNTNAME=#{azure_account_name}",
|
|
60
|
+
"REGISTRY_STORAGE_AZURE_ACCOUNTKEY=#{azure_account_key}"
|
|
61
|
+
]
|
|
62
|
+
secrets = [
|
|
63
|
+
{ secret: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', name: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', type: 'env' }
|
|
64
|
+
]
|
|
65
|
+
stateful = false
|
|
66
|
+
instances = 2 if nodes['nodes'].size > 1
|
|
67
|
+
else
|
|
68
|
+
env = [
|
|
69
|
+
'REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry'
|
|
70
|
+
]
|
|
71
|
+
if preferred_node
|
|
72
|
+
node = nodes['nodes'].find { |n| n['connected'] && n['name'] == preferred_node }
|
|
73
|
+
abort('Node not found') if node.nil?
|
|
74
|
+
affinity << "node==#{node['name']}"
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
if vault_secret_exists?('REGISTRY_AUTH_PASSWORD')
|
|
79
|
+
secrets << { secret: 'REGISTRY_AUTH_PASSWORD', name: 'AUTH_PASSWORD', type: 'env' }
|
|
80
|
+
configure_registry_auth(vault_secret('REGISTRY_AUTH_PASSWORD'))
|
|
81
|
+
end
|
|
82
|
+
if vault_secret_exists?('REGISTRY_HTTP_TLS_CERTIFICATE')
|
|
83
|
+
secrets << { secret: 'REGISTRY_HTTP_TLS_CERTIFICATE', name: 'REGISTRY_HTTP_TLS_CERTIFICATE', type: 'env' }
|
|
84
|
+
secrets << { secret: 'REGISTRY_HTTP_TLS_KEY', name: 'REGISTRY_HTTP_TLS_KEY', type: 'env' }
|
|
85
|
+
env << 'REGISTRY_HTTP_ADDR=0.0.0.0:443'
|
|
86
|
+
else
|
|
87
|
+
env << 'REGISTRY_HTTP_ADDR=0.0.0.0:80'
|
|
88
|
+
end
|
|
89
|
+
env << "REGISTRY_HTTP_SECRET=#{SecureRandom.hex(24)}"
|
|
90
|
+
|
|
91
|
+
data = {
|
|
92
|
+
name: 'registry',
|
|
93
|
+
stateful: stateful,
|
|
94
|
+
container_count: instances,
|
|
95
|
+
image: "fishyard/registry:#{REGISTRY_VERSION}",
|
|
96
|
+
volumes: ['/registry'],
|
|
97
|
+
env: env,
|
|
98
|
+
secrets: secrets,
|
|
99
|
+
affinity: affinity
|
|
100
|
+
}
|
|
101
|
+
client(token).post("stacks/#{current_stack}/services", data)
|
|
102
|
+
client(token).post("services/#{current_stack}/registry/deploy", {})
|
|
103
|
+
ShellSpinner 'Deploying registry service ' do
|
|
104
|
+
sleep 1 until client(token).get("services/#{current_stack}/registry")['state'] != 'deploying'
|
|
105
|
+
end
|
|
106
|
+
puts "\n"
|
|
107
|
+
puts "Docker Registry #{REGISTRY_VERSION} is now running at registry.#{current_stack}.central.local."
|
|
108
|
+
puts 'Note: '
|
|
109
|
+
puts ' - OpenVPN connection is needed to establish connection to this registry. See http://www.central.io/docs/using-central/vpn-access for details'
|
|
110
|
+
puts " - you must set '--insecure-registry registry.#{current_stack}.central.local' to your client docker daemon before you are able to push to this registry"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# @param [String] name
|
|
114
|
+
# @return [Boolean]
|
|
115
|
+
def vault_secret_exists?(name)
|
|
116
|
+
client(require_token).get("secrets/#{current_stack}/#{name}")
|
|
117
|
+
true
|
|
118
|
+
rescue
|
|
119
|
+
false
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# @param [String] name
|
|
123
|
+
# @return [String]
|
|
124
|
+
def vault_secret(name)
|
|
125
|
+
secret = client(require_token).get("secrets/#{current_stack}/#{name}")
|
|
126
|
+
secret['value']
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# @param [String] password
|
|
130
|
+
def configure_registry_auth(password)
|
|
131
|
+
data = {
|
|
132
|
+
username: 'admin',
|
|
133
|
+
password: password,
|
|
134
|
+
email: 'not@val.id',
|
|
135
|
+
url: "http://registry.#{current_stack}.central.local/"
|
|
136
|
+
}
|
|
137
|
+
begin
|
|
138
|
+
client(require_token).post("stacks/#{current_stack}/external_registries", data)
|
|
139
|
+
rescue
|
|
140
|
+
nil
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
end
|