ACK both
On 09/12/11 14:52, [email protected] wrote:
> From: Michal Fojtik <[email protected]>
>
> Signed-off-by: Michal fojtik <[email protected]>
> ---
> .../lib/deltacloud/drivers/rhevm/rhevm_client.rb | 93
> ++++++++++++++------
> .../lib/deltacloud/drivers/rhevm/rhevm_driver.rb | 19 ++++-
> 2 files changed, 83 insertions(+), 29 deletions(-)
>
> diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> index d9f3c17..47a7ef5 100644
> --- a/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_client.rb
> @@ -44,10 +44,11 @@ module RHEVM
>
> class Client
>
> - attr_reader :credentials, :api_entrypoint
> + attr_reader :credentials, :api_entrypoint, :datacenter_id
>
> - def initialize(username, password, api_entrypoint)
> + def initialize(username, password, api_entrypoint, datacenter_id=nil)
> @credentials = { :username => username, :password => password }
> + @datacenter_id = datacenter_id
> @api_entrypoint = api_entrypoint
> end
>
> @@ -57,18 +58,22 @@ module RHEVM
> }
> headers.merge!(auth_header)
> if opts[:id]
> + return [] unless
> current_datacenter.cluster_ids.include?((vm/'cluster').first[:id])
> vm = Client::parse_response(RHEVM::client(@api_entrypoint)["/vms/%s"
> % opts[:id]].get(headers)).root
> [ RHEVM::VM::new(self, vm)]
> else
>
> Client::parse_response(RHEVM::client(@api_entrypoint)["/vms"].get(headers)).xpath('/vms/vm').collect
> do |vm|
> + next unless
> current_datacenter.cluster_ids.include?((vm/'cluster').first[:id])
> RHEVM::VM::new(self, vm)
> - end
> + end.compact
> end
> end
>
> def vm_action(id, action, headers={})
> headers.merge!(auth_header)
> headers.merge!({:accept => 'application/xml'})
> + vm = vms(:id => id)
> + raise RHEVMBackendException::new("Requested VM not found in datacenter
> #{self.current_datacenter.id}") if vm.empty
> if action==:delete
> RHEVM::client(@api_entrypoint)["/vms/%s" % id].delete(headers)
> else
> @@ -112,11 +117,12 @@ module RHEVM
>
> def create_vm(template_id, opts={})
> opts ||= {}
> + raise RHEVMBackendException::new("Requested VM not found in datacenter
> #{self.current_datacenter.id}") unless template(template_id)
> builder = Nokogiri::XML::Builder.new do
> vm {
> name opts[:name] || "i-#{Time.now.to_i}"
> template_(:id => template_id)
> - cluster(:id => opts[:realm_id].empty? ? clusters.first.id :
> opts[:realm_id])
> + cluster_(:id => opts[:realm_id].empty? ? clusters.first.id :
> opts[:realm_id])
> type_ opts[:hwp_id] || 'desktop'
> memory opts[:hwp_memory] ? (opts[:hwp_memory].to_i*1024*1024).to_s
> : (512*1024*1024).to_s
> cpu {
> @@ -125,11 +131,6 @@ module RHEVM
> if opts[:user_data] and not opts[:user_data].empty?
> if api_version?('3') and cluster_version?((opts[:realm_id] ||
> clusters.first.id), '3')
> custom_properties {
> - #
> - # FIXME: 'regexp' parameter is just a temporary workaround.
> This
> - # is a reported and verified bug and should be fixed in next
> - # RHEV-M release.
> - #
> custom_property({
> :name => "floppyinject",
> :value => "#{RHEVM::FILEINJECT_PATH}:#{opts[:user_data]}",
> @@ -146,6 +147,8 @@ module RHEVM
> :content_type => 'application/xml',
> :accept => 'application/xml',
> })
> + vm = vms(:id => id)
> + raise RHEVMBackendException::new("Requested VM not found in datacenter
> #{self.current_datacenter.id}") if vm.empty?
> headers.merge!(auth_header)
> begin
> vm =
> RHEVM::client(@api_entrypoint)["/vms"].post(Nokogiri::XML(builder.to_xml).root.to_s,
> headers)
> @@ -184,6 +187,8 @@ module RHEVM
> :content_type => 'application/xml',
> :accept => 'application/xml',
> })
> + tmpl = template(id)
> + raise RHEVMBackendException::new("Requested VM not found in datacenter
> #{self.current_datacenter.id}") unless tmpl
> headers.merge!(auth_header)
> RHEVM::client(@api_entrypoint)["/templates/%s" % id].delete(headers)
> return true
> @@ -196,8 +201,9 @@ module RHEVM
> headers.merge!(auth_header)
> rhevm_templates =
> RHEVM::client(@api_entrypoint)["/templates"].get(headers)
>
> Client::parse_response(rhevm_templates).xpath('/templates/template').collect
> do |t|
> + next unless
> current_datacenter.cluster_ids.include?((t/'cluster').first[:id])
> RHEVM::Template::new(self, t)
> - end
> + end.compact
> end
>
> def template(template_id)
> @@ -209,21 +215,6 @@ module RHEVM
> RHEVM::Template::new(self, Client::parse_response(rhevm_template).root)
> end
>
> - def clusters(opts={})
> - headers = {
> - :accept => "application/xml; detail=datacenters"
> - }
> - headers.merge!(auth_header)
> - if opts[:id]
> - vm =
> Client::parse_response(RHEVM::client(@api_entrypoint)["/clusters/%s" %
> opts[:id]].get(headers)).root
> - [ RHEVM::Cluster::new(self, vm)]
> - else
> -
> Client::parse_response(RHEVM::client(@api_entrypoint)["/clusters"].get(headers)).xpath('/clusters/cluster').collect
> do |vm|
> - RHEVM::Cluster::new(self, vm) if has_datacenter?(vm)
> - end.compact
> - end
> - end
> -
> def datacenters(opts={})
> headers = {
> :accept => "application/xml"
> @@ -235,6 +226,18 @@ module RHEVM
> end
> end
>
> + def clusters
> + current_datacenter.clusters
> + end
> +
> + def cluster(cluster_id)
> + current_datacenter.cluster(cluster_id)
> + end
> +
> + def current_datacenter
> + @current_datacenter ||= self.datacenter_id ?
> datacenter(self.datacenter_id) : datacenters.first
> + end
> +
> def datacenter(datacenter_id)
> headers = {
> :accept => "application/xml"
> @@ -382,7 +385,7 @@ module RHEVM
> end
>
> class Cluster < BaseObject
> - attr_reader :description, :datacenter
> + attr_reader :description, :datacenter, :version
>
> def initialize(client, xml)
> super(client, xml[:id], xml[:href], (xml/'name').first.text)
> @@ -394,7 +397,10 @@ module RHEVM
>
> def parse_xml_attributes!(xml)
> @description = ((xml/'description').first.text rescue nil)
> - @datacenter = Link::new(@client, (xml/'data_center').first[:id],
> (xml/'data_center').first[:href])
> + @version =((xml/'version').first[:major].strip rescue nil)
> + unless (xml/'data_center').empty?
> + @datacenter = Link::new(@client, (xml/'data_center').first[:id],
> (xml/'data_center').first[:href])
> + end
> end
>
> end
> @@ -408,6 +414,39 @@ module RHEVM
> self
> end
>
> + def clusters
> + headers = {
> + :accept => "application/xml; detail=datacenters"
> + }
> + headers.merge!(client.auth_header)
> + clusters_list =
> RHEVM::client(client.api_entrypoint)["/clusters"].get(headers)
> + cluster_arr =
> Client::parse_response(clusters_list).xpath('/clusters/cluster')
> + clusters_arr = []
> + cluster_arr.each do |cluster|
> + cluster = RHEVM::Cluster.new(self.client, cluster)
> + clusters_arr << cluster if cluster.datacenter &&
> cluster.datacenter.id == client.datacenter_id
> + end
> + clusters_arr
> + end
> +
> + def cluster(cluster_id)
> + headers = {
> + :accept => "application/xml; detail=datacenters"
> + }
> + headers.merge!(client.auth_header)
> + cluster_xml = RHEVM::client(client.api_entrypoint)["/clusters/%s" %
> cluster_id].get(headers)
> + cluster = RHEVM::Cluster.new(self.client, cluster_xml)
> + if cluster.datacenter && cluster.datacenter.id == client.datacenter_id
> + cluster
> + else
> + nil
> + end
> + end
> +
> + def cluster_ids
> + @cluster_ids ||= clusters.collect { |c| c.id }
> + end
> +
> private
>
> def parse_xml_attributes!(xml)
> diff --git a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> index fa876de..3617661 100644
> --- a/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> +++ b/server/lib/deltacloud/drivers/rhevm/rhevm_driver.rb
> @@ -70,6 +70,13 @@ class RHEVMDriver < Deltacloud::BaseDriver
> stopped.to( :finish ) .on( :destroy )
> end
>
> + def providers(credentials)
> + client = new_client(credentials)
> + safely do
> + client.datacenters.collect { |dc| convert_provider(dc) }
> + end
> + end
> +
> #
> # Realms
> #
> @@ -209,12 +216,20 @@ class RHEVMDriver < Deltacloud::BaseDriver
> private
>
> def new_client(credentials)
> - url = api_provider
> + url, datacenter = api_provider.split(';')
> safely do
> - ::RHEVM::Client.new(credentials.user, credentials.password, url)
> + ::RHEVM::Client.new(credentials.user, credentials.password, url,
> datacenter)
> end
> end
>
> + def convert_provider(dc)
> + Provider.new(
> + :id => dc.id,
> + :name => dc.name,
> + :url => [api_provider.split(';').first, dc.id].join(';')
> + )
> + end
> +
> def confserver_ip(uuid)
> client = RestClient::Resource::new(ENV['CONFIG_SERVER_ADDRESS'])
> client["/ip/%s/%s" % [ (ENV['CONFIG_SERVER_VERSION'] || '0.0.1'),
> uuid]].get(:accept => 'text/plain').body.strip rescue nil