require "sinatra" module Provider module ProviderFactory @@providers = {} @@providers_with_accounts_factories = {} def self.providers @@providers.keys end def self.get provider, account=nil p = if account.nil? @@providers[provider] else @@providers_with_accounts_factories[provider].connection(account) end # TODO: new exception raise ::Sinatra::NotFound.new("Provider #{provider} not found") if p.nil? p end def self.all @@providers.values end def self.init conf # require providers here to get access to debug properties require_all ["ec2", "openstack", "static"].each do |p| begin o = Provider.const_get(p.capitalize).new(conf) #if o.configured? @@providers[p] = o puts "Provider '#{p}' has been loaded" #end factory = Provider.const_get(p.capitalize + "AccountsFactory").new factory.init(conf) @@providers_with_accounts_factories[p] = factory rescue => e puts "Error while loading provider '#{p}': " + e.message next end end end def self.add_account provider, account factory = @@providers_with_accounts_factories[provider] factory.create_connection_from_account(DevopsConfig.config, account) DevopsLogger.logger.info("Added #{provider} account '#{account.account_name}'") end def self.require_all ["ec2", "openstack", "static"].each do |provider| begin require_relative provider require_relative provider + "_accounts_factory" rescue LoadError => e puts "Can not load provider '#{provider}': " + e.message end end end def self.get_account_class provider case(provider) when ::Provider::Static::PROVIDER ::Devops::Model::StaticProviderAccount when ::Provider::Ec2::PROVIDER ::Devops::Model::Ec2ProviderAccount when ::Provider::Openstack::PROVIDER ::Devops::Model::OpenstackProviderAccount else nil end end end end