vagrant-kvm 0.1.2 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ # 0.1.4 (August 20, 2013)
2
+
3
+ * Add support for qcow2 and configuration for image type [GH-45]
4
+ * Improve error handling [GH-43] [GH-44]
5
+ * Add license and additional author Hiroshi Miura @miurahr to gemfile [GH-42]
6
+ * Add option to enable/disable VNC [GH-41]
7
+ * Fixes to VM set_name [GH-29]
8
+ * Fix typo in VM definition [GH-35]
9
+ * Expanded Readme file [GH-26] [GH-25][GH-34]
10
+ * Add support for VNC console [GH-27]
11
+ * ShareFolders after Boot to avoid ssh timeout [GH-19]
12
+ * Set vm name to avoid collisions [GH-15]
13
+
14
+ # 0.1.3 (May 20, 2013)
15
+
16
+ * Merge pull request #13 Fixed error in check_box.rb (Vagrant v1.2.2 compat)
17
+ * Merge pull request #12 improve invalid version reporting
18
+
1
19
  # 0.1.2 (May 7, 2013)
2
20
 
3
21
  * Merge pull request #2 add "/usr/bin/kvm" to search options
data/README.md CHANGED
@@ -5,8 +5,14 @@ provider to Vagrant, allowing Vagrant to control and provision KVM/QEMU VM.
5
5
 
6
6
  **NOTE:** This plugin requires Vagrant 1.1+
7
7
 
8
- **NOTE:** This plugin requires QEMU 1.2+, it has only been tested on Fedora 18
9
- and Debian Wheezy at the moment.
8
+ **NOTE:** This plugin requires QEMU 1.2+, it has only been tested on Fedora 18,
9
+ Debian Wheezy, Ubuntu 12.04(LTS) Precise and Ubuntu 13.04 Raring at the moment.
10
+
11
+ **NOTE:** This plugin requires `libvirt-dev` package to be installed
12
+ (as in Debian/Ubuntu) or `libvirt-devel` (Fedora/openSUSE)
13
+
14
+ **NOTE** You can use a backported KVM/QEMU 1.2 with Private Package Archive(PPA)
15
+ for Ubuntu 12.04(LTS) at https://launchpad.net/~miurahr/+archive/vagrant
10
16
 
11
17
  ## Features/Limitations
12
18
 
@@ -68,6 +74,12 @@ end
68
74
 
69
75
  And then run `vagrant up --provider=kvm`.
70
76
 
77
+ If you always use kvm provider as default, please set it in your .bashrc:
78
+ ```
79
+ export VAGRANT_DEFAULT_PROVIDER=kvm
80
+ ```
81
+ then you can simply run `vagrant up` with kvm provider.
82
+
71
83
  ## Box Format
72
84
 
73
85
  Vagrant providers each require a custom provider-specific box format.
@@ -80,15 +92,32 @@ There are two box formats for the `kvm` provider:
80
92
  2. "Native" box - you need a box.xml file (libvirt domain format) and a raw
81
93
  image file (you can convert a .vmdk with qemu-img)
82
94
 
83
- To turn this into a native box, you need to create a vagrant image and do:
95
+ To turn this into a native box, you need to create a vagrant image and
96
+ make it sparse.
97
+ You need ```libguestfs-tools``` package
98
+ in Debian/Ubuntu/Mint, Fedora15 and after, or CentOS/RHEL6.
99
+
100
+ ```
101
+ $ env TMPDIR=/tmp virt-sparsify box-disk1-orig.img box-disk1.img
102
+ ```
103
+
104
+ Please keep enough disk space for TMPDIR!
105
+ To make box with keeping sparse, don't forget -S in tar option:
84
106
 
85
107
  ```
86
- $ tar cvzf kvm.box ./metadata.json ./Vagrantfile ./box.xml ./box-disk1.img
108
+ $ tar cvSzf kvm.box ./metadata.json ./Vagrantfile ./box.xml ./box-disk1.img
87
109
  ```
88
110
 
