From: marios <mar...@redhat.com> https://issues.apache.org/jira/browse/DTACLOUD-488
Signed-off-by: marios <mar...@redhat.com> --- .../drivers/openstack/openstack_driver.rb | 114 +++++++++++---------- 1 file changed, 58 insertions(+), 56 deletions(-) diff --git a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb index ec5cd67..248cf2a 100644 --- a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb +++ b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb @@ -43,11 +43,25 @@ module Deltacloud end define_hardware_profile('default') + def supported_collections(credentials) #get the collections as defined by 'capability' and 'respond_to?' blocks super_collections = super - super_collections = super_collections - [Sinatra::Rabbit::BucketsCollection] if regions_for(credentials, "object-store").empty? - super_collections = super_collections - [Sinatra::Rabbit::StorageVolumesCollection] if regions_for(credentials, "volume").empty? + begin + new_client(credentials, "compute") + rescue Deltacloud::Exceptions::NotImplemented + super_collections = super_collections - [Sinatra::Rabbit::ImagesCollection, Sinatra::Rabbit::InstancesCollection, Sinatra::Rabbit::InstanceStatesCollection,Sinatra::Rabbit::KeysCollection,Sinatra::Rabbit::RealmsCollection, Sinatra::Rabbit::HardwareProfilesCollection] + end + begin + new_client(credentials, "object-store") + rescue Deltacloud::Exceptions::NotImplemented #OpenStack::Exception::NotImplemented... + super_collections = super_collections - [Sinatra::Rabbit::BucketsCollection] + end + begin + new_client(credentials, "volume") + rescue Deltacloud::Exceptions::NotImplemented + super_collections = super_collections - [Sinatra::Rabbit::StorageVolumesCollection, Sinatra::Rabbit::StorageSnapshotsCollection] + end super_collections end @@ -115,44 +129,35 @@ module Deltacloud end end + def providers(credentials, opts={}) + os = new_client(credentials, "compute", true) + providers = [] + os.connection.regions_list.each_pair do |region, services| + resource_types = services.inject([]){|res, cur| res << cur[:service] if ["compute", "volume", "object-store"].include?(cur[:service]); res } + next if resource_types.empty? #nothing here deltacloud manages + providers << convert_provider(region) + end + providers + end + def realms(credentials, opts={}) os = new_client(credentials) realms = [] - if opts[:id] - resource_types = [] - (os.connection.regions_list[opts[:id]] || []).each do |service| - resource_types << service[:service] if ["compute", "volume", "object-store"].include?(service[:service]) - realms << Realm.new( { :id => opts[:id], - :name => opts[:id], - :state =>'AVAILABLE', - :resource_types => resource_types}) unless resource_types.empty? - end - else - os.connection.regions_list.each_pair do |region, services| - resource_types = services.inject([]){|res, cur| res << cur[:service] if ["compute", "volume", "object-store"].include?(cur[:service]); res } - next if resource_types.empty? #nothing here deltacloud manages - realms << Realm.new( { :id => region, - :name => region, - :state =>'AVAILABLE', - :resource_types => resource_types}) - end + limits = "" + safely do + lim = os.limits + limits << "ABSOLUTE >> Max. Instances: #{lim[:absolute][:maxTotalInstances]} Max. RAM: #{lim[:absolute][:maxTotalRAMSize]} || " + lim[:rate].each do |rate| + if rate[:regex] =~ /servers/ + limits << "SERVERS >> Total: #{rate[:limit].first[:value]} Remaining: #{rate[:limit].first[:remaining]} Time Unit: per #{rate[:limit].first[:unit]}" + end + end end - realms -# limits = "" -# safely do -# lim = os.limits -# limits << "ABSOLUTE >> Max. Instances: #{lim[:absolute][:maxTotalInstances]} Max. RAM: #{lim[:absolute][:maxTotalRAMSize]} || " -# lim[:rate].each do |rate| -# if rate[:regex] =~ /servers/ -# limits << "SERVERS >> Total: #{rate[:limit].first[:value]} Remaining: #{rate[:limit].first[:remaining]} Time Unit: per #{rate[:limit].first[:unit]}" -# end -# end -# end -# return [] if opts[:id] and opts[:id] != 'default' -# [ Realm.new( { :id=>'default', -# :name=>'default', -# :limit => limits, -# :state=>'AVAILABLE' })] + return [] if opts[:id] and opts[:id] != 'default' + [ Realm.new( { :id=>'default', + :name=>'default', + :limit => limits, + :state=>'AVAILABLE' })] end def instances(credentials, opts={}) @@ -178,13 +183,7 @@ module Deltacloud end def create_instance(credentials, image_id, opts) - if opts[:realm_id] && opts[:realm_id].length > 0 - os = new_client( credentials, "compute", opts[:realm_id]) - else - #choose a random realm: - available_realms = regions_for(credentials, "compute") - os = new_client(credentials, "compute", available_realms.sample.id) - end + os = new_client( credentials, "compute") result = nil #opts[:personality]: path1='server_path1'. content1='contents1', path2='server_path2', content2='contents2' etc params = {} @@ -484,17 +483,8 @@ module Deltacloud end private - - def region_specified? - api_provider.split(";").last - end - - def regions_for(credentials, service="compute") - realms(credentials).select{|region| region.resource_types.include?(service)} - end - #for v2 authentication credentials.name == "username+tenant_name" - def new_client(credentials, type="compute", realm_id=nil) + def new_client(credentials, type="compute", ignore_provider=false) tokens = credentials.user.split("+") if credentials.user.empty? raise AuthenticationFailure.new(Exception.new("Error: you must supply the username")) @@ -506,12 +496,12 @@ private end #check if region specified with provider: provider = api_provider - if (realm_id || provider.include?(";")) - region = realm_id || provider.split(";").last + if (provider.include?(";")) + region = provider.split(";").last provider = provider.chomp(";#{region}") end connection_params = {:username => user_name, :api_key => credentials.password, :authtenant => tenant_name, :auth_url => provider, :service_type => type} - connection_params.merge!({:region => region}) if region + connection_params.merge!({:region => region}) if region && !ignore_provider # hack needed for 'def providers' safely do raise ValidationFailure.new(Exception.new("Error: tried to initialise Openstack connection using" + " an unknown service_type: #{type}")) unless ["volume", "compute", "object-store"].include? type @@ -667,6 +657,14 @@ private ) end + def convert_provider(region) + Provider.new( + :id => region, + :name => region, + :url => [api_provider.split(';').first, region].join(';') + ) + end + #IN: path1='server_path1'. content1='contents1', path2='server_path2', content2='contents2' etc #OUT:{local_path=>server_path, local_path1=>server_path2 etc} def extract_personality(opts) @@ -705,6 +703,10 @@ private status 401 end + on /No API endpoint for region/ do + status 501 + end + on /OpenStack::Exception::Authentication/ do status 401 end -- 1.7.11.7