215 lines
5.9 KiB
Ruby
215 lines
5.9 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
|
|
|
|
def initialize
|
|
@logger = Log4r::Logger.new("vagrant::plugin::v2::manager")
|
|
@registered = []
|
|
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 [Registry<Symbol, Array<Proc, Hash>>]
|
|
def commands
|
|
Registry.new.tap do |result|
|
|
@registered.each do |plugin|
|
|
result.merge!(plugin.components.commands)
|
|
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 the registered guests.
|
|
#
|
|
# @return [Hash]
|
|
def hosts
|
|
Registry.new.tap do |result|
|
|
@registered.each do |plugin|
|
|
result.merge!(plugin.components.hosts)
|
|
end
|
|
end
|
|
end
|
|
|
|
# This returns all the registered host capabilities.
|
|
#
|
|
# @return [Hash]
|
|
def host_capabilities
|
|
results = Hash.new { |h, k| h[k] = Registry.new }
|
|
|
|
@registered.each do |plugin|
|
|
plugin.components.host_capabilities.each do |host, caps|
|
|
results[host].merge!(caps)
|
|
end
|
|
end
|
|
|
|
results
|
|
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 registered provider capabilities.
|
|
#
|
|
# @return [Hash]
|
|
def provider_capabilities
|
|
results = Hash.new { |h, k| h[k] = Registry.new }
|
|
|
|
@registered.each do |plugin|
|
|
plugin.components.provider_capabilities.each do |provider, caps|
|
|
results[provider].merge!(caps)
|
|
end
|
|
end
|
|
|
|
results
|
|
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 clears out all the registered plugins. This is only used by
|
|
# unit tests and should not be called directly.
|
|
def reset!
|
|
@registered.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
|