Class: Kontena::PluginManager

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/kontena/plugin_manager.rb,
lib/kontena/plugin_manager/rubygems_client.rb

Defined Under Namespace

Classes: RubygemsClient

Constant Summary collapse

CLI_GEM =
'kontena-cli'.freeze
MIN_CLI_VERSION =
'0.15.99'.freeze

Instance Method Summary collapse

Instance Method Details

#cleanup_plugin(plugin_name) ⇒ Object

Runs gem cleanup, removes remains from previous versions

Parameters:



108
109
110
111
112
113
114
115
116
117
# File 'lib/kontena/plugin_manager.rb', line 108

def cleanup_plugin(plugin_name)
  cmd = Gem::Commands::CleanupCommand.new
  options = []
  options += ['-q', '--no-verbose'] unless ENV["DEBUG"]
  cmd.handle_options options
  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

Parameters:



68
69
70
# File 'lib/kontena/plugin_manager.rb', line 68

def gem_versions(plugin_name)
  RubygemsClient.new.versions(prefix(plugin_name))
end

#init ⇒ Object

Initialize plugin manager



20
21
22
23
24
25
26
# File 'lib/kontena/plugin_manager.rb', line 20

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

Returns:



121
122
123
124
125
126
127
128
129
# File 'lib/kontena/plugin_manager.rb', line 121

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

Parameters:

  • plugin_name (String)
  • pre (Boolean) (defaults to: false) —

    install a prerelease version if available

  • version (String) (defaults to: nil) —

    install a specific version



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/kontena/plugin_manager.rb', line 32

def install_plugin(plugin_name, pre: false, version: nil)
  cmd = Gem::DependencyInstaller.new(
    document: false,
    force: true,
    prerelease: pre,
    minimal_deps: true
  )
  plugin_version = version.nil? ? Gem::Requirement.default : Gem::Requirement.new(version)
  cmd.install(prefix(plugin_name), plugin_version)
  cmd.installed_gems
end

#installed(plugin_name) ⇒ Object

Find a plugin by name from installed plugins

Parameters:



82
83
84
85
# File 'lib/kontena/plugin_manager.rb', line 82

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

Parameters:

  • plugin_name (String)
  • pre (Boolean) (defaults to: false) —

    include prerelease versions



75
76
77
78
# File 'lib/kontena/plugin_manager.rb', line 75

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>

Returns:

  • (Array<Gem::Specification>)


133
134
135
# File 'lib/kontena/plugin_manager.rb', line 133

def plugins
  @plugins ||= load_plugins
end

#search_plugins(pattern = nil) ⇒ Object

Search rubygems for kontena plugins

Parameters:

  • pattern (String) (defaults to: nil) —

    optional search pattern



62
63
64
# File 'lib/kontena/plugin_manager.rb', line 62

def search_plugins(pattern = nil)
  RubygemsClient.new.search(prefix(pattern))
end

#uninstall_plugin(plugin_name) ⇒ Object

Uninstall a plugin

Parameters:



46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/kontena/plugin_manager.rb', line 46

def uninstall_plugin(plugin_name)
  installed = installed(plugin_name)
  raise "Plugin #{plugin_name} not installed" unless installed

  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

Parameters:

  • plugin_name (String)
  • pre (Boolean) (defaults to: false) —

    upgrade to a prerelease version if available. Will happen always when the installed version is a prerelease version.



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/kontena/plugin_manager.rb', line 90

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