111
+ For CentOS/RHEL5, there is a package in EPEL5.
112
+ For Gentoo, you can use ```emerge libguestfs```.
113
+
89
114
  You need a base MAC address and a private network like in the example.
90
115
 
91
116
 
92
117
  ## Configuration
93
118
 
94
- There are no provider-specific parameters at the moment.
119
+ There are some provider specific parameter to control VM definition.
120
+
121
+ * `gui` - boolean for starting VM with VNC enabled.
122
+ * `image_type` - an image format for vm disk: 'raw' or 'qcow2'
123
+
@@ -18,10 +18,10 @@ module VagrantPlugins
18
18
  b.use PruneNFSExports
19
19
  b.use NFS
20
20
  b.use PrepareNFSSettings
21
- b.use ShareFolders
22
21
  b.use SetHostname
23
22
  #b.use Customize
24
23
  b.use Boot
24
+ b.use ShareFolders
25
25
  end
26
26
  end
27
27
 
@@ -223,6 +223,7 @@ module VagrantPlugins
223
223
  def self.action_up
224
224
  Vagrant::Action::Builder.new.tap do |b|
225
225
  b.use CheckKvm
226
+ b.use SetName
226
227
  b.use ConfigValidate
227
228
  b.use InitStoragePool
228
229
  b.use Call, Created do |env, b2|
@@ -260,6 +261,7 @@ module VagrantPlugins
260
261
  autoload :PrepareNFSSettings, action_root.join("prepare_nfs_settings")
261
262
  autoload :PruneNFSExports, action_root.join("prune_nfs_exports")
262
263
  autoload :Resume, action_root.join("resume")
264
+ autoload :SetName, action_root.join("set_name")
263
265
  autoload :SetupPackageFiles, action_root.join("setup_package_files")
264
266
  autoload :ShareFolders, action_root.join("share_folders")
265
267
  autoload :Suspend, action_root.join("suspend")
@@ -9,6 +9,10 @@ module VagrantPlugins
9
9
  def call(env)
10
10
  @env = env
11
11
 
12
+ if @env[:machine].provider_config.gui
13
+ env[:machine].provider.driver.set_gui
14
+ end
15
+
12
16
  # Start up the VM
13
17
  env[:ui].info I18n.t("vagrant.actions.vm.boot.booting")
14
18
  env[:machine].provider.driver.start
@@ -16,7 +16,7 @@ module VagrantPlugins
16
16
 
17
17
  # Add the box then reload the box collection so that it becomes
18
18
  # aware of it.
19
- env[:ui].info I18n.t("vagrant.actions.vm.check_box.not_found", :name => box_name)
19
+ env[:ui].info I18n.t("vagrant.actions.vm.check_box.not_found", :name => box_name, :provider => env[:machine].provider_name)
20
20
  env[:action_runner].run(Vagrant::Action.action_box_add, {
21
21
  :box_name => box_name,
22
22
  :box_provider => env[:machine].provider_name,
@@ -10,6 +10,10 @@ module VagrantPlugins
10
10
  env[:ui].info I18n.t("vagrant.actions.vm.import.importing",
11
11
  :name => env[:machine].box.name)
12
12
 
13
+ # Ignore unsupported image types
14
+ image_type = env[:machine].provider_config.image_type
15
+ image_type = 'raw' unless image_type == 'qcow2'
16
+
13
17
  # Import the virtual machine (ovf or libvirt)
14
18
  # if a libvirt XML definition is present we use it
15
19
  # otherwise we convert the OVF
@@ -17,11 +21,11 @@ module VagrantPlugins
17
21
  box_file = env[:machine].box.directory.join("box.xml").to_s
18
22
  if File.file?(box_file)
19
23
  env[:machine].id = env[:machine].provider.driver.import(
20
- box_file, storage_path)
24
+ box_file, storage_path, image_type)
21
25
  else
22
26
  box_file = env[:machine].box.directory.join("box.ovf").to_s
23
27
  env[:machine].id = env[:machine].provider.driver.import_ovf(
24
- box_file, storage_path)
28
+ box_file, storage_path, image_type)
25
29
  end
