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,334 @@
|
|
1
|
+
require 'kontena/cli/common'
|
2
|
+
require 'kontena/stacks_client'
|
3
|
+
|
4
|
+
class Helper
|
5
|
+
include Kontena::Cli::Common
|
6
|
+
|
7
|
+
def client_config
|
8
|
+
require 'json'
|
9
|
+
config_file = File.expand_path('~/.krates.json')
|
10
|
+
if(File.exist?(config_file))
|
11
|
+
JSON.parse(File.read(config_file))
|
12
|
+
else
|
13
|
+
{}
|
14
|
+
end
|
15
|
+
rescue => ex
|
16
|
+
logger.debug ex
|
17
|
+
{}
|
18
|
+
end
|
19
|
+
|
20
|
+
def current_grid
|
21
|
+
client_config['servers'].find { |s| s['name'] == client_config['current_server']}['grid']
|
22
|
+
rescue => ex
|
23
|
+
logger.debug ex
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
def current_master_name
|
28
|
+
client_config['current_server']
|
29
|
+
end
|
30
|
+
|
31
|
+
def grids
|
32
|
+
client.get("grids")['grids'].map{|grid| grid['id']}
|
33
|
+
rescue => ex
|
34
|
+
logger.debug ex
|
35
|
+
[]
|
36
|
+
end
|
37
|
+
|
38
|
+
def nodes
|
39
|
+
client.get("grids/#{current_grid}/nodes")['nodes'].map{|node| node['name']}
|
40
|
+
rescue
|
41
|
+
[]
|
42
|
+
end
|
43
|
+
|
44
|
+
def stacks
|
45
|
+
stacks = client.get("grids/#{current_grid}/stacks")['stacks']
|
46
|
+
results = []
|
47
|
+
results.push stacks.map{|s| s['name']}
|
48
|
+
results.delete('null')
|
49
|
+
results
|
50
|
+
rescue => ex
|
51
|
+
logger.debug ex
|
52
|
+
[]
|
53
|
+
end
|
54
|
+
|
55
|
+
def stack_registry_usable?
|
56
|
+
return false if current_account.nil? || current_account.stacks_url.nil?
|
57
|
+
return false if current_account.stacks_read_authentication && current_account.token.nil? || current_account.token.access_token.nil?
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
61
|
+
def stacks_client
|
62
|
+
Kontena::StacksClient.new(current_account.stacks_url, current_account.token, read_requires_token: current_account.stacks_read_authentication)
|
63
|
+
end
|
64
|
+
|
65
|
+
def registry_stacks(query = '')
|
66
|
+
return [] unless stack_registry_usable?
|
67
|
+
results = stacks_client.search(query).map { |s| s['stack'] }
|
68
|
+
if results.empty? && !query.empty? # this is here because old stack registry does not return anything for "org/"
|
69
|
+
results = stacks_client.search('').map { |s| s['stack'] }.select { |s| s.start_with?(query) }
|
70
|
+
end
|
71
|
+
results
|
72
|
+
rescue => ex
|
73
|
+
logger.debug ex
|
74
|
+
[]
|
75
|
+
end
|
76
|
+
|
77
|
+
def registry_stack_versions(stackname)
|
78
|
+
return [] unless stack_registry_usable?
|
79
|
+
logger.debug stackname.inspect
|
80
|
+
stacks_client.versions(stackname).map { |v| [stackname, v['version']].join(':') }
|
81
|
+
rescue => ex
|
82
|
+
logger.debug ex
|
83
|
+
[]
|
84
|
+
end
|
85
|
+
|
86
|
+
def services
|
87
|
+
services = client.get("grids/#{current_grid}/services")['services']
|
88
|
+
results = []
|
89
|
+
results.push services.map{ |s|
|
90
|
+
stack = s['stack']['id'].split('/').last
|
91
|
+
if stack != 'null'
|
92
|
+
"#{stack}/#{s['name']}"
|
93
|
+
else
|
94
|
+
s['name']
|
95
|
+
end
|
96
|
+
}
|
97
|
+
results
|
98
|
+
rescue => ex
|
99
|
+
logger.debug ex
|
100
|
+
[]
|
101
|
+
end
|
102
|
+
|
103
|
+
def containers
|
104
|
+
results = []
|
105
|
+
client.get("grids/#{current_grid}/services")['services'].each do |service|
|
106
|
+
containers = client.get("services/#{service['id']}/containers")['containers']
|
107
|
+
results.push(containers.map{|c| c['name'] })
|
108
|
+
results.push(containers.map{|c| c['id'] })
|
109
|
+
end
|
110
|
+
results
|
111
|
+
rescue => ex
|
112
|
+
logger.debug ex
|
113
|
+
[]
|
114
|
+
end
|
115
|
+
|
116
|
+
def yml_services
|
117
|
+
require 'yaml'
|
118
|
+
if File.exist?('kontena.yml')
|
119
|
+
yaml = YAML.safe_load(File.read('kontena.yml'), [], [], true, 'kontena.yml')
|
120
|
+
services = yaml['services']
|
121
|
+
services.keys
|
122
|
+
end
|
123
|
+
rescue => ex
|
124
|
+
logger.debug ex
|
125
|
+
[]
|
126
|
+
end
|
127
|
+
|
128
|
+
def directories(word)
|
129
|
+
if word && File.directory?(word) && !word.end_with?('/')
|
130
|
+
['%s/' % word]
|
131
|
+
else
|
132
|
+
Dir[File.join('.', '%s*' % word)].select { |file| File.directory?(file) }.map { |file| '%s/' % file.sub('./', '') }
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def yml_files(word)
|
137
|
+
if word && File.directory?(word) && word.end_with?('/')
|
138
|
+
glob = File.join(word, '*.{yml,yaml}')
|
139
|
+
else
|
140
|
+
glob = File.join('.', '%s*.{yml,yaml}' % word)
|
141
|
+
end
|
142
|
+
Dir[glob].map { |file| file.sub('./', '') } + directories(word)
|
143
|
+
rescue => ex
|
144
|
+
logger.debug ex
|
145
|
+
[]
|
146
|
+
end
|
147
|
+
|
148
|
+
def master_names
|
149
|
+
client_config['servers'].map{|s| s['name']}
|
150
|
+
rescue => ex
|
151
|
+
logger.debug ex
|
152
|
+
[]
|
153
|
+
end
|
154
|
+
|
155
|
+
def subcommand_tree(cmd = nil, base = nil)
|
156
|
+
puts "#{cmd} ".strip
|
157
|
+
if base.has_subcommands?
|
158
|
+
base.recognised_subcommands.each do |sc|
|
159
|
+
subcommand_tree("#{cmd} #{sc.names.first}", sc.subcommand_class)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
helper = Helper.new
|
166
|
+
|
167
|
+
words = ARGV
|
168
|
+
|
169
|
+
if words.first == '--subcommand-tree'
|
170
|
+
require 'kontena/main_command'
|
171
|
+
helper.subcommand_tree("kontena", Kontena::MainCommand)
|
172
|
+
exit 0
|
173
|
+
end
|
174
|
+
|
175
|
+
words.delete_at(0)
|
176
|
+
|
177
|
+
helper.logger.debug { "Completing #{words.inspect}" }
|
178
|
+
|
179
|
+
begin
|
180
|
+
completion = []
|
181
|
+
completion.push %w(cloud grid service stack vault certificate node master vpn registry container etcd external-registry whoami plugin version) if words.size < 2
|
182
|
+
if words.size > 0
|
183
|
+
case words[0]
|
184
|
+
when 'plugin'
|
185
|
+
completion.clear
|
186
|
+
sub_commands = %w(list search install uninstall)
|
187
|
+
if words[1]
|
188
|
+
completion.push(sub_commands) unless (sub_commands + %w(ls)).include?(words[1])
|
189
|
+
else
|
190
|
+
completion.push sub_commands
|
191
|
+
end
|
192
|
+
when 'etcd'
|
193
|
+
completion.clear
|
194
|
+
sub_commands = %w(get set mkdir list rm)
|
195
|
+
if words[1]
|
196
|
+
completion.push(sub_commands) unless (sub_commands + %w(ls)).include?(words[1])
|
197
|
+
else
|
198
|
+
completion.push sub_commands
|
199
|
+
end
|
200
|
+
when 'registry'
|
201
|
+
completion.clear
|
202
|
+
sub_commands = %w(create remove)
|
203
|
+
if words[1]
|
204
|
+
completion.push(sub_commands) unless (sub_commands + %w(rm)).include?(words[1])
|
205
|
+
else
|
206
|
+
completion.push sub_commands
|
207
|
+
end
|
208
|
+
when 'grid'
|
209
|
+
completion.clear
|
210
|
+
sub_commands = %w(add-user audit-log create current list user remove show use)
|
211
|
+
if words[1] && words[1] == 'use'
|
212
|
+
completion.push helper.grids.reject { |g| g == helper.current_grid }
|
213
|
+
elsif words[1] && %w(update show remove env cloud-config health).include?(words[1])
|
214
|
+
completion.push helper.grids
|
215
|
+
else
|
216
|
+
completion.push sub_commands
|
217
|
+
end
|
218
|
+
when 'node'
|
219
|
+
completion.clear
|
220
|
+
sub_commands = %w(list show remove)
|
221
|
+
if words[1] && sub_commands.include?(words[1])
|
222
|
+
completion.push helper.nodes
|
223
|
+
else
|
224
|
+
completion.push sub_commands
|
225
|
+
end
|
226
|
+
when 'master'
|
227
|
+
completion.clear
|
228
|
+
sub_commands = %w(list use user current remove config login logout token join audit-log init-cloud)
|
229
|
+
if words[1] && words[1] == 'use'
|
230
|
+
completion.push helper.master_names.reject { |n| n == helper.current_master_name }
|
231
|
+
elsif words[1] && %w(remove rm).include?(words[1])
|
232
|
+
completion.push helper.master_names
|
233
|
+
elsif words[1] && words[1] == 'user'
|
234
|
+
users_sub_commands = %w(invite list role)
|
235
|
+
if words[2] == 'role'
|
236
|
+
role_subcommands = %w(add remove)
|
237
|
+
if !words[3] || !(role_subcommands + %w(rm)).include?(words[3])
|
238
|
+
completion.push role_subcommands
|
239
|
+
end
|
240
|
+
else
|
241
|
+
completion.push users_sub_commands
|
242
|
+
end
|
243
|
+
elsif words[1] && ['config', 'cfg'].include?(words[1])
|
244
|
+
config_sub_commands = %(set get dump load import export unset)
|
245
|
+
completion.push config_sub_commands
|
246
|
+
elsif words[1] && words[1] == 'token'
|
247
|
+
token_sub_commands = %(list remove show current create)
|
248
|
+
completion.push token_sub_commands
|
249
|
+
elsif words[1]
|
250
|
+
completion.push(sub_commands) unless (sub_commands + %w(ls rm)).include?(words[1])
|
251
|
+
else
|
252
|
+
completion.push sub_commands
|
253
|
+
end
|
254
|
+
when 'cloud'
|
255
|
+
completion.clear
|
256
|
+
sub_commands = %w(login logout master)
|
257
|
+
if words[1] && words[1] == 'master'
|
258
|
+
cloud_master_sub_commands = %(list remove add show update)
|
259
|
+
completion.push cloud_master_sub_commands
|
260
|
+
elsif words[1]
|
261
|
+
completion.push(sub_commands) unless (sub_commands + %w(ls rm)).include?(words[1])
|
262
|
+
else
|
263
|
+
completion.push sub_commands
|
264
|
+
end
|
265
|
+
when 'service'
|
266
|
+
completion.clear
|
267
|
+
sub_commands = %w(containers create remove deploy list logs restart
|
268
|
+
scale show start stats stop update monitor env
|
269
|
+
secret link unlink)
|
270
|
+
if words[1] && sub_commands.include?(words[1])
|
271
|
+
completion.push helper.services
|
272
|
+
else
|
273
|
+
completion.push sub_commands
|
274
|
+
end
|
275
|
+
when 'container'
|
276
|
+
completion.clear
|
277
|
+
sub_commands = %w(exec inspect logs)
|
278
|
+
if words[1] && sub_commands.include?(words[1])
|
279
|
+
completion.push helper.containers
|
280
|
+
else
|
281
|
+
completion.push sub_commands
|
282
|
+
end
|
283
|
+
when 'vpn'
|
284
|
+
completion.clear
|
285
|
+
completion.push %w(config create remove)
|
286
|
+
when 'external-registry'
|
287
|
+
completion.clear
|
288
|
+
completion.push %w(add list remove)
|
289
|
+
when 'stack'
|
290
|
+
completion.clear
|
291
|
+
sub_commands = %w(build install upgrade deploy start stop remove restart list
|
292
|
+
logs monitor show registry inspect validate)
|
293
|
+
if words[1]
|
294
|
+
if words[1] == 'registry' || words[1] == 'reg'
|
295
|
+
registry_sub_commands = %(push pull search show remove make-public make-private create)
|
296
|
+
if words[2]
|
297
|
+
if words[2] == 'push'
|
298
|
+
completion.push helper.yml_files(words[3])
|
299
|
+
elsif %w(pull search show remove rm make-public make-private).include?(words[2]) && words[4].nil?
|
300
|
+
completion.push helper.registry_stacks(words[3].to_s)
|
301
|
+
else
|
302
|
+
completion.push registry_sub_commands
|
303
|
+
end
|
304
|
+
else
|
305
|
+
completion.push registry_sub_commands
|
306
|
+
end
|
307
|
+
elsif %w(install validate build).include?(words[1])
|
308
|
+
completion.push helper.yml_files(words[2])
|
309
|
+
if words[1] == 'install'
|
310
|
+
completion.push helper.registry_stacks(words[2].to_s)
|
311
|
+
end
|
312
|
+
elsif words[1] == 'upgrade'
|
313
|
+
if words[3]
|
314
|
+
completion.push helper.yml_files(words[4])
|
315
|
+
completion.push helper.registry_stacks(words[4].to_s)
|
316
|
+
else
|
317
|
+
completion.push helper.stacks
|
318
|
+
end
|
319
|
+
elsif %w(deploy start stop remove rm restart logs monitor show inspect).include?(words[1])
|
320
|
+
completion.push helper.stacks
|
321
|
+
else
|
322
|
+
completion.push(sub_commands) unless (sub_commands + %w(rm ls)).include?(words[1])
|
323
|
+
end
|
324
|
+
else
|
325
|
+
completion.push sub_commands
|
326
|
+
end
|
327
|
+
end
|
328
|
+
end
|
329
|
+
rescue => ex
|
330
|
+
helper.logger.debug ex
|
331
|
+
end
|
332
|
+
helper.logger.debug { "Returning completions: #{completion.inspect}" }
|
333
|
+
|
334
|
+
puts completion
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env bash
|
2
|
+
|
3
|
+
# This file exists mostly for backwards dependency to
|
4
|
+
# allow the old "which kontena && . foofoo/init"
|
5
|
+
# completion loading
|
6
|
+
_kontena_complete() {
|
7
|
+
COMPREPLY=()
|
8
|
+
local word="${COMP_WORDS[COMP_CWORD]}"
|
9
|
+
local completions="$(kontena complete ${COMP_WORDS[*]})"
|
10
|
+
COMPREPLY=( $(compgen -W "$completions" -- "$word") )
|
11
|
+
}
|
12
|
+
|
13
|
+
if [ "$ZSH_VERSION" != "" ]; then
|
14
|
+
autoload -U +X compinit && compinit
|
15
|
+
autoload -U +X bashcompinit && bashcompinit
|
16
|
+
fi
|
17
|
+
|
18
|
+
which kontena > /dev/null && complete -F _kontena_complete kontena
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require_relative 'stack_data_set'
|
2
|
+
|
3
|
+
module Kontena::Stacks
|
4
|
+
class ChangeResolver
|
5
|
+
|
6
|
+
attr_reader :old_data, :new_data
|
7
|
+
|
8
|
+
# Creates a change analysis from two sets of stack data.
|
9
|
+
# The format is a flat hash of all related stacks.
|
10
|
+
#
|
11
|
+
# @param old_data [DataSet,Hash]
|
12
|
+
# @param new_data [DataSet,Hash]
|
13
|
+
def initialize(old_data, new_data)
|
14
|
+
@old_data = old_data.is_a?(StackDataSet) ? old_data : StackDataSet.new(old_data)
|
15
|
+
@new_data = new_data.is_a?(StackDataSet) ? new_data : StackDataSet.new(new_data)
|
16
|
+
analyze
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Array<String>] an array of services that should be added
|
20
|
+
def added_services
|
21
|
+
@added_services ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Array<String>] an array of services that should be removed
|
25
|
+
def removed_services
|
26
|
+
@removed_services ||= []
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Array<String>] an array of services that should be upgraded
|
30
|
+
def upgraded_services
|
31
|
+
@upgraded_services ||= []
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Array<String>] an array of stack installation names that should be removed
|
35
|
+
def removed_stacks
|
36
|
+
@removed_stacks ||= []
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Array<String>] an array of stack installation names that should be removed
|
40
|
+
def added_stacks
|
41
|
+
@added_stacks ||= []
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Array<String>] an array of stack installation names that should be upgraded
|
45
|
+
def upgraded_stacks
|
46
|
+
@upgraded_stacks ||= []
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Hash] a hash of "installed-stack-name" => { :from => 'stackname', :to => 'new-stackname' }
|
50
|
+
def replaced_stacks
|
51
|
+
@replaced_stacks ||= {}
|
52
|
+
end
|
53
|
+
|
54
|
+
# @return [Array<String>] an array of installed stack names that should exist after upgrade
|
55
|
+
def remaining_stacks
|
56
|
+
@remaining_stacks ||= added_stacks + upgraded_stacks
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [Boolean]
|
60
|
+
def safe?
|
61
|
+
removed_stacks.empty? && replaced_stacks.empty? && removed_services.empty?
|
62
|
+
end
|
63
|
+
|
64
|
+
def analyze
|
65
|
+
old_names = old_data.stack_names
|
66
|
+
new_names = new_data.stack_names
|
67
|
+
|
68
|
+
removed_stacks.concat(old_names - new_names)
|
69
|
+
added_stacks.concat(new_names - old_names)
|
70
|
+
(new_names & old_names).each do |candidate|
|
71
|
+
upgraded_stacks << candidate if stack_upgraded?(candidate)
|
72
|
+
end
|
73
|
+
|
74
|
+
removed_stacks.each do |removed_stack|
|
75
|
+
removed_services.concat(
|
76
|
+
old_data.stack(removed_stack).service_names.map { |name| "#{removed_stack}/#{name}"}
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
added_stacks.each do |added_stack|
|
81
|
+
added_services.concat(
|
82
|
+
new_data.stack(added_stack).service_names.map { |name| "#{added_stack}/#{name}"}
|
83
|
+
)
|
84
|
+
end
|
85
|
+
|
86
|
+
upgraded_stacks.each do |upgraded_stack|
|
87
|
+
old_stack = old_data.stack(upgraded_stack).stack_name
|
88
|
+
new_stack = new_data.stack(upgraded_stack).stack_name
|
89
|
+
|
90
|
+
unless old_stack == new_stack
|
91
|
+
replaced_stacks[upgraded_stack] = { from: old_stack, to: new_stack }
|
92
|
+
end
|
93
|
+
|
94
|
+
old_services = old_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }
|
95
|
+
new_services = new_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }
|
96
|
+
|
97
|
+
removed_services.concat(old_services - new_services)
|
98
|
+
added_services.concat(new_services - old_services)
|
99
|
+
upgraded_services.concat(new_services & old_services)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Stack is upgraded if version, stack name, variables change or stack is root
|
104
|
+
#
|
105
|
+
# @param name [String]
|
106
|
+
# @return [Boolean]
|
107
|
+
def stack_upgraded?(name)
|
108
|
+
old_stack = old_data.stack(name)
|
109
|
+
new_stack = new_data.stack(name)
|
110
|
+
return true if new_stack.root?
|
111
|
+
return true if old_stack.version != new_stack.version
|
112
|
+
return true if old_stack.stack_name != new_stack.stack_name
|
113
|
+
return true if old_stack.variables != new_stack.variables
|
114
|
+
|
115
|
+
false
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Kontena::Stacks
|
2
|
+
class StackData
|
3
|
+
|
4
|
+
attr_reader :loader
|
5
|
+
|
6
|
+
# @param data [Hash]
|
7
|
+
# @param loader [StackFileLoader,NilClass]
|
8
|
+
def initialize(data, loader = nil)
|
9
|
+
@data = data
|
10
|
+
@loader = loader
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [String]
|
14
|
+
def name
|
15
|
+
@data['name']
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [String]
|
19
|
+
def stack_name
|
20
|
+
@data['stack']
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [String]
|
24
|
+
def version
|
25
|
+
@data['version']
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Boolean]
|
29
|
+
def root?
|
30
|
+
parent.nil?
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [String]
|
34
|
+
def parent
|
35
|
+
@data.dig('parent', 'name')
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [Hash]
|
39
|
+
def variables
|
40
|
+
@data['variables']
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [Array<Hash>]
|
44
|
+
def services
|
45
|
+
@data['services']
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Array<String>]
|
49
|
+
def service_names
|
50
|
+
@data['services'].map { |s| s['name']}
|
51
|
+
end
|
52
|
+
|
53
|
+
# @return [Hash]
|
54
|
+
def data
|
55
|
+
@data.dup
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_relative 'stack_data'
|
2
|
+
|
3
|
+
module Kontena::Stacks
|
4
|
+
class StackDataSet
|
5
|
+
|
6
|
+
# @param data [Hash]
|
7
|
+
def initialize(data)
|
8
|
+
@data = data
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param name [String]
|
12
|
+
# @return [StackData,NilClass]
|
13
|
+
def stack(name)
|
14
|
+
data = @data[name]
|
15
|
+
StackData.new(data[:stack_data], data[:loader]) if data
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method :[], :stack
|
19
|
+
|
20
|
+
# @return [Array<StackData>]
|
21
|
+
def stacks
|
22
|
+
stack_names.map do |name|
|
23
|
+
stack(name)
|
24
|
+
end.compact
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Array<String>]
|
28
|
+
def stack_names
|
29
|
+
@data.keys
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [Integer]
|
33
|
+
def size
|
34
|
+
@data.size
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param name [String]
|
38
|
+
# @return [StackData,NilClass]
|
39
|
+
def delete(name)
|
40
|
+
data = @data.delete(name)
|
41
|
+
StackData.new(data[:stack_data], data[:loader]) if data
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Array<StackData>]
|
45
|
+
def remove_dependencies
|
46
|
+
stacks.map do |stack|
|
47
|
+
delete(stack.name) unless stack.root?
|
48
|
+
end.compact
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|