Class: Kontena::PluginManager

Inherits:
Object
  • Object
show all
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

Instance Method Details

#cleanup_plugin(plugin_name) ⇒ Object

Runs gem cleanup, removes remains from previous versions

Parameters:



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
  options = []
  options += ['-q', '--no-verbose'] unless ENV["DEBUG"]
  cmd.handle_options options
  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

Parameters:



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

Returns:



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

Parameters:

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

    install a prerelease version if available

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

    install a specific version



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

Parameters:



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

Parameters:

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

    include prerelease versions



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>

Returns:

  • (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

Parameters:

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

    optional search pattern



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

Parameters:



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

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.



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