You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@deltacloud.apache.org by mf...@redhat.com on 2011/11/02 15:05:29 UTC
[PATCH core 1/4] RHEVM: Various optimization to preserve multiple requests to access single resource
From: Michal Fojtik <mf...@redhat.com>
Signed-off-by: Michal fojtik <mf...@redhat.com>
---
.../lib/deltacloud/drivers/rhevm/rhevm_client.rb | 46 ++++++++++++--------
.../lib/deltacloud/drivers/rhevm/rhevm_driver.rb | 40 +++++++++--------
2 files changed, 49 insertions(+), 37 deletions(-)
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
index c7b671b..d08d2cc 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
@@ -196,16 +196,21 @@ module RHEVM
:accept => "application/xml"
}
headers.merge!(auth_header)
- if opts[:id]
- vm = Client::parse_response(RHEVM::client(@api_entrypoint)["/templates/%s" % opts[:id]].get(headers)).root
- [ RHEVM::Template::new(self, vm)]
- else
- Client::parse_response(RHEVM::client(@api_entrypoint)["/templates"].get(headers)).xpath('/templates/template').collect do |vm|
- RHEVM::Template::new(self, vm)
- end
+ rhevm_templates = RHEVM::client(@api_entrypoint)["/templates"].get(headers)
+ Client::parse_response(rhevm_templates).xpath('/templates/template').collect do |t|
+ RHEVM::Template::new(self, t)
end
end
+ def template(template_id)
+ headers = {
+ :accept => "application/xml"
+ }
+ headers.merge!(auth_header)
+ rhevm_template = RHEVM::client(@api_entrypoint)["/templates/%s" % template_id].get(headers)
+ RHEVM::Template::new(self, Client::parse_response(rhevm_template).root)
+ end
+
def clusters(opts={})
headers = {
:accept => "application/xml; detail=datacenters"
@@ -226,16 +231,21 @@ module RHEVM
:accept => "application/xml"
}
headers.merge!(auth_header)
- if opts[:id]
- vm = Client::parse_response(RHEVM::client(@api_entrypoint)["/datacenters/%s" % opts[:id]].get(headers)).root
- [ RHEVM::DataCenter::new(self, vm)]
- else
- Client::parse_response(RHEVM::client(@api_entrypoint)["/datacenters"].get(headers)).xpath('/data_centers/data_center').collect do |vm|
- RHEVM::DataCenter::new(self, vm)
- end
+ rhevm_datacenters = RHEVM::client(@api_entrypoint)["/datacenters"].get(headers)
+ Client::parse_response(rhevm_datacenters).xpath('/data_centers/data_center').collect do |dc|
+ RHEVM::DataCenter::new(self, dc)
end
end
+ def datacenter(datacenter_id)
+ headers = {
+ :accept => "application/xml"
+ }
+ headers.merge!(auth_header)
+ rhevm_datacenter = RHEVM::client(@api_entrypoint)["/datacenters/%s" % datacenter_id].get(headers)
+ RHEVM::DataCenter::new(self, Client::parse_response(rhevm_datacenter).root)
+ end
+
def hosts(opts={})
headers = {
:accept => "application/xml"
@@ -347,10 +357,10 @@ module RHEVM
@macs = (xml/'nics/nic/mac').collect { |mac| mac[:address] }
@creation_time = (xml/'creation_time').text
@ip = ((xml/'guest_info/ip').first[:address] rescue nil)
- unless @ip
- @vnc = ((xml/'display/address').first.text rescue "127.0.0.1")
- @vnc += ":#{((xml/'display/port').first.text rescue "5890")}"
- end
+ @vnc = {
+ :address => ((xml/'display/address').first.text rescue "127.0.0.1"),
+ :port => ((xml/'display/port').first.text rescue "5890")
+ } unless @ip
end
end
diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
index 7ee953a..dfcc7ad 100644
--- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
+++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
@@ -74,14 +74,12 @@ class RHEVMDriver < Deltacloud::BaseDriver
# Realms
#
- def realms(credentials, opts=nil)
+ def realms(credentials, opts={})
client = new_client(credentials)
realm_arr = []
safely do
- clusters = client.clusters
- clusters.each do |r|
- d = client.datacenters(:id => r.datacenter.id).first
- realm_arr << convert_realm(r, d)
+ realm_arr = client.clusters.collect do |r|
+ convert_realm(r, client.datacenter(r.datacenter.id))
end
end
realm_arr = filter_on( realm_arr, :id, opts )
@@ -92,12 +90,10 @@ class RHEVMDriver < Deltacloud::BaseDriver
client = new_client(credentials)
img_arr = []
safely do
- templates = client.templates
if (!opts.nil? && opts[:id])
- templates = templates.select{|t| opts[:id] == t.id}
- end
- templates.each do |t|
- img_arr << convert_image(client, t)
+ img_arr << convert_image(client, client.template(opts[:id]))
+ else
+ img_arr = client.templates.collect { |t| convert_image(client, t) }
end
end
img_arr = filter_on( img_arr, :architecture, opts )
@@ -233,15 +229,21 @@ class RHEVMDriver < Deltacloud::BaseDriver
:hwp_storage => "#{storage_size}"
)
public_addresses = []
- # First check if RHEV-M guest tools are installed and IP address is offered by them
- public_addresses << inst.ip if inst.ip
- # Second check if ConfServer broker is running, then ask for an IP there
- public_addresses << confserver_ip(inst.id) if ENV['CONFIG_SERVER_ADDRESS'] and public_addresses.empty?
- public_addresses.compact!
- # If everything fails fallback to report MAC address
- public_addresses = inst.macs if public_addresses.empty?
- public_addresses.flatten!
- public_addresses << inst.vnc if inst.vnc
+ # First try to get IP address from RHEV-M. This require rhev-agent package
+ # installed on guest
+ public_addresses << InstanceAddress.new(inst.ip, :type => :ipv6) if inst.ip
+ # ConfServer will overide the IP address returned by RHEV-M guest agent
+ if ENV['CONFIG_SERVER_ADDRESS']
+ ip = confserver_ip(inst.id)
+ public_addresses = [ InstanceAddress.new(ip, :type => :ipv6) ]
+ end
+ # If IP retrieval failed, fallback to VNC and MAC address
+ if public_addresses.empty?
+ public_addresses = inst.macs.collect { |mac_address| InstanceAddress.new(mac_address, :type => :mac) }
+ end
+ if inst.vnc
+ public_addresses << InstanceAddress.new(inst.vnc[:address], :port => inst.vnc[:port], :type => :vnc)
+ end
Instance.new(
:id => inst.id,
:name => inst.name,
--
1.7.4.4