kontena-cli 1.4.0.pre6 → 1.4.0.pre7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/VERSION +1 -1
- data/bin/kontena +1 -1
- data/kontena-cli.gemspec +3 -3
- data/lib/kontena/cli/certificate/authorize_command.rb +67 -6
- data/lib/kontena/cli/certificate/get_command.rb +7 -0
- data/lib/kontena/cli/certificate/list_command.rb +75 -0
- data/lib/kontena/cli/certificate/register_command.rb +13 -2
- data/lib/kontena/cli/certificate/request_command.rb +20 -0
- data/lib/kontena/cli/certificate/show_command.rb +19 -0
- data/lib/kontena/cli/certificate_command.rb +4 -1
- data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
- data/lib/kontena/cli/common.rb +21 -33
- data/lib/kontena/cli/etcd/health_command.rb +21 -27
- data/lib/kontena/cli/helpers/exec_helper.rb +15 -6
- data/lib/kontena/cli/helpers/health_helper.rb +12 -0
- data/lib/kontena/cli/helpers/log_helper.rb +2 -2
- data/lib/kontena/cli/helpers/time_helper.rb +29 -0
- data/lib/kontena/cli/master/init_cloud_command.rb +19 -0
- data/lib/kontena/cli/master/list_command.rb +1 -1
- data/lib/kontena/cli/master/ssh_command.rb +3 -1
- data/lib/kontena/cli/master/use_command.rb +1 -2
- data/lib/kontena/cli/node_command.rb +1 -0
- data/lib/kontena/cli/nodes/health_command.rb +28 -13
- data/lib/kontena/cli/nodes/list_command.rb +19 -3
- data/lib/kontena/cli/nodes/show_command.rb +4 -2
- data/lib/kontena/cli/nodes/ssh_command.rb +5 -2
- data/lib/kontena/cli/nodes/update_command.rb +2 -0
- data/lib/kontena/cli/plugins/install_command.rb +11 -8
- data/lib/kontena/cli/plugins/list_command.rb +5 -3
- data/lib/kontena/cli/plugins/search_command.rb +4 -2
- data/lib/kontena/cli/plugins/show_command.rb +17 -0
- data/lib/kontena/cli/plugins/uninstall_command.rb +9 -13
- data/lib/kontena/cli/registry/create_command.rb +1 -1
- data/lib/kontena/cli/services/create_command.rb +6 -0
- data/lib/kontena/cli/services/services_helper.rb +33 -6
- data/lib/kontena/cli/services/update_command.rb +6 -0
- data/lib/kontena/cli/stacks/build_command.rb +3 -3
- data/lib/kontena/cli/stacks/common.rb +105 -90
- data/lib/kontena/cli/stacks/deploy_command.rb +7 -3
- data/lib/kontena/cli/stacks/install_command.rb +39 -6
- data/lib/kontena/cli/stacks/list_command.rb +36 -4
- data/lib/kontena/cli/stacks/logs_command.rb +9 -2
- data/lib/kontena/cli/stacks/registry/pull_command.rb +2 -2
- data/lib/kontena/cli/stacks/registry/push_command.rb +20 -9
- data/lib/kontena/cli/stacks/registry/remove_command.rb +4 -4
- data/lib/kontena/cli/stacks/registry/show_command.rb +4 -4
- data/lib/kontena/cli/stacks/remove_command.rb +27 -1
- data/lib/kontena/cli/stacks/service_generator.rb +12 -2
- data/lib/kontena/cli/stacks/show_command.rb +35 -5
- data/lib/kontena/cli/stacks/stack_name.rb +71 -0
- data/lib/kontena/cli/stacks/upgrade_command.rb +127 -14
- data/lib/kontena/cli/stacks/validate_command.rb +38 -10
- data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
- data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -2
- data/lib/kontena/cli/stacks/yaml/reader.rb +211 -185
- data/lib/kontena/cli/stacks/yaml/service_extender.rb +6 -12
- data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +97 -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/validations.rb +16 -0
- data/lib/kontena/cli/stacks/yaml/validator_v3.rb +25 -8
- data/lib/kontena/client.rb +2 -2
- data/lib/kontena/command.rb +11 -0
- data/lib/kontena/main_command.rb +3 -1
- data/lib/kontena/plugin_manager.rb +11 -198
- data/lib/kontena/plugin_manager/cleaner.rb +33 -0
- data/lib/kontena/plugin_manager/common.rb +86 -0
- data/lib/kontena/plugin_manager/installer.rb +54 -0
- data/lib/kontena/plugin_manager/loader.rb +93 -0
- data/lib/kontena/plugin_manager/rubygems_client.rb +42 -23
- data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
- data/lib/kontena/util.rb +24 -0
- data/lib/kontena_cli.rb +1 -0
- data/omnibus/config/projects/kontena.rb +7 -1
- data/omnibus/config/software/{kontena.rb → kontena-cli.rb} +2 -0
- data/spec/fixtures/api/node.json +2 -1
- data/spec/fixtures/stack-internal-extend.yml +6 -1
- data/spec/fixtures/stack-with-dependencies-dep-1-1.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-1.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep-2.yml +8 -0
- data/spec/fixtures/stack-with-dependencies-dep-3.yml +5 -0
- data/spec/fixtures/stack-with-dependencies-dep_2-removed.yml +17 -0
- data/spec/fixtures/stack-with-dependencies-dep_3-added.yml +25 -0
- data/spec/fixtures/stack-with-dependencies.yml +22 -0
- data/spec/fixtures/stack-with-variables.yml +3 -0
- data/spec/kontena/cli/etcd/health_command_spec.rb +45 -33
- data/spec/kontena/cli/helpers/exec_helper_spec.rb +2 -1
- data/spec/kontena/cli/master/init_cloud_command_spec.rb +14 -0
- data/spec/kontena/cli/nodes/health_command_spec.rb +74 -10
- data/spec/kontena/cli/nodes/list_command_spec.rb +381 -232
- data/spec/kontena/cli/nodes/show_command_spec.rb +31 -0
- data/spec/kontena/cli/nodes/ssh_command_spec.rb +18 -3
- data/spec/kontena/cli/plugins/install_command_spec.rb +1 -1
- data/spec/kontena/cli/stacks/build_command_spec.rb +6 -12
- data/spec/kontena/cli/stacks/common_spec.rb +42 -69
- data/spec/kontena/cli/stacks/install_command_spec.rb +57 -31
- data/spec/kontena/cli/stacks/list_command_spec.rb +44 -0
- data/spec/kontena/cli/stacks/logs_command_spec.rb +12 -1
- data/spec/kontena/cli/stacks/remove_command_spec.rb +39 -0
- data/spec/kontena/cli/stacks/show_command_spec.rb +16 -0
- data/spec/kontena/cli/stacks/stack_name_spec.rb +21 -0
- data/spec/kontena/cli/stacks/upgrade_command_spec.rb +73 -56
- data/spec/kontena/cli/stacks/validate_command_spec.rb +81 -0
- data/spec/kontena/cli/stacks/yaml/custom_validators/affinities_validator_spec.rb +22 -0
- data/spec/kontena/cli/stacks/yaml/reader_spec.rb +173 -169
- data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +12 -3
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/file_loader_spec.rb +47 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/registry_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader/uri_loader_spec.rb +53 -0
- data/spec/kontena/cli/stacks/yaml/stack_file_loader_spec.rb +104 -0
- data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +19 -0
- data/spec/kontena/plugin_manager/cleaner_spec.rb +20 -0
- data/spec/kontena/plugin_manager/common_spec.rb +39 -0
- data/spec/kontena/plugin_manager/installer_spec.rb +50 -0
- data/spec/kontena/plugin_manager/loader_spec.rb +5 -0
- data/spec/kontena/plugin_manager/rubygems_client_spec.rb +11 -25
- data/spec/kontena/plugin_manager/uninstaller_spec.rb +19 -0
- data/spec/kontena/plugin_manager_spec.rb +7 -7
- metadata +64 -97
- data/lib/kontena/cli/app_command.rb +0 -22
- data/lib/kontena/cli/apps/build_command.rb +0 -28
- data/lib/kontena/cli/apps/common.rb +0 -172
- data/lib/kontena/cli/apps/config_command.rb +0 -25
- data/lib/kontena/cli/apps/deploy_command.rb +0 -137
- data/lib/kontena/cli/apps/docker_compose_generator.rb +0 -61
- data/lib/kontena/cli/apps/docker_helper.rb +0 -80
- data/lib/kontena/cli/apps/dockerfile_generator.rb +0 -16
- data/lib/kontena/cli/apps/init_command.rb +0 -89
- data/lib/kontena/cli/apps/kontena_yml_generator.rb +0 -105
- data/lib/kontena/cli/apps/list_command.rb +0 -59
- data/lib/kontena/cli/apps/logs_command.rb +0 -37
- data/lib/kontena/cli/apps/monitor_command.rb +0 -93
- data/lib/kontena/cli/apps/remove_command.rb +0 -74
- data/lib/kontena/cli/apps/restart_command.rb +0 -39
- data/lib/kontena/cli/apps/scale_command.rb +0 -33
- data/lib/kontena/cli/apps/service_generator.rb +0 -114
- data/lib/kontena/cli/apps/service_generator_v2.rb +0 -27
- data/lib/kontena/cli/apps/show_command.rb +0 -23
- data/lib/kontena/cli/apps/start_command.rb +0 -40
- data/lib/kontena/cli/apps/stop_command.rb +0 -40
- data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +0 -19
- data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +0 -20
- data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +0 -54
- data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +0 -22
- data/lib/kontena/cli/apps/yaml/reader.rb +0 -213
- data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -77
- data/lib/kontena/cli/apps/yaml/validations.rb +0 -71
- data/lib/kontena/cli/apps/yaml/validator.rb +0 -38
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +0 -53
- data/spec/fixtures/app.json +0 -42
- data/spec/fixtures/health.yml +0 -26
- data/spec/fixtures/kontena-build.yml +0 -16
- data/spec/fixtures/kontena-internal-extend.yml +0 -8
- data/spec/fixtures/kontena-invalid.yml +0 -4
- data/spec/fixtures/kontena-with-env-file.yml +0 -18
- data/spec/fixtures/kontena-with-variables.yml +0 -19
- data/spec/fixtures/kontena.yml +0 -17
- data/spec/fixtures/kontena_build_v2.yml +0 -26
- data/spec/fixtures/kontena_numeric_version.yml +0 -9
- data/spec/fixtures/kontena_v2.yml +0 -35
- data/spec/fixtures/mysql.yml +0 -3
- data/spec/fixtures/wordpress-scaled.yml +0 -3
- data/spec/fixtures/wordpress.yml +0 -2
- data/spec/kontena/cli/app/build_command_spec.rb +0 -55
- data/spec/kontena/cli/app/common_spec.rb +0 -110
- data/spec/kontena/cli/app/config_command_spec.rb +0 -78
- data/spec/kontena/cli/app/deploy_command_spec.rb +0 -217
- data/spec/kontena/cli/app/docker_helper_spec.rb +0 -155
- data/spec/kontena/cli/app/init_command_spec.rb +0 -109
- data/spec/kontena/cli/app/logs_command_spec.rb +0 -131
- data/spec/kontena/cli/app/scale_spec.rb +0 -51
- data/spec/kontena/cli/app/service_generator_spec.rb +0 -384
- data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -73
- data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -457
- data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -127
- data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -380
- data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +0 -301
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require 'kontena/plugin_manager/common'
|
|
2
|
+
require 'rubygems/commands/cleanup_command'
|
|
3
|
+
|
|
4
|
+
module Kontena
|
|
5
|
+
module PluginManager
|
|
6
|
+
class Cleaner
|
|
7
|
+
include Common
|
|
8
|
+
|
|
9
|
+
attr_reader :plugin_name
|
|
10
|
+
|
|
11
|
+
def initialize(plugin_name)
|
|
12
|
+
@plugin_name = plugin_name
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def command
|
|
16
|
+
@command ||= Gem::Commands::CleanupCommand.new
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Runs gem cleanup, removes remains from previous versions
|
|
20
|
+
# @param plugin_name [String]
|
|
21
|
+
def cleanup
|
|
22
|
+
options = []
|
|
23
|
+
options += ['-q', '--no-verbose'] unless ENV["DEBUG"]
|
|
24
|
+
command.handle_options options
|
|
25
|
+
command.execute
|
|
26
|
+
true
|
|
27
|
+
rescue Gem::SystemExitException => e
|
|
28
|
+
raise unless e.exit_code.zero?
|
|
29
|
+
true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'kontena/plugin_manager'
|
|
2
|
+
|
|
3
|
+
module Kontena
|
|
4
|
+
module PluginManager
|
|
5
|
+
module Common
|
|
6
|
+
Gem.autoload :DefaultUserInteraction, 'rubygems/user_interaction'
|
|
7
|
+
Gem.autoload :StreamUI, 'rubygems/user_interaction'
|
|
8
|
+
|
|
9
|
+
# @return [Boolean] is the CLI in plugin debugging mode?
|
|
10
|
+
def plugin_debug?
|
|
11
|
+
@plugin_debug ||= ENV['DEBUG'] == 'plugin'
|
|
12
|
+
end
|
|
13
|
+
module_function :plugin_debug?
|
|
14
|
+
|
|
15
|
+
# @return [Gem::StreamUI] a rubygems user interaction module with minimal output
|
|
16
|
+
def dummy_ui
|
|
17
|
+
Gem::StreamUI.new(StringIO.new, StringIO.new, StringIO.new, false)
|
|
18
|
+
end
|
|
19
|
+
module_function :dummy_ui
|
|
20
|
+
|
|
21
|
+
# Tell rubygems to use the dummy ui as default user interaction
|
|
22
|
+
def use_dummy_ui
|
|
23
|
+
Gem::DefaultUserInteraction.ui = dummy_ui
|
|
24
|
+
end
|
|
25
|
+
module_function :use_dummy_ui
|
|
26
|
+
|
|
27
|
+
# Prefix a plugin name into a gem name (hello to kontena-plugin-hello)
|
|
28
|
+
def prefix(plugin_name)
|
|
29
|
+
return plugin_name if plugin_name.to_s.start_with?('kontena-plugin-')
|
|
30
|
+
"kontena-plugin-#{plugin_name}"
|
|
31
|
+
end
|
|
32
|
+
module_function :prefix
|
|
33
|
+
|
|
34
|
+
# Find a plugin by name from installed plugins
|
|
35
|
+
# @param plugin_name [String]
|
|
36
|
+
def installed(plugin_name)
|
|
37
|
+
search = prefix(plugin_name)
|
|
38
|
+
plugins.find {|plugin| plugin.name == search }
|
|
39
|
+
end
|
|
40
|
+
module_function :installed
|
|
41
|
+
|
|
42
|
+
def installed?(plugin_name)
|
|
43
|
+
!installed(plugin_name).nil?
|
|
44
|
+
end
|
|
45
|
+
module_function :installed?
|
|
46
|
+
|
|
47
|
+
# Gem installation directory
|
|
48
|
+
# @return [String]
|
|
49
|
+
def install_dir
|
|
50
|
+
return @install_dir if @install_dir
|
|
51
|
+
install_dir = File.join(Dir.home, '.kontena', 'gems', RUBY_VERSION)
|
|
52
|
+
unless File.directory?(install_dir)
|
|
53
|
+
require 'fileutils'
|
|
54
|
+
FileUtils.mkdir_p(install_dir, mode: 0700)
|
|
55
|
+
end
|
|
56
|
+
@install_dir = install_dir
|
|
57
|
+
end
|
|
58
|
+
module_function :install_dir
|
|
59
|
+
|
|
60
|
+
# @return [Kontena::PluginManager::RubygemsClient]
|
|
61
|
+
def rubygems_client
|
|
62
|
+
@rubygems_client ||= Kontena::PluginManager::RubygemsClient.new
|
|
63
|
+
end
|
|
64
|
+
module_function :rubygems_client
|
|
65
|
+
|
|
66
|
+
# Search rubygems for kontena plugins
|
|
67
|
+
# @param pattern [String] optional search pattern
|
|
68
|
+
def search_plugins(pattern = nil)
|
|
69
|
+
rubygems_client.search(prefix(pattern))
|
|
70
|
+
end
|
|
71
|
+
module_function :search_plugins
|
|
72
|
+
|
|
73
|
+
# Retrieve plugin versions from rubygems
|
|
74
|
+
# @param plugin_name [String]
|
|
75
|
+
def gem_versions(plugin_name)
|
|
76
|
+
rubygems_client.versions(prefix(plugin_name))
|
|
77
|
+
end
|
|
78
|
+
module_function :gem_versions
|
|
79
|
+
|
|
80
|
+
def plugins
|
|
81
|
+
Kontena::PluginManager.plugins
|
|
82
|
+
end
|
|
83
|
+
module_function :plugins
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'kontena/plugin_manager/common'
|
|
2
|
+
require 'rubygems/dependency_installer'
|
|
3
|
+
require 'rubygems/requirement'
|
|
4
|
+
|
|
5
|
+
module Kontena
|
|
6
|
+
module PluginManager
|
|
7
|
+
class Installer
|
|
8
|
+
include Common
|
|
9
|
+
|
|
10
|
+
attr_reader :plugin_name, :pre, :version
|
|
11
|
+
|
|
12
|
+
# Create a new instance of plugin installer
|
|
13
|
+
# @param plugin_name [String]
|
|
14
|
+
# @param pre [Boolean] install a prerelease version if available
|
|
15
|
+
# @param version [String] install a specific version
|
|
16
|
+
def initialize(plugin_name, pre: false, version: nil)
|
|
17
|
+
@plugin_name = plugin_name
|
|
18
|
+
@pre = pre
|
|
19
|
+
@version = version
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def command
|
|
23
|
+
@command ||= Gem::DependencyInstaller.new(
|
|
24
|
+
document: false,
|
|
25
|
+
force: true,
|
|
26
|
+
prerelease: pre,
|
|
27
|
+
minimal_deps: true
|
|
28
|
+
)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Install a plugin
|
|
32
|
+
def install
|
|
33
|
+
plugin_version = version.nil? ? Gem::Requirement.default : Gem::Requirement.new(version)
|
|
34
|
+
command.install(prefix(plugin_name), plugin_version)
|
|
35
|
+
command.installed_gems
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Upgrade an installed plugin
|
|
39
|
+
# @param plugin_name [String]
|
|
40
|
+
# @param pre [Boolean] upgrade to a prerelease version if available. Will happen always when the installed version is a prerelease version.
|
|
41
|
+
def upgrade
|
|
42
|
+
return install if version
|
|
43
|
+
installed = installed(plugin_name)
|
|
44
|
+
pre = installed.version.prerelease?
|
|
45
|
+
|
|
46
|
+
raise "Plugin #{plugin_name} not installed" unless installed
|
|
47
|
+
latest = rubygems_client.latest_version(prefix(plugin_name), pre: pre)
|
|
48
|
+
if latest > installed.version
|
|
49
|
+
Installer.new(plugin_name, version: latest.to_s).install
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
require 'kontena_cli'
|
|
2
|
+
require 'kontena/plugin_manager/common'
|
|
3
|
+
|
|
4
|
+
module Kontena
|
|
5
|
+
module PluginManager
|
|
6
|
+
class Loader
|
|
7
|
+
include Common
|
|
8
|
+
|
|
9
|
+
CLI_GEM = 'kontena-cli'.freeze
|
|
10
|
+
MIN_CLI_VERSION = '0.15.99'.freeze
|
|
11
|
+
|
|
12
|
+
def loaded_plugins
|
|
13
|
+
@loaded_plugins ||= []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def load_plugins
|
|
17
|
+
Gem::Specification.to_a.each do |spec|
|
|
18
|
+
plugin_path = plugin_require_path(spec)
|
|
19
|
+
next unless plugin_path
|
|
20
|
+
next if loaded_plugins.find { |p| p.name == spec.name }
|
|
21
|
+
load_plugin(plugin_path, spec)
|
|
22
|
+
end
|
|
23
|
+
loaded_plugins
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def load_plugin(path, spec)
|
|
29
|
+
unless spec_has_valid_dependency?(spec)
|
|
30
|
+
plugin_name = spec.name.sub('kontena-plugin-', '')
|
|
31
|
+
$stderr.puts " [#{Kontena.pastel.red('error')}] Plugin #{Kontena.pastel.cyan(plugin_name)} (#{spec.version}) is not compatible with the current cli version."
|
|
32
|
+
$stderr.puts " To update the plugin, run 'kontena plugin install #{plugin_name}'"
|
|
33
|
+
return false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
start_tracking
|
|
37
|
+
activate(spec)
|
|
38
|
+
|
|
39
|
+
Kontena.logger.debug { "Loading plugin #{spec.name} from #{path}" }
|
|
40
|
+
require(path)
|
|
41
|
+
Kontena.logger.debug { "Loaded plugin #{spec.name}" } if plugin_debug?
|
|
42
|
+
|
|
43
|
+
report_tracking
|
|
44
|
+
true
|
|
45
|
+
rescue ScriptError, LoadError, StandardError => ex
|
|
46
|
+
warn " [#{Kontena.pastel.red('error')}] Failed to load plugin: #{spec.name} from #{spec.gem_dir}\n\tRerun the command with environment DEBUG=true set to get the full exception."
|
|
47
|
+
Kontena.logger.error(ex)
|
|
48
|
+
spec.description = spec.description + Kontena.pastel.red(" (broken)")
|
|
49
|
+
false
|
|
50
|
+
ensure
|
|
51
|
+
loaded_plugins << spec
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def activate(spec)
|
|
55
|
+
Kontena.logger.debug { "Activating plugin #{spec.name}" } if plugin_debug?
|
|
56
|
+
spec.activate
|
|
57
|
+
spec.activate_dependencies
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @param [Gem::Specification] spec
|
|
61
|
+
# @return [Boolean]
|
|
62
|
+
def spec_has_valid_dependency?(spec)
|
|
63
|
+
kontena_cli = spec.runtime_dependencies.find{ |d| d.name == CLI_GEM }
|
|
64
|
+
!kontena_cli.match?(CLI_GEM, MIN_CLI_VERSION)
|
|
65
|
+
rescue
|
|
66
|
+
false
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def plugin_require_path(spec)
|
|
70
|
+
paths = spec.require_paths.to_a.map do |require_path|
|
|
71
|
+
File.join(spec.gem_dir, require_path, 'kontena_cli_plugin.rb')
|
|
72
|
+
end
|
|
73
|
+
paths.find { |path| File.exist?(path) }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def start_tracking
|
|
77
|
+
return unless plugin_debug?
|
|
78
|
+
@loaded_features_before = $LOADED_FEATURES.dup
|
|
79
|
+
@load_path_before = $LOAD_PATH.dup
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def report_tracking
|
|
83
|
+
return unless plugin_debug?
|
|
84
|
+
added_features = ($LOADED_FEATURES - @loaded_features_before).map {|feat| "- #{feat}"}
|
|
85
|
+
added_paths = ($LOAD_PATH - @load_path_before).map {|feat| "- #{feat}"}
|
|
86
|
+
Kontena.logger.debug { "Plugin manager loaded features for #{spec.name}:" } unless added_features.empty?
|
|
87
|
+
added_features.each { |feat| Kontena.logger.debug { feat } }
|
|
88
|
+
Kontena.logger.debug { "Plugin manager load paths added for #{spec.name}:" } unless added_paths.empty?
|
|
89
|
+
added_paths.each { |path| Kontena.logger.debug { path } }
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
@@ -1,40 +1,59 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'kontena_cli'
|
|
2
2
|
require 'json'
|
|
3
|
+
require 'uri'
|
|
4
|
+
require 'net/https'
|
|
3
5
|
|
|
4
6
|
module Kontena
|
|
5
|
-
|
|
7
|
+
module PluginManager
|
|
6
8
|
class RubygemsClient
|
|
7
9
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
'Accept' => 'application/json'
|
|
12
|
-
}
|
|
10
|
+
JSON_MIME ='application/json'.freeze
|
|
11
|
+
ACCEPT = 'Accept'.freeze
|
|
12
|
+
HTTPOK = "200".freeze
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
def search(pattern = nil)
|
|
15
|
+
get('/api/v1/search.json', query: pattern)
|
|
16
|
+
end
|
|
15
17
|
|
|
16
|
-
def
|
|
17
|
-
|
|
18
|
+
def versions(gem_name)
|
|
19
|
+
response = get("/api/v1/versions/#{gem_name}.json")
|
|
20
|
+
response.map { |version| Gem::Version.new(version["number"]) }.sort.reverse
|
|
18
21
|
end
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
)
|
|
23
|
+
# Get the latest version number from rubygems
|
|
24
|
+
# @param plugin_name [String]
|
|
25
|
+
# @param pre [Boolean] include prerelease versions
|
|
26
|
+
def latest_version(gem_name, pre: false)
|
|
27
|
+
return versions(gem_name).first if pre
|
|
28
|
+
versions(gem_name).find { |version| !version.prerelease? }
|
|
29
|
+
end
|
|
25
30
|
|
|
26
|
-
|
|
31
|
+
def client
|
|
32
|
+
return @client if @client
|
|
33
|
+
@client = Net::HTTP.new('rubygems.org', 443)
|
|
34
|
+
@client.use_ssl = true
|
|
35
|
+
@client
|
|
27
36
|
end
|
|
28
37
|
|
|
29
|
-
def
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
def request_path(path, query = nil)
|
|
39
|
+
uri = URI(path)
|
|
40
|
+
uri.query = URI.encode_www_form(query) if query
|
|
41
|
+
uri.to_s
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def get_request(path)
|
|
45
|
+
request = Net::HTTP::Get.new(path)
|
|
46
|
+
request[ACCEPT] = JSON_MIME
|
|
47
|
+
request
|
|
36
48
|
end
|
|
37
49
|
|
|
50
|
+
def get(path, query = nil)
|
|
51
|
+
Kontena.logger.debug { "Requesting GET #{path}" }
|
|
52
|
+
response = client.request(get_request(request_path(path, query)))
|
|
53
|
+
Kontena.logger.debug { "Response #{response.code}" }
|
|
54
|
+
raise "Server responded with #{response.code} (#{response.class.name})" unless response.code == HTTPOK
|
|
55
|
+
JSON.parse(response.body)
|
|
56
|
+
end
|
|
38
57
|
end
|
|
39
58
|
end
|
|
40
59
|
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
require 'rubygems/uninstaller'
|
|
2
|
+
|
|
3
|
+
module Kontena
|
|
4
|
+
module PluginManager
|
|
5
|
+
class Uninstaller
|
|
6
|
+
include PluginManager::Common
|
|
7
|
+
|
|
8
|
+
attr_reader :plugin_name
|
|
9
|
+
|
|
10
|
+
def initialize(plugin_name)
|
|
11
|
+
@plugin_name = plugin_name
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def command(spec)
|
|
15
|
+
@command ||= Gem::Uninstaller.new(
|
|
16
|
+
spec.name,
|
|
17
|
+
all: true,
|
|
18
|
+
executables: true,
|
|
19
|
+
force: true,
|
|
20
|
+
install_dir: spec.base_dir
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Uninstall a plugin
|
|
25
|
+
# @param plugin_name [String]
|
|
26
|
+
def uninstall
|
|
27
|
+
installed = installed(plugin_name)
|
|
28
|
+
raise "Plugin #{plugin_name} not installed" unless installed
|
|
29
|
+
|
|
30
|
+
command(installed).uninstall
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
data/lib/kontena/util.rb
CHANGED
|
@@ -28,6 +28,30 @@ module Kontena
|
|
|
28
28
|
end
|
|
29
29
|
module_function :symbolize_keys!
|
|
30
30
|
|
|
31
|
+
def stringify_keys(obj)
|
|
32
|
+
case obj
|
|
33
|
+
when Hash
|
|
34
|
+
obj.map { |k,v| [k.to_s, stringify_keys(v)] }.to_h
|
|
35
|
+
when Array
|
|
36
|
+
obj.map { |v| stringify_keys(v) }
|
|
37
|
+
else
|
|
38
|
+
obj
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
module_function :stringify_keys
|
|
42
|
+
|
|
43
|
+
def stringify_keys!(obj)
|
|
44
|
+
case obj
|
|
45
|
+
when Hash
|
|
46
|
+
obj.keys.each { |k| obj[k.to_s] = stringify_keys!(obj.delete(k)) }
|
|
47
|
+
when Array
|
|
48
|
+
obj.map! { |v| stringify_keys!(v) }
|
|
49
|
+
else
|
|
50
|
+
end
|
|
51
|
+
obj
|
|
52
|
+
end
|
|
53
|
+
module_function :stringify_keys!
|
|
54
|
+
|
|
31
55
|
# @param [String] cmd
|
|
32
56
|
def which(cmd)
|
|
33
57
|
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
data/lib/kontena_cli.rb
CHANGED
|
@@ -21,6 +21,7 @@ module Kontena
|
|
|
21
21
|
autoload :PluginManager, 'kontena/plugin_manager'
|
|
22
22
|
autoload :MainCommand, 'kontena/main_command'
|
|
23
23
|
autoload :Errors, 'kontena/errors'
|
|
24
|
+
autoload :Util, 'kontena/util'
|
|
24
25
|
|
|
25
26
|
# Run a kontena command like it was launched from the command line. Re-raises any exceptions,
|
|
26
27
|
# except a SystemExit with status 0, which is considered a success.
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
#
|
|
6
6
|
|
|
7
7
|
name "kontena"
|
|
8
|
+
package_name "kontena-cli"
|
|
8
9
|
friendly_name "Kontena CLI"
|
|
10
|
+
description "Command-line tool for the Kontena Platform"
|
|
9
11
|
maintainer "Kontena, Inc."
|
|
10
12
|
homepage "https://kontena.io"
|
|
11
13
|
|
|
@@ -20,7 +22,7 @@ build_iteration 1
|
|
|
20
22
|
dependency "preparation"
|
|
21
23
|
|
|
22
24
|
# kontena dependencies/components
|
|
23
|
-
dependency "kontena"
|
|
25
|
+
dependency "kontena-cli"
|
|
24
26
|
|
|
25
27
|
# Version manifest file
|
|
26
28
|
dependency "version-manifest"
|
|
@@ -32,3 +34,7 @@ package :pkg do
|
|
|
32
34
|
identifier "io.kontena.cli.pkg.kontena"
|
|
33
35
|
signing_identity "Developer ID Installer: Kontena Oy (JJ22T2W355)"
|
|
34
36
|
end
|
|
37
|
+
|
|
38
|
+
package :deb do
|
|
39
|
+
vendor "Kontena, Inc <info@kontena.io>"
|
|
40
|
+
end
|