26
30
 
27
31
  # If we got interrupted, then the import could have been
@@ -0,0 +1,31 @@
1
+ module VagrantPlugins
2
+ module ProviderKvm
3
+ module Action
4
+ class SetName
5
+ def initialize(app, env)
6
+ @logger = Log4r::Logger.new("vagrant::action::vm::setname")
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ name = env[:machine].provider_config.name
12
+
13
+ if !name
14
+ prefix = env[:root_path].basename.to_s
15
+ prefix.gsub!(/[^-a-z0-9_]/i, "")
16
+ name = prefix + "_#{Time.now.to_i}"
17
+ end
18
+
19
+ # @todo raise error if name is taken in kvm
20
+ # @todo don't set the name if the vm already has a name
21
+
22
+ @logger.info("Setting the name of the VM: #{name}")
23
+ env[:machine].provider.driver.set_name(name)
24
+
25
+ @app.call(env)
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -6,6 +6,11 @@ module VagrantPlugins
6
6
  # @return [Array]
7
7
  attr_reader :customizations
8
8
 
9
+ # If set to `true`, then KVM/Qemu will be launched with a VNC console.
10
+ #
11
+ # @return [Boolean]
12
+ attr_accessor :gui
13
+
9
14
  # This should be set to the name of the VM
10
15
  #
11
16
  # @return [String]
@@ -16,8 +21,15 @@ module VagrantPlugins
16
21
  # @return [Hash]
17
22
  attr_reader :network_adapters
18
23
 
24
+ # The VM image format
25
+ #
26
+ # @return [String]
27
+ attr_accessor :image_type
28
+
19
29
  def initialize
20
30
  @name = UNSET_VALUE
31
+ @gui = UNSET_VALUE
32
+ @image_type = UNSET_VALUE
21
33
  end
22
34
 
23
35
  # This is the hook that is called to finalize the object before it
@@ -25,6 +37,10 @@ module VagrantPlugins
25
37
  def finalize!
26
38
  # The default name is just nothing, and we default it
27
39
  @name = nil if @name == UNSET_VALUE
40
+ # Default is to not show a GUI
41
+ @gui = false if @gui == UNSET_VALUE
42
+ # Default image type is a sparsed raw
43
+ @image_type = 'raw' if @image_type == UNSET_VALUE
28
44
  end
29
45
  end
30
46
  end
@@ -10,6 +10,7 @@ module VagrantPlugins
10
10
  class VMNotFound < StandardError; end
11
11
 
12
12
  include Util
13
+ include Errors
13
14
 
14
15
  # enum for states return by libvirt
15
16
  VM_STATE = [
@@ -21,6 +22,9 @@ module VagrantPlugins
21
22
  :shutoff,
22
23
  :crashed]
23
24
 
25
+ # The Name of the virtual machine we represent
26
+ attr_reader :name
27
+
24
28
  # The UUID of the virtual machine we represent
25
29
  attr_reader :uuid
26
30
 
@@ -46,9 +50,11 @@ module VagrantPlugins
46
50
  raise e
47
51
  end
48
52
  end
53
+
49
54
  @version = read_version
50
- if (@version[:maj] == 1 && @version[:min] < 2) || @version[:maj] < 1
51
- raise Vagrant::Errors::KvmInvalidVersion
55
+ if @version < "1.2.0"
56
+ raise Errors::KvmInvalidVersion,
57
+ :actual => @version, :required => "< 1.2.0"
52
58
  end
53
59
 
54
60
  # Get storage pool if it exists
@@ -88,8 +94,9 @@ module VagrantPlugins
88
94
  #
89
95
  # @param [String] xml Path to the libvirt XML file.
90
96
  # @param [String] path Destination path for the volume.
97
+ # @param [String] image_type An image type for the volume.
91
98
  # @return [String] UUID of the imported VM.
92
- def import(xml, path)
99
+ def import(xml, path, image_type)
93
100
  @logger.info("Importing VM")
94
101
  # create vm definition from xml
