libvirt 0.1.0 → 0.2.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.
@@ -1,3 +1,8 @@
1
+ ## 0.2.0 (December 7, 2010)
2
+
3
+ - Domain XML is now parsed into a `Libvirt::Spec::Domain` object,
4
+ which can then be turned back into XML.
5
+
1
6
  ## 0.1.0 (November 16, 2010)
2
7
 
3
8
  - Initial release
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- libvirt (0.1.0)
4
+ libvirt (0.2.0)
5
5
  ffi (~> 0.6.3)
6
6
  nokogiri (~> 1.4.3)
7
7
 
@@ -12,15 +12,15 @@ GEM
12
12
  ffi (0.6.3)
13
13
  rake (>= 0.8.7)
14
14
  ffi (0.6.3-java)
15
- mocha (0.9.8)
15
+ mocha (0.9.10)
16
16
  rake
17
- nokogiri (1.4.3.1)
18
- nokogiri (1.4.3.1-java)
17
+ nokogiri (1.4.4)
18
+ nokogiri (1.4.4-java)
19
19
  weakling (>= 0.0.3)
20
- protest (0.4.1)
20
+ protest (0.4.2)
21
21
  rake (0.8.7)
22
22
  weakling (0.0.4-java)
23
- yard (0.6.1)
23
+ yard (0.6.3)
24
24
 
25
25
  PLATFORMS
26
26
  java
data/Rakefile CHANGED
@@ -12,6 +12,27 @@ task :test do
12
12
  files.each { |f| load f }
13
13
  end
14
14
 
15
+ # Testing against specific rubies or all of them. This uses RVM
16
+ # and expects these rubies to be installed already.
17
+ rubies = ["1.9.2", "1.8.7", "jruby", "rbx"]
18
+ rubies.each do |ruby|
19
+ desc "Run the test suite against: #{ruby}"
20
+ task "test_#{ruby.gsub('.', '_')}" do
21
+ puts "Running test suite against: #{ruby}"
22
+ exec("rvm #{ruby} rake")
23
+ end
24
+ end
25
+
26
+ desc "Run the test suite against all rubies: #{rubies.join(", ")}"
27
+ task :test_all do
28
+ rubies.each do |ruby|
29
+ puts "Running test suite against: #{ruby}"
30
+ pid = fork
31
+ exec "rvm #{ruby} rake" if !pid
32
+ Process.wait(pid) if pid
33
+ end
34
+ end
35
+
15
36
  begin
16
37
  # Documentation task
17
38
  require 'yard'
@@ -40,7 +40,7 @@ module Libvirt
40
40
  # # Basic Information of a Connection
41
41
  #
42
42
  # Once you have a connection object, you can gather basic information about it
43
- # by using methods such as {#name}, {#capabilities}, etc.:
43
+ # by using methods such as {#hypervisor}, {#capabilities}, etc.:
44
44
  #
45
45
  # puts "Hypervisor type: #{conn.hypervisor}"
46
46
  # puts "Hypervisor version: #{conn.hypervisor_verison}"
@@ -111,6 +111,14 @@ module Libvirt
111
111
  FFI::Libvirt.virDomainGetXMLDesc(self, 0)
112
112
  end
113
113
 
114
+ # Returns the {Libvirt::Spec::Domain} object representing this
115
+ # domain.
116
+ #
117
+ # @return [Libvirt::Spec::Domain]
118
+ def spec
119
+ Spec::Domain.new(xml)
120
+ end
121
+
114
122
  # Returns boolean of whether the domain is active (running) or not.
115
123
  #
116
124
  # @return [Boolean]
@@ -15,5 +15,14 @@ module Libvirt
15
15
  super(error.message)
16
16
  end
17
17
  end
18
+
19
+ # Represents an exception in parsing an XML spec into a Ruby
20
+ # {Libvirt::Spec} object.
21
+ class UnparseableSpec < StandardError
22
+ def initialize(tags)
23
+ tags = tags.map { |tag| tag.name }
24
+ super("Unsupported tags found. This is either a bug or the XML string given is invalid. Tags: #{tags}")
25
+ end
26
+ end
18
27
  end
