From 943e0d257820d4b6bed5db88aea3e61a086e8239 Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Fri, 2 Jul 2010 16:15:00 +0200 Subject: [PATCH 1/5] feature #192 Added OCA Tests --- src/oca/ruby/test.zip | Bin 0 -> 16807 bytes src/oca/ruby/test/HostPool_spec.rb | 97 ++++ src/oca/ruby/test/Host_spec.rb | 251 ++++++++++ src/oca/ruby/test/MockClient.rb | 49 ++ src/oca/ruby/test/UserPool_spec.rb | 81 ++++ src/oca/ruby/test/User_spec.rb | 161 +++++++ src/oca/ruby/test/VirtualMachinePool_spec.rb | 105 +++++ src/oca/ruby/test/VirtualMachine_spec.rb | 464 +++++++++++++++++++ src/oca/ruby/test/VirtualNetworkPool_spec.rb | 103 ++++ src/oca/ruby/test/VirtualNetwork_spec.rb | 183 ++++++++ src/oca/ruby/test/xml_test/host.xml | 38 ++ src/oca/ruby/test/xml_test/hostpool.xml | 52 +++ src/oca/ruby/test/xml_test/user.xml | 6 + src/oca/ruby/test/xml_test/userpool.xml | 14 + src/oca/ruby/test/xml_test/vm.xml | 59 +++ src/oca/ruby/test/xml_test/vmpool.xml | 92 ++++ src/oca/ruby/test/xml_test/vnet.xml | 23 + src/oca/ruby/test/xml_test/vnetpool.xml | 20 + 18 files changed, 1798 insertions(+) create mode 100644 src/oca/ruby/test.zip create mode 100644 src/oca/ruby/test/HostPool_spec.rb create mode 100644 src/oca/ruby/test/Host_spec.rb create mode 100644 src/oca/ruby/test/MockClient.rb create mode 100644 src/oca/ruby/test/UserPool_spec.rb create mode 100644 src/oca/ruby/test/User_spec.rb create mode 100644 src/oca/ruby/test/VirtualMachinePool_spec.rb create mode 100644 src/oca/ruby/test/VirtualMachine_spec.rb create mode 100644 src/oca/ruby/test/VirtualNetworkPool_spec.rb create mode 100644 src/oca/ruby/test/VirtualNetwork_spec.rb create mode 100644 src/oca/ruby/test/xml_test/host.xml create mode 100644 src/oca/ruby/test/xml_test/hostpool.xml create mode 100644 src/oca/ruby/test/xml_test/user.xml create mode 100644 src/oca/ruby/test/xml_test/userpool.xml create mode 100644 src/oca/ruby/test/xml_test/vm.xml create mode 100644 src/oca/ruby/test/xml_test/vmpool.xml create mode 100644 src/oca/ruby/test/xml_test/vnet.xml create mode 100644 src/oca/ruby/test/xml_test/vnetpool.xml diff --git a/src/oca/ruby/test.zip b/src/oca/ruby/test.zip new file mode 100644 index 0000000000000000000000000000000000000000..60ad41e9e211385ff8f7aa3ae832fe6d30a3dfee GIT binary patch literal 16807 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 b%PWzu;Gr*H;emlsU4Cv|`u*3efWQ6+)iigs literal 0 HcmV?d00001 diff --git a/src/oca/ruby/test/HostPool_spec.rb b/src/oca/ruby/test/HostPool_spec.rb new file mode 100644 index 0000000000..171e38cccd --- /dev/null +++ b/src/oca/ruby/test/HostPool_spec.rb @@ -0,0 +1,97 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "Host using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + client = MockClient.new() + @host_pool = HostPool.new(client) + end + + it "should update the HOST_POOL info" do + rc = @host_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the HOST_POOL elements and get info from them" do + rc = @host_pool.each{ |host| + host.class.to_s.should eql("OpenNebula::Host") + if host.id == 0 + host.name.should eql('dummyhost') + elsif host.id == 1 + host.name.should eql('thost') + end + } + end + + it "should get a hash representation of the HOST_POOL" do + host_hash = @host_pool.to_hash + host_hash['HOST_POOL']['HOST'][0]['ID'].should eql('0') + host_hash['HOST_POOL']['HOST'][0]['NAME'].should eql('dummyhost') + host_hash['HOST_POOL']['HOST'][0]['STATE'].should eql('2') + host_hash['HOST_POOL']['HOST'][0]['IM_MAD'].should eql('im_dummy') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['MEM_USAGE'].should eql('1572864') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['CPU_USAGE'].should eql('300') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['FREE_MEM'].should eql('16777216') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['RUNNING_VMS'].should eql('3') + host_hash['HOST_POOL']['HOST'][1]['ID'].should eql('1') + host_hash['HOST_POOL']['HOST'][1]['NAME'].should eql('thost') + host_hash['HOST_POOL']['HOST'][1]['STATE'].should eql('2') + host_hash['HOST_POOL']['HOST'][1]['IM_MAD'].should eql('im_dummy') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['MEM_USAGE'].should eql('0') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['CPU_USAGE'].should eql('0') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['FREE_MEM'].should eql('16777216') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['RUNNING_VMS'].should eql('0') + end + end + + describe "Host using REXML" do + before(:all) do + NOKOGIRI=false + + client = MockClient.new() + @host_pool = HostPool.new(client) + end + + it "should update the HOST_POOL info" do + rc = @host_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the HOST_POOL elements and get info from them" do + rc = @host_pool.each{ |host| + host.class.to_s.should eql("OpenNebula::Host") + if host.id == 0 + host.name.should eql('dummyhost') + elsif host.id == 1 + host.name.should eql('thost') + end + } + end + + it "should get a hash representation of the HOST_POOL" do + host_hash = @host_pool.to_hash + host_hash['HOST_POOL']['HOST'][0]['ID'].should eql('0') + host_hash['HOST_POOL']['HOST'][0]['NAME'].should eql('dummyhost') + host_hash['HOST_POOL']['HOST'][0]['STATE'].should eql('2') + host_hash['HOST_POOL']['HOST'][0]['IM_MAD'].should eql('im_dummy') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['MEM_USAGE'].should eql('1572864') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['CPU_USAGE'].should eql('300') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['FREE_MEM'].should eql('16777216') + host_hash['HOST_POOL']['HOST'][0]['HOST_SHARE']['RUNNING_VMS'].should eql('3') + host_hash['HOST_POOL']['HOST'][1]['ID'].should eql('1') + host_hash['HOST_POOL']['HOST'][1]['NAME'].should eql('thost') + host_hash['HOST_POOL']['HOST'][1]['STATE'].should eql('2') + host_hash['HOST_POOL']['HOST'][1]['IM_MAD'].should eql('im_dummy') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['MEM_USAGE'].should eql('0') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['CPU_USAGE'].should eql('0') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['FREE_MEM'].should eql('16777216') + host_hash['HOST_POOL']['HOST'][1]['HOST_SHARE']['RUNNING_VMS'].should eql('0') + end + end +end \ No newline at end of file diff --git a/src/oca/ruby/test/Host_spec.rb b/src/oca/ruby/test/Host_spec.rb new file mode 100644 index 0000000000..224656f99a --- /dev/null +++ b/src/oca/ruby/test/Host_spec.rb @@ -0,0 +1,251 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "Host using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + @xml = Host.build_xml(7) + + client = MockClient.new() + @host = Host.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should allocate the new HOST" do + @host.allocate(nil,nil,nil,nil) + + @host.id.should eql(7) + end + + it "should update the HOST info" do + @host.info() + + @host.id.should eql(7) + @host.name.should eql('dummyhost') + @host.state.should eql(2) + @host.state_str.should eql('MONITORED') + @host.short_state_str.should eql('on') + end + + it "should enable the HOST" do + rc = @host.enable() + + rc.should eql(nil) + end + + it "should disable the HOST" do + rc = @host.disable() + + rc.should eql(nil) + end + + it "should delete the HOST" do + rc = @host.delete() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @host['ID'].should eql('7') + @host['NAME'].should eql('dummyhost') + @host['STATE'].should eql('2') + @host['IM_MAD'].should eql('im_dummy') + @host['LAST_MON_TIME'].should eql('1277733596') + @host['HOST_SHARE/MEM_USAGE'].should eql('1572864') + @host['HOST_SHARE/CPU_USAGE'].should eql('300') + @host['HOST_SHARE/FREE_CPU'].should eql('800') + @host['HOST_SHARE/RUNNING_VMS'].should eql('3') + @host['TEMPLATE/CPUSPEED'].should eql('2.2GHz') + @host['TEMPLATE/HYPERVISOR'].should eql('dummy') + @host['TEMPLATE/TOTALMEMORY'].should eql('16777216') + end + + it "should get a hash representation of the HOST" do + host_hash = @host.to_hash + host_hash['HOST']['ID'].should eql('7') + host_hash['HOST']['NAME'].should eql('dummyhost') + host_hash['HOST']['STATE'].should eql('2') + host_hash['HOST']['IM_MAD'].should eql('im_dummy') + host_hash['HOST']['LAST_MON_TIME'].should eql('1277733596') + host_hash['HOST']['HOST_SHARE']['MEM_USAGE'].should eql('1572864') + host_hash['HOST']['HOST_SHARE']['CPU_USAGE'].should eql('300') + host_hash['HOST']['HOST_SHARE']['FREE_CPU'].should eql('800') + host_hash['HOST']['HOST_SHARE']['RUNNING_VMS'].should eql('3') + host_hash['HOST']['TEMPLATE']['CPUSPEED'].should eql('2.2GHz') + host_hash['HOST']['TEMPLATE']['HYPERVISOR'].should eql('dummy') + host_hash['HOST']['TEMPLATE']['TOTALMEMORY'].should eql('16777216') + end + end + + describe "Host using REXML" do + before(:all) do + NOKOGIRI=false + + @xml = Host.build_xml(7) + + client = MockClient.new() + @host = Host.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should allocate the new HOST" do + @host.allocate(nil,nil,nil,nil) + + @host.id.should eql(7) + end + + it "should update the HOST info" do + @host.info() + + @host.id.should eql(7) + @host.name.should eql('dummyhost') + @host.state.should eql(2) + @host.state_str.should eql('MONITORED') + @host.short_state_str.should eql('on') + end + + it "should enable the HOST" do + rc = @host.enable() + + rc.should eql(nil) + end + + it "should disable the HOST" do + rc = @host.disable() + + rc.should eql(nil) + end + + it "should delete the HOST" do + rc = @host.delete() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @host['ID'].should eql('7') + @host['NAME'].should eql('dummyhost') + @host['STATE'].should eql('2') + @host['IM_MAD'].should eql('im_dummy') + @host['LAST_MON_TIME'].should eql('1277733596') + @host['HOST_SHARE/MEM_USAGE'].should eql('1572864') + @host['HOST_SHARE/CPU_USAGE'].should eql('300') + @host['HOST_SHARE/FREE_CPU'].should eql('800') + @host['HOST_SHARE/RUNNING_VMS'].should eql('3') + @host['TEMPLATE/CPUSPEED'].should eql('2.2GHz') + @host['TEMPLATE/HYPERVISOR'].should eql('dummy') + @host['TEMPLATE/TOTALMEMORY'].should eql('16777216') + end + + it "should get a hash representation of the HOST" do + host_hash = @host.to_hash + host_hash['HOST']['ID'].should eql('7') + host_hash['HOST']['NAME'].should eql('dummyhost') + host_hash['HOST']['STATE'].should eql('2') + host_hash['HOST']['IM_MAD'].should eql('im_dummy') + host_hash['HOST']['LAST_MON_TIME'].should eql('1277733596') + host_hash['HOST']['HOST_SHARE']['MEM_USAGE'].should eql('1572864') + host_hash['HOST']['HOST_SHARE']['CPU_USAGE'].should eql('300') + host_hash['HOST']['HOST_SHARE']['FREE_CPU'].should eql('800') + host_hash['HOST']['HOST_SHARE']['RUNNING_VMS'].should eql('3') + host_hash['HOST']['TEMPLATE']['CPUSPEED'].should eql('2.2GHz') + host_hash['HOST']['TEMPLATE']['HYPERVISOR'].should eql('dummy') + host_hash['HOST']['TEMPLATE']['TOTALMEMORY'].should eql('16777216') + end + end + + + describe "Host using NOKOGIRI without id" do + before(:all) do + NOKOGIRI=true + + @xml = Host.build_xml() + + client = MockClient.new() + @host = Host.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should get Error getting info" do + rc = @host.info() + + OpenNebula.is_error?(rc).should eql(true) + @host.id.should eql(nil) + @host.name.should eql(nil) + end + + it "should enable the HOST" do + rc = @host.enable() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should disable the HOST" do + rc = @host.disable() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should get Error deleting the HOST" do + rc = @host.delete() + + OpenNebula.is_error?(rc).should eql(true) + end + end + + describe "Host using REXML without id" do + before(:all) do + NOKOGIRI=false + + @xml = Host.build_xml() + + client = MockClient.new() + @host = Host.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should get Error getting info" do + rc = @host.info() + + OpenNebula.is_error?(rc).should eql(true) + @host.id.should eql(nil) + @host.name.should eql(nil) + end + + it "should enable the HOST" do + rc = @host.enable() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should disable the HOST" do + rc = @host.disable() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should get Error deleting the HOST" do + rc = @host.delete() + + OpenNebula.is_error?(rc).should eql(true) + end + end + +end \ No newline at end of file diff --git a/src/oca/ruby/test/MockClient.rb b/src/oca/ruby/test/MockClient.rb new file mode 100644 index 0000000000..9ec22687ff --- /dev/null +++ b/src/oca/ruby/test/MockClient.rb @@ -0,0 +1,49 @@ +class MockClient + + def call(action, *args) + xmlrpc_action = "one."+action + + case xmlrpc_action + when "one.vn.info" + return File.read("xml_test/vnet.xml") + when "one.vn.allocate" + return 3 + when "one.vn.delete" + return nil + when "one.vm.info" + return File.read("xml_test/vm.xml") + when "one.vm.allocate" + return 6 + when "one.vm.delete" + return nil + when "one.vm.action" + return nil + when "one.vm.deploy" + return nil + when "one.vm.migrate" + return nil + when "one.host.info" + return File.read("xml_test/host.xml") + when "one.host.allocate" + return 7 + when "one.host.delete" + return nil + when "one.host.enable" + return nil + when "one.user.allocate" + return 3 + when "one.user.info" + return File.read("xml_test/user.xml") + when "one.user.delete" + return nil + when "one.vnpool.info" + return File.read("xml_test/vnetpool.xml") + when "one.vmpool.info" + return File.read("xml_test/vmpool.xml") + when "one.hostpool.info" + return File.read("xml_test/hostpool.xml") + when "one.userpool.info" + return File.read("xml_test/userpool.xml") + end + end +end \ No newline at end of file diff --git a/src/oca/ruby/test/UserPool_spec.rb b/src/oca/ruby/test/UserPool_spec.rb new file mode 100644 index 0000000000..38acf157eb --- /dev/null +++ b/src/oca/ruby/test/UserPool_spec.rb @@ -0,0 +1,81 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "User using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + client = MockClient.new() + @user_pool = UserPool.new(client) + end + + it "should update the USER_POOL info" do + rc = @user_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the USER_POOL elements and get info from them" do + rc = @user_pool.each{ |user| + user.class.to_s.should eql("OpenNebula::User") + if user.id == 0 + user.name.should eql('oneadmin') + elsif user.id == 1 + user.name.should eql('dan') + end + } + end + + it "should get a hash representation of the USER_POOL" do + user_hash = @user_pool.to_hash + user_hash['USER_POOL']['USER'][0]['ID'].should eql('0') + user_hash['USER_POOL']['USER'][0]['NAME'].should eql('oneadmin') + user_hash['USER_POOL']['USER'][0]['PASSWORD'].should eql('f13a1234833436f71ab846572d251c0d40391e72') + user_hash['USER_POOL']['USER'][0]['ENABLED'].should eql('True') + user_hash['USER_POOL']['USER'][1]['ID'].should eql('1') + user_hash['USER_POOL']['USER'][1]['NAME'].should eql('dan') + user_hash['USER_POOL']['USER'][1]['PASSWORD'].should eql('d22a12348334v33f71ba846572d25250d40701e72') + user_hash['USER_POOL']['USER'][1]['ENABLED'].should eql('False') + end + end + + describe "User using REXML" do + before(:all) do + NOKOGIRI=false + + client = MockClient.new() + @user_pool = UserPool.new(client) + end + + it "should update the USER_POOL info" do + rc = @user_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the USER_POOL elements and get info from them" do + rc = @user_pool.each{ |user| + user.class.to_s.should eql("OpenNebula::User") + if user.id == 0 + user.name.should eql('oneadmin') + elsif user.id == 1 + user.name.should eql('dan') + end + } + end + + it "should get a hash representation of the USER_POOL" do + user_hash = @user_pool.to_hash + user_hash['USER_POOL']['USER'][0]['ID'].should eql('0') + user_hash['USER_POOL']['USER'][0]['NAME'].should eql('oneadmin') + user_hash['USER_POOL']['USER'][0]['PASSWORD'].should eql('f13a1234833436f71ab846572d251c0d40391e72') + user_hash['USER_POOL']['USER'][0]['ENABLED'].should eql('True') + user_hash['USER_POOL']['USER'][1]['ID'].should eql('1') + user_hash['USER_POOL']['USER'][1]['NAME'].should eql('dan') + user_hash['USER_POOL']['USER'][1]['PASSWORD'].should eql('d22a12348334v33f71ba846572d25250d40701e72') + user_hash['USER_POOL']['USER'][1]['ENABLED'].should eql('False') + end + end +end \ No newline at end of file diff --git a/src/oca/ruby/test/User_spec.rb b/src/oca/ruby/test/User_spec.rb new file mode 100644 index 0000000000..c889991271 --- /dev/null +++ b/src/oca/ruby/test/User_spec.rb @@ -0,0 +1,161 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "User using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + @xml = User.build_xml(3) + + client = MockClient.new() + @user = User.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should allocate the new USER" do + @user.allocate(nil,nil) + + @user.id.should eql(3) + end + + it "should update the USER info" do + @user.info() + + @user.id.should eql(3) + @user.name.should eql('dan') + end + + it "should delete the USER" do + rc = @user.delete() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @user['ID'].should eql('3') + @user['NAME'].should eql('dan') + @user['PASSWORD'].should eql('d22a12348334v33f71ba846572d25250d40701e72') + @user['ENABLED'].should eql('False') + end + + it "should get a hash representation of the USER" do + user_hash = @user.to_hash + user_hash['USER']['ID'].should eql('3') + user_hash['USER']['NAME'].should eql('dan') + user_hash['USER']['PASSWORD'].should eql('d22a12348334v33f71ba846572d25250d40701e72') + user_hash['USER']['ENABLED'].should eql('False') + end + end + + describe "User using REXML" do + before(:all) do + NOKOGIRI=false + + @xml = User.build_xml(3) + + client = MockClient.new() + @user = User.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should allocate the new USER" do + @user.allocate(nil,nil) + + @user.id.should eql(3) + end + + it "should update the USER info" do + @user.info() + + @user.id.should eql(3) + @user.name.should eql('dan') + end + + it "should delete the USER" do + rc = @user.delete() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @user['ID'].should eql('3') + @user['NAME'].should eql('dan') + @user['PASSWORD'].should eql('d22a12348334v33f71ba846572d25250d40701e72') + @user['ENABLED'].should eql('False') + end + + it "should get a hash representation of the USER" do + user_hash = @user.to_hash + user_hash['USER']['ID'].should eql('3') + user_hash['USER']['NAME'].should eql('dan') + user_hash['USER']['PASSWORD'].should eql('d22a12348334v33f71ba846572d25250d40701e72') + user_hash['USER']['ENABLED'].should eql('False') + end + end + + + describe "User using NOKOGIRI without id" do + before(:all) do + NOKOGIRI=true + + @xml = User.build_xml() + + client = MockClient.new() + @user = User.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should get Error getting info" do + rc = @user.info() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should get Error deleting the USER" do + rc = @user.delete() + + OpenNebula.is_error?(rc).should eql(true) + end + end + + describe "User using REXML without id" do + before(:all) do + NOKOGIRI=false + + @xml = User.build_xml() + + client = MockClient.new() + @user = User.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should get Error getting info" do + rc = @user.info() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should get Error deleting the USER" do + rc = @user.delete() + + OpenNebula.is_error?(rc).should eql(true) + end + end + +end \ No newline at end of file diff --git a/src/oca/ruby/test/VirtualMachinePool_spec.rb b/src/oca/ruby/test/VirtualMachinePool_spec.rb new file mode 100644 index 0000000000..f8d66d0e62 --- /dev/null +++ b/src/oca/ruby/test/VirtualMachinePool_spec.rb @@ -0,0 +1,105 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "VirtualMachinePool using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + client = MockClient.new() + @vm_pool = VirtualMachinePool.new(client) + end + + it "should update the VM_POOL info" do + rc = @vm_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the VM_POOL elements and get info from them" do + rc = @vm_pool.each{ |vm| + vm.class.to_s.should eql("OpenNebula::VirtualMachine") + if vm.id == 6 + vm.name.should eql('vm-example') + vm.state.should eql(3) + vm.state_str.should eql('ACTIVE') + elsif vm.id == 8 + vm.name.should eql('vmext') + vm.state.should eql(4) + vm.state_str.should eql('STOPPED') + end + } + end + + it "should get a hash representation of the VM_POOL" do + vm_hash = @vm_pool.to_hash + vm_hash['VM_POOL']['VM'][0]['ID'].should eql('6') + vm_hash['VM_POOL']['VM'][0]['UID'].should eql('0') + vm_hash['VM_POOL']['VM'][0]['USERNAME'].should eql('oneadmin') + vm_hash['VM_POOL']['VM'][0]['NAME'].should eql('vm-example') + vm_hash['VM_POOL']['VM'][0]['LAST_POLL'].should eql('1277910006') + vm_hash['VM_POOL']['VM'][0]['HISTORY']['HOSTNAME'].should eql('dummyhost') + vm_hash['VM_POOL']['VM'][0]['HISTORY']['STIME'].should eql('1277375186') + vm_hash['VM_POOL']['VM'][0]['HISTORY']['REASON'].should eql('0') + vm_hash['VM_POOL']['VM'][2]['ID'].should eql('8') + vm_hash['VM_POOL']['VM'][2]['UID'].should eql('0') + vm_hash['VM_POOL']['VM'][2]['USERNAME'].should eql('oneadmin') + vm_hash['VM_POOL']['VM'][2]['NAME'].should eql('vmext') + vm_hash['VM_POOL']['VM'][2]['LAST_POLL'].should eql('1277910006') + vm_hash['VM_POOL']['VM'][2]['HISTORY']['HOSTNAME'].should eql('thost') + vm_hash['VM_POOL']['VM'][2]['HISTORY']['STIME'].should eql('1277377556') + vm_hash['VM_POOL']['VM'][2]['HISTORY']['REASON'].should eql('0') + end + end + + describe "VirtualMachinePool using REXML" do + before(:all) do + NOKOGIRI=false + + client = MockClient.new() + @vm_pool = VirtualMachinePool.new(client) + end + + it "should update the VM_POOL info" do + rc = @vm_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the VM_POOL elements and get info from them" do + rc = @vm_pool.each{ |vm| + vm.class.to_s.should eql("OpenNebula::VirtualMachine") + if vm.id == 6 + vm.name.should eql('vm-example') + vm.state.should eql(3) + vm.state_str.should eql('ACTIVE') + elsif vm.id == 8 + vm.name.should eql('vmext') + vm.state.should eql(4) + vm.state_str.should eql('STOPPED') + end + } + end + + it "should get a hash representation of the VM_POOL" do + vm_hash = @vm_pool.to_hash + vm_hash['VM_POOL']['VM'][0]['ID'].should eql('6') + vm_hash['VM_POOL']['VM'][0]['UID'].should eql('0') + vm_hash['VM_POOL']['VM'][0]['USERNAME'].should eql('oneadmin') + vm_hash['VM_POOL']['VM'][0]['NAME'].should eql('vm-example') + vm_hash['VM_POOL']['VM'][0]['LAST_POLL'].should eql('1277910006') + vm_hash['VM_POOL']['VM'][0]['HISTORY']['HOSTNAME'].should eql('dummyhost') + vm_hash['VM_POOL']['VM'][0]['HISTORY']['STIME'].should eql('1277375186') + vm_hash['VM_POOL']['VM'][0]['HISTORY']['REASON'].should eql('0') + vm_hash['VM_POOL']['VM'][2]['ID'].should eql('8') + vm_hash['VM_POOL']['VM'][2]['UID'].should eql('0') + vm_hash['VM_POOL']['VM'][2]['USERNAME'].should eql('oneadmin') + vm_hash['VM_POOL']['VM'][2]['NAME'].should eql('vmext') + vm_hash['VM_POOL']['VM'][2]['LAST_POLL'].should eql('1277910006') + vm_hash['VM_POOL']['VM'][2]['HISTORY']['HOSTNAME'].should eql('thost') + vm_hash['VM_POOL']['VM'][2]['HISTORY']['STIME'].should eql('1277377556') + vm_hash['VM_POOL']['VM'][2]['HISTORY']['REASON'].should eql('0') + end + end +end \ No newline at end of file diff --git a/src/oca/ruby/test/VirtualMachine_spec.rb b/src/oca/ruby/test/VirtualMachine_spec.rb new file mode 100644 index 0000000000..2cd35489e9 --- /dev/null +++ b/src/oca/ruby/test/VirtualMachine_spec.rb @@ -0,0 +1,464 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "VirtualMachine using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + @xml = VirtualMachine.build_xml(6) + + client = MockClient.new() + @vm = VirtualMachine.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should allocate the new VM" do + @vm.allocate(nil) + + @vm.id.should eql(6) + end + + it "should update the VM info" do + @vm.info() + + @vm.id.should eql(6) + @vm.name.should eql('vm-example') + @vm.state.should eql(3) + @vm.state_str.should eql('ACTIVE') + @vm.lcm_state.should eql(3) + @vm.lcm_state_str.should eql('RUNNING') + @vm.status.should eql('runn') + end + + it "should deploy the VNET" do + rc = @vm.deploy(nil) + + rc.should eql(nil) + end + + it "should migrate the VNET" do + rc = @vm.migrate(nil) + + rc.should eql(nil) + end + + it "should live_migrate the VNET" do + rc = @vm.live_migrate(nil) + + rc.should eql(nil) + end + + it "should shutdown the VNET" do + rc = @vm.shutdown() + + rc.should eql(nil) + end + + it "should cancel the VNET" do + rc = @vm.cancel() + + rc.should eql(nil) + end + + it "should hold the VNET" do + rc = @vm.hold() + + rc.should eql(nil) + end + + it "should release the VNET" do + rc = @vm.release() + + rc.should eql(nil) + end + + it "should stop the VNET" do + rc = @vm.stop() + + rc.should eql(nil) + end + + it "should suspend the VNET" do + rc = @vm.suspend() + + rc.should eql(nil) + end + + it "should resume the VNET" do + rc = @vm.resume() + + rc.should eql(nil) + end + + it "should finalize the VNET" do + rc = @vm.finalize() + + rc.should eql(nil) + end + + it "should restart the VNET" do + rc = @vm.restart() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @vm['NAME'].should eql('vm-example') + @vm['DEPLOY_ID'].should eql('dummy') + @vm['TEMPLATE/MEMORY'].should eql('512') + @vm['ID'].should eql('6') + @vm['NAME'].should eql('vm-example') + @vm['LCM_STATE'].should eql('3') + @vm['DEPLOY_ID'].should eql('dummy') + @vm['TEMPLATE/MEMORY'].should eql('512') + @vm['TEMPLATE/CONTEXT/DNS'].should eql('192.169.1.4') + @vm['TEMPLATE/DISK/SIZE'].should eql('1024') + @vm['HISTORY/HOSTNAME'].should eql('dummyhost') + @vm['HISTORY/PSTIME'].should eql('1277375186') + end + + it "should get a hash representation of the VM" do + vm_hash = @vm.to_hash + vm_hash['VM']['ID'].should eql('6') + vm_hash['VM']['NAME'].should eql('vm-example') + vm_hash['VM']['LCM_STATE'].should eql('3') + vm_hash['VM']['DEPLOY_ID'].should eql('dummy') + vm_hash['VM']['TEMPLATE']['MEMORY'].should eql('512') + vm_hash['VM']['TEMPLATE']['CONTEXT']['DNS'].should eql('192.169.1.4') + vm_hash['VM']['TEMPLATE']['DISK'][0]['TARGET'].should eql('sda') + vm_hash['VM']['HISTORY']['HOSTNAME'].should eql('dummyhost') + vm_hash['VM']['HISTORY']['PSTIME'].should eql('1277375186') + end + end + + describe "VirtualMachine using REXML" do + before(:all) do + NOKOGIRI=false + + @xml = VirtualMachine.build_xml(6) + + client = MockClient.new() + @vm = VirtualMachine.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should allocate the new VM" do + @vm.allocate(nil) + + @vm.id.should eql(6) + end + + it "should update the VM info" do + @vm.info() + + @vm.id.should eql(6) + @vm.name.should eql('vm-example') + @vm.state.should eql(3) + @vm.state_str.should eql('ACTIVE') + @vm.lcm_state.should eql(3) + @vm.lcm_state_str.should eql('RUNNING') + @vm.status.should eql('runn') + end + + it "should deploy the VNET" do + rc = @vm.deploy(nil) + + rc.should eql(nil) + end + + it "should migrate the VNET" do + rc = @vm.migrate(nil) + + rc.should eql(nil) + end + + it "should live_migrate the VNET" do + rc = @vm.live_migrate(nil) + + rc.should eql(nil) + end + + it "should shutdown the VNET" do + rc = @vm.shutdown() + + rc.should eql(nil) + end + + it "should cancel the VNET" do + rc = @vm.cancel() + + rc.should eql(nil) + end + + it "should hold the VNET" do + rc = @vm.hold() + + rc.should eql(nil) + end + + it "should release the VNET" do + rc = @vm.release() + + rc.should eql(nil) + end + + it "should stop the VNET" do + rc = @vm.stop() + + rc.should eql(nil) + end + + it "should suspend the VNET" do + rc = @vm.suspend() + + rc.should eql(nil) + end + + it "should resume the VNET" do + rc = @vm.resume() + + rc.should eql(nil) + end + + it "should finalize the VNET" do + rc = @vm.finalize() + + rc.should eql(nil) + end + + it "should restart the VNET" do + rc = @vm.restart() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @vm['NAME'].should eql('vm-example') + @vm['DEPLOY_ID'].should eql('dummy') + @vm['TEMPLATE/MEMORY'].should eql('512') + @vm['ID'].should eql('6') + @vm['NAME'].should eql('vm-example') + @vm['LCM_STATE'].should eql('3') + @vm['DEPLOY_ID'].should eql('dummy') + @vm['TEMPLATE/MEMORY'].should eql('512') + @vm['TEMPLATE/CONTEXT/DNS'].should eql('192.169.1.4') + @vm['TEMPLATE/DISK/SIZE'].should eql('1024') + @vm['HISTORY/HOSTNAME'].should eql('dummyhost') + @vm['HISTORY/PSTIME'].should eql('1277375186') + end + + it "should get a hash representation of the VM" do + vm_hash = @vm.to_hash + vm_hash['VM']['ID'].should eql('6') + vm_hash['VM']['NAME'].should eql('vm-example') + vm_hash['VM']['LCM_STATE'].should eql('3') + vm_hash['VM']['DEPLOY_ID'].should eql('dummy') + vm_hash['VM']['TEMPLATE']['MEMORY'].should eql('512') + vm_hash['VM']['TEMPLATE']['CONTEXT']['DNS'].should eql('192.169.1.4') + vm_hash['VM']['TEMPLATE']['DISK'][0]['TARGET'].should eql('sda') + vm_hash['VM']['HISTORY']['HOSTNAME'].should eql('dummyhost') + vm_hash['VM']['HISTORY']['PSTIME'].should eql('1277375186') + end + end + + + describe "VirtualMachine using NOKOGIRI without id" do + before(:all) do + NOKOGIRI=true + + @xml = VirtualMachine.build_xml() + + client = MockClient.new() + @vm = VirtualMachine.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should deploy the VNET" do + rc = @vm.deploy(nil) + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should migrate the VNET" do + rc = @vm.migrate(nil) + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should live_migrate the VNET" do + rc = @vm.live_migrate(nil) + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should shutdown the VNET" do + rc = @vm.shutdown() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should cancel the VNET" do + rc = @vm.cancel() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should hold the VNET" do + rc = @vm.hold() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should release the VNET" do + rc = @vm.release() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should stop the VNET" do + rc = @vm.stop() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should suspend the VNET" do + rc = @vm.suspend() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should resume the VNET" do + rc = @vm.resume() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should finalize the VNET" do + rc = @vm.finalize() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should restart the VNET" do + rc = @vm.restart() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should get Error getting info" do + rc = @vm.info() + + OpenNebula.is_error?(rc).should eql(true) + @vm.id.should eql(nil) + @vm.name.should eql(nil) + end + end + + describe "VirtualMachine using REXML without id" do + before(:all) do + NOKOGIRI=false + + @xml = VirtualMachine.build_xml() + + client = MockClient.new() + @vm = VirtualMachine.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should deploy the VNET" do + rc = @vm.deploy(nil) + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should migrate the VNET" do + rc = @vm.migrate(nil) + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should live_migrate the VNET" do + rc = @vm.live_migrate(nil) + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should shutdown the VNET" do + rc = @vm.shutdown() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should cancel the VNET" do + rc = @vm.cancel() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should hold the VNET" do + rc = @vm.hold() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should release the VNET" do + rc = @vm.release() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should stop the VNET" do + rc = @vm.stop() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should suspend the VNET" do + rc = @vm.suspend() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should resume the VNET" do + rc = @vm.resume() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should finalize the VNET" do + rc = @vm.finalize() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should restart the VNET" do + rc = @vm.restart() + + OpenNebula.is_error?(rc).should eql(true) + end + + it "should get Error getting info" do + rc = @vm.info() + + OpenNebula.is_error?(rc).should eql(true) + @vm.id.should eql(nil) + @vm.name.should eql(nil) + end + end +end \ No newline at end of file diff --git a/src/oca/ruby/test/VirtualNetworkPool_spec.rb b/src/oca/ruby/test/VirtualNetworkPool_spec.rb new file mode 100644 index 0000000000..bd373e488d --- /dev/null +++ b/src/oca/ruby/test/VirtualNetworkPool_spec.rb @@ -0,0 +1,103 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "VirtualNetwork using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + client = MockClient.new() + @vnet_pool = VirtualNetworkPool.new(client) + end + + #it "should get nil, trying to get a hash, if the info method was not called before" do + # vnet_hash = @vnet_pool.to_hash + # vnet_hash.nil?.should eql(true) + #end + + it "should update the VNET_POOL info" do + rc = @vnet_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the VNET_POOL elements and get info from them" do + rc = @vnet_pool.each{ |vn| + vn.class.to_s.should eql("OpenNebula::VirtualNetwork") + if vn.id == 4 + vn.name.should eql('Red LAN') + elsif vn.id == 5 + vn.name.should eql('Public') + end + } + end + + it "should get a hash representation of the VNET_POOL" do + vnet_hash = @vnet_pool.to_hash + vnet_hash['VNET_POOL']['VNET'][0]['ID'].should eql('4') + vnet_hash['VNET_POOL']['VNET'][0]['UID'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][0]['USERNAME'].should eql('oneadmin') + vnet_hash['VNET_POOL']['VNET'][0]['NAME'].should eql('Red LAN') + vnet_hash['VNET_POOL']['VNET'][0]['TYPE'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][0]['BRIDGE'].should eql('vbr0') + vnet_hash['VNET_POOL']['VNET'][0]['TOTAL_LEASES'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][1]['ID'].should eql('5') + vnet_hash['VNET_POOL']['VNET'][1]['UID'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][1]['USERNAME'].should eql('oneadmin') + vnet_hash['VNET_POOL']['VNET'][1]['NAME'].should eql('Public') + vnet_hash['VNET_POOL']['VNET'][1]['TYPE'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][1]['BRIDGE'].should eql('vbr0') + vnet_hash['VNET_POOL']['VNET'][1]['TOTAL_LEASES'].should eql('1') + end + end + + describe "VirtualNetwork using REXML" do + before(:all) do + NOKOGIRI=false + + client = MockClient.new() + @vnet_pool = VirtualNetworkPool.new(client) + end + + #it "should get nil, trying to get a hash, if the info method was not called before" do + # vnet_hash = @vnet_pool.to_hash + # vnet_hash.nil?.should eql(true) + #end + + it "should update the VNET_POOL info" do + rc = @vnet_pool.info() + rc.nil?.should eql(true) + end + + it "should iterate the VNET_POOL elements and get info from them" do + rc = @vnet_pool.each{ |vn| + vn.class.to_s.should eql("OpenNebula::VirtualNetwork") + if vn.id == 4 + vn.name.should eql('Red LAN') + elsif vn.id == 5 + vn.name.should eql('Public') + end + } + end + + it "should get a hash representation of the VNET_POOL" do + vnet_hash = @vnet_pool.to_hash + vnet_hash['VNET_POOL']['VNET'][0]['ID'].should eql('4') + vnet_hash['VNET_POOL']['VNET'][0]['UID'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][0]['USERNAME'].should eql('oneadmin') + vnet_hash['VNET_POOL']['VNET'][0]['NAME'].should eql('Red LAN') + vnet_hash['VNET_POOL']['VNET'][0]['TYPE'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][0]['BRIDGE'].should eql('vbr0') + vnet_hash['VNET_POOL']['VNET'][0]['TOTAL_LEASES'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][1]['ID'].should eql('5') + vnet_hash['VNET_POOL']['VNET'][1]['UID'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][1]['USERNAME'].should eql('oneadmin') + vnet_hash['VNET_POOL']['VNET'][1]['NAME'].should eql('Public') + vnet_hash['VNET_POOL']['VNET'][1]['TYPE'].should eql('0') + vnet_hash['VNET_POOL']['VNET'][1]['BRIDGE'].should eql('vbr0') + vnet_hash['VNET_POOL']['VNET'][1]['TOTAL_LEASES'].should eql('1') + end + end +end \ No newline at end of file diff --git a/src/oca/ruby/test/VirtualNetwork_spec.rb b/src/oca/ruby/test/VirtualNetwork_spec.rb new file mode 100644 index 0000000000..89682e28df --- /dev/null +++ b/src/oca/ruby/test/VirtualNetwork_spec.rb @@ -0,0 +1,183 @@ +$: << '../' + +require 'OpenNebula' +require 'MockClient' + +module OpenNebula + + describe "VirtualNetwork using NOKOGIRI" do + before(:all) do + NOKOGIRI=true + + @xml = VirtualNetwork.build_xml(3) + + client = MockClient.new() + @vnet = VirtualNetwork.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should allocate the new VNET" do + @vnet.allocate(nil) + + @vnet.id.should eql(3) + end + + it "should update the VNET info" do + @vnet.info() + + @vnet.id.should eql(3) + @vnet.name.should eql('Red LAN') + end + + it "should delete the VNET" do + rc = @vnet.delete() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @vnet['ID'].should eql('3') + @vnet['NAME'].should eql('Red LAN') + @vnet['BRIDGE'].should eql('vbr0') + @vnet['TEMPLATE/NETWORK_ADDRESS'].should eql('192.168.0.0') + @vnet['TEMPLATE/TYPE'].should eql('RANGED') + @vnet['LEASES/LEASE/IP'].should eql('192.168.0.1') + @vnet['LEASES/LEASE/USED'].should eql('1') + end + + it "should get a hash representation of the VNET" do + vnet_hash = @vnet.to_hash + vnet_hash['VNET']['NAME'].should eql('Red LAN') + vnet_hash['VNET']['BRIDGE'].should eql('vbr0') + vnet_hash['VNET']['TEMPLATE']['NETWORK_ADDRESS'].should eql('192.168.0.0') + vnet_hash['VNET']['ID'].should eql('3') + vnet_hash['VNET']['NAME'].should eql('Red LAN') + vnet_hash['VNET']['BRIDGE'].should eql('vbr0') + vnet_hash['VNET']['TEMPLATE']['NETWORK_ADDRESS'].should eql('192.168.0.0') + vnet_hash['VNET']['TEMPLATE']['TYPE'].should eql('RANGED') + vnet_hash['VNET']['LEASES']['LEASE']['IP'].should eql('192.168.0.1') + vnet_hash['VNET']['LEASES']['LEASE']['USED'].should eql('1') + end + end + + describe "VirtualNetwork using REXML" do + before(:all) do + NOKOGIRI=false + + @xml = VirtualNetwork.build_xml(3) + + client = MockClient.new() + @vnet = VirtualNetwork.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should allocate the new VNET" do + @vnet.allocate(nil) + + @vnet.id.should eql(3) + end + + it "should update the VNET info" do + @vnet.info() + + @vnet.id.should eql(3) + @vnet.name.should eql('Red LAN') + end + + it "should delete the VNET" do + rc = @vnet.delete() + + rc.should eql(nil) + end + + it "should access an attribute using []" do + @vnet['ID'].should eql('3') + @vnet['NAME'].should eql('Red LAN') + @vnet['BRIDGE'].should eql('vbr0') + @vnet['TEMPLATE/NETWORK_ADDRESS'].should eql('192.168.0.0') + @vnet['TEMPLATE/TYPE'].should eql('RANGED') + @vnet['LEASES/LEASE/IP'].should eql('192.168.0.1') + @vnet['LEASES/LEASE/USED'].should eql('1') + end + + it "should get a hash representation of the VNET" do + vnet_hash = @vnet.to_hash + vnet_hash['VNET']['NAME'].should eql('Red LAN') + vnet_hash['VNET']['BRIDGE'].should eql('vbr0') + vnet_hash['VNET']['TEMPLATE']['NETWORK_ADDRESS'].should eql('192.168.0.0') + vnet_hash['VNET']['ID'].should eql('3') + vnet_hash['VNET']['NAME'].should eql('Red LAN') + vnet_hash['VNET']['BRIDGE'].should eql('vbr0') + vnet_hash['VNET']['TEMPLATE']['NETWORK_ADDRESS'].should eql('192.168.0.0') + vnet_hash['VNET']['TEMPLATE']['TYPE'].should eql('RANGED') + vnet_hash['VNET']['LEASES']['LEASE']['IP'].should eql('192.168.0.1') + vnet_hash['VNET']['LEASES']['LEASE']['USED'].should eql('1') + end + end + + + describe "VirtualNetwork using NOKOGIRI without id" do + before(:all) do + NOKOGIRI=true + + @xml = VirtualNetwork.build_xml() + + client = MockClient.new() + @vnet = VirtualNetwork.new(@xml,client) + end + + it "should create a Nokogiri Node" do + @xml.class.to_s.should eql('Nokogiri::XML::NodeSet') + end + + it "should get Error getting info" do + rc = @vnet.info() + + OpenNebula.is_error?(rc).should eql(true) + @vnet.id.should eql(nil) + @vnet.name.should eql(nil) + end + + it "should get Error deleting the VNET" do + rc = @vnet.delete() + + OpenNebula.is_error?(rc).should eql(true) + end + end + + describe "VirtualNetwork using REXML without id" do + before(:all) do + NOKOGIRI=false + + @xml = VirtualNetwork.build_xml() + + client = MockClient.new() + @vnet = VirtualNetwork.new(@xml,client) + end + + it "should create a REXML Element" do + @xml.class.to_s.should eql('REXML::Element') + end + + it "should get Error getting info" do + rc = @vnet.info() + + OpenNebula.is_error?(rc).should eql(true) + @vnet.id.should eql(nil) + @vnet.name.should eql(nil) + end + + it "should get Error deleting the VNET" do + rc = @vnet.delete() + + OpenNebula.is_error?(rc).should eql(true) + end + end + +end \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/host.xml b/src/oca/ruby/test/xml_test/host.xml new file mode 100644 index 0000000000..55710fe305 --- /dev/null +++ b/src/oca/ruby/test/xml_test/host.xml @@ -0,0 +1,38 @@ + + 7 + dummyhost + 2 + im_dummy + vmm_dummy + tm_dummy + 1277733596 + + 0 + 0 + 1572864 + 300 + 0 + 16777216 + 800 + 0 + 16777216 + 800 + 0 + 0 + 0 + 3 + + + \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/hostpool.xml b/src/oca/ruby/test/xml_test/hostpool.xml new file mode 100644 index 0000000000..50fe5fc2b6 --- /dev/null +++ b/src/oca/ruby/test/xml_test/hostpool.xml @@ -0,0 +1,52 @@ + + + 0 + dummyhost + 2 + im_dummy + vmm_dummy + tm_dummy + 1277912461 + + 0 + 0 + 1572864 + 300 + 0 + 16777216 + 800 + 0 + 16777216 + 800 + 0 + 0 + 0 + 3 + + + + 1 + thost + 2 + im_dummy + vmm_dummy + tm_dummy + 1277912461 + + 1 + 0 + 0 + 0 + 0 + 16777216 + 800 + 0 + 16777216 + 800 + 0 + 0 + 0 + 0 + + + \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/user.xml b/src/oca/ruby/test/xml_test/user.xml new file mode 100644 index 0000000000..eab4482685 --- /dev/null +++ b/src/oca/ruby/test/xml_test/user.xml @@ -0,0 +1,6 @@ + + 3 + dan + d22a12348334v33f71ba846572d25250d40701e72 + False + \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/userpool.xml b/src/oca/ruby/test/xml_test/userpool.xml new file mode 100644 index 0000000000..d6d5565131 --- /dev/null +++ b/src/oca/ruby/test/xml_test/userpool.xml @@ -0,0 +1,14 @@ + + + 0 + oneadmin + f13a1234833436f71ab846572d251c0d40391e72 + True + + + 1 + dan + d22a12348334v33f71ba846572d25250d40701e72 + False + + \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/vm.xml b/src/oca/ruby/test/xml_test/vm.xml new file mode 100644 index 0000000000..9b5f2a1b20 --- /dev/null +++ b/src/oca/ruby/test/xml_test/vm.xml @@ -0,0 +1,59 @@ + + 6 + 0 + vm-example + 1277729095 + 3 + 3 + 1277375180 + 0 + dummy + 512 + 1 + 12345 + 0 + + + 0 + dummyhost + 0 + 1277375186 + 0 + 1277375186 + 1277375186 + 1277375186 + 0 + 0 + 0 + 0 + + \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/vmpool.xml b/src/oca/ruby/test/xml_test/vmpool.xml new file mode 100644 index 0000000000..7811116fd8 --- /dev/null +++ b/src/oca/ruby/test/xml_test/vmpool.xml @@ -0,0 +1,92 @@ + + + 6 + 0 + oneadmin + vm-example + 1277910006 + 3 + 3 + 1277375180 + 0 + dummy + 512 + 1 + 12345 + 0 + + 0 + dummyhost + 0 + 1277375186 + 0 + 1277375186 + 1277375186 + 1277375186 + 0 + 0 + 0 + 0 + + + + 7 + 0 + oneadmin + vm-in + 1277910006 + 3 + 3 + 1277377464 + 0 + dummy + 1024 + 2 + 12345 + 0 + + 0 + thost + 0 + 1277377466 + 0 + 1277377466 + 1277377466 + 1277377466 + 0 + 0 + 0 + 0 + + + + 8 + 0 + oneadmin + vmext + 1277910006 + 4 + 5 + 1277377533 + 0 + thost + 256 + 1 + 12345 + 0 + + 0 + thost + 0 + 1277377556 + 0 + 1277377556 + 1277377556 + 1277377556 + 0 + 0 + 0 + 0 + + + \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/vnet.xml b/src/oca/ruby/test/xml_test/vnet.xml new file mode 100644 index 0000000000..8df0c43070 --- /dev/null +++ b/src/oca/ruby/test/xml_test/vnet.xml @@ -0,0 +1,23 @@ + + 3 + 0 + Red LAN + 0 + vbr0 + + + + 192.168.0.1 + 00:03:c0:a8:00:01 + 1 + 18 + + + \ No newline at end of file diff --git a/src/oca/ruby/test/xml_test/vnetpool.xml b/src/oca/ruby/test/xml_test/vnetpool.xml new file mode 100644 index 0000000000..bc77abac40 --- /dev/null +++ b/src/oca/ruby/test/xml_test/vnetpool.xml @@ -0,0 +1,20 @@ + + + 4 + 0 + oneadmin + Red LAN + 0 + vbr0 + 0 + + + 5 + 0 + oneadmin + Public + 0 + vbr0 + 1 + + \ No newline at end of file From a185719604807dc9d1d2a6971c376eb95dc76ccd Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Fri, 2 Jul 2010 16:16:51 +0200 Subject: [PATCH 2/5] feature #192 Fixed error on to_xml method when no @xml, now it returns nil --- src/oca/ruby/OpenNebula/XMLUtils.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/oca/ruby/OpenNebula/XMLUtils.rb b/src/oca/ruby/OpenNebula/XMLUtils.rb index 2ed93c1765..31682be19c 100644 --- a/src/oca/ruby/OpenNebula/XMLUtils.rb +++ b/src/oca/ruby/OpenNebula/XMLUtils.rb @@ -95,7 +95,7 @@ module OpenNebula end def to_hash - if !@hash + if !@hash && @xml @hash=Crack::XML.parse(to_xml) end return @hash @@ -157,7 +157,7 @@ module OpenNebula end def to_hash - if !@hash + if !@hash && @xml @hash=Crack::XML.parse(to_xml) end return @hash From 76040825aa155109a275f726299b9c3314e3b637 Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Fri, 2 Jul 2010 16:17:37 +0200 Subject: [PATCH 3/5] feature #192 Fixed NOKOGIRI returning 0 instead of nil --- src/oca/ruby/OpenNebula/XMLUtils.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/oca/ruby/OpenNebula/XMLUtils.rb b/src/oca/ruby/OpenNebula/XMLUtils.rb index 31682be19c..b481c5f730 100644 --- a/src/oca/ruby/OpenNebula/XMLUtils.rb +++ b/src/oca/ruby/OpenNebula/XMLUtils.rb @@ -41,6 +41,9 @@ module OpenNebula def [](key) if NOKOGIRI element=@xml.xpath(key.to_s.upcase) + if element.size == 0 + return nil + end else element=@xml.elements[key.to_s.upcase] end From 909bdb0381c00b1de6abf59c570ecd80e15d7f65 Mon Sep 17 00:00:00 2001 From: Daniel Molina Date: Fri, 2 Jul 2010 16:19:26 +0200 Subject: [PATCH 4/5] feature #192 Fixed problem on REXML parser adding \n and whitespaces --- src/client/ruby/onehost | 4 ++-- src/client/ruby/oneuser | 2 +- src/client/ruby/onevm | 4 ++-- src/client/ruby/onevnet | 4 ++-- src/oca/ruby/OpenNebula/XMLUtils.rb | 16 ++++++++++++---- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/client/ruby/onehost b/src/client/ruby/onehost index d6a9cf6d05..3b5fd7db80 100755 --- a/src/client/ruby/onehost +++ b/src/client/ruby/onehost @@ -278,7 +278,7 @@ when "show" puts host.template_str else - puts host.to_xml + puts host.to_xml(true) end when "delete" @@ -322,7 +322,7 @@ when "list" else hostpool=OpenNebula::HostPool.new(get_one_client) hostpool.info - puts hostpool.to_xml + puts hostpool.to_xml(true) end when "top" diff --git a/src/client/ruby/oneuser b/src/client/ruby/oneuser index 8bbeff18ce..e175761b31 100755 --- a/src/client/ruby/oneuser +++ b/src/client/ruby/oneuser @@ -202,7 +202,7 @@ when "list" else userpool=OpenNebula::UserPool.new(get_one_client) userpool.info - puts userpool.to_xml + puts userpool.to_xml(true) end else diff --git a/src/client/ruby/onevm b/src/client/ruby/onevm index 9e40e67632..43135f2314 100755 --- a/src/client/ruby/onevm +++ b/src/client/ruby/onevm @@ -633,7 +633,7 @@ when "list" vmpool=OpenNebula::VirtualMachinePool.new(get_one_client, ops[:filter_user].to_i) vmpool.info - puts vmpool.to_xml + puts vmpool.to_xml(true) end when "top" @@ -718,7 +718,7 @@ when "show" puts vm.template_str else - puts vm.to_xml + puts vm.to_xml(true) end end else diff --git a/src/client/ruby/onevnet b/src/client/ruby/onevnet index 55171dcbd6..8baa6bed24 100755 --- a/src/client/ruby/onevnet +++ b/src/client/ruby/onevnet @@ -236,7 +236,7 @@ when "show" puts leases_str end else - puts vn.to_xml + puts vn.to_xml(true) end else puts "Error: "+result.message @@ -286,7 +286,7 @@ when "list" vnpool=OpenNebula::VirtualNetworkPool.new(get_one_client, filter_flag.to_i) vnpool.info - puts vnpool.to_xml + puts vnpool.to_xml(true) end else diff --git a/src/oca/ruby/OpenNebula/XMLUtils.rb b/src/oca/ruby/OpenNebula/XMLUtils.rb index b481c5f730..6ee470d0f3 100644 --- a/src/oca/ruby/OpenNebula/XMLUtils.rb +++ b/src/oca/ruby/OpenNebula/XMLUtils.rb @@ -104,12 +104,16 @@ module OpenNebula return @hash end - def to_xml + def to_xml(pretty=false) if NOKOGIRI @xml.to_xml else str = "" - REXML::Formatters::Pretty.new(1).write(@xml,str) + if pretty + REXML::Formatters::Pretty.new(1).write(@xml,str) + else + REXML::Formatters::Default.new.write(@xml,str) + end str end end @@ -149,12 +153,16 @@ module OpenNebula end end - def to_xml + def to_xml(pretty=false) if NOKOGIRI @xml.to_xml else str = "" - REXML::Formatters::Pretty.new(1).write(@xml,str) + if pretty + REXML::Formatters::Pretty.new(1).write(@xml,str) + else + REXML::Formatters::Default.new.write(@xml,str) + end str end end From a16489576444c1d83f6fbf6a92fd6bb340ac7061 Mon Sep 17 00:00:00 2001 From: "Ruben S. Montero" Date: Thu, 8 Jul 2010 00:45:08 +0200 Subject: [PATCH 5/5] feature #192: removed unneeded files --- src/oca/ruby/test.zip | Bin 16807 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/oca/ruby/test.zip diff --git a/src/oca/ruby/test.zip b/src/oca/ruby/test.zip deleted file mode 100644 index 60ad41e9e211385ff8f7aa3ae832fe6d30a3dfee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16807 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 b%PWzu;Gr*H;emlsU4Cv|`u*3efWQ6+)iigs