(GH-230) Dynamically load VM Providers

Previously, a static list was used to instantiate VM Pooler Provider objects.
This commit changes the loader to instead interrogate the available clases in
the Vmpooler::PoolManager::Provider namespace and then instantiate from there.

This means class names are not case sensitive and that VM Providers can now be
dynamically loaded from other sources such as gems in the LOADPATH.  No tests
were added as this behaviour is exercised in the execute! tests already.
This commit is contained in:
Glenn Sarti 2017-07-18 13:48:03 -07:00
parent 9b0e55f959
commit b16a2e6e96

View file

@ -735,21 +735,20 @@ module Vmpooler
raise raise
end end
# create a provider object based on the providers/*.rb class that implements providers/base.rb # Create a provider object, usually based on the providers/*.rb class, that implements providers/base.rb
# provider_class: needs to match a provider class in providers/*.rb ie Vmpooler::PoolManager::Provider::X # provider_class: Needs to match a class in the Vmpooler::PoolManager::Provider namespace. This is
# provider_name: should be a unique provider name # either as a gem in the LOADPATH or in providers/*.rb ie Vmpooler::PoolManager::Provider::X
# provider_name: Should be a unique provider name
# #
# returns an object Vmpooler::PoolManager::Provider::* # returns an object Vmpooler::PoolManager::Provider::*
# or raises an error if the class does not exist # or raises an error if the class does not exist
def create_provider_object(config, logger, metrics, provider_class, provider_name, options) def create_provider_object(config, logger, metrics, provider_class, provider_name, options)
case provider_class provider_klass = Vmpooler::PoolManager::Provider
when 'vsphere' provider_klass.constants.each do |classname|
Vmpooler::PoolManager::Provider::VSphere.new(config, logger, metrics, provider_name, options) next unless classname.to_s.casecmp(provider_class) == 0
when 'dummy' return provider_klass.const_get(classname).new(config, logger, metrics, provider_name, options)
Vmpooler::PoolManager::Provider::Dummy.new(config, logger, metrics, provider_name, options)
else
raise("Provider '#{provider_class}' is unknown for pool with provider '#{provider_name}'")
end end
raise("Provider '#{provider_class}' is unknown for pool with provider name '#{provider_name}'") if provider.nil?
end end
def execute!(maxloop = 0, loop_delay = 1) def execute!(maxloop = 0, loop_delay = 1)