19
28
  end
@@ -8,5 +8,6 @@ module Libvirt
8
8
  module Spec
9
9
  autoload :Device, 'libvirt/spec/device'
10
10
  autoload :Domain, 'libvirt/spec/domain'
11
+ autoload :Util, 'libvirt/spec/util'
11
12
  end
12
13
  end
@@ -3,6 +3,33 @@ module Libvirt
3
3
  module Device
4
4
  autoload :Disk, 'libvirt/spec/device/disk'
5
5
  autoload :Emulator, 'libvirt/spec/device/emulator'
6
+ autoload :Graphics, 'libvirt/spec/device/graphics'
7
+ autoload :Input, 'libvirt/spec/device/input'
8
+ autoload :Interface, 'libvirt/spec/device/interface'
9
+ autoload :Sound, 'libvirt/spec/device/sound'
10
+ autoload :Video, 'libvirt/spec/device/video'
11
+ autoload :VideoModel, 'libvirt/spec/device/video_model'
12
+
13
+ # Loads a device from an XML string. This will automatically find
14
+ # the proper class to load and return that.
15
+ #
16
+ # @return [Device]
17
+ def self.load!(xml)
18
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
19
+ get(xml.name).new(xml)
20
+ end
21
+
22
+ # Returns the class of a device based on the name. If
23
+ # `:disk` were given, for example, then a {Disk} class
24
+ # would be returned. Note that since the class is returned,
25
+ # and not an instance, it is up to the caller to instantiate
26
+ # the returned class.
27
+ #
28
+ # @param [Symbol] name
29
+ # @return [Class]
30
+ def self.get(name)
31
+ const_get(name.to_s.capitalize)
32
+ end
6
33
  end
7
34
  end
8
35
  end
@@ -5,7 +5,10 @@ module Libvirt
5
5
  # cdrom, or paravirtualized driver is specified via the disk
6
6
  # element.
7
7
  class Disk
8
+ include Util
9
+
8
10
  attr_accessor :type
11
+ attr_accessor :device
9
12
  attr_accessor :source
10
13
  attr_accessor :target_dev
11
14
  attr_accessor :target_bus
@@ -15,16 +18,33 @@ module Libvirt
15
18
  attr_accessor :shareable
16
19
  attr_accessor :serial
17
20
 
18
- # Initialize a new disk element with the given type. Examples
19
- # of valid `type`s are "disk," "floppy," and "cdrom."
20
- def initialize(type)
21
- @type = type
21
+ # Initializes a new disk element. If an XML string is passed
22
+ # then that will be used to initialize the attributes of the
23
+ # device.
24
+ def initialize(xml=nil)
22
25
  @shareable = false
26
+
27
+ load!(xml) if xml
28
+ end
29
+
30
+ # Loads data from XML.
31
+ def load!(xml)
32
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
33
+ try(xml.xpath("//disk[@type]"), :preserve => true) { |result| self.type = result["type"].to_sym }
34
+ try(xml.xpath("//disk[@device]"), :preserve => true) { |result| self.device = result["device"].to_sym }
35
+ try(xml.xpath("//disk/source")) { |result| self.source = result["dev"] || result["file"] }
36
+
37
+ try(xml.xpath("//disk/target")) do |result|
38
+ self.target_dev = result["dev"]
39
+ self.target_bus = result["bus"]
40
+ end
41
+
42
+ raise_if_unparseables(xml.xpath("//disk/*"))
23
43
  end
24
44
 
25
45
  # Returns the XML representation of this device.
26
46
  def to_xml(xml=Nokogiri::XML::Builder.new)
27
- xml.disk(:type => type) do |d|
47
+ xml.disk(:type => type, :device => device) do |d|
28
48
  if source
29
49
  # Source tag, the attribute depends on the type.
30
50
  attribute = type == :block ? :dev : :file