95
102
  definition = File.open(xml) { |f|
@@ -102,10 +109,12 @@ module VagrantPlugins
102
109
  old_path = File.join(File.dirname(xml), box_disk)
103
110
  new_path = File.join(path, new_disk)
104
111
  # we use qemu-img convert to preserve image size
105
- system("qemu-img convert -p #{old_path} -O raw #{new_path}")
112
+ system("qemu-img convert -p #{old_path} -O #{image_type} #{new_path}")
106
113
  @pool.refresh
107
114
  volume = @pool.lookup_volume_by_name(new_disk)
108
115
  definition.disk = volume.path
116
+ definition.name = @name
117
+ definition.image_type = image_type
109
118
  # create vm
110
119
  @logger.info("Creating new VM")
111
120
  domain = @conn.define_domain_xml(definition.as_libvirt)
@@ -117,8 +126,9 @@ module VagrantPlugins
117
126
  #
118
127
  # @param [String] ovf Path to the OVF file.
119
128
  # @param [String] path Destination path for the volume.
129
+ # @param [String] image_type An image type for the volume.
120
130
  # @return [String] UUID of the imported VM.
121
- def import_ovf(ovf, path)
131
+ def import_ovf(ovf, path, image_type)
122
132
  @logger.info("Importing OVF definition for VM")
123
133
  # create vm definition from ovf
124
134
  definition = File.open(ovf) { |f|
@@ -130,10 +140,12 @@ module VagrantPlugins
130
140
  @logger.info("Converting volume #{box_disk} to #{new_disk}")
131
141
  old_path = File.join(File.dirname(ovf), box_disk)
132
142
  new_path = File.join(path, new_disk)
133
- system("qemu-img convert -p #{old_path} -O raw #{new_path}")
143
+ system("qemu-img convert -p #{old_path} -O #{image_type} #{new_path}")
134
144
  @pool.refresh
135
145
  volume = @pool.lookup_volume_by_name(new_disk)
136
146
  definition.disk = volume.path
147
+ definition.name = @name
148
+ definition.image_type = image_type
137
149
  # create vm
138
150
  @logger.info("Creating new VM")
139
151
  domain = @conn.define_domain_xml(definition.as_libvirt)
@@ -207,13 +219,13 @@ module VagrantPlugins
207
219
 
208
220
  # Return the qemu version
209
221
  #
210
- # @return [Hash] with :maj and :min version numbers
222
+ # @return [String] of the form "1.2.2"
211
223
  def read_version
212
224
  # libvirt returns a number like 1002002 for version 1.2.2
213
- # we return just the major.minor part like this 1002
214
225
  maj = @conn.version / 1000000
215
226
  min = (@conn.version - maj*1000000) / 1000
216
- { :maj => maj, :min => min }
227
+ rel = @conn.version % 1000
228
+ "#{maj}.#{min}.#{rel}"
217
229
  end
218
230
 
219
231
  # Resumes the previously paused virtual machine.
@@ -224,6 +236,10 @@ module VagrantPlugins
224
236
  true
225
237
  end
226
238
 
239
+ def set_name(name)
240
+ @name = name
241
+ end
242
+
227
243
  def set_mac_address(mac)
228
244
  domain = @conn.lookup_domain_by_uuid(@uuid)
229
245
  definition = Util::VmDefinition.new(domain.xml_desc, 'libvirt')
@@ -232,6 +248,14 @@ module VagrantPlugins
232
248
  @conn.define_domain_xml(definition.as_libvirt)
233
249
  end
234
250
 
251
+ def set_gui
252
+ domain = @conn.lookup_domain_by_uuid(@uuid)
253
+ definition = Util::VmDefinition.new(domain.xml_desc, 'libvirt')
254
+ definition.set_gui
255
+ domain.undefine
256
+ @conn.define_domain_xml(definition.as_libvirt)
257
+ end
258
+
235
259
  # Starts the virtual machine.
236
260
  def start
237
261
  domain = @conn.lookup_domain_by_uuid(@uuid)
@@ -6,6 +6,12 @@ module VagrantPlugins
6
6
  class VagrantKVMError < Vagrant::Errors::VagrantError
7
7
  error_namespace("vagrant_kvm.errors")
8
8
  end
9
+ class KvmNoConnection < VagrantKVMError
10
+ error_key(:kvm_no_connection)
11
+ end
12
+ class KvmInvalidVersion < VagrantKVMError
13
+ error_key(:kvm_invalid_version)
14
+ end
9
15
  end
10
16
  end
11
17
  end
@@ -8,12 +8,13 @@ module VagrantPlugins
8
8
  module Util
9
9
  class VmDefinition
10
10
  # Attributes of the VM
11
- attr_reader :name
11
+ attr_accessor :name
12
12
  attr_reader :cpus
13
13
  attr_accessor :disk
14
14
  attr_reader :mac
15
15
  attr_reader :arch
16
16
  attr_reader :network
17
+ attr_accessor :image_type
17
18
 
18
19
  def self.list_interfaces(definition)
19
20
  nics = {}
@@ -27,7 +28,7 @@ module VagrantPlugins
27
28
  nics[adapter][:type] = :user
28
29
  end
29
30
  # look for interfaces on virtual network
30
- doc.css("devices interface[type='netwok']").each do |item|
31
+ doc.css("devices interface[type='network']").each do |item|
31
32
  ifcount += 1
32
33
  adapter = ifcount
33
34
  nics[adapter] ||= {}
@@ -39,6 +40,7 @@ module VagrantPlugins
39
40
 
40
41
  def initialize(definition, source_type='libvirt')
41
42
  @uuid = nil
43
+ @gui = nil
42
44
  @network = 'default'
43
45
  if source_type == 'ovf'
44
46
  create_from_ovf(definition)
@@ -68,7 +70,7 @@ module VagrantPlugins
68
70
  # disk volume
69
71
  diskref = doc.at_css("DiskSection Disk")["fileRef"]
70
72
  @disk = doc.at_css("References File[id='#{diskref}']")["href"]
71
-
73
+ @image_type = 'raw'
72
74
  # mac address
73
75
  # XXX we use only the first nic
74
76
  @mac = format_mac(doc.at_css("Machine Hardware Adapter[enabled='true']")['MACAddress'])
@@ -92,6 +94,7 @@ module VagrantPlugins
92
94
  @disk = doc.at_css("devices disk source")["file"]
93
95
  @mac = doc.at_css("devices interface mac")["address"]
94
96
  @network = doc.at_css("devices interface source")["network"]
97
+ @image_type = doc.at_css("devices disk driver")["type"]
95
98
  end
96
99
 
97
100
  def as_libvirt
@@ -110,6 +113,8 @@ module VagrantPlugins
110
113
  :disk => @disk,
111
114
  :mac => format_mac(@mac),
112
115
  :network => @network,
116
+ :gui => @gui,
117
+ :image_type => @image_type,
113
118
  :qemu_bin => qemu_bin.detect { |binary| File.exists? binary }
114
119
  })
