98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| require "sinatra"
 | |
| 
 | |
| module Provider
 | |
|   module ProviderFactory
 | |
| 
 | |
|     @@available_providers = []
 | |
|     @@providers = {}
 | |
|     @@providers_with_accounts_factories = {}
 | |
| 
 | |
|     def self.providers
 | |
|       @@available_providers
 | |
|     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.add_provider provider
 | |
|       @@available_providers << provider unless @@available_providers.include?(provider)
 | |
|     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
 | |
|             ProviderFactory.add_provider p
 | |
|             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
 | |
|       puts "Available providers: #{@@available_providers}"
 | |
|     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.delete_account provider, account
 | |
|       factory = @@providers_with_accounts_factories[provider]
 | |
|       factory.delete_connection(account.account_name)
 | |
|       DevopsLogger.logger.info("Removed #{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_accounts_factory provider
 | |
|       @@providers_with_accounts_factories[provider]
 | |
|     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
 | 
