Class: Kontena::PluginManager
- Inherits:
-
Object
- Object
- Kontena::PluginManager
- Includes:
- Singleton
- Defined in:
- lib/kontena/plugin_manager.rb
Constant Summary collapse
- CLI_GEM =
'kontena-cli'.freeze
- MIN_CLI_VERSION =
'0.15.99'.freeze
Instance Method Summary collapse
-
#cleanup_plugin(plugin_name) ⇒ Object
Runs gem cleanup, removes remains from previous versions.
-
#gem_versions(plugin_name) ⇒ Object
Retrieve plugin versions from rubygems.
-
#init ⇒ Object
Initialize plugin manager.
-
#install_dir ⇒ String
Gem installation directory.
-
#install_plugin(plugin_name, pre: false, version: nil) ⇒ Object
Install a plugin.
-
#installed(plugin_name) ⇒ Object
Find a plugin by name from installed plugins.
-
#latest_version(plugin_name, pre: false) ⇒ Object
Get the latest version number from rubygems.
- #plugins ⇒ Array<Gem::Specification>
-
#search_plugins(pattern = nil) ⇒ Object
Search rubygems for kontena plugins.
-
#uninstall_plugin(plugin_name) ⇒ Object
Uninstall a plugin.
-
#upgrade_plugin(plugin_name, pre: false) ⇒ Object
Upgrade an installed plugin.
Instance Method Details
#cleanup_plugin(plugin_name) ⇒ Object
Runs gem cleanup, removes remains from previous versions
122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/kontena/plugin_manager.rb', line 122 def cleanup_plugin(plugin_name) require 'rubygems/commands/cleanup_command' cmd = Gem::Commands::CleanupCommand.new = [] += ['-q', '--no-verbose'] unless ENV["DEBUG"] cmd. without_safe { cmd.execute } rescue Gem::SystemExitException => e return true if e.exit_code == 0 raise end |
#gem_versions(plugin_name) ⇒ Object
Retrieve plugin versions from rubygems
73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/kontena/plugin_manager.rb', line 73 def gem_versions(plugin_name) client = Excon.new('https://rubygems.org') response = client.get( path: "/api/v1/versions/#{prefix(plugin_name)}.json", headers: { 'Content-Type' => 'application/json', 'Accept' => 'application/json' } ) versions = JSON.parse(response.body) versions.map { |version| Gem::Version.new(version["number"]) }.sort.reverse end |
#init ⇒ Object
Initialize plugin manager
12 13 14 15 16 17 18 |
# File 'lib/kontena/plugin_manager.rb', line 12 def init ENV["GEM_HOME"] = install_dir Gem.paths = ENV plugins use_dummy_ui unless ENV["DEBUG"] true end |
#install_dir ⇒ String
Gem installation directory
136 137 138 139 140 141 142 143 144 |
# File 'lib/kontena/plugin_manager.rb', line 136 def install_dir return @install_dir if @install_dir install_dir = File.join(Dir.home, '.kontena', 'gems', RUBY_VERSION) unless File.directory?(install_dir) require 'fileutils' FileUtils.mkdir_p(install_dir, mode: 0700) end @install_dir = install_dir end |
#install_plugin(plugin_name, pre: false, version: nil) ⇒ Object
Install a plugin
24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/kontena/plugin_manager.rb', line 24 def install_plugin(plugin_name, pre: false, version: nil) require 'rubygems/dependency_installer' require 'rubygems/requirement' cmd = Gem::DependencyInstaller.new( document: false, force: true, prerelease: pre, minimal_deps: true ) plugin_version = version.nil? ? Gem::Requirement.default : Gem::Requirement.new(version) without_safe { cmd.install(prefix(plugin_name), plugin_version) } cmd.installed_gems end |
#installed(plugin_name) ⇒ Object
Find a plugin by name from installed plugins
96 97 98 99 |
# File 'lib/kontena/plugin_manager.rb', line 96 def installed(plugin_name) search = prefix(plugin_name) plugins.find {|plugin| plugin.name == search } end |
#latest_version(plugin_name, pre: false) ⇒ Object
Get the latest version number from rubygems
89 90 91 92 |
# File 'lib/kontena/plugin_manager.rb', line 89 def latest_version(plugin_name, pre: false) return gem_versions(plugin_name).first if pre gem_versions(plugin_name).find { |version| !version.prerelease? } end |
#plugins ⇒ Array<Gem::Specification>
148 149 150 |
# File 'lib/kontena/plugin_manager.rb', line 148 def plugins @plugins ||= load_plugins end |
#search_plugins(pattern = nil) ⇒ Object
Search rubygems for kontena plugins
58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/kontena/plugin_manager.rb', line 58 def search_plugins(pattern = nil) client = Excon.new('https://rubygems.org') response = client.get( path: "/api/v1/search.json?query=#{prefix(pattern)}", headers: { 'Content-Type' => 'application/json', 'Accept' => 'application/json' } ) JSON.parse(response.body) rescue nil end |
#uninstall_plugin(plugin_name) ⇒ Object
Uninstall a plugin
41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/kontena/plugin_manager.rb', line 41 def uninstall_plugin(plugin_name) installed = installed(plugin_name) raise "Plugin #{plugin_name} not installed" unless installed require 'rubygems/uninstaller' cmd = Gem::Uninstaller.new( installed.name, all: true, executables: true, force: true, install_dir: installed.base_dir ) cmd.uninstall end |
#upgrade_plugin(plugin_name, pre: false) ⇒ Object
Upgrade an installed plugin
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/kontena/plugin_manager.rb', line 104 def upgrade_plugin(plugin_name, pre: false) installed = installed(plugin_name) if installed.version.prerelease? pre = true end if installed latest = latest_version(plugin_name, pre: pre) if latest > installed.version install_plugin(plugin_name, version: latest.to_s) end else raise "Plugin #{plugin_name} not installed" end end |