115
120
  xml
@@ -123,6 +128,10 @@ module VagrantPlugins
123
128
  @mac = format_mac(mac)
124
129
  end
125
130
 
131
+ def set_gui
132
+ @gui = true
133
+ end
134
+
126
135
  # Takes a quantity and a unit
127
136
  # returns quantity in bytes
128
137
  # mib = true to use mebibytes, etc
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module ProviderKvm
3
- VERSION = "0.1.2"
3
+ VERSION = "0.1.4"
4
4
  end
5
5
  end
data/locales/en.yml CHANGED
@@ -2,3 +2,11 @@ en:
2
2
  vagrant_kvm:
3
3
  test_message: |-
4
4
  This is a test message.
5
+ errors:
6
+ kvm_no_connection: |-
7
+ Cannot connect to KVM through Libvirt. Please check kernel module
8
+ 'kvm' and 'kvm-intel' or 'kvm-amd' are installed and your id is in
9
+ group libvirt(in debian/ubuntu).
10
+ kvm_invalid_version: |-
11
+ Invalid Kvm version detected: %{actual}, but a version %{required} is
12
+ required.
@@ -22,7 +22,7 @@
22
22
  <devices>
23
23
  <emulator><%= qemu_bin %></emulator>
24
24
  <disk type='file' device='disk'>
