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,19 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
|
2
|
+
class AffinitiesValidator < HashValidator::Validator::Base
|
3
|
+
def initialize
|
4
|
+
super('stacks_valid_affinities')
|
5
|
+
end
|
6
|
+
|
7
|
+
def validate(key, value, validations, errors)
|
8
|
+
unless value.is_a?(Array)
|
9
|
+
errors[key] = 'affinity must be array'
|
10
|
+
return
|
11
|
+
end
|
12
|
+
|
13
|
+
invalid_formats = value.find_all { |a| !a.match(/(?<=\!|\=)=/) }
|
14
|
+
if invalid_formats.count > 0
|
15
|
+
errors[key] = "affinity contains invalid formats: #{invalid_formats.join(', ')}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
|
2
|
+
class BuildValidator < HashValidator::Validator::Base
|
3
|
+
def initialize
|
4
|
+
super('stacks_valid_build')
|
5
|
+
end
|
6
|
+
|
7
|
+
def validate(key, value, validations, errors)
|
8
|
+
unless value.is_a?(String) || value.is_a?(Hash)
|
9
|
+
errors[key] = 'build must be string or hash'
|
10
|
+
return
|
11
|
+
end
|
12
|
+
if value.is_a?(Hash)
|
13
|
+
build_validation = {
|
14
|
+
'context' => 'string',
|
15
|
+
'dockerfile' => HashValidator.optional('string'),
|
16
|
+
'args' => HashValidator.optional(-> (value) { value.is_a?(Array) || value.is_a?(Hash) })
|
17
|
+
}
|
18
|
+
HashValidator.validator_for(build_validation).validate(key, value, build_validation, errors)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
|
2
|
+
class CertificatesValidator < HashValidator::Validator::Base
|
3
|
+
def initialize
|
4
|
+
super('stacks_valid_certificates')
|
5
|
+
end
|
6
|
+
|
7
|
+
def validate(key, value, validations, errors)
|
8
|
+
unless value.is_a?(Array)
|
9
|
+
errors[key] = 'certificates must be array'
|
10
|
+
return
|
11
|
+
end
|
12
|
+
certificate_item_validation = {
|
13
|
+
'subject' => 'string',
|
14
|
+
'name' => 'string',
|
15
|
+
'type' => 'string'
|
16
|
+
}
|
17
|
+
value.each do |certificate|
|
18
|
+
HashValidator.validator_for(certificate_item_validation).validate(key, certificate, certificate_item_validation, errors)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
|
2
|
+
class ExtendsValidator < HashValidator::Validator::Base
|
3
|
+
def initialize
|
4
|
+
super('stacks_valid_extends')
|
5
|
+
end
|
6
|
+
|
7
|
+
def validate(key, value, validations, errors)
|
8
|
+
unless value.is_a?(String) || value.is_a?(Hash)
|
9
|
+
errors[key] = 'extends must be string or hash'
|
10
|
+
return
|
11
|
+
end
|
12
|
+
if value.is_a?(Hash)
|
13
|
+
extends_validation = {
|
14
|
+
'service' => 'string',
|
15
|
+
'file' => HashValidator.optional('string'),
|
16
|
+
'stack' => HashValidator.optional('string')
|
17
|
+
}
|
18
|
+
HashValidator.validator_for(extends_validation).validate(key, value, extends_validation, errors)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
|
2
|
+
class HooksValidator < HashValidator::Validator::Base
|
3
|
+
def initialize
|
4
|
+
super('stacks_valid_hooks')
|
5
|
+
end
|
6
|
+
|
7
|
+
def validate(key, value, validations, errors)
|
8
|
+
unless value.is_a?(Hash)
|
9
|
+
errors[key] = "must be a mapping, not #{value.class}"
|
10
|
+
return
|
11
|
+
end
|
12
|
+
|
13
|
+
value.keys.each do |hook|
|
14
|
+
unless %w(pre_build pre_start post_start pre_stop).include?(hook)
|
15
|
+
errors[key] = "invalid hook #{hook}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
if value['pre_build']
|
20
|
+
validate_pre_build_hooks(key, value['pre_build'], errors)
|
21
|
+
end
|
22
|
+
|
23
|
+
if value['pre_start']
|
24
|
+
validate_pre_start_hooks(key, value['pre_start'], errors)
|
25
|
+
end
|
26
|
+
|
27
|
+
if value['post_start']
|
28
|
+
validate_post_start_hooks(key, value['post_start'], errors)
|
29
|
+
end
|
30
|
+
|
31
|
+
if value['pre_stop']
|
32
|
+
validate_pre_stop_hooks(key, value['pre_stop'], errors)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def validate_pre_build_hooks(key, pre_build_hooks, errors)
|
37
|
+
unless pre_build_hooks.is_a?(Array)
|
38
|
+
errors[key] = { 'pre_build' => "must be an array" }
|
39
|
+
return
|
40
|
+
end
|
41
|
+
pre_build_validation = {
|
42
|
+
'name' => 'string',
|
43
|
+
'cmd' => 'string'
|
44
|
+
}
|
45
|
+
validator = HashValidator.validator_for(pre_build_validation)
|
46
|
+
pre_build_hooks.each do |pre_build|
|
47
|
+
validator.validate('hooks.pre_build', pre_build, pre_build_validation, errors)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def validate_pre_start_hooks(key, pre_start_hooks, errors)
|
52
|
+
unless pre_start_hooks.is_a?(Array)
|
53
|
+
errors[key] = { 'pre_start' => 'must be an array' }
|
54
|
+
return
|
55
|
+
end
|
56
|
+
pre_start_validation = {
|
57
|
+
'name' => 'string',
|
58
|
+
'instances' => (-> (value) { value.is_a?(Integer) || value == '*' }),
|
59
|
+
'cmd' => 'string',
|
60
|
+
'oneshot' => HashValidator.optional('boolean')
|
61
|
+
}
|
62
|
+
validator = HashValidator.validator_for(pre_start_validation)
|
63
|
+
pre_start_hooks.each do |pre_start|
|
64
|
+
validator.validate('hooks.pre_start', pre_start, pre_start_validation, errors)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def validate_post_start_hooks(key, post_start_hooks, errors)
|
69
|
+
unless post_start_hooks.is_a?(Array)
|
70
|
+
errors[key] = { 'post_start' => 'must be an array' }
|
71
|
+
return
|
72
|
+
end
|
73
|
+
post_start_validation = {
|
74
|
+
'name' => 'string',
|
75
|
+
'instances' => (-> (value) { value.is_a?(Integer) || value == '*' }),
|
76
|
+
'cmd' => 'string',
|
77
|
+
'oneshot' => HashValidator.optional('boolean')
|
78
|
+
}
|
79
|
+
validator = HashValidator.validator_for(post_start_validation)
|
80
|
+
post_start_hooks.each do |post_start|
|
81
|
+
validator.validate('hooks.post_start', post_start, post_start_validation, errors)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def validate_pre_stop_hooks(key, pre_stop_hooks, errors)
|
86
|
+
unless pre_stop_hooks.is_a?(Array)
|
87
|
+
errors[key] = { 'pre_stop' => 'must be an array' }
|
88
|
+
return
|
89
|
+
end
|
90
|
+
pre_stop_validation = {
|
91
|
+
'name' => 'string',
|
92
|
+
'instances' => (-> (value) { value.is_a?(Integer) || value == '*' }),
|
93
|
+
'cmd' => 'string',
|
94
|
+
'oneshot' => HashValidator.optional('boolean')
|
95
|
+
}
|
96
|
+
validator = HashValidator.validator_for(pre_stop_validation)
|
97
|
+
pre_stop_hooks.each do |pre_stop|
|
98
|
+
validator.validate('hooks.pre_stop', pre_stop, pre_stop_validation, errors)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Validations::CustomValidators
|
2
|
+
class SecretsValidator < HashValidator::Validator::Base
|
3
|
+
def initialize
|
4
|
+
super('stacks_valid_secrets')
|
5
|
+
end
|
6
|
+
|
7
|
+
def validate(key, value, validations, errors)
|
8
|
+
unless value.is_a?(Array)
|
9
|
+
errors[key] = 'secrets must be array'
|
10
|
+
return
|
11
|
+
end
|
12
|
+
secret_item_validation = {
|
13
|
+
'secret' => 'string',
|
14
|
+
'name' => 'string',
|
15
|
+
'type' => 'string'
|
16
|
+
}
|
17
|
+
value.each do |secret|
|
18
|
+
HashValidator.validator_for(secret_item_validation).validate(key, secret, secret_item_validation, errors)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Opto::Resolvers
|
2
|
+
class Certificates < ::Opto::Resolver
|
3
|
+
include Kontena::Cli::Common
|
4
|
+
|
5
|
+
def resolve
|
6
|
+
return nil unless current_master && current_grid
|
7
|
+
message = hint || 'Select SSL certificates'
|
8
|
+
certificates = get_certificates
|
9
|
+
if certificates.size > 0
|
10
|
+
prompt.multi_select(message) do |menu|
|
11
|
+
menu.default(*default_indexes(certificates)) if option.default
|
12
|
+
certificates.each do |s|
|
13
|
+
menu.choice s['subject']
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Array<Hash>] certificates
|
20
|
+
def get_certificates
|
21
|
+
client.get("grids/#{current_grid}/certificates")['certificates']
|
22
|
+
rescue
|
23
|
+
[]
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param certificates [Array<Hash>]
|
27
|
+
# @return [Array<Integer>]
|
28
|
+
def default_indexes(certificates)
|
29
|
+
indexes = []
|
30
|
+
option.default.to_a.each do |subject|
|
31
|
+
index = certificates.index { |s| s['subject'] == subject }
|
32
|
+
indexes << index.to_i + 1 if index
|
33
|
+
end
|
34
|
+
indexes
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require_relative '../opto'
|
2
|
+
|
3
|
+
module Kontena::Cli::Stacks
|
4
|
+
module YAML
|
5
|
+
class Prompt < ::Opto::Resolver
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
|
8
|
+
using ::Opto::Extension::HashStringOrSymbolKey
|
9
|
+
|
10
|
+
def enum?
|
11
|
+
option.type == 'enum'
|
12
|
+
end
|
13
|
+
|
14
|
+
def boolean?
|
15
|
+
option.type == 'boolean'
|
16
|
+
end
|
17
|
+
|
18
|
+
def prompt_word
|
19
|
+
return "Select" if enum?
|
20
|
+
return "Enable" if boolean?
|
21
|
+
"Enter"
|
22
|
+
end
|
23
|
+
|
24
|
+
def question_text
|
25
|
+
(!hint.nil? && hint != option.name) ? "#{hint} :" : "#{prompt_word} #{option.label || option.name} :"
|
26
|
+
end
|
27
|
+
|
28
|
+
def enum_can_be_other?
|
29
|
+
enum? && option.handler.options[:can_be_other] ? true : false
|
30
|
+
end
|
31
|
+
|
32
|
+
def enum
|
33
|
+
opts = option.handler.options[:options]
|
34
|
+
opts << { label: '(Other)', value: nil, description: '(Other)' } if enum_can_be_other?
|
35
|
+
|
36
|
+
answer = prompt.select(question_text) do |menu|
|
37
|
+
menu.enum ':' # makes it show numbers before values, you can press the number to select.
|
38
|
+
menu.default(opts.index {|opt| opt[:value] == option.default }.to_i + 1) if option.default
|
39
|
+
opts.each do |opt|
|
40
|
+
menu.choice opt[:label], opt[:value]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
if answer.nil? && enum_can_be_other?
|
45
|
+
ask
|
46
|
+
else
|
47
|
+
answer
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def bool
|
52
|
+
prompt.yes?(question_text, default: option.default.nil? || option.default)
|
53
|
+
end
|
54
|
+
|
55
|
+
def echo?
|
56
|
+
return true if option.handler.nil?
|
57
|
+
return true if option.handler.options.nil?
|
58
|
+
return true if option.handler.options[:echo].nil?
|
59
|
+
option.handler.options[:echo]
|
60
|
+
end
|
61
|
+
|
62
|
+
def ask
|
63
|
+
prompt.ask(question_text, default: option.default, echo: echo?)
|
64
|
+
end
|
65
|
+
|
66
|
+
def resolve
|
67
|
+
return nil if option.skip?
|
68
|
+
if enum?
|
69
|
+
enum
|
70
|
+
elsif boolean?
|
71
|
+
bool
|
72
|
+
else
|
73
|
+
ask
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Kontena::Cli::Stacks
|
2
|
+
module YAML
|
3
|
+
class Opto::Resolvers::ServiceInstances < ::Opto::Resolver
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
|
6
|
+
def resolve
|
7
|
+
return nil unless current_master && current_grid
|
8
|
+
require 'kontena/cli/stacks/show_command'
|
9
|
+
stack = client.get("stacks/#{current_grid}/#{self.stack}")
|
10
|
+
service = stack['services'].find { |s| s['name'] == hint }
|
11
|
+
if service
|
12
|
+
service['instances']
|
13
|
+
else
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
rescue Kontena::Errors::StandardError
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
|
20
|
+
def stack
|
21
|
+
ENV['STACK']
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Opto::Resolvers
|
2
|
+
class ServiceLink < ::Opto::Resolver
|
3
|
+
include Kontena::Cli::Common
|
4
|
+
|
5
|
+
def resolve
|
6
|
+
return nil unless current_master && current_grid
|
7
|
+
message = hint['prompt']
|
8
|
+
name_filter = hint['name']
|
9
|
+
image_filter = hint['image']
|
10
|
+
raise "prompt missing" unless message
|
11
|
+
|
12
|
+
services = get_services
|
13
|
+
services = filter_by_image(services, image_filter) if image_filter
|
14
|
+
services = filter_by_name(services, name_filter) if name_filter
|
15
|
+
return nil if services.size == 0
|
16
|
+
prompt.select(message) do |menu|
|
17
|
+
menu.default(default_index(services)) if option.default
|
18
|
+
menu.choice "<none>", nil unless option.required?
|
19
|
+
services.each do |s|
|
20
|
+
menu.choice service_name(s), service_link(s)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Array<Hash>]
|
26
|
+
def get_services
|
27
|
+
client.get("grids/#{current_grid}/services")['services']
|
28
|
+
rescue
|
29
|
+
[]
|
30
|
+
end
|
31
|
+
|
32
|
+
# @param [Array<Hash>] services
|
33
|
+
# @return [Integer]
|
34
|
+
def default_index(services)
|
35
|
+
index = services.index {|s| service_link(s) == option.default }
|
36
|
+
|
37
|
+
if index && !option.required?
|
38
|
+
index + 2 # extra offset for the initial <none> option
|
39
|
+
elsif index
|
40
|
+
index + 1 # menu index starts from 1
|
41
|
+
else
|
42
|
+
0 # XXX: this just explodes?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# @param [Hash] service
|
47
|
+
# @return [String]
|
48
|
+
def service_link(service)
|
49
|
+
grid, stack, service = service['id'].split('/')
|
50
|
+
"#{stack}/#{service}"
|
51
|
+
end
|
52
|
+
|
53
|
+
# @param [Hash] service
|
54
|
+
# @return [String]
|
55
|
+
def service_name(service)
|
56
|
+
grid, stack, service = service['id'].split('/')
|
57
|
+
if stack == 'null'.freeze
|
58
|
+
service
|
59
|
+
else
|
60
|
+
"#{stack}/#{service}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def filter_by_image(services, image)
|
65
|
+
services.select { |s|
|
66
|
+
s['image'].include?(image)
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def filter_by_name(services, name)
|
71
|
+
services.select { |s|
|
72
|
+
s['name'].include?(name)
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def stack
|
77
|
+
ENV['STACK']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Kontena::Cli::Stacks::YAML::Opto::Resolvers
|
2
|
+
class VaultCertPrompt < ::Opto::Resolver
|
3
|
+
include Kontena::Cli::Common
|
4
|
+
|
5
|
+
def resolve
|
6
|
+
return nil unless current_master && current_grid
|
7
|
+
message = hint || 'Select SSL certs'
|
8
|
+
secrets = get_secrets.select{ |s|
|
9
|
+
s['name'].match(/(ssl|cert)/i)
|
10
|
+
}
|
11
|
+
if secrets.size > 0
|
12
|
+
prompt.multi_select(message) do |menu|
|
13
|
+
menu.default(*default_indexes(secrets)) if option.default
|
14
|
+
secrets.each do |s|
|
15
|
+
menu.choice s['name']
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [Array<Hash>] secrets
|
22
|
+
def get_secrets
|
23
|
+
client.get("grids/#{current_grid}/secrets")['secrets']
|
24
|
+
rescue
|
25
|
+
[]
|
26
|
+
end
|
27
|
+
|
28
|
+
# @param [Array<Hash>] secrets
|
29
|
+
# @return [Array<Integer>]
|
30
|
+
def default_indexes(secrets)
|
31
|
+
indexes = []
|
32
|
+
option.default.to_a.each do |name|
|
33
|
+
index = secrets.index { |s| s['name'] == name }
|
34
|
+
indexes << index.to_i + 1 if index
|
35
|
+
end
|
36
|
+
indexes
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Kontena::Cli::Stacks
|
2
|
+
module YAML
|
3
|
+
class Opto::Resolvers::Vault < ::Opto::Resolver
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
def resolve
|
6
|
+
raise RuntimeError, "Missing or empty vault secret name" if hint.to_s.empty?
|
7
|
+
if current_master && current_grid
|
8
|
+
client.get("secrets/#{current_grid}/#{hint}")['value'] rescue nil
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Kontena::Cli::Stacks
|
2
|
+
module YAML
|
3
|
+
class Opto::Setters::Vault < ::Opto::Setter
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
def set(value)
|
6
|
+
if current_master && current_grid
|
7
|
+
client.put("secrets/#{current_grid}/#{hint}", {name: hint, value: value, upsert: true})
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Kontena::Cli::Stacks
|
2
|
+
module YAML
|
3
|
+
module Opto
|
4
|
+
module Resolvers; end
|
5
|
+
module Setters; end
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
require 'opto'
|
10
|
+
require_relative 'opto/vault_setter'
|
11
|
+
require_relative 'opto/vault_resolver'
|
12
|
+
require_relative 'opto/prompt_resolver'
|
13
|
+
require_relative 'opto/service_instances_resolver'
|
14
|
+
require_relative 'opto/vault_cert_prompt_resolver'
|
15
|
+
require_relative 'opto/certificates_resolver'
|
16
|
+
require_relative 'opto/service_link_resolver'
|