Revision 355c3a31
Added by Dominic Cleal about 8 years ago
app/models/compute_resource.rb | ||
---|---|---|
attr_accessible :name, :provider, :description, :url, :set_console_password,
|
||
:user, :password
|
||
|
||
class_attribute :supported_providers
|
||
self.supported_providers = {
|
||
'Libvirt' => 'Foreman::Model::Libvirt',
|
||
'Ovirt' => 'Foreman::Model::Ovirt',
|
||
'EC2' => 'Foreman::Model::EC2',
|
||
'Vmware' => 'Foreman::Model::Vmware',
|
||
'Openstack' => 'Foreman::Model::Openstack',
|
||
'Rackspace' => 'Foreman::Model::Rackspace',
|
||
'GCE' => 'Foreman::Model::GCE',
|
||
}
|
||
|
||
validates_lengths_from_database
|
||
|
||
audited :except => [:password, :attrs], :allow_mass_assignment => true
|
||
... | ... | |
end
|
||
}
|
||
|
||
def self.register_provider(provider)
|
||
name = provider.name.split('::').last
|
||
return if supported_providers.values.include?(provider) || supported_providers.keys.include?(name)
|
||
supported_providers[name] = provider.name
|
||
def self.supported_providers
|
||
{
|
||
'Libvirt' => 'Foreman::Model::Libvirt',
|
||
'Ovirt' => 'Foreman::Model::Ovirt',
|
||
'EC2' => 'Foreman::Model::EC2',
|
||
'Vmware' => 'Foreman::Model::Vmware',
|
||
'Openstack' => 'Foreman::Model::Openstack',
|
||
'Rackspace' => 'Foreman::Model::Rackspace',
|
||
'GCE' => 'Foreman::Model::GCE',
|
||
}
|
||
end
|
||
|
||
def self.registered_providers
|
||
Foreman::Plugin.all.map(&:compute_resources).inject({}) do |prov_hash, providers|
|
||
providers.each { |provider| prov_hash.update(provider.split('::').last => provider) }
|
||
prov_hash
|
||
end
|
||
end
|
||
|
||
def self.all_providers
|
||
supported_providers.merge(registered_providers)
|
||
end
|
||
|
||
def self.providers
|
||
supported_providers.reject { |p,c| !SETTINGS[p.downcase.to_sym] }.keys
|
||
# SETTINGS contains a list of loaded CR providers set during app initialization and is based
|
||
# on the Bundler groups available, while all plugin CRs will be available
|
||
supported_providers.reject { |p,c| !SETTINGS[p.downcase.to_sym] }.merge(registered_providers)
|
||
end
|
||
|
||
def self.provider_class(name)
|
||
supported_providers[name]
|
||
all_providers[name]
|
||
end
|
||
|
||
# allows to create a specific compute class based on the provider.
|
||
def self.new_provider(args)
|
||
raise ::Foreman::Exception.new(N_("must provide a provider")) unless provider = args.delete(:provider)
|
||
self.providers.each do |p|
|
||
return self.provider_class(p).constantize.new(args) if p.downcase == provider.downcase
|
||
self.providers.each do |provider_name, provider_class|
|
||
return provider_class.constantize.new(args) if provider_name.downcase == provider.downcase
|
||
end
|
||
raise ::Foreman::Exception.new N_("unknown provider")
|
||
end
|
Also available in: Unified diff
fixes #12746 - list compute resources from plugin definitions
Load the full list of known CRs from plugins on the fly, instead of
modifying the class-level list of supported plugins. Since plugin
definitions don't get reloaded, this allows the ComputeResource class to
be reloaded without affecting the registered list.
Changes the apipie translation use of ComputeResource.providers to a
lambda to prevent foreman/plugin being autoloaded before it's required
in config/initializers/foreman.rb, and to ensure CRs from plugins are
listed.
Previously registered provider names are no longer rejected, instead
they are merged with preference given to plugins, allowing them to
override existing provider names in Foreman.