@@ -0,0 +1,39 @@
1
+ module Libvirt
2
+ module Spec
3
+ module Device
4
+ # Represents a graphics device, which allows for graphical
5
+ # interaction with the guest OS.
6
+ class Graphics
7
+ include Util
8
+
9
+ attr_accessor :type
10
+ attr_accessor :display
11
+
12
+ # Initializes a new graphics device. If an XML string is given,
13
+ # it will be used to attempt to initialize the attributes.
14
+ def initialize(xml=nil)
15
+ load!(xml) if xml
16
+ end
17
+
18
+ # Attempts to initialize object attributes based on the XML
19
+ # string given.
20
+ def load!(xml)
21
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
22
+ try(xml.xpath("//graphics[@type]"), :preserve => true) { |result| self.type = result["type"].to_sym }
23
+ try(xml.xpath("//graphics[@display]"), :preserve => true) { |result| self.display = result["display"] }
24
+
25
+ raise_if_unparseables(xml.xpath("//graphics/*"))
26
+ end
27
+
28
+ # Returns the XML representation of this device.
29
+ def to_xml(xml=Nokogiri::XML::Builder.new)
30
+ options = { :type => type }
31
+ options[:display] = display if display
32
+
33
+ xml.graphics(options)
34
+ xml.to_xml
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,40 @@
1
+ module Libvirt
2
+ module Spec
3
+ module Device
4
+ # Represents an input device, which is a device that allows
5
+ # interaction with the graphical framebuffer in the guest
6
+ # virtual machine.
7
+ class Input
8
+ include Util
9
+
10
+ attr_accessor :type
11
+ attr_accessor :bus
12
+
13
+ # Initializes a new input device. If an XML string is given,
14
+ # it will be used to attempt to initialize the attributes.
15
+ def initialize(xml=nil)
16
+ load!(xml) if xml
17
+ end
18
+
19
+ # Attempts to initialize object attributes based on the XML
20
+ # string given.
21
+ def load!(xml)
22
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
23
+ try(xml.xpath("//input[@type]"), :preserve => true) { |result| self.type = result["type"].to_sym }
24
+ try(xml.xpath("//input[@bus]"), :preserve => true) { |result| self.bus = result["bus"].to_sym }
25
+
26
+ raise_if_unparseables(xml.xpath("//input/*"))
27
+ end
28
+
29
+ # Returns the XML representation of this device
30
+ def to_xml(xml=Nokogiri::XML::Builder.new)
31
+ options = { :type => type }
32
+ options[:bus] = bus if bus
33
+
34
+ xml.input(options)
35
+ xml.to_xml
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ module Libvirt
2
+ module Spec
3
+ module Device
4
+ # Represents a network interface device which is attached to
5
+ # a domain.
6
+ class Interface
7
+ include Util
8
+
9
+ attr_accessor :type
10
+ attr_accessor :mac_address
11
+ attr_accessor :model_type
12
+ attr_accessor :source_network
13
+
14
+ # Initializes a new network interface device. If an XML string
15
+ # is given, it will be used to attempt to initialize the attributes.
16
+ def initialize(xml=nil)
17
+ load!(xml) if xml
18
+ end
19
+
20
+ # Attempts to initialize object attributes based on XML attributes.
21
+ def load!(xml)
22
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
23
+ try(xml.xpath("//interface")) do |interface|
24
+ self.type = interface["type"].to_sym if interface["type"]
25
+ try(interface.xpath("mac")) { |result| self.mac_address = result["address"] }
26
+ try(interface.xpath("model")) { |result| self.model_type = result["type"] }
27
+ try(interface.xpath("source")) do |result|
28
+ self.source_network = result["network"]
29
+ end
30
+
31
+ raise_if_unparseables(interface.xpath("*"))
32
+ end
33
+ end
34
+
35
+ # Returns the XML representation of this device
36
+ def to_xml(xml=Nokogiri::XML::Builder.new)
37
+ xml.interface(:type => type) do |i|
38
+ i.mac(:address => mac_address) if mac_address
39
+ i.model(:type => model_type) if model_type
40
+ end
41
+
42
+ xml.to_xml
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,32 @@
1
+ module Libvirt
2
+ module Spec
3
+ module Device
4
+ # Represents a sound device.
5
+ class Sound
6
+ include Util
7
+
8
+ attr_accessor :model
9
+
10
+ # Initializes a new sound device. If an XML string is given,
11
+ # it will be used to attempt to initialize the attributes.
12
+ def initialize(xml=nil)
13
+ load!(xml) if xml
14
+ end
15
+
16
+ # Attempts to initialize object attributes based on the XML
17
+ # string given.
18
+ def load!(xml)
19
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
20
+ try(xml.xpath("//sound[@model]"), :preserve => true) { |result| self.model = result["model"].to_sym }
21
+ raise_if_unparseables(xml.xpath("//sound/*"))
22
+ end
23
+
24
+ # Returns the XML representation of this device.
25
+ def to_xml(xml=Nokogiri::XML::Builder.new)
26
+ xml.sound(:model => model)
27
+ xml.to_xml
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,47 @@
1
+ module Libvirt
2
+ module Spec
3
+ module Device
4
+ # Represents a video device.
5
+ class Video
6
+ include Util
7
+
8
+ attr_accessor :models
9
+
10
+ # Initializes a new video device. If an XML string is given,
11
+ # it will be used to attempt to initialize the attributes.
12
+ def initialize(xml=nil)
13
+ @models = []
14
+
15
+ load!(xml) if xml
16
+ end
17
+
18
+ # Attempts to initialize object attributes based on the XML
19
+ # string given.
20
+ def load!(xml)
21
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
22
+
23
+ try(xml.xpath("//video/model"), :multi => true) do |result|
24
+ self.models = []
25
+
26
+ result.each do |model|
27
+ self.models << VideoModel.new(model)
28
+ end
29
+ end
30
+
31
+ raise_if_unparseables(xml.xpath("//video/*"))
32
+ end
33
+
34
+ # Returns the XML representation of this device.
35
+ def to_xml(xml=Nokogiri::XML::Builder.new)
36
+ xml.video do |v|
37
+ models.each do |model|
38
+ model.to_xml(xml)
39
+ end
40
+ end
41
+
42
+ xml.to_xml
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,53 @@
1
+ module Libvirt
2
+ module Spec
3
+ module Device
4
+ # Represents a model in the specific video device.
5
+ class VideoModel
6
+ include Util
7
+
8
+ attr_accessor :type
9
+ attr_accessor :vram
10
+ attr_accessor :heads
11
+ attr_accessor :accel3d
12
+ attr_accessor :accel2d
13
+
14
+ # Initializes a new video model device. If an XML string is
15
+ # given, it will be used to attempt to initialize the attributes.
16
+ def initialize(xml=nil)
17
+ load!(xml) if xml
18
+ end
19
+
20
+ # Attempts to initialize object attributes based on the XML
21
+ # strings given.
22
+ def load!(xml)
23
+ xml = Nokogiri::XML(xml).root if !xml.is_a?(Nokogiri::XML::Element)
24
+ try(xml.xpath("//model[@type]"), :preserve => true) { |result| self.type = result["type"].to_sym }
25
+ try(xml.xpath("//model[@vram]"), :preserve => true) { |result| self.vram = result["vram"] }
26
+ try(xml.xpath("//model[@heads]"), :preserve => true) { |result| self.heads = result["heads"] }
27
+ try(xml.xpath("//model/acceleration")) do |result|
28
+ self.accel3d = result["accel3d"] == "yes"
29
+ self.accel2d = result["accel2d"] == "yes"
30
+ end
31
+
32
+ raise_if_unparseables(xml.xpath("//model/*"))
33
+ end
34
+
35
+ # Returns the XML representation of this device.
36
+ def to_xml(xml=Nokogiri::XML::Builder.new)
37
+ options = { :type => type }
38
+ options[:vram] = vram if vram
39
+ options[:heads] = heads if heads
40
+
41
+ xml.model(options) do |m|
42
+ a3d = accel3d ? "yes" : "no"
43
+ a2d = accel2d ? "yes" : "no"
44
+
45
+ m.acceleration(:accel3d => a3d, :accel2d => a2d)
46
+ end
47
+
48
+ xml.to_xml
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end