25
- <driver name='qemu' type='raw'/>
25
+ <driver name='qemu' type='<%= image_type %>'/>
26
26
  <source file='<%= disk %>'/>
27
27
  <target dev='vda' bus='virtio'/>
28
28
  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
@@ -48,6 +48,9 @@
48
48
  <sound model='ich6'>
49
49
  <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
50
50
  </sound>
51
+ <% if gui %>
52
+ <%= "<graphics type='vnc' port='-1' autoport='yes'/>" %>
53
+ <% end %>
51
54
  <video>
52
55
  <model type='cirrus' vram='9216' heads='1'/>
53
56
  <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
data/vagrant-kvm.gemspec CHANGED
@@ -5,17 +5,20 @@ Gem::Specification.new do |s|
5
5
  s.name = "vagrant-kvm"
6
6
  s.version = VagrantPlugins::ProviderKvm::VERSION
7
7
  s.platform = Gem::Platform::RUBY
8
- s.authors = "Alex Drahon"
8
+ s.authors = ["Alex Drahon", "Hiroshi Miura"]
9
9
  s.email = "adrahon@gmail.com"
10
10
  s.homepage = "http://www.vagrantup.com"
11
11
  s.summary = "Enables Vagrant to use KVM instead of VirtualBox."
12
12
  s.description = "Enables Vagrant to use KVM instead of VirtualBox."
13
+ s.license = 'MIT'
13
14
 
14
15
  s.required_rubygems_version = ">= 1.3.6"
16
+ s.requirements << 'KVM/QEMU, v1.2.0 or greater'
15
17
 
16
18
  s.add_runtime_dependency "nokogiri", "~> 1.5.6"
17
19
  s.add_runtime_dependency "ruby-libvirt", "~> 0.4.0"
18
20
 
21
+ s.add_development_dependency "pry"
19
22
  s.add_development_dependency "rake"
20
23
  s.add_development_dependency "rspec-core", "~> 2.12.2"
21
24
  s.add_development_dependency "rspec-expectations", "~> 2.12.1"
metadata CHANGED
@@ -1,15 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-kvm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Alex Drahon
9
+ - Hiroshi Miura
9
10
  autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2013-05-07 00:00:00.000000000 Z
13
+ date: 2013-08-24 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: nokogiri
@@ -43,6 +44,22 @@ dependencies:
43
44
  - - ~>
44
45
  - !ruby/object:Gem::Version
45
46
  version: 0.4.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: pry
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
46
63
  - !ruby/object:Gem::Dependency
47
64
  name: rake
48
65
  requirement: !ruby/object:Gem::Requirement
@@ -146,6 +163,7 @@ files:
146
163
  - lib/vagrant-kvm/action/message_will_not_destroy.rb
147
164
  - lib/vagrant-kvm/action/destroy.rb
148
165
  - lib/vagrant-kvm/action/import.rb
166
+ - lib/vagrant-kvm/action/set_name.rb
149
167
  - lib/vagrant-kvm/action/export.rb
150
168
  - lib/vagrant-kvm/action/destroy_confirm.rb
151
169
  - lib/vagrant-kvm/action/check_running.rb
@@ -165,7 +183,8 @@ files:
165
183
  - README.md
166
184
  - .gitignore
167
185
  homepage: http://www.vagrantup.com
168
- licenses: []
186
+ licenses:
187
+ - MIT
169
188
  post_install_message:
170
189
  rdoc_options: []
171
190
  require_paths:
@@ -182,7 +201,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
182
201
  - - ! '>='
183
202
  - !ruby/object:Gem::Version
184
203
  version: 1.3.6
185
- requirements: []
204
+ requirements:
205
+ - KVM/QEMU, v1.2.0 or greater
186
206
  rubyforge_project:
187
207
  rubygems_version: 1.8.25
188
208
  signing_key: