You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltacloud.apache.org by ma...@apache.org on 2013/02/07 16:55:06 UTC
git commit: Deltacloud - adds maps openstack 'regions' to deltacloud
realms - DTACLOUD-443
Updated Branches:
refs/heads/master e7e9232da -> 3d318d252
Deltacloud - adds maps openstack 'regions' to deltacloud realms - DTACLOUD-443
https://issues.apache.org/jira/browse/DTACLOUD-443
API-Change: Added the 'resource_types' attribute to Realm model
Project: http://git-wip-us.apache.org/repos/asf/deltacloud/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltacloud/commit/3d318d25
Tree: http://git-wip-us.apache.org/repos/asf/deltacloud/tree/3d318d25
Diff: http://git-wip-us.apache.org/repos/asf/deltacloud/diff/3d318d25
Branch: refs/heads/master
Commit: 3d318d252f5289322b0798a65ff81c6604aef946
Parents: e7e9232
Author: marios <ma...@redhat.com>
Authored: Thu Feb 7 17:33:23 2013 +0200
Committer: marios <ma...@redhat.com>
Committed: Thu Feb 7 17:53:17 2013 +0200
----------------------------------------------------------------------
.../drivers/openstack/openstack_driver.rb | 97 ++++++++++-----
server/lib/deltacloud/models/realm.rb | 5 +-
server/views/realms/index.html.haml | 2 +
server/views/realms/show.html.haml | 4 +
server/views/realms/show.xml.haml | 3 +
5 files changed, 79 insertions(+), 32 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/3d318d25/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
index d499f8d..bd541bc 100644
--- a/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
+++ b/server/lib/deltacloud/drivers/openstack/openstack_driver.rb
@@ -43,20 +43,11 @@ 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
- 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]
- end
+ super_collections = super_collections - [Sinatra::Rabbit::BucketsCollection] if regions_for("object-store", credentials).empty?
+ super_collections = super_collections - [Sinatra::Rabbit::StorageVolumesCollection] if regions_for("volume", credentials).empty?
super_collections
end
@@ -126,21 +117,42 @@ module Deltacloud
def realms(credentials, opts={})
os = new_client(credentials)
- 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
+ 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
end
- return [] if opts[:id] and opts[:id] != 'default'
- [ Realm.new( { :id=>'default',
- :name=>'default',
- :limit => limits,
- :state=>'AVAILABLE' })]
+ 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' })]
end
def instances(credentials, opts={})
@@ -166,7 +178,13 @@ module Deltacloud
end
def create_instance(credentials, image_id, opts)
- os = new_client( credentials )
+ 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("compute", credentials)
+ os = new_client(credentials, "compute", available_realms.sample.id)
+ end
result = nil
#opts[:personality]: path1='server_path1'. content1='contents1', path2='server_path2', content2='contents2' etc
params = {}
@@ -186,11 +204,12 @@ module Deltacloud
end
safely do
server = os.create_server(params)
- result = convert_from_server(server, os.connection.authuser, get_attachments(server.id, os))
+ result = convert_from_server(server, os.connection.authuser, get_attachments(server.id, os), os.connection.region)
end
result
end
+
def reboot_instance(credentials, instance_id)
os = new_client(credentials)
safely do
@@ -466,8 +485,16 @@ module Deltacloud
private
+ def region_specified?
+ api_provider.split(";").last
+ end
+
+ def regions_for(service="compute", credentials)
+ realms(credentials).select{|region| region.resource_types.include?(service)}
+ end
+
#for v2 authentication credentials.name == "username+tenant_name"
- def new_client(credentials, type = "compute")
+ def new_client(credentials, type="compute", realm_id=nil)
tokens = credentials.user.split("+")
if credentials.user.empty?
raise AuthenticationFailure.new(Exception.new("Error: you must supply the username"))
@@ -477,10 +504,18 @@ private
else
user_name, tenant_name = tokens.first, tokens.last
end
+ #check if region specified with provider:
+ provider = api_provider
+ if (realm_id || provider.include?(";"))
+ region = realm_id || 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
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
- OpenStack::Connection.create(:username => user_name, :api_key => credentials.password, :authtenant => tenant_name, :auth_url => api_provider, :service_type => type)
+ OpenStack::Connection.create(connection_params)
end
end
@@ -513,7 +548,7 @@ private
})
end
- def convert_from_server(server, owner, attachments=[])
+ def convert_from_server(server, owner, attachments=[], region=nil)
op = (server.class == Hash)? :fetch : :send
image = server.send(op, :image)
flavor = server.send(op, :flavor)
@@ -524,7 +559,7 @@ private
end
inst = Instance.new(
:id => server.send(op, :id).to_s,
- :realm_id => 'default',
+ :realm_id => region || "n/a",
:owner_id => owner,
:description => server.send(op, :name),
:name => server.send(op, :name),
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/3d318d25/server/lib/deltacloud/models/realm.rb
----------------------------------------------------------------------
diff --git a/server/lib/deltacloud/models/realm.rb b/server/lib/deltacloud/models/realm.rb
index 00dd36f..1c25ba2 100644
--- a/server/lib/deltacloud/models/realm.rb
+++ b/server/lib/deltacloud/models/realm.rb
@@ -20,15 +20,18 @@ class Realm < BaseModel
attr_accessor :name
attr_accessor :limit
attr_accessor :state
+ attr_accessor :resource_types
def to_hash(context)
- {
+ r = {
:id => self.id,
:href => context.realm_url(self.id),
:name => name,
:state => state,
:limit => limit
}
+ r.merge!({:resource_types => resource_types}) if resource_types
+ r
end
end
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/3d318d25/server/views/realms/index.html.haml
----------------------------------------------------------------------
diff --git a/server/views/realms/index.html.haml b/server/views/realms/index.html.haml
index 5e91e56..91636a8 100644
--- a/server/views/realms/index.html.haml
+++ b/server/views/realms/index.html.haml
@@ -10,4 +10,6 @@
%img{ :class => 'ui-link-thumb', :src => '/images/realm.png'}
%h3= realm.name
%p=[realm.id, realm.limit].join(', ')
+ -if realm.resource_types
+ %p=realm.resource_types.join(",")
%span{ :class => 'ui-li-count'}=realm.state
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/3d318d25/server/views/realms/show.html.haml
----------------------------------------------------------------------
diff --git a/server/views/realms/show.html.haml b/server/views/realms/show.html.haml
index f2c52f7..e1c16d4 100644
--- a/server/views/realms/show.html.haml
+++ b/server/views/realms/show.html.haml
@@ -15,3 +15,7 @@
%li{ :'data-role' => 'list-divider'} Limit
%li
%p{ :'data-role' => 'fieldcontain'}=@realm.limit
+ - if @realm.resource_types
+ %li{ :'data-role' => 'list-divider'} Resource Types
+ %li
+ %p{ :'data-role' => 'fieldcontain'}=@realm.resource_types
http://git-wip-us.apache.org/repos/asf/deltacloud/blob/3d318d25/server/views/realms/show.xml.haml
----------------------------------------------------------------------
diff --git a/server/views/realms/show.xml.haml b/server/views/realms/show.xml.haml
index 5c06c06..268cb65 100644
--- a/server/views/realms/show.xml.haml
+++ b/server/views/realms/show.xml.haml
@@ -9,3 +9,6 @@
%limit<
=cdata do
=@realm.limit
+ - @realm.resource_types.each do |r|
+ %resource_type<
+ =r