vagrant-kvm 0.1.2 → 0.1.4

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/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: