Teemu Matilainen e5032071f6 core: Vagrant.has_plugin? tries to match gem name first
Search primary from the list of gem names which have been loaded by
`Vagrant.require_plugin`. Fall back to matching registered plugin names.
2013-12-20 17:36:10 -03:00

197 lines
5.5 KiB
Ruby

require "log4r"
module Vagrant
module Plugin
module V2
# This class maintains a list of all the registered plugins as well
# as provides methods that allow querying all registered components of
# those plugins as a single unit.
class Manager
attr_reader :registered
attr_reader :required
def initialize
@logger = Log4r::Logger.new("vagrant::plugin::v2::manager")
@registered = []
@required = []
end
# This returns all the action hooks.
#
# @return [Array]
def action_hooks(hook_name)
result = []
@registered.each do |plugin|
result += plugin.components.action_hooks[Plugin::ALL_ACTIONS]
result += plugin.components.action_hooks[hook_name]
end
result
end
# This returns all the registered commands.
#
# @return [Hash]
def commands
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.command)
end
end
end
# This returns all the registered communicators.
#
# @return [Hash]
def communicators
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.communicator)
end
end
end
# This returns all the registered configuration classes.
#
# @return [Hash]
def config
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.components.configs[:top])
end
end
end
# This returns all the registered guests.
#
# @return [Hash]
def guests
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.components.guests)
end
end
end
# This returns all the registered guest capabilities.
#
# @return [Hash]
def guest_capabilities
results = Hash.new { |h, k| h[k] = Registry.new }
@registered.each do |plugin|
plugin.components.guest_capabilities.each do |guest, caps|
results[guest].merge!(caps)
end
end
results
end
# This returns all registered host classes.
#
# @return [Hash]
def hosts
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.host)
end
end
end
# This returns all registered providers.
#
# @return [Hash]
def providers
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.components.providers)
end
end
end
# This returns all the config classes for the various providers.
#
# @return [Hash]
def provider_configs
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.components.configs[:provider])
end
end
end
# This returns all the config classes for the various provisioners.
#
# @return [Registry]
def provisioner_configs
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.components.configs[:provisioner])
end
end
end
# This returns all registered provisioners.
#
# @return [Hash]
def provisioners
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.provisioner)
end
end
end
# This returns all synced folder implementations.
#
# @return [Registry]
def synced_folders
Registry.new.tap do |result|
@registered.each do |plugin|
result.merge!(plugin.components.synced_folders)
end
end
end
# This registers a plugin. This should _NEVER_ be called by the public
# and should only be called from within Vagrant. Vagrant will
# automatically register V2 plugins when a name is set on the
# plugin.
def register(plugin)
if !@registered.include?(plugin)
@logger.info("Registered plugin: #{plugin.name}")
@registered << plugin
end
end
# This registers a required plugin. This should _NEVER_ be called by
# the public and should only be called from within Vagrant.
def plugin_required(gem_name)
if !@required.include?(gem_name)
@logger.info("Registered required plugin: #{gem_name}")
@required << gem_name
end
end
# This clears out all the registered plugins. This is only used by
# unit tests and should not be called directly.
def reset!
@registered.clear
@required.clear
end
# This unregisters a plugin so that its components will no longer
# be used. Note that this should only be used for testing purposes.
def unregister(plugin)
if @registered.include?(plugin)
@logger.info("Unregistered: #{plugin.name}")
@registered.delete(plugin)
end
end
end
end
end
end