libvirt 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +10 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +3 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +36 -0
- data/README.md +83 -0
- data/Rakefile +20 -0
- data/docs/user_guide.md +259 -0
- data/examples/README.md +10 -0
- data/examples/create_domain.rb +46 -0
- data/examples/print_domain_info.rb +46 -0
- data/examples/print_hypervisor_info.rb +40 -0
- data/lib/ffi/libvirt/domain_info.rb +12 -0
- data/lib/ffi/libvirt/error.rb +25 -0
- data/lib/ffi/libvirt/error_functions.rb +21 -0
- data/lib/ffi/libvirt/error_types.rb +125 -0
- data/lib/ffi/libvirt/functions.rb +363 -0
- data/lib/ffi/libvirt/node_info.rb +27 -0
- data/lib/ffi/libvirt/storage_pool_info.rb +11 -0
- data/lib/ffi/libvirt/storage_volume_info.rb +14 -0
- data/lib/ffi/libvirt/types.rb +61 -0
- data/lib/ffi/libvirt/util.rb +19 -0
- data/lib/ffi/libvirt/version.rb +46 -0
- data/lib/ffi/libvirt.rb +29 -0
- data/lib/libvirt/collection/abstract_collection.rb +49 -0
- data/lib/libvirt/collection/domain_collection.rb +98 -0
- data/lib/libvirt/collection/interface_collection.rb +16 -0
- data/lib/libvirt/collection/network_collection.rb +58 -0
- data/lib/libvirt/collection/node_device_collection.rb +29 -0
- data/lib/libvirt/collection/nwfilter_collection.rb +15 -0
- data/lib/libvirt/collection/storage_pool_collection.rb +58 -0
- data/lib/libvirt/collection/storage_volume_collection.rb +57 -0
- data/lib/libvirt/collection.rb +12 -0
- data/lib/libvirt/connection.rb +225 -0
- data/lib/libvirt/domain.rb +241 -0
- data/lib/libvirt/error.rb +91 -0
- data/lib/libvirt/exception.rb +19 -0
- data/lib/libvirt/network.rb +118 -0
- data/lib/libvirt/node.rb +118 -0
- data/lib/libvirt/node_device.rb +75 -0
- data/lib/libvirt/spec/device/disk.rb +58 -0
- data/lib/libvirt/spec/device/emulator.rb +23 -0
- data/lib/libvirt/spec/device.rb +8 -0
- data/lib/libvirt/spec/domain/os_booting.rb +69 -0
- data/lib/libvirt/spec/domain.rb +71 -0
- data/lib/libvirt/spec.rb +12 -0
- data/lib/libvirt/storage_pool.rb +164 -0
- data/lib/libvirt/storage_volume.rb +109 -0
- data/lib/libvirt/version.rb +3 -0
- data/lib/libvirt.rb +53 -0
- data/libvirt.gemspec +27 -0
- data/test/libvirt/collection/abstract_collection_test.rb +14 -0
- data/test/libvirt/collection/domain_collection_test.rb +122 -0
- data/test/libvirt/collection/interface_collection_test.rb +9 -0
- data/test/libvirt/collection/network_collection_test.rb +41 -0
- data/test/libvirt/collection/node_device_collection_test.rb +24 -0
- data/test/libvirt/collection/nwfilter_collection_test.rb +7 -0
- data/test/libvirt/collection/storage_pool_collection_test.rb +41 -0
- data/test/libvirt/collection/storage_volume_collection_test.rb +86 -0
- data/test/libvirt/connection_test.rb +133 -0
- data/test/libvirt/domain_test.rb +221 -0
- data/test/libvirt/error_test.rb +93 -0
- data/test/libvirt/libvirt_test.rb +16 -0
- data/test/libvirt/network_test.rb +76 -0
- data/test/libvirt/node_device_test.rb +16 -0
- data/test/libvirt/node_test.rb +24 -0
- data/test/libvirt/spec/devices/disk_test.rb +107 -0
- data/test/libvirt/spec/devices/emulator_test.rb +20 -0
- data/test/libvirt/spec/domain_test.rb +17 -0
- data/test/libvirt/storage_pool_test.rb +133 -0
- data/test/libvirt/storage_volume_test.rb +63 -0
- data/test/support/xml_assertions.rb +29 -0
- data/test/test_helper.rb +23 -0
- metadata +219 -0
@@ -0,0 +1,93 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("error") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::Error
|
6
|
+
end
|
7
|
+
|
8
|
+
context "getting the last error" do
|
9
|
+
setup do
|
10
|
+
# Reset the error manually so we're clear.
|
11
|
+
FFI::Libvirt.virResetLastError
|
12
|
+
end
|
13
|
+
|
14
|
+
should "be fine if there is no last error" do
|
15
|
+
result = nil
|
16
|
+
assert_nothing_raised { result = @klass.last_error }
|
17
|
+
assert result.nil?
|
18
|
+
end
|
19
|
+
|
20
|
+
should "report the last error" do
|
21
|
+
begin
|
22
|
+
FFI::Libvirt.virConnectOpen("NSEpicFailure")
|
23
|
+
rescue Libvirt::Exception::LibvirtError; end
|
24
|
+
|
25
|
+
# And now we verify the error is accessible
|
26
|
+
error = @klass.last_error
|
27
|
+
assert error
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "setting an error handling callback" do
|
32
|
+
teardown do
|
33
|
+
# Reset the error handler to nil
|
34
|
+
@klass.on_error
|
35
|
+
end
|
36
|
+
|
37
|
+
should "call the callback when an error occurs" do
|
38
|
+
called = false
|
39
|
+
@klass.on_error do |error|
|
40
|
+
called = true
|
41
|
+
end
|
42
|
+
|
43
|
+
FFI::Libvirt.virConnectOpen("foo") rescue nil
|
44
|
+
assert called
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
context "disable error raising" do
|
49
|
+
teardown do
|
50
|
+
# Make sure this gets reset
|
51
|
+
@klass.raise_errors = true
|
52
|
+
end
|
53
|
+
|
54
|
+
should "raise errors by default" do
|
55
|
+
assert @klass.raise_errors
|
56
|
+
assert_raise(Libvirt::Exception::LibvirtError) { FFI::Libvirt.virConnectOpen("fail") }
|
57
|
+
end
|
58
|
+
|
59
|
+
should "not raise errors if it is disabled" do
|
60
|
+
@klass.raise_errors = false
|
61
|
+
assert !@klass.raise_errors
|
62
|
+
assert_nothing_raised { FFI::Libvirt.virConnectOpen("fail") }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "with an error instance" do
|
67
|
+
setup do
|
68
|
+
# Get an error instance...
|
69
|
+
@error = nil
|
70
|
+
begin
|
71
|
+
FFI::Libvirt.virConnectOpen("FailHard")
|
72
|
+
rescue Libvirt::Exception::LibvirtError => e
|
73
|
+
@error = e.error
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
should "allow access to the raw struct" do
|
78
|
+
assert @error.interface.is_a?(FFI::Libvirt::Error)
|
79
|
+
end
|
80
|
+
|
81
|
+
should "allow access to the error code" do
|
82
|
+
assert_equal :system_error, @error.code
|
83
|
+
end
|
84
|
+
|
85
|
+
should "allow access to the error domain" do
|
86
|
+
assert_equal :remote, @error.domain
|
87
|
+
end
|
88
|
+
|
89
|
+
should "allow access to the error message" do
|
90
|
+
assert @error.message
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("libvirt") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt
|
6
|
+
end
|
7
|
+
|
8
|
+
should "provide the version" do
|
9
|
+
assert @klass.version.is_a?(Array)
|
10
|
+
end
|
11
|
+
|
12
|
+
should "provide a shortcut to connecting" do
|
13
|
+
Libvirt::Connection.expects(:new).with(1,2,3)
|
14
|
+
@klass.connect(1,2,3)
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("network") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::Network
|
6
|
+
|
7
|
+
@data = {
|
8
|
+
:name => "vboxnet0",
|
9
|
+
:uuid => "786f6276-656e-4074-8000-0a0027000000"
|
10
|
+
}
|
11
|
+
|
12
|
+
@conn = Libvirt.connect("test:///default")
|
13
|
+
@instance = @klass.new(FFI::Libvirt.virNetworkDefineXML(@conn, <<-XML))
|
14
|
+
<network>
|
15
|
+
<name>#{@data[:name]}</name>
|
16
|
+
<uuid>#{@data[:uuid]}</uuid>
|
17
|
+
</network>
|
18
|
+
XML
|
19
|
+
end
|
20
|
+
|
21
|
+
should "provide the name of the network" do
|
22
|
+
result = @instance.name
|
23
|
+
assert_equal @data[:name], result
|
24
|
+
end
|
25
|
+
|
26
|
+
should "provide the UUID of the network" do
|
27
|
+
result = @instance.uuid
|
28
|
+
assert result
|
29
|
+
assert_equal @data[:uuid], result
|
30
|
+
end
|
31
|
+
|
32
|
+
should "provide the bridge of the network" do
|
33
|
+
assert_raise(Libvirt::Exception::LibvirtError) { @instance.bridge }
|
34
|
+
end
|
35
|
+
|
36
|
+
should "control autostart" do
|
37
|
+
assert !@instance.autostart?
|
38
|
+
@instance.autostart = true
|
39
|
+
assert @instance.autostart?
|
40
|
+
end
|
41
|
+
|
42
|
+
should "provide an active check" do
|
43
|
+
assert !@instance.active?
|
44
|
+
@instance.start
|
45
|
+
assert @instance.active?
|
46
|
+
end
|
47
|
+
|
48
|
+
should "provide a persistence check" do
|
49
|
+
assert @instance.persistent?
|
50
|
+
# TODO: Check state change. Not sure how to trigger this at the moment.
|
51
|
+
end
|
52
|
+
|
53
|
+
should "provide ability to stop network" do
|
54
|
+
@instance.start
|
55
|
+
assert @instance.active?
|
56
|
+
@instance.stop
|
57
|
+
assert !@instance.active?
|
58
|
+
end
|
59
|
+
|
60
|
+
should "be able to undefine the network" do
|
61
|
+
assert @conn.networks.include?(@instance)
|
62
|
+
@instance.undefine
|
63
|
+
assert !@conn.networks.include?(@instance)
|
64
|
+
end
|
65
|
+
|
66
|
+
should "provide an equality comparison based on UUID" do
|
67
|
+
# TODO: Create multiple networks with uuids to compare
|
68
|
+
end
|
69
|
+
|
70
|
+
should "provide a `to_ptr` method to get the `virNetworkPtr`" do
|
71
|
+
result = nil
|
72
|
+
assert_nothing_raised { result = @instance.to_ptr }
|
73
|
+
assert result.is_a?(FFI::Pointer)
|
74
|
+
assert !result.null?
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("node device") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::NodeDevice
|
6
|
+
@instance = Libvirt.connect("test:///default").node.devices.first
|
7
|
+
end
|
8
|
+
|
9
|
+
should "provide the name" do
|
10
|
+
assert_equal "computer", @instance.name
|
11
|
+
end
|
12
|
+
|
13
|
+
should "provide the XML description" do
|
14
|
+
assert @instance.xml
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("node") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::Node
|
6
|
+
|
7
|
+
@connection = Libvirt.connect("test:///default")
|
8
|
+
@instance = @connection.node
|
9
|
+
end
|
10
|
+
|
11
|
+
should "provide access to the connection" do
|
12
|
+
assert_equal @connection, @instance.connection
|
13
|
+
end
|
14
|
+
|
15
|
+
should "be able to retrieve devices" do
|
16
|
+
result = nil
|
17
|
+
assert_nothing_raised { result = @instance.devices }
|
18
|
+
assert result
|
19
|
+
assert result.is_a?(Libvirt::Collection::NodeDeviceCollection)
|
20
|
+
end
|
21
|
+
|
22
|
+
# Note: This class is extremely hard to test since the results actually
|
23
|
+
# change computer to computer. Mocking/stubbing probably required.
|
24
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("Disk device spec") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::Spec::Device::Disk
|
6
|
+
end
|
7
|
+
|
8
|
+
context "outputting XML" do
|
9
|
+
setup do
|
10
|
+
@instance = @klass.new(:file)
|
11
|
+
end
|
12
|
+
|
13
|
+
should "output given type for type in XML" do
|
14
|
+
assert_xpath @instance.type.to_s, @instance.to_xml, "//disk/@type"
|
15
|
+
end
|
16
|
+
|
17
|
+
context "source" do
|
18
|
+
should "not output source if not specified" do
|
19
|
+
@instance.source = nil
|
20
|
+
assert_not_element @instance.to_xml, "//disk/source"
|
21
|
+
end
|
22
|
+
|
23
|
+
should "output source attr as dev for block devices" do
|
24
|
+
@instance.type = :block
|
25
|
+
@instance.source = "foo"
|
26
|
+
assert_xpath @instance.source, @instance.to_xml, "//disk/source/@dev"
|
27
|
+
end
|
28
|
+
|
29
|
+
should "output source attr as file for other devices" do
|
30
|
+
@instance.type = :file
|
31
|
+
@instance.source = "foo"
|
32
|
+
assert_xpath @instance.source, @instance.to_xml, "//disk/source/@file"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
context "target" do
|
37
|
+
should "not output target if not specified" do
|
38
|
+
@instance.target_dev = nil
|
39
|
+
assert_not_element @instance.to_xml, "//disk/target"
|
40
|
+
end
|
41
|
+
|
42
|
+
should "not output target if only bus is given" do
|
43
|
+
@instance.target_dev = nil
|
44
|
+
@instance.target_bus = "foo"
|
45
|
+
assert_not_element @instance.to_xml, "//disk/target"
|
46
|
+
end
|
47
|
+
|
48
|
+
should "output specified dev on target" do
|
49
|
+
@instance.target_dev = "foo"
|
50
|
+
assert_xpath @instance.target_dev, @instance.to_xml, "//disk/target/@dev"
|
51
|
+
end
|
52
|
+
|
53
|
+
should "output specified bus on target" do
|
54
|
+
@instance.target_dev = "foo"
|
55
|
+
@instance.target_bus = "bar"
|
56
|
+
assert_xpath @instance.target_bus, @instance.to_xml, "//disk/target/@bus"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "driver" do
|
61
|
+
should "not output if no name is given" do
|
62
|
+
@instance.driver = nil
|
63
|
+
assert_not_element @instance.to_xml, "//disk/driver"
|
64
|
+
end
|
65
|
+
|
66
|
+
should "output with specified driver" do
|
67
|
+
@instance.driver = "foo"
|
68
|
+
assert_xpath @instance.driver, @instance.to_xml, "//disk/driver/@name"
|
69
|
+
end
|
70
|
+
|
71
|
+
should "output with specified type if given" do
|
72
|
+
@instance.driver = "foo"
|
73
|
+
@instance.driver_type = "bar"
|
74
|
+
assert_xpath @instance.driver_type, @instance.to_xml, "//disk/driver/@type"
|
75
|
+
end
|
76
|
+
|
77
|
+
should "output with specified cache if given" do
|
78
|
+
@instance.driver = "foo"
|
79
|
+
@instance.driver_cache = "bar"
|
80
|
+
assert_xpath @instance.driver_cache, @instance.to_xml, "//disk/driver/@cache"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
context "shareable" do
|
85
|
+
should "not be sharable initially" do
|
86
|
+
assert_not_element @instance.to_xml, "//disk/shareable"
|
87
|
+
end
|
88
|
+
|
89
|
+
should "be shareable if specified" do
|
90
|
+
@instance.shareable = true
|
91
|
+
assert_element @instance.to_xml, "//disk/shareable"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "serial" do
|
96
|
+
should "not have serial if not specified" do
|
97
|
+
@instance.serial = nil
|
98
|
+
assert_not_element @instance.to_xml, "//disk/serial"
|
99
|
+
end
|
100
|
+
|
101
|
+
should "have serial if specified" do
|
102
|
+
@instance.serial = "foobar"
|
103
|
+
assert_xpath @instance.serial, @instance.to_xml, "//disk/serial"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("Emulator device spec") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::Spec::Device::Emulator
|
6
|
+
end
|
7
|
+
|
8
|
+
should "have the given path when initialized" do
|
9
|
+
path = "foo"
|
10
|
+
instance = @klass.new(path)
|
11
|
+
assert_equal path, instance.path
|
12
|
+
end
|
13
|
+
|
14
|
+
should "output XML with the given path" do
|
15
|
+
path = "foo"
|
16
|
+
instance = @klass.new(path)
|
17
|
+
|
18
|
+
assert_xpath path, instance.to_xml, "//emulator"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
Protest.describe("Domain spec") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::Spec::Domain
|
6
|
+
end
|
7
|
+
|
8
|
+
context "initialization" do
|
9
|
+
setup do
|
10
|
+
@instance= @klass.new
|
11
|
+
end
|
12
|
+
|
13
|
+
should "not have any devices" do
|
14
|
+
assert @instance.devices.empty?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,133 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("storage pool") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::StoragePool
|
6
|
+
|
7
|
+
@data = {
|
8
|
+
:name => "default-pool",
|
9
|
+
:uuid => "786f6276-656e-4074-8000-0a0027000000",
|
10
|
+
:capacity => "107374182400"
|
11
|
+
}
|
12
|
+
|
13
|
+
@conn = Libvirt.connect("test:///default")
|
14
|
+
@instance = @klass.new(FFI::Libvirt.virStoragePoolDefineXML(@conn, <<-XML, 0))
|
15
|
+
<pool type='dir'>
|
16
|
+
<name>#{@data[:name]}</name>
|
17
|
+
<uuid>#{@data[:uuid]}</uuid>
|
18
|
+
<capacity>#{@data[:capacity]}</capacity>
|
19
|
+
<allocation>0</allocation>
|
20
|
+
<available>107374182400</available>
|
21
|
+
<source>
|
22
|
+
</source>
|
23
|
+
<target>
|
24
|
+
<path>/default-pool</path>
|
25
|
+
<permissions>
|
26
|
+
<mode>0700</mode>
|
27
|
+
<owner>-1</owner>
|
28
|
+
<group>-1</group>
|
29
|
+
</permissions>
|
30
|
+
</target>
|
31
|
+
</pool>
|
32
|
+
XML
|
33
|
+
end
|
34
|
+
|
35
|
+
should "be able to retrieve the connection" do
|
36
|
+
result = @instance.connection
|
37
|
+
assert result.is_a?(Libvirt::Connection)
|
38
|
+
end
|
39
|
+
|
40
|
+
should "provide the name" do
|
41
|
+
result = @instance.name
|
42
|
+
assert_equal @data[:name], result
|
43
|
+
end
|
44
|
+
|
45
|
+
should "provide the UUID" do
|
46
|
+
result = @instance.uuid
|
47
|
+
assert result
|
48
|
+
assert_equal 36, result.length
|
49
|
+
end
|
50
|
+
|
51
|
+
should "provide the state" do
|
52
|
+
assert_equal :running, @instance.state
|
53
|
+
@instance.stop
|
54
|
+
assert_equal :inactive, @instance.state
|
55
|
+
end
|
56
|
+
|
57
|
+
should "provide the capacity" do
|
58
|
+
assert_equal @data[:capacity].to_i, @instance.capacity
|
59
|
+
end
|
60
|
+
|
61
|
+
should "provide the current allocation" do
|
62
|
+
assert_equal 0, @instance.allocation
|
63
|
+
end
|
64
|
+
|
65
|
+
should "provide the available bytes remaining" do
|
66
|
+
assert_equal 107374182400, @instance.available
|
67
|
+
end
|
68
|
+
|
69
|
+
should "dump the XML" do
|
70
|
+
result = @instance.xml
|
71
|
+
assert result
|
72
|
+
end
|
73
|
+
|
74
|
+
should "provide an active check" do
|
75
|
+
@instance.start
|
76
|
+
assert @instance.active?
|
77
|
+
end
|
78
|
+
|
79
|
+
should "provide a persistence check" do
|
80
|
+
assert @instance.persistent?
|
81
|
+
# TODO: Check state change. Not sure how to trigger this at the moment.
|
82
|
+
end
|
83
|
+
|
84
|
+
should "not raise an exception if instance is already active and start is called" do
|
85
|
+
assert @instance.active?
|
86
|
+
assert_nothing_raised { @instance.start }
|
87
|
+
end
|
88
|
+
|
89
|
+
should "be able to build storage pool" do
|
90
|
+
@instance.stop
|
91
|
+
assert @instance.build
|
92
|
+
end
|
93
|
+
|
94
|
+
context "deleting underlying resources" do
|
95
|
+
setup do
|
96
|
+
@instance.stop
|
97
|
+
end
|
98
|
+
|
99
|
+
should "be able to delete underlying resources" do
|
100
|
+
assert @instance.delete
|
101
|
+
end
|
102
|
+
|
103
|
+
should "be able to specify type of delete" do
|
104
|
+
assert @instance.delete(:zeroed)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
should "be able to be stopped" do
|
109
|
+
assert @instance.active?
|
110
|
+
@instance.stop
|
111
|
+
assert !@instance.active?
|
112
|
+
end
|
113
|
+
|
114
|
+
should "be able to undefine a storage pool" do
|
115
|
+
@instance.stop
|
116
|
+
assert @conn.storage_pools.include?(@instance)
|
117
|
+
@instance.undefine
|
118
|
+
assert !@conn.storage_pools.include?(@instance)
|
119
|
+
end
|
120
|
+
|
121
|
+
should "provide a collection of volumes" do
|
122
|
+
result = nil
|
123
|
+
assert_nothing_raised { result = @instance.volumes }
|
124
|
+
assert result.is_a?(Libvirt::Collection::StorageVolumeCollection)
|
125
|
+
end
|
126
|
+
|
127
|
+
should "provide a `to_ptr` method to get the pointer" do
|
128
|
+
result = nil
|
129
|
+
assert_nothing_raised { result = @instance.to_ptr }
|
130
|
+
assert result.is_a?(FFI::Pointer)
|
131
|
+
assert !result.null?
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
Protest.describe("storage volume") do
|
4
|
+
setup do
|
5
|
+
@klass = Libvirt::StorageVolume
|
6
|
+
|
7
|
+
@data = {
|
8
|
+
:name => "test_vm_A.vdi",
|
9
|
+
:key => "f9eba311-ea76-4e4a-ad7b-401fa81e38c8"
|
10
|
+
}
|
11
|
+
|
12
|
+
@connection = Libvirt.connect("test:///default")
|
13
|
+
@pool = @connection.storage_pools.first
|
14
|
+
@instance = @pool.volumes.create(<<-XML)
|
15
|
+
<volume>
|
16
|
+
<name>#{@data[:name]}</name>
|
17
|
+
<key>#{@data[:key]}</key>
|
18
|
+
<source>
|
19
|
+
</source>
|
20
|
+
<capacity>8589934592</capacity>
|
21
|
+
<allocation>33280</allocation>
|
22
|
+
<target>
|
23
|
+
<format type='raw'/>
|
24
|
+
<permissions>
|
25
|
+
<mode>00</mode>
|
26
|
+
<owner>0</owner>
|
27
|
+
<group>0</group>
|
28
|
+
</permissions>
|
29
|
+
</target>
|
30
|
+
</volume>
|
31
|
+
XML
|
32
|
+
end
|
33
|
+
|
34
|
+
should "be able to retrieve the key" do
|
35
|
+
assert @instance.uuid
|
36
|
+
end
|
37
|
+
|
38
|
+
should "be able to retrieve the name" do
|
39
|
+
assert_equal @data[:name], @instance.name
|
40
|
+
end
|
41
|
+
|
42
|
+
should "be able to retrieve the path" do
|
43
|
+
assert_equal "/default-pool/test_vm_A.vdi", @instance.path
|
44
|
+
end
|
45
|
+
|
46
|
+
should "be able to retrieve the type of this volume" do
|
47
|
+
assert_equal :file, @instance.type
|
48
|
+
end
|
49
|
+
|
50
|
+
should "be able to retrieve the capacity" do
|
51
|
+
assert_equal 8589934592, @instance.capacity
|
52
|
+
end
|
53
|
+
|
54
|
+
should "be able to retrieve the allocation" do
|
55
|
+
assert_equal 33280, @instance.allocation
|
56
|
+
end
|
57
|
+
|
58
|
+
should "be able to delete the storage volume" do
|
59
|
+
assert @pool.volumes.include?(@instance)
|
60
|
+
@instance.delete
|
61
|
+
assert !@pool.volumes.include?(@instance)
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
class Protest::TestCase
|
2
|
+
# Assert the value of an xpath expression is valid
|
3
|
+
def assert_xpath(expected, xml, xpath, msg = nil)
|
4
|
+
full_message = build_message(msg, '? at ? should be ?', xpath, xml, expected)
|
5
|
+
assert_block full_message do
|
6
|
+
value = Nokogiri::XML.parse(xml).at_xpath(xpath)
|
7
|
+
value && value.text == expected
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# Assert an element exists
|
12
|
+
def assert_element(xml, xpath, msg = nil)
|
13
|
+
full_message = build_message(msg, 'element ? at ? not found', xpath, xml)
|
14
|
+
assert_block full_message do
|
15
|
+
element = Nokogiri::XML.parse(xml).at_xpath(xpath)
|
16
|
+
!element.nil? && element.element?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Assert an element doesn't exist
|
21
|
+
def assert_not_element(xml, xpath)
|
22
|
+
assert_nil Nokogiri::XML.parse(xml).at_xpath(xpath)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Assert a valid number of elements
|
26
|
+
def assert_elements(expected_size, xml, xpath, msg = nil)
|
27
|
+
assert_equal expected_size, Nokogiri::XML.parse(xml).xpath(xpath).size
|
28
|
+
end
|
29
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "test/unit/assertions"
|
2
|
+
require "protest"
|
3
|
+
require "mocha"
|
4
|
+
require "libvirt"
|
5
|
+
|
6
|
+
# Test helpers which monkey-patch Protest::TestCase directly
|
7
|
+
require File.expand_path("../support/xml_assertions", __FILE__)
|
8
|
+
|
9
|
+
class Protest::TestCase
|
10
|
+
include Test::Unit::Assertions
|
11
|
+
include Mocha::API
|
12
|
+
|
13
|
+
# Get Mocha integrated properly into the tests
|
14
|
+
alias :original_run :run
|
15
|
+
def run(report)
|
16
|
+
original_run(report)
|
17
|
+
mocha_verify
|
18
|
+
ensure
|
19
|
+
mocha_teardown
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
Protest.report_with(:progress)
|