krates 1.6.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 +7 -0
- data/LICENSE +212 -0
- data/LOGO +10 -0
- data/VERSION +1 -0
- data/bin/krates +23 -0
- data/lib/kontena/autoload_core.rb +19 -0
- data/lib/kontena/callback.rb +60 -0
- data/lib/kontena/callbacks/.gitkeep +0 -0
- data/lib/kontena/callbacks/auth/01_list_and_select_grid_after_master_auth.rb +26 -0
- data/lib/kontena/callbacks/master/01_clear_current_master_after_terminate.rb +19 -0
- data/lib/kontena/callbacks/master/deploy/01_show_logo_before_deploy.rb +14 -0
- data/lib/kontena/callbacks/master/deploy/04_default_master_version.rb +18 -0
- data/lib/kontena/callbacks/master/deploy/05_before_deploy_configuration_wizard.rb +105 -0
- data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +32 -0
- data/lib/kontena/callbacks/master/deploy/50_authenticate_after_deploy.rb +66 -0
- data/lib/kontena/callbacks/master/deploy/55_create_initial_grid_after_deploy.rb +21 -0
- data/lib/kontena/callbacks/master/deploy/56_set_server_provider_after_deploy.rb +24 -0
- data/lib/kontena/callbacks/master/deploy/60_configure_auth_provider_after_deploy.rb +31 -0
- data/lib/kontena/callbacks/master/deploy/70_invite_self_after_deploy.rb +95 -0
- data/lib/kontena/callbacks/master/deploy/90_proptip_after_deploy.rb +33 -0
- data/lib/kontena/cli/browser_launcher.rb +61 -0
- data/lib/kontena/cli/bytes_helper.rb +40 -0
- data/lib/kontena/cli/certificate/authorize_command.rb +107 -0
- data/lib/kontena/cli/certificate/common.rb +16 -0
- data/lib/kontena/cli/certificate/domain_authorization/list_command.rb +24 -0
- data/lib/kontena/cli/certificate/domain_authorization/remove_authorization_command.rb +25 -0
- data/lib/kontena/cli/certificate/domain_authorize_command.rb +7 -0
- data/lib/kontena/cli/certificate/export_command.rb +28 -0
- data/lib/kontena/cli/certificate/get_command.rb +33 -0
- data/lib/kontena/cli/certificate/import_command.rb +61 -0
- data/lib/kontena/cli/certificate/list_command.rb +75 -0
- data/lib/kontena/cli/certificate/register_command.rb +30 -0
- data/lib/kontena/cli/certificate/remove_command.rb +23 -0
- data/lib/kontena/cli/certificate/request_command.rb +20 -0
- data/lib/kontena/cli/certificate/show_command.rb +22 -0
- data/lib/kontena/cli/certificate_command.rb +18 -0
- data/lib/kontena/cli/cloud/login_command.rb +186 -0
- data/lib/kontena/cli/cloud/logout_command.rb +14 -0
- data/lib/kontena/cli/cloud/master/add_command.rb +156 -0
- data/lib/kontena/cli/cloud/master/list_command.rb +35 -0
- data/lib/kontena/cli/cloud/master/remove_command.rb +68 -0
- data/lib/kontena/cli/cloud/master/show_command.rb +21 -0
- data/lib/kontena/cli/cloud/master/update_command.rb +52 -0
- data/lib/kontena/cli/cloud/master_command.rb +14 -0
- data/lib/kontena/cli/cloud_command.rb +13 -0
- data/lib/kontena/cli/common.rb +360 -0
- data/lib/kontena/cli/config.rb +662 -0
- data/lib/kontena/cli/container_command.rb +10 -0
- data/lib/kontena/cli/containers/exec_command.rb +31 -0
- data/lib/kontena/cli/containers/inspect_command.rb +16 -0
- data/lib/kontena/cli/containers/list_command.rb +51 -0
- data/lib/kontena/cli/containers/logs_command.rb +19 -0
- data/lib/kontena/cli/etcd/common.rb +8 -0
- data/lib/kontena/cli/etcd/get_command.rb +26 -0
- data/lib/kontena/cli/etcd/health_command.rb +53 -0
- data/lib/kontena/cli/etcd/list_command.rb +36 -0
- data/lib/kontena/cli/etcd/mkdir_command.rb +23 -0
- data/lib/kontena/cli/etcd/remove_command.rb +29 -0
- data/lib/kontena/cli/etcd/set_command.rb +24 -0
- data/lib/kontena/cli/etcd_command.rb +12 -0
- data/lib/kontena/cli/external_registries/add_command.rb +25 -0
- data/lib/kontena/cli/external_registries/list_command.rb +23 -0
- data/lib/kontena/cli/external_registries/remove_command.rb +17 -0
- data/lib/kontena/cli/external_registry_command.rb +9 -0
- data/lib/kontena/cli/grid_command.rb +21 -0
- data/lib/kontena/cli/grid_options.rb +12 -0
- data/lib/kontena/cli/grids/audit_log_command.rb +22 -0
- data/lib/kontena/cli/grids/cloud_config_command.rb +53 -0
- data/lib/kontena/cli/grids/common.rb +182 -0
- data/lib/kontena/cli/grids/create_command.rb +48 -0
- data/lib/kontena/cli/grids/current_command.rb +25 -0
- data/lib/kontena/cli/grids/env_command.rb +32 -0
- data/lib/kontena/cli/grids/events_command.rb +50 -0
- data/lib/kontena/cli/grids/health_command.rb +69 -0
- data/lib/kontena/cli/grids/list_command.rb +59 -0
- data/lib/kontena/cli/grids/logs_command.rb +35 -0
- data/lib/kontena/cli/grids/remove_command.rb +31 -0
- data/lib/kontena/cli/grids/show_command.rb +25 -0
- data/lib/kontena/cli/grids/trusted_subnet_command.rb +10 -0
- data/lib/kontena/cli/grids/trusted_subnets/add_command.rb +18 -0
- data/lib/kontena/cli/grids/trusted_subnets/list_command.rb +18 -0
- data/lib/kontena/cli/grids/trusted_subnets/remove_command.rb +26 -0
- data/lib/kontena/cli/grids/update_command.rb +35 -0
- data/lib/kontena/cli/grids/use_command.rb +26 -0
- data/lib/kontena/cli/grids/user_command.rb +9 -0
- data/lib/kontena/cli/grids/users/add_command.rb +18 -0
- data/lib/kontena/cli/grids/users/list_command.rb +20 -0
- data/lib/kontena/cli/grids/users/remove_command.rb +20 -0
- data/lib/kontena/cli/helpers/exec_helper.rb +209 -0
- data/lib/kontena/cli/helpers/health_helper.rb +65 -0
- data/lib/kontena/cli/helpers/log_helper.rb +113 -0
- data/lib/kontena/cli/helpers/time_helper.rb +29 -0
- data/lib/kontena/cli/localhost_web_server.rb +113 -0
- data/lib/kontena/cli/log_formatters/compact.rb +65 -0
- data/lib/kontena/cli/log_formatters/strip_color.rb +13 -0
- data/lib/kontena/cli/logout_command.rb +10 -0
- data/lib/kontena/cli/master/audit_log_command.rb +19 -0
- data/lib/kontena/cli/master/config/export_command.rb +46 -0
- data/lib/kontena/cli/master/config/get_command.rb +26 -0
- data/lib/kontena/cli/master/config/import_command.rb +67 -0
- data/lib/kontena/cli/master/config/set_command.rb +19 -0
- data/lib/kontena/cli/master/config/unset_command.rb +20 -0
- data/lib/kontena/cli/master/config_command.rb +17 -0
- data/lib/kontena/cli/master/create_command.rb +74 -0
- data/lib/kontena/cli/master/current_command.rb +25 -0
- data/lib/kontena/cli/master/init_cloud_command.rb +45 -0
- data/lib/kontena/cli/master/join_command.rb +22 -0
- data/lib/kontena/cli/master/list_command.rb +24 -0
- data/lib/kontena/cli/master/login_command.rb +331 -0
- data/lib/kontena/cli/master/logout_command.rb +25 -0
- data/lib/kontena/cli/master/remove_command.rb +55 -0
- data/lib/kontena/cli/master/ssh_command.rb +72 -0
- data/lib/kontena/cli/master/token/common.rb +29 -0
- data/lib/kontena/cli/master/token/create_command.rb +50 -0
- data/lib/kontena/cli/master/token/current_command.rb +45 -0
- data/lib/kontena/cli/master/token/list_command.rb +39 -0
- data/lib/kontena/cli/master/token/remove_command.rb +19 -0
- data/lib/kontena/cli/master/token/show_command.rb +34 -0
- data/lib/kontena/cli/master/token_command.rb +13 -0
- data/lib/kontena/cli/master/use_command.rb +31 -0
- data/lib/kontena/cli/master/user/invite_command.rb +51 -0
- data/lib/kontena/cli/master/user/list_command.rb +29 -0
- data/lib/kontena/cli/master/user/remove_command.rb +24 -0
- data/lib/kontena/cli/master/user/role/add_command.rb +29 -0
- data/lib/kontena/cli/master/user/role/remove_command.rb +27 -0
- data/lib/kontena/cli/master/user/role_command.rb +6 -0
- data/lib/kontena/cli/master/user_command.rb +9 -0
- data/lib/kontena/cli/master_command.rb +21 -0
- data/lib/kontena/cli/node_command.rb +17 -0
- data/lib/kontena/cli/nodes/create_command.rb +25 -0
- data/lib/kontena/cli/nodes/env_command.rb +37 -0
- data/lib/kontena/cli/nodes/health_command.rb +47 -0
- data/lib/kontena/cli/nodes/label_command.rb +10 -0
- data/lib/kontena/cli/nodes/labels/add_command.rb +18 -0
- data/lib/kontena/cli/nodes/labels/list_command.rb +19 -0
- data/lib/kontena/cli/nodes/labels/remove_command.rb +32 -0
- data/lib/kontena/cli/nodes/list_command.rb +97 -0
- data/lib/kontena/cli/nodes/remove_command.rb +34 -0
- data/lib/kontena/cli/nodes/reset_token_command.rb +34 -0
- data/lib/kontena/cli/nodes/show_command.rb +56 -0
- data/lib/kontena/cli/nodes/ssh_command.rb +63 -0
- data/lib/kontena/cli/nodes/update_command.rb +31 -0
- data/lib/kontena/cli/plugin_command.rb +12 -0
- data/lib/kontena/cli/plugins/common.rb +8 -0
- data/lib/kontena/cli/plugins/install_command.rb +42 -0
- data/lib/kontena/cli/plugins/list_command.rb +31 -0
- data/lib/kontena/cli/plugins/search_command.rb +25 -0
- data/lib/kontena/cli/plugins/show_command.rb +17 -0
- data/lib/kontena/cli/plugins/uninstall_command.rb +31 -0
- data/lib/kontena/cli/plugins/upgrade_command.rb +60 -0
- data/lib/kontena/cli/registry/create_command.rb +151 -0
- data/lib/kontena/cli/registry/remove_command.rb +21 -0
- data/lib/kontena/cli/registry_command.rb +8 -0
- data/lib/kontena/cli/service_command.rb +28 -0
- data/lib/kontena/cli/services/container_command.rb +8 -0
- data/lib/kontena/cli/services/containers_command.rb +39 -0
- data/lib/kontena/cli/services/create_command.rb +105 -0
- data/lib/kontena/cli/services/deploy_command.rb +25 -0
- data/lib/kontena/cli/services/env_command.rb +9 -0
- data/lib/kontena/cli/services/envs/add_command.rb +21 -0
- data/lib/kontena/cli/services/envs/list_command.rb +22 -0
- data/lib/kontena/cli/services/envs/remove_command.rb +22 -0
- data/lib/kontena/cli/services/events_command.rb +36 -0
- data/lib/kontena/cli/services/exec_command.rb +107 -0
- data/lib/kontena/cli/services/link_command.rb +35 -0
- data/lib/kontena/cli/services/list_command.rb +66 -0
- data/lib/kontena/cli/services/logs_command.rb +33 -0
- data/lib/kontena/cli/services/monitor_command.rb +58 -0
- data/lib/kontena/cli/services/remove_command.rb +60 -0
- data/lib/kontena/cli/services/restart_command.rb +19 -0
- data/lib/kontena/cli/services/scale_command.rb +21 -0
- data/lib/kontena/cli/services/secret_command.rb +8 -0
- data/lib/kontena/cli/services/secrets/link_command.rb +26 -0
- data/lib/kontena/cli/services/secrets/unlink_command.rb +28 -0
- data/lib/kontena/cli/services/services_helper.rb +579 -0
- data/lib/kontena/cli/services/show_command.rb +26 -0
- data/lib/kontena/cli/services/start_command.rb +21 -0
- data/lib/kontena/cli/services/stats_command.rb +87 -0
- data/lib/kontena/cli/services/stop_command.rb +21 -0
- data/lib/kontena/cli/services/unlink_command.rb +30 -0
- data/lib/kontena/cli/services/update_command.rb +94 -0
- data/lib/kontena/cli/spinner.rb +205 -0
- data/lib/kontena/cli/stack_command.rb +21 -0
- data/lib/kontena/cli/stacks/build_command.rb +125 -0
- data/lib/kontena/cli/stacks/common.rb +209 -0
- data/lib/kontena/cli/stacks/deploy_command.rb +37 -0
- data/lib/kontena/cli/stacks/events_command.rb +33 -0
- data/lib/kontena/cli/stacks/inspect_command.rb +17 -0
- data/lib/kontena/cli/stacks/install_command.rb +95 -0
- data/lib/kontena/cli/stacks/label_command.rb +10 -0
- data/lib/kontena/cli/stacks/labels/add_command.rb +21 -0
- data/lib/kontena/cli/stacks/labels/common.rb +19 -0
- data/lib/kontena/cli/stacks/labels/list_command.rb +21 -0
- data/lib/kontena/cli/stacks/labels/remove_command.rb +21 -0
- data/lib/kontena/cli/stacks/list_command.rb +154 -0
- data/lib/kontena/cli/stacks/logs_command.rb +35 -0
- data/lib/kontena/cli/stacks/monitor_command.rb +93 -0
- data/lib/kontena/cli/stacks/registry/create_command.rb +24 -0
- data/lib/kontena/cli/stacks/registry/make_private_command.rb +24 -0
- data/lib/kontena/cli/stacks/registry/make_public_command.rb +24 -0
- data/lib/kontena/cli/stacks/registry/pull_command.rb +28 -0
- data/lib/kontena/cli/stacks/registry/push_command.rb +40 -0
- data/lib/kontena/cli/stacks/registry/remove_command.rb +30 -0
- data/lib/kontena/cli/stacks/registry/search_command.rb +42 -0
- data/lib/kontena/cli/stacks/registry/show_command.rb +65 -0
- data/lib/kontena/cli/stacks/registry_command.rb +12 -0
- data/lib/kontena/cli/stacks/remove_command.rb +80 -0
- data/lib/kontena/cli/stacks/restart_command.rb +24 -0
- data/lib/kontena/cli/stacks/service_generator.rb +131 -0
- data/lib/kontena/cli/stacks/service_generator_v2.rb +27 -0
- data/lib/kontena/cli/stacks/show_command.rb +168 -0
- data/lib/kontena/cli/stacks/stack_name.rb +71 -0
- data/lib/kontena/cli/stacks/stacks_helper.rb +83 -0
- data/lib/kontena/cli/stacks/stop_command.rb +24 -0
- data/lib/kontena/cli/stacks/upgrade_command.rb +264 -0
- data/lib/kontena/cli/stacks/validate_command.rb +75 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/affinities_validator.rb +19 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/build_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/extends_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/hooks_validator.rb +102 -0
- data/lib/kontena/cli/stacks/yaml/custom_validators/secrets_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/opto/certificates_resolver.rb +37 -0
- data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +78 -0
- data/lib/kontena/cli/stacks/yaml/opto/service_instances_resolver.rb +25 -0
- data/lib/kontena/cli/stacks/yaml/opto/service_link_resolver.rb +80 -0
- data/lib/kontena/cli/stacks/yaml/opto/vault_cert_prompt_resolver.rb +39 -0
- data/lib/kontena/cli/stacks/yaml/opto/vault_resolver.rb +13 -0
- data/lib/kontena/cli/stacks/yaml/opto/vault_setter.rb +12 -0
- data/lib/kontena/cli/stacks/yaml/opto.rb +16 -0
- data/lib/kontena/cli/stacks/yaml/reader.rb +525 -0
- data/lib/kontena/cli/stacks/yaml/service_extender.rb +65 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
- data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +152 -0
- data/lib/kontena/cli/stacks/yaml/validations.rb +119 -0
- data/lib/kontena/cli/stacks/yaml/validator_v3.rb +164 -0
- data/lib/kontena/cli/subcommand_loader.rb +83 -0
- data/lib/kontena/cli/table_generator.rb +128 -0
- data/lib/kontena/cli/vault/export_command.rb +24 -0
- data/lib/kontena/cli/vault/import_command.rb +75 -0
- data/lib/kontena/cli/vault/list_command.rb +37 -0
- data/lib/kontena/cli/vault/read_command.rb +27 -0
- data/lib/kontena/cli/vault/remove_command.rb +23 -0
- data/lib/kontena/cli/vault/update_command.rb +24 -0
- data/lib/kontena/cli/vault/write_command.rb +23 -0
- data/lib/kontena/cli/vault_command.rb +13 -0
- data/lib/kontena/cli/version.rb +10 -0
- data/lib/kontena/cli/version_command.rb +20 -0
- data/lib/kontena/cli/volume_command.rb +9 -0
- data/lib/kontena/cli/volumes/create_command.rb +42 -0
- data/lib/kontena/cli/volumes/list_command.rb +29 -0
- data/lib/kontena/cli/volumes/remove_command.rb +29 -0
- data/lib/kontena/cli/volumes/show_command.rb +38 -0
- data/lib/kontena/cli/vpn/config_command.rb +27 -0
- data/lib/kontena/cli/vpn/create_command.rb +99 -0
- data/lib/kontena/cli/vpn/remove_command.rb +22 -0
- data/lib/kontena/cli/vpn_command.rb +9 -0
- data/lib/kontena/cli/whoami_command.rb +38 -0
- data/lib/kontena/client.rb +574 -0
- data/lib/kontena/command.rb +251 -0
- data/lib/kontena/debug_instrumentor.rb +80 -0
- data/lib/kontena/errors.rb +50 -0
- data/lib/kontena/light_prompt.rb +103 -0
- data/lib/kontena/machine/cert_helper.rb +43 -0
- data/lib/kontena/machine/cloud_config/cloudinit.yml +82 -0
- data/lib/kontena/machine/cloud_config/node_generator.rb +28 -0
- data/lib/kontena/machine/common.rb +17 -0
- data/lib/kontena/machine/random_name.rb +42 -0
- data/lib/kontena/main_command.rb +66 -0
- data/lib/kontena/plugin_manager/cleaner.rb +33 -0
- data/lib/kontena/plugin_manager/common.rb +89 -0
- data/lib/kontena/plugin_manager/installer.rb +78 -0
- data/lib/kontena/plugin_manager/loader.rb +93 -0
- data/lib/kontena/plugin_manager/rubygems_client.rb +59 -0
- data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
- data/lib/kontena/plugin_manager.rb +26 -0
- data/lib/kontena/presets/github_auth_provider.yml +11 -0
- data/lib/kontena/presets/kontena_auth_provider.yml +11 -0
- data/lib/kontena/scripts/completer +9 -0
- data/lib/kontena/scripts/completer.rb +334 -0
- data/lib/kontena/scripts/init +18 -0
- data/lib/kontena/scripts/kontena.zsh +11 -0
- data/lib/kontena/scripts/krates.bash +8 -0
- data/lib/kontena/stacks/change_resolver.rb +118 -0
- data/lib/kontena/stacks/stack_data.rb +58 -0
- data/lib/kontena/stacks/stack_data_set.rb +51 -0
- data/lib/kontena/stacks_cache.rb +110 -0
- data/lib/kontena/stacks_client.rb +177 -0
- data/lib/kontena/util.rb +116 -0
- data/lib/kontena_cli.rb +190 -0
- metadata +518 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
module Kontena::Cli::Nodes
|
|
2
|
+
class ShowCommand < Kontena::Command
|
|
3
|
+
include Kontena::Cli::Common
|
|
4
|
+
include Kontena::Cli::GridOptions
|
|
5
|
+
include Kontena::Cli::BytesHelper
|
|
6
|
+
|
|
7
|
+
parameter "NODE", "Node name"
|
|
8
|
+
|
|
9
|
+
def execute
|
|
10
|
+
require_api_url
|
|
11
|
+
require_current_grid
|
|
12
|
+
token = require_token
|
|
13
|
+
|
|
14
|
+
node = client(token).get("nodes/#{current_grid}/#{self.node}")
|
|
15
|
+
puts "#{node['id']}:"
|
|
16
|
+
puts " id: #{node['node_id']}"
|
|
17
|
+
puts " agent version: #{node['agent_version']}"
|
|
18
|
+
puts " docker version: #{node['docker_version']}"
|
|
19
|
+
puts " connected: #{node['connected'] ? 'yes': 'no'}"
|
|
20
|
+
puts " last connect: #{node['connected_at']}"
|
|
21
|
+
puts " last seen: #{node['last_seen_at']}"
|
|
22
|
+
puts " availability: #{node['availability']}"
|
|
23
|
+
puts " public ip: #{node['public_ip']}"
|
|
24
|
+
puts " private ip: #{node['private_ip']}"
|
|
25
|
+
puts " overlay ip: #{node['overlay_ip']}"
|
|
26
|
+
puts " os: #{node['os']}"
|
|
27
|
+
puts " kernel: #{node['kernel_version']}"
|
|
28
|
+
puts " drivers:"
|
|
29
|
+
puts " storage: #{node['driver']}"
|
|
30
|
+
puts " volume: #{node['volume_drivers'].to_a.map{|v| v['name']}.join(',')}"
|
|
31
|
+
puts " initial node: #{node['initial_member'] ? 'yes' : 'no'}"
|
|
32
|
+
puts " labels:"
|
|
33
|
+
if node['labels']
|
|
34
|
+
node['labels'].each{|l| puts " - #{l}"}
|
|
35
|
+
end
|
|
36
|
+
puts " stats:"
|
|
37
|
+
puts " cpus: #{node['cpus']}"
|
|
38
|
+
loads = node.dig('resource_usage', 'load')
|
|
39
|
+
if loads
|
|
40
|
+
puts " load: #{loads['1m'].round(2)} #{loads['5m'].round(2)} #{loads['15m'].round(2)}"
|
|
41
|
+
end
|
|
42
|
+
mem = node.dig('resource_usage', 'memory')
|
|
43
|
+
if mem
|
|
44
|
+
mem_used = mem['used'] - (mem['cached'] + mem['buffers'])
|
|
45
|
+
puts " memory: #{to_gigabytes(mem_used, 2)} of #{to_gigabytes(mem['total'], 2)} GB"
|
|
46
|
+
end
|
|
47
|
+
fs = node.dig('resource_usage','filesystem')
|
|
48
|
+
if fs
|
|
49
|
+
puts " filesystem:"
|
|
50
|
+
fs.each do |filesystem|
|
|
51
|
+
puts " - #{filesystem['name']}: #{to_gigabytes(filesystem['used'], 2)} of #{to_gigabytes(filesystem['total'], 2)} GB"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'kontena/plugin_manager'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Nodes
|
|
4
|
+
class SshCommand < Kontena::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include Kontena::Cli::GridOptions
|
|
7
|
+
|
|
8
|
+
usage "[OPTIONS] [NODE] -- [COMMANDS] ..."
|
|
9
|
+
|
|
10
|
+
parameter "[NODE]", "SSH to Grid node. Use --any to connect to the first available node"
|
|
11
|
+
parameter "[COMMANDS] ...", "Run command on host"
|
|
12
|
+
option ["-a", "--any"], :flag, "Connect to first available node"
|
|
13
|
+
option ["-i", "--identity-file"], "IDENTITY_FILE", "Path to ssh private key"
|
|
14
|
+
option ["-u", "--user"], "USER", "Login as a user", default: "core"
|
|
15
|
+
option "--private-ip", :flag, "Connect to node's private IP address"
|
|
16
|
+
option "--internal-ip", :flag, "Connect to node's internal IP address (requires VPN connection)"
|
|
17
|
+
|
|
18
|
+
requires_current_master
|
|
19
|
+
requires_current_grid
|
|
20
|
+
|
|
21
|
+
def execute
|
|
22
|
+
exit_with_error "Cannot combine --any with a node name" if self.node && any?
|
|
23
|
+
|
|
24
|
+
if self.node
|
|
25
|
+
node = client.get("nodes/#{current_grid}/#{self.node}")
|
|
26
|
+
elsif any?
|
|
27
|
+
nodes = client.get("grids/#{current_grid}/nodes")['nodes']
|
|
28
|
+
node = nodes.find{ |node| node['connected'] }
|
|
29
|
+
exit_with_error "There are no online nodes" if node.nil?
|
|
30
|
+
else
|
|
31
|
+
exit_with_error "No node name given. Use --any to connect to the first available node"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
provider = Array(node["labels"]).find{ |l| l.start_with?('provider=')}.to_s.split('=').last
|
|
35
|
+
|
|
36
|
+
if provider == 'vagrant'
|
|
37
|
+
unless Kontena::PluginManager::Common.installed?('vagrant')
|
|
38
|
+
exit_with_error 'You need to install vagrant plugin to ssh into this node. Use kontena plugin install vagrant'
|
|
39
|
+
end
|
|
40
|
+
cmd = ['vagrant', 'node', 'ssh', node['name']]
|
|
41
|
+
unless commands_list.empty?
|
|
42
|
+
cmd << '--'
|
|
43
|
+
cmd.concat(commands_list)
|
|
44
|
+
end
|
|
45
|
+
Kontena.run!(cmd)
|
|
46
|
+
else
|
|
47
|
+
cmd = ['ssh']
|
|
48
|
+
cmd += ["-i", identity_file] if identity_file
|
|
49
|
+
if internal_ip?
|
|
50
|
+
ip = node['overlay_ip']
|
|
51
|
+
elsif private_ip?
|
|
52
|
+
ip = node['private_ip']
|
|
53
|
+
else
|
|
54
|
+
ip = node['public_ip']
|
|
55
|
+
end
|
|
56
|
+
cmd << "#{user}@#{ip}"
|
|
57
|
+
cmd += commands_list
|
|
58
|
+
logger.debug { "Running ssh command: #{cmd.inspect}" }
|
|
59
|
+
exec(*cmd)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
module Kontena::Cli::Nodes
|
|
2
|
+
class UpdateCommand < Kontena::Command
|
|
3
|
+
include Kontena::Cli::Common
|
|
4
|
+
include Kontena::Cli::GridOptions
|
|
5
|
+
|
|
6
|
+
requires_current_master
|
|
7
|
+
requires_current_master_token
|
|
8
|
+
requires_current_grid
|
|
9
|
+
|
|
10
|
+
parameter "NODE ...", "Node name", attribute_name: :nodes
|
|
11
|
+
|
|
12
|
+
option ["-l", "--label"], "LABEL", "Node label", multivalued: true
|
|
13
|
+
option "--clear-labels", :flag, "Clear node labels"
|
|
14
|
+
option "--availability", "active|drain", "Node scheduling availability"
|
|
15
|
+
|
|
16
|
+
def execute
|
|
17
|
+
data = {}
|
|
18
|
+
|
|
19
|
+
data[:labels] = self.label_list unless self.label_list.empty?
|
|
20
|
+
data[:labels] = [] if self.clear_labels?
|
|
21
|
+
|
|
22
|
+
data[:availability] = availability if availability
|
|
23
|
+
|
|
24
|
+
nodes.each do |node_name|
|
|
25
|
+
spinner "Updating node #{pastel.cyan(node_name)} " do
|
|
26
|
+
client.put("nodes/#{current_grid}/#{node_name}", data)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
|
|
2
|
+
class Kontena::Cli::PluginCommand < Kontena::Command
|
|
3
|
+
|
|
4
|
+
subcommand ["list","ls"], "List plugins", load_subcommand('plugins/list_command')
|
|
5
|
+
subcommand "search", "Search plugins", load_subcommand('plugins/search_command')
|
|
6
|
+
subcommand "install", "Install a plugin", load_subcommand('plugins/install_command')
|
|
7
|
+
subcommand "uninstall", "Uninstall a plugin", load_subcommand('plugins/uninstall_command')
|
|
8
|
+
subcommand "upgrade", "Upgrade plugins", load_subcommand('plugins/upgrade_command')
|
|
9
|
+
|
|
10
|
+
def execute
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'kontena/plugin_manager'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Plugins
|
|
4
|
+
class InstallCommand < Kontena::Command
|
|
5
|
+
include Kontena::Util
|
|
6
|
+
include Kontena::Cli::Common
|
|
7
|
+
include Kontena::PluginManager::Common
|
|
8
|
+
|
|
9
|
+
parameter 'NAME', 'Plugin name'
|
|
10
|
+
|
|
11
|
+
option ['-v', '--version'], 'VERSION', 'Specify version of plugin to install'
|
|
12
|
+
option '--pre', :flag, 'Allow pre-release of a plugin to be installed', default: false
|
|
13
|
+
|
|
14
|
+
def installer
|
|
15
|
+
Kontena::PluginManager::Installer.new(name, pre: pre?, version: version)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def execute
|
|
19
|
+
if installed?(name)
|
|
20
|
+
installed = spinner "Upgrading plugin #{pastel.cyan(name)}" do
|
|
21
|
+
installer.upgrade
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
spinner "Running cleanup" do |spin|
|
|
25
|
+
Kontena::PluginManager::Cleaner.new(name).cleanup
|
|
26
|
+
end
|
|
27
|
+
else
|
|
28
|
+
installed = spinner "Installing plugin #{pastel.cyan(name)}" do
|
|
29
|
+
installer.install
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Array(installed).each do |gem|
|
|
34
|
+
if gem.name.start_with?('kontena-plugin-')
|
|
35
|
+
puts Kontena.pastel.green("Installed plugin #{gem.name.sub('kontena-plugin-', '')} version #{gem.version}")
|
|
36
|
+
else
|
|
37
|
+
puts Kontena.pastel.cyan("Installed dependency #{gem.name} version #{gem.version}")
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'kontena/plugin_manager'
|
|
2
|
+
require_relative 'common'
|
|
3
|
+
|
|
4
|
+
module Kontena::Cli::Plugins
|
|
5
|
+
class ListCommand < Kontena::Command
|
|
6
|
+
include Kontena::Cli::Common
|
|
7
|
+
include Kontena::Cli::TableGenerator::Helper
|
|
8
|
+
include Common
|
|
9
|
+
include Kontena::PluginManager::Common
|
|
10
|
+
|
|
11
|
+
banner "List installed plugins"
|
|
12
|
+
|
|
13
|
+
def fields
|
|
14
|
+
quiet? ? [:name] : %i(name version description)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def plugin_list
|
|
18
|
+
plugins.map do |plugin|
|
|
19
|
+
{
|
|
20
|
+
name: short_name(plugin.name),
|
|
21
|
+
version: plugin.version,
|
|
22
|
+
description: plugin.description
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def execute
|
|
28
|
+
print_table(plugin_list)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
require_relative 'common'
|
|
2
|
+
require 'kontena/plugin_manager'
|
|
3
|
+
|
|
4
|
+
module Kontena::Cli::Plugins
|
|
5
|
+
class SearchCommand < Kontena::Command
|
|
6
|
+
include Common
|
|
7
|
+
include Kontena::PluginManager::Common
|
|
8
|
+
|
|
9
|
+
parameter '[NAME]', 'Search text'
|
|
10
|
+
option '--pre', :flag, 'Include pre-release versions'
|
|
11
|
+
|
|
12
|
+
def execute
|
|
13
|
+
results = search_plugins(name)
|
|
14
|
+
exit_with_error("Cannot access plugin server") unless results
|
|
15
|
+
puts "%-50s %-10s %-60s" % ['NAME', 'VERSION', 'DESCRIPTION']
|
|
16
|
+
results.each do |item|
|
|
17
|
+
if pre?
|
|
18
|
+
latest = rubygems_client.latest_version(item['name'], pre: true)
|
|
19
|
+
item['version'] = latest.version.to_s
|
|
20
|
+
end
|
|
21
|
+
puts "%-50s %-10s %-60s" % [short_name(item['name']), item['version'], item['info']]
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'kontena/plugin_manager'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Plugins
|
|
4
|
+
class ShowCommand < Kontena::Command
|
|
5
|
+
parameter 'NAME', 'Plugin name' do |name|
|
|
6
|
+
"kontena-plugin-#{name}"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def execute
|
|
10
|
+
require 'yaml'
|
|
11
|
+
plug = Gem::Specification.find { |g| g.name == name }
|
|
12
|
+
out = {}
|
|
13
|
+
out[:path] = plug.gem_dir
|
|
14
|
+
puts out.to_yaml
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require 'kontena/plugin_manager'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Plugins
|
|
4
|
+
class UninstallCommand < Kontena::Command
|
|
5
|
+
include Kontena::Util
|
|
6
|
+
include Kontena::Cli::Common
|
|
7
|
+
|
|
8
|
+
parameter 'NAME ...', 'Plugin name'
|
|
9
|
+
|
|
10
|
+
def execute
|
|
11
|
+
name_list.each do |name|
|
|
12
|
+
exit_with_error "Plugin #{name} has not been installed" unless plugin_installed?(name)
|
|
13
|
+
spinner "Uninstalling plugin #{pastel.cyan(name)}" do
|
|
14
|
+
plugin_uninstaller(name).uninstall
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @param name [String]
|
|
20
|
+
# @return [Boolean]
|
|
21
|
+
def plugin_installed?(name)
|
|
22
|
+
Kontena::PluginManager::Common.installed?(name)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @param name [String]
|
|
26
|
+
# @return [Kontena::PluginManager::Uninstaller]
|
|
27
|
+
def plugin_uninstaller(name)
|
|
28
|
+
Kontena::PluginManager::Uninstaller.new(name)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require 'kontena/plugin_manager'
|
|
2
|
+
require_relative 'common'
|
|
3
|
+
|
|
4
|
+
module Kontena::Cli::Plugins
|
|
5
|
+
class UpgradeCommand < Kontena::Command
|
|
6
|
+
include Kontena::Cli::Common
|
|
7
|
+
include Common
|
|
8
|
+
include Kontena::PluginManager::Common
|
|
9
|
+
|
|
10
|
+
option '--pre', :flag, 'Include pre-release versions'
|
|
11
|
+
option '--silent', :flag, 'Less verbose output'
|
|
12
|
+
|
|
13
|
+
def running_verbose?
|
|
14
|
+
!silent?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def cleanup(*plugins)
|
|
18
|
+
return if plugins.empty?
|
|
19
|
+
vspinner "Running cleanup" do
|
|
20
|
+
plugins.each do |name|
|
|
21
|
+
Kontena::PluginManager::Cleaner.new(name).cleanup
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def installer(name, version: nil)
|
|
27
|
+
Kontena::PluginManager::Installer.new(name, pre: pre?, version: version)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def upgrade(name, from, to)
|
|
31
|
+
vspinner "Upgrading #{pastel.cyan(name)} from #{pastel.cyan(from)} to #{pastel.cyan(to)}" do
|
|
32
|
+
installer(name, version: to).install
|
|
33
|
+
end
|
|
34
|
+
sputs "Upgraded #{name} from #{from} to #{to}" if silent?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def execute
|
|
38
|
+
upgradable = {}
|
|
39
|
+
|
|
40
|
+
vspinner "Checking for upgrades" do
|
|
41
|
+
plugins.each do |plugin|
|
|
42
|
+
short = short_name(plugin.name)
|
|
43
|
+
available_upgrade = installer(short).available_upgrade
|
|
44
|
+
unless available_upgrade.nil?
|
|
45
|
+
upgradable[short] = { from: plugin.version.to_s, to: available_upgrade }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
if upgradable.empty?
|
|
51
|
+
vputs "Nothing upgraded"
|
|
52
|
+
else
|
|
53
|
+
upgradable.each do |name, data|
|
|
54
|
+
upgrade(name, data[:from], data[:to])
|
|
55
|
+
end
|
|
56
|
+
cleanup(upgradable.keys)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
require_relative '../stacks/stacks_helper'
|
|
2
|
+
require 'securerandom'
|
|
3
|
+
|
|
4
|
+
module Kontena::Cli::Registry
|
|
5
|
+
class CreateCommand < Kontena::Command
|
|
6
|
+
include Kontena::Cli::Common
|
|
7
|
+
include Kontena::Cli::GridOptions
|
|
8
|
+
include Kontena::Cli::Stacks::StacksHelper
|
|
9
|
+
|
|
10
|
+
REGISTRY_VERSION = '2.6.0'
|
|
11
|
+
|
|
12
|
+
option '--node', 'NODE', 'Node name'
|
|
13
|
+
option '--s3-bucket', 'S3_BUCKET', 'S3 bucket'
|
|
14
|
+
option '--s3-region', 'S3_REGION', 'S3 region', default: 'eu-west-1'
|
|
15
|
+
option '--s3-encrypt', :flag, 'Encrypt S3 objects', default: false
|
|
16
|
+
option '--s3-secure', :flag, 'Use secure connection in S3', default: true
|
|
17
|
+
option '--s3-v4auth', :flag, 'Use v4auth on S3', default: true
|
|
18
|
+
option '--azure-account-name', 'AZURE_ACCOUNT_NAME', 'Azure account name'
|
|
19
|
+
option '--azure-container-name', 'AZURE_CONTAINER_NAME', 'Azure container name'
|
|
20
|
+
|
|
21
|
+
def execute
|
|
22
|
+
require_api_url
|
|
23
|
+
token = require_token
|
|
24
|
+
preferred_node = node
|
|
25
|
+
secrets = []
|
|
26
|
+
affinity = []
|
|
27
|
+
stateful = true
|
|
28
|
+
instances = 1
|
|
29
|
+
|
|
30
|
+
registry = client(token).get("services/#{current_grid}/registry") rescue nil
|
|
31
|
+
exit_with_error('Registry already exists') if registry
|
|
32
|
+
|
|
33
|
+
nodes = client(token).get("grids/#{current_grid}/nodes")
|
|
34
|
+
|
|
35
|
+
if s3_bucket
|
|
36
|
+
['REGISTRY_STORAGE_S3_ACCESSKEY', 'REGISTRY_STORAGE_S3_SECRETKEY'].each do |secret|
|
|
37
|
+
exit_with_error("Secret #{secret} does not exist in the vault") unless vault_secret_exists?(secret)
|
|
38
|
+
end
|
|
39
|
+
env = [
|
|
40
|
+
"REGISTRY_STORAGE=s3",
|
|
41
|
+
"REGISTRY_STORAGE_S3_REGION=#{s3_region}",
|
|
42
|
+
"REGISTRY_STORAGE_S3_BUCKET=#{s3_bucket}",
|
|
43
|
+
"REGISTRY_STORAGE_S3_ENCRYPT=#{s3_encrypt?}",
|
|
44
|
+
"REGISTRY_STORAGE_S3_SECURE=#{s3_secure?}",
|
|
45
|
+
"REGISTRY_STORAGE_S3_V4AUTH=#{s3_v4auth?}"
|
|
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
|
+
exit_with_error('Option --azure-account-name is missing') if azure_account_name.nil?
|
|
55
|
+
exit_with_error('Option --azure-container-name is missing') if azure_container_name.nil?
|
|
56
|
+
exit_with_error('Secret REGISTRY_STORAGE_AZURE_ACCOUNTKEY does not exist in the 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_CONTAINER=#{azure_container_name}"
|
|
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
|
+
exit_with_error('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
|
+
stack: 'kontena/registry',
|
|
94
|
+
version: Kontena::Cli::VERSION,
|
|
95
|
+
source: '---',
|
|
96
|
+
registry: 'file://',
|
|
97
|
+
expose: 'api',
|
|
98
|
+
services: [
|
|
99
|
+
{
|
|
100
|
+
name: 'api',
|
|
101
|
+
stateful: stateful,
|
|
102
|
+
container_count: instances,
|
|
103
|
+
image: "kontena/registry:#{REGISTRY_VERSION}",
|
|
104
|
+
volumes: ['/registry'],
|
|
105
|
+
env: env,
|
|
106
|
+
secrets: secrets,
|
|
107
|
+
affinity: affinity
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
client(token).post("grids/#{current_grid}/stacks", data)
|
|
113
|
+
deployment = client(token).post("stacks/#{current_grid}/registry/deploy", {})
|
|
114
|
+
spinner "Deploying #{pastel.cyan(data[:name])} stack " do
|
|
115
|
+
wait_for_deploy_to_finish(deployment)
|
|
116
|
+
end
|
|
117
|
+
puts "\n"
|
|
118
|
+
puts "Docker Registry #{REGISTRY_VERSION} is now running at registry.#{current_grid}.kontena.local."
|
|
119
|
+
puts "Note: "
|
|
120
|
+
puts " - OpenVPN connection is needed to establish connection to this registry. See http://www.kontena.io/docs/using-kontena/vpn-access for details"
|
|
121
|
+
puts " - you must set '--insecure-registry registry.#{current_grid}.kontena.local' to your client docker daemon before you are able to push to this registry"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# @param [String] name
|
|
125
|
+
# @return [Boolean]
|
|
126
|
+
def vault_secret_exists?(name)
|
|
127
|
+
client(require_token).get("secrets/#{current_grid}/#{name}")
|
|
128
|
+
true
|
|
129
|
+
rescue
|
|
130
|
+
false
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# @param [String] name
|
|
134
|
+
# @return [String]
|
|
135
|
+
def vault_secret(name)
|
|
136
|
+
secret = client(require_token).get("secrets/#{current_grid}/#{name}")
|
|
137
|
+
secret['value']
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# @param [String] password
|
|
141
|
+
def configure_registry_auth(password)
|
|
142
|
+
data = {
|
|
143
|
+
username: 'admin',
|
|
144
|
+
password: password,
|
|
145
|
+
email: 'not@val.id',
|
|
146
|
+
url: "http://registry.#{current_grid}.kontena.local/"
|
|
147
|
+
}
|
|
148
|
+
client(require_token).post("grids/#{current_grid}/external_registries", data) rescue nil
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module Kontena::Cli::Registry
|
|
2
|
+
class RemoveCommand < Kontena::Command
|
|
3
|
+
include Kontena::Cli::Common
|
|
4
|
+
|
|
5
|
+
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
|
6
|
+
|
|
7
|
+
def execute
|
|
8
|
+
require_api_url
|
|
9
|
+
token = require_token
|
|
10
|
+
confirm unless forced?
|
|
11
|
+
name = 'registry'
|
|
12
|
+
|
|
13
|
+
registry = client(token).get("stacks/#{current_grid}/#{name}") rescue nil
|
|
14
|
+
exit_with_error("Stack #{pastel.cyan(name)} does not exist") if registry.nil?
|
|
15
|
+
|
|
16
|
+
spinner "Removing #{pastel.cyan(name)} stack " do
|
|
17
|
+
client(token).delete("stacks/#{current_grid}/#{name}")
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
class Kontena::Cli::RegistryCommand < Kontena::Command
|
|
2
|
+
|
|
3
|
+
subcommand "create", "Create Docker image registry service", load_subcommand('registry/create_command')
|
|
4
|
+
subcommand ["remove","rm"], "Remove Docker image registry service", load_subcommand('registry/remove_command')
|
|
5
|
+
|
|
6
|
+
def execute
|
|
7
|
+
end
|
|
8
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
class Kontena::Cli::ServiceCommand < Kontena::Command
|
|
2
|
+
subcommand ["list","ls"], "List services", load_subcommand('services/list_command')
|
|
3
|
+
subcommand "create", "Create a new service", load_subcommand('services/create_command')
|
|
4
|
+
subcommand "show", "Show service details", load_subcommand('services/show_command')
|
|
5
|
+
subcommand "update", "Update service configuration", load_subcommand('services/update_command')
|
|
6
|
+
subcommand "deploy", "Deploy service", load_subcommand('services/deploy_command')
|
|
7
|
+
subcommand "stop", "Stop service", load_subcommand('services/stop_command')
|
|
8
|
+
subcommand "start", "Start service", load_subcommand('services/start_command')
|
|
9
|
+
subcommand "restart", "Restart service", load_subcommand('services/restart_command')
|
|
10
|
+
subcommand "scale", "Scale service", load_subcommand('services/scale_command')
|
|
11
|
+
subcommand ["remove", "rm"], "Remove service", load_subcommand('services/remove_command')
|
|
12
|
+
subcommand "containers", "List service containers", load_subcommand('services/containers_command')
|
|
13
|
+
subcommand "logs", "Show service logs", load_subcommand('services/logs_command')
|
|
14
|
+
subcommand "events", "Show service events", load_subcommand('services/events_command')
|
|
15
|
+
subcommand "stats", "Show service statistics", load_subcommand('services/stats_command')
|
|
16
|
+
subcommand "monitor", "Monitor", load_subcommand('services/monitor_command')
|
|
17
|
+
|
|
18
|
+
subcommand "env", "Environment variable specific commands", load_subcommand('services/env_command')
|
|
19
|
+
|
|
20
|
+
subcommand "secret", "Secret specific commands", load_subcommand('services/secret_command')
|
|
21
|
+
|
|
22
|
+
subcommand "link", "Link service to another service", load_subcommand('services/link_command')
|
|
23
|
+
subcommand "unlink", "Unlink service from another service", load_subcommand('services/unlink_command')
|
|
24
|
+
subcommand "exec", "Execute commands in service containers", load_subcommand('services/exec_command')
|
|
25
|
+
|
|
26
|
+
def execute
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require_relative 'services_helper'
|
|
2
|
+
|
|
3
|
+
module Kontena::Cli::Services
|
|
4
|
+
class ContainersCommand < Kontena::Command
|
|
5
|
+
include Kontena::Cli::Common
|
|
6
|
+
include Kontena::Cli::GridOptions
|
|
7
|
+
include ServicesHelper
|
|
8
|
+
|
|
9
|
+
parameter "NAME", "Service name"
|
|
10
|
+
option ['-q', '--quiet'], :flag, "Output the identifying column only"
|
|
11
|
+
|
|
12
|
+
def execute
|
|
13
|
+
require_api_url
|
|
14
|
+
token = require_token
|
|
15
|
+
|
|
16
|
+
result = client(token).get("services/#{parse_service_id(name)}/containers")
|
|
17
|
+
|
|
18
|
+
if quiet?
|
|
19
|
+
puts result['containers'].map { |c| "#{c['node']['name']}/#{c['name']}" }.join("\n")
|
|
20
|
+
exit 0
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
result['containers'].each do |container|
|
|
24
|
+
puts "#{container['name']}:"
|
|
25
|
+
puts " rev: #{container['deploy_rev']}"
|
|
26
|
+
puts " node: #{container['node']['name']}"
|
|
27
|
+
puts " dns: #{container['hostname']}.#{container['domainname']}"
|
|
28
|
+
puts " ip: #{container['ip_address']}"
|
|
29
|
+
puts " public ip: #{container['node']['public_ip']}"
|
|
30
|
+
if container['status'] == 'unknown'
|
|
31
|
+
puts " status: #{pastel.yellow(container['status'])}"
|
|
32
|
+
else
|
|
33
|
+
puts " status: #{container['status']}"
|
|
34
|
+
end
|
|
35
|
+
puts ""
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|