diff --git a/.gitignore b/.gitignore index 44708107f..76e452d49 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ .rvmrc .bundle .DS_Store +.idea coverage doc/* docs/_site/* diff --git a/fog.gemspec b/fog.gemspec index 5c98c3de3..70a9b5e3d 100644 --- a/fog.gemspec +++ b/fog.gemspec @@ -54,10 +54,10 @@ Gem::Specification.new do |s| s.add_development_dependency('rdoc') s.add_development_dependency('thor') s.add_development_dependency('rspec', '~>1.3.1') + s.add_development_dependency('rbovirt', '>=0.0.5') s.add_development_dependency('shindo', '~>0.3.4') s.add_development_dependency('virtualbox', '~>0.9.1') # s.add_development_dependency('ruby-libvirt','~>0.4.0') - s.add_development_dependency('rbovirt', '>=0.0.5') s.files = `git ls-files`.split("\n") s.test_files = `git ls-files -- {spec,tests}/*`.split("\n") diff --git a/lib/fog/core/errors.rb b/lib/fog/core/errors.rb index 297d704c8..fc2884d69 100644 --- a/lib/fog/core/errors.rb +++ b/lib/fog/core/errors.rb @@ -54,6 +54,9 @@ An alternate file may be used by placing its path in the FOG_RC environment vari :openstack_username: :openstack_auth_url: :openstack_tenant: + :ovirt_username: + :ovirt_password: + :ovirt_url: :rackspace_api_key: :rackspace_username: :rackspace_servicenet: diff --git a/lib/fog/ovirt/compute.rb b/lib/fog/ovirt/compute.rb index 3397d02d4..f65e67896 100644 --- a/lib/fog/ovirt/compute.rb +++ b/lib/fog/ovirt/compute.rb @@ -18,22 +18,60 @@ module Fog request :vm_action request :destroy_vm + request :create_vm request :datacenters request :storage_domains + request :list_virtual_machines + request :get_virtual_machine + request :list_templates + request :get_template + request :list_clusters + request :get_cluster + + module Shared + # converts an OVIRT object into an hash for fog to consume. + def ovirt_attrs obj + opts = {:raw => obj} + obj.instance_variables.each do |v| + key = v.gsub("@","").to_sym + value = obj.instance_variable_get(v) + #ignore nil values + next if value.nil? + + opts[key] = case value.class + when OVIRT::Link + value.id + when Hash + value + else + value.to_s.strip + end + end + opts + end + end class Mock + include Shared attr_reader :client + def initialize(options={}) + require 'rbovirt' username = options[:ovirt_username] password = options[:ovirt_password] url = options[:ovirt_url] - - #@client = OVIRT::Client.new(username, password, url) end + private + #read mocks xml + def read_xml(file_name) + file_path = File.join(File.dirname(__FILE__),"requests","compute","mock_files",file_name) + File.read(file_path) + end end class Real + include Shared attr_reader :client def initialize(options={}) diff --git a/lib/fog/ovirt/models/compute/clusters.rb b/lib/fog/ovirt/models/compute/clusters.rb index 1bf2306d6..41fc5c63c 100644 --- a/lib/fog/ovirt/models/compute/clusters.rb +++ b/lib/fog/ovirt/models/compute/clusters.rb @@ -1,6 +1,5 @@ require 'fog/core/collection' require 'fog/ovirt/models/compute/cluster' -require 'fog/ovirt/models/compute/helpers/collection_helper' module Fog module Compute @@ -8,16 +7,14 @@ module Fog class Clusters < Fog::Collection - include Fog::Compute::Ovirt::Helpers::CollectionHelper model Fog::Compute::Ovirt::Cluster def all(filters = {}) - attrs = connection.client.clusters(filters).map { |cluster| ovirt_attrs(cluster) } - load attrs + load connection.list_clusters(filters) end def get(id) - new ovirt_attrs(connection.client.cluster(id)) + new connection.get_cluster(id) end end diff --git a/lib/fog/ovirt/models/compute/helpers/collection_helper.rb b/lib/fog/ovirt/models/compute/helpers/collection_helper.rb deleted file mode 100644 index 66a0a952a..000000000 --- a/lib/fog/ovirt/models/compute/helpers/collection_helper.rb +++ /dev/null @@ -1,32 +0,0 @@ -module Fog - module Compute - class Ovirt - module Helpers - module CollectionHelper - - # converts an OVIRT object into an hash for fog to consume. - def ovirt_attrs obj - opts = {:raw => obj} - obj.instance_variables.each do |v| - key = v.gsub("@","").to_sym - value = obj.instance_variable_get(v) - #ignore nil values - next if value.nil? - - opts[key] = case value.class - when OVIRT::Link - value.id - when Hash - value - else - value.to_s.strip - end - end - opts - end - - end - end - end - end -end diff --git a/lib/fog/ovirt/models/compute/server.rb b/lib/fog/ovirt/models/compute/server.rb index 7059f30de..1b2109ee7 100644 --- a/lib/fog/ovirt/models/compute/server.rb +++ b/lib/fog/ovirt/models/compute/server.rb @@ -39,29 +39,36 @@ module Fog end def start(options = {}) - connection.client.vm_action(id, :start) + connection.vm_action(:id =>id, :action => :start) reload end def stop(options = {}) - connection.client.vm_action(id, :stop) + connection.vm_action(:id =>id, :action => :stop) reload end def reboot(options = {}) - connection.client.vm_action(id, :reboot) + stop unless stopped? + wait_for { stopped? } + connection.vm_action(:id =>id, :action => :start) + reload + end + + def suspend(options = {}) + connection.vm_action(:id =>id, :action => :suspend) reload end def destroy(options = {}) - stop unless stopped? + (stop unless stopped?) rescue nil #ignore failure, destroy the machine anyway. wait_for { stopped? } - connection.client.destroy_vm(id) + connection.destroy_vm(:id => id) end def save raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if identity - self.id = connection.client.create_vm(attributes).id + self.id = connection.create_vm(attributes).id reload end diff --git a/lib/fog/ovirt/models/compute/servers.rb b/lib/fog/ovirt/models/compute/servers.rb index d02b1a974..a0232ee81 100644 --- a/lib/fog/ovirt/models/compute/servers.rb +++ b/lib/fog/ovirt/models/compute/servers.rb @@ -1,6 +1,5 @@ require 'fog/core/collection' require 'fog/ovirt/models/compute/server' -require 'fog/ovirt/models/compute/helpers/collection_helper' module Fog module Compute @@ -8,16 +7,14 @@ module Fog class Servers < Fog::Collection - include Fog::Compute::Ovirt::Helpers::CollectionHelper model Fog::Compute::Ovirt::Server def all(filters = {}) - attrs = connection.client.vms(filters).map { |server| ovirt_attrs(server) } - load attrs + load connection.list_virtual_machines(filters) end def get(id) - new ovirt_attrs(connection.client.vm(id)) + new connection.get_virtual_machine(id) end def bootstrap(new_attributes = {}) diff --git a/lib/fog/ovirt/models/compute/templates.rb b/lib/fog/ovirt/models/compute/templates.rb index f69d18a09..6a6bf906a 100644 --- a/lib/fog/ovirt/models/compute/templates.rb +++ b/lib/fog/ovirt/models/compute/templates.rb @@ -1,6 +1,5 @@ require 'fog/core/collection' require 'fog/ovirt/models/compute/template' -require 'fog/ovirt/models/compute/helpers/collection_helper' module Fog module Compute @@ -8,16 +7,14 @@ module Fog class Templates < Fog::Collection - include Fog::Compute::Ovirt::Helpers::CollectionHelper model Fog::Compute::Ovirt::Template def all(filters = {}) - attrs = connection.client.templates(filters).map { |template| ovirt_attrs(template) } - load attrs + load connection.list_templates(filters) end def get(id) - new ovirt_attrs(connection.client.template(id)) + new connection.get_template(id) end end diff --git a/lib/fog/ovirt/requests/compute/create_vm.rb b/lib/fog/ovirt/requests/compute/create_vm.rb new file mode 100644 index 000000000..b72505786 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/create_vm.rb @@ -0,0 +1,20 @@ +module Fog + module Compute + class Ovirt + + class Real + def create_vm(attrs) + client.create_vm(attrs) + end + end + + class Mock + def create_vm(attrs) + xml = read_xml('vm.xml') + OVIRT::VM::new(self, Nokogiri::XML(xml).root) + end + + end + end + end +end diff --git a/lib/fog/ovirt/requests/compute/datacenters.rb b/lib/fog/ovirt/requests/compute/datacenters.rb index 7978fef8d..4c94ba4d6 100644 --- a/lib/fog/ovirt/requests/compute/datacenters.rb +++ b/lib/fog/ovirt/requests/compute/datacenters.rb @@ -4,14 +4,17 @@ module Fog class Real def datacenters filter={} - client.datacenters(filter) + client.datacenters(filter).map {|ovirt_obj| ovirt_attrs ovirt_obj} end end - class Mock - def datacenters filter={} - [ "Solutions", "Solutions2", "Solutions3" ] + class Mock + def datacenters(filters = {}) + xml = read_xml 'data_centers.xml' + Nokogiri::XML(xml).xpath('/data_centers/data_center').collect do |dc| + ovirt_attrs OVIRT::DataCenter::new(self, dc) + end end end end diff --git a/lib/fog/ovirt/requests/compute/get_cluster.rb b/lib/fog/ovirt/requests/compute/get_cluster.rb new file mode 100644 index 000000000..61d628d33 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/get_cluster.rb @@ -0,0 +1,18 @@ +module Fog + module Compute + class Ovirt + class Real + def get_cluster(id) + ovirt_attrs client.cluster(id) + end + + end + class Mock + def get_cluster(id) + xml = read_xml('cluster.xml') + ovirt_attrs OVIRT::Cluster::new(self, Nokogiri::XML(xml).root) + end + end + end + end +end diff --git a/lib/fog/ovirt/requests/compute/get_template.rb b/lib/fog/ovirt/requests/compute/get_template.rb new file mode 100644 index 000000000..409537311 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/get_template.rb @@ -0,0 +1,18 @@ +module Fog + module Compute + class Ovirt + class Real + def get_template(id) + ovirt_attrs client.template(id) + end + + end + class Mock + def get_template(id) + xml = read_xml 'template.xml' + ovirt_attrs OVIRT::Template::new(self, Nokogiri::XML(xml).root) + end + end + end + end +end \ No newline at end of file diff --git a/lib/fog/ovirt/requests/compute/get_virtual_machine.rb b/lib/fog/ovirt/requests/compute/get_virtual_machine.rb new file mode 100644 index 000000000..8896a5c13 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/get_virtual_machine.rb @@ -0,0 +1,18 @@ +module Fog + module Compute + class Ovirt + class Real + def get_virtual_machine(id) + ovirt_attrs client.vm(id) + end + + end + class Mock + def get_virtual_machine(id) + xml = read_xml 'vm.xml' + ovirt_attrs OVIRT::VM::new(self, Nokogiri::XML(xml).root) + end + end + end + end +end diff --git a/lib/fog/ovirt/requests/compute/list_clusters.rb b/lib/fog/ovirt/requests/compute/list_clusters.rb new file mode 100644 index 000000000..4fdf0b93f --- /dev/null +++ b/lib/fog/ovirt/requests/compute/list_clusters.rb @@ -0,0 +1,20 @@ +module Fog + module Compute + class Ovirt + class Real + def list_clusters(filters = {}) + client.clusters(filters).map {|ovirt_obj| ovirt_attrs ovirt_obj} + end + + end + class Mock + def list_clusters(filters = {}) + xml = read_xml 'clusters.xml' + Nokogiri::XML(xml).xpath('/clusters/cluster').collect do |cl| + ovirt_attrs OVIRT::Cluster::new(self, cl) + end + end + end + end + end +end diff --git a/lib/fog/ovirt/requests/compute/list_templates.rb b/lib/fog/ovirt/requests/compute/list_templates.rb new file mode 100644 index 000000000..eb74d981c --- /dev/null +++ b/lib/fog/ovirt/requests/compute/list_templates.rb @@ -0,0 +1,20 @@ +module Fog + module Compute + class Ovirt + class Real + def list_templates(filters = {}) + client.templates(filters).map {|ovirt_obj| ovirt_attrs ovirt_obj} + end + + end + class Mock + def list_templates(filters = {}) + xml = read_xml 'templates.xml' + Nokogiri::XML(xml).xpath('/templates/template').collect do |t| + ovirt_attrs OVIRT::Template::new(self, t) + end + end + end + end + end +end diff --git a/lib/fog/ovirt/requests/compute/list_virtual_machines.rb b/lib/fog/ovirt/requests/compute/list_virtual_machines.rb new file mode 100644 index 000000000..a2d6251b5 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/list_virtual_machines.rb @@ -0,0 +1,20 @@ +module Fog + module Compute + class Ovirt + class Real + def list_virtual_machines(filters = {}) + client.vms(filters).map {|ovirt_obj| ovirt_attrs ovirt_obj} + end + + end + class Mock + def list_virtual_machines(filters = {}) + xml = read_xml 'vms.xml' + Nokogiri::XML(xml).xpath('/vms/vm').collect do |vm| + ovirt_attrs OVIRT::VM::new(self, vm) + end + end + end + end + end +end diff --git a/lib/fog/ovirt/requests/compute/mock_files/cluster.xml b/lib/fog/ovirt/requests/compute/mock_files/cluster.xml new file mode 100644 index 000000000..51006eca0 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/mock_files/cluster.xml @@ -0,0 +1,20 @@ + + +cluster1 + + + + + + + +true + + + + + +migrate_highly_available + + + \ No newline at end of file diff --git a/lib/fog/ovirt/requests/compute/mock_files/clusters.xml b/lib/fog/ovirt/requests/compute/mock_files/clusters.xml new file mode 100644 index 000000000..0235f0313 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/mock_files/clusters.xml @@ -0,0 +1,39 @@ + + +Cluster1 +The default server cluster + + + + + + + +true + + + + + +migrate + + + +Cluster2 + + + + + + + +true + + + + + +migrate_highly_available + + + \ No newline at end of file diff --git a/lib/fog/ovirt/requests/compute/mock_files/data_centers.xml b/lib/fog/ovirt/requests/compute/mock_files/data_centers.xml new file mode 100644 index 000000000..cda1053dc --- /dev/null +++ b/lib/fog/ovirt/requests/compute/mock_files/data_centers.xml @@ -0,0 +1,17 @@ + + +Datacenter1 +The first Data Center + + +nfs +v1 + + + + + +up + + + \ No newline at end of file diff --git a/lib/fog/ovirt/requests/compute/mock_files/storage_domains.xml b/lib/fog/ovirt/requests/compute/mock_files/storage_domains.xml new file mode 100644 index 000000000..7eca19304 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/mock_files/storage_domains.xml @@ -0,0 +1,36 @@ + + +covirt + + +iso + +unattached + +false + +nfs +
ovirt.server.com
+/mnt/nfs +
+0 +0 +0 +v1 +
+ +nfs + +data +true + +nfs +
storage.server.com
+/volumes/path/for/ovirt +
+40802189312 +66571993088 +75161927680 +v1 +
+
\ No newline at end of file diff --git a/lib/fog/ovirt/requests/compute/mock_files/template.xml b/lib/fog/ovirt/requests/compute/mock_files/template.xml new file mode 100644 index 000000000..64543bed6 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/mock_files/template.xml @@ -0,0 +1,39 @@ + + + \ No newline at end of file diff --git a/lib/fog/ovirt/requests/compute/mock_files/templates.xml b/lib/fog/ovirt/requests/compute/mock_files/templates.xml new file mode 100644 index 000000000..4a3e7e4f8 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/mock_files/templates.xml @@ -0,0 +1,110 @@ + + + + + \ No newline at end of file diff --git a/lib/fog/ovirt/requests/compute/mock_files/vm.xml b/lib/fog/ovirt/requests/compute/mock_files/vm.xml new file mode 100644 index 000000000..14438e7d7 --- /dev/null +++ b/lib/fog/ovirt/requests/compute/mock_files/vm.xml @@ -0,0 +1,54 @@ + + +vm01 + + + + + + + +server + +down + +805306368 + + + + + + + + + + + +false +1 + + +spice +
host
+5900 +5901 +1 +
+ + +