vagrant-libvirt 0.0.37 → 0.0.38

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 133c3e62a88c8fe90de33598ebafdaadb7a8fcfc
4
- data.tar.gz: efc8ee6514b87be1309957af7a9bf57f15daa893
3
+ metadata.gz: ec76a65b6a28f5c9f4160ed84a12d4ed452e125d
4
+ data.tar.gz: 1cb52a45beb2a74567a70b8633fbddb2581745ac
5
5
  SHA512:
6
- metadata.gz: 5dcc7e341830feb2a3ac402539ef4e9447eb234caa6cda31f62a35bb677be58e0a89b6ed27d84a683c09857f8b4580978d61c89409e9955c676bd0b42c4a3e15
7
- data.tar.gz: 2e1f97ec49aaf4c71131fd2eedf524e707b42814b943a38fb88a201ef8061244f4287e1adad8700d7f1267d4c4c6a83e2262327734e6d3b569b74629ebcc5e48
6
+ metadata.gz: a4d955916b17fb3a513d091fe031435d293e766c6ae2cb87af4b6e49e23a4daa0388afc3596d64e7733d052c22cfdf6a699471039dd6b358d6202f9594f276ea
7
+ data.tar.gz: '092d61e503d19f5a7ff51e6ab36af403f1dcba747ee5a7f5e0695199bf1e82aaf28c9b29b7ea9901d62f0dab748b2bd8caff34bae3cb47e75e8ed60fcb44a92f'
data/README.md CHANGED
@@ -52,6 +52,8 @@ In the table below, build passing means that specific version combination of Vag
52
52
  - [PCI device passthrough](#pci-device-passthrough)
53
53
  - [USB Redirector Devices](#usb-redirector-devices)
54
54
  - [Random number generator passthrough](#random-number-generator-passthrough)
55
+ - [Watchdog·Device](#watchdog-device)
56
+ - [Smartcard device](#smartcard-device)
55
57
  - [CPU Features](#cpu-features)
56
58
  - [No box and PXE boot](#no-box-and-pxe-boot)
57
59
  - [SSH Access To VM](#ssh-access-to-vm)
@@ -275,6 +277,10 @@ end
275
277
  _target_](http://libvirt.org/formatdomain.html#elementsDisks). NOTE: this
276
278
  option applies only to disks associated with a box image. To set the bus type
277
279
  on additional disks, see the [Additional Disks](#additional-disks) section.
280
+ * `disk_device` - The disk device to emulate. Defaults to vda if not
281
+ set, which should be fine for paravirtualized guests, but some fully
282
+ virtualized guests may require hda. NOTE: this option also applies only to
283
+ disks associated with a box image.
278
284
  * `nic_model_type` - parameter specifies the model of the network adapter when
279
285
  you create a domain value by default virtio KVM believe possible values, see
280
286
  the [documentation for
@@ -330,6 +336,8 @@ end
330
336
  "cirrus", "vmvga", "xen", "vbox", or "qxl".
331
337
  * `video_vram` - Used by some graphics card types to vary the amount of RAM
332
338
  dedicated to video. Defaults to 9216.
339
+ * `sound_type` - [Set the virtual sound card](https://libvirt.org/formatdomain.html#elementsSound)
340
+ Defaults to "ich6".
333
341
  * `machine_type` - Sets machine type. Equivalent to qemu `-machine`. Use
334
342
  `qemu-system-x86_64 -machine help` to get a list of supported machines.
335
343
  * `machine_arch` - Sets machine architecture. This helps libvirt to determine
@@ -600,6 +608,11 @@ starts with `libvirt__` string. Here is a list of those options:
600
608
  * `:model_type` - parameter specifies the model of the network adapter when you
601
609
  create a domain value by default virtio KVM believe possible values, see the
602
610
  documentation for libvirt
611
+ * `:libvirt__driver_name` - Define which network driver to use. [More
612
+ info](https://libvirt.org/formatdomain.html#elementsDriverBackendOptions)
613
+ * `:libvirt__driver_queues` - Define a number of queues to be used for network
614
+ interface. Set equal to numer of vCPUs for best performance. [More
615
+ info](http://www.linux-kvm.org/page/Multiqueue)
603
616
  * `:autostart` - Automatic startup of network by the libvirt daemon.
604
617
  If not specified the default is 'false'.
605
618
 
@@ -680,6 +693,7 @@ It has a number of options:
680
693
  pre-existing disk. If the disk doesn't exist it will be created.
681
694
  Disks with this option set to true need to be removed manually.
682
695
  * `shareable` - Set to true if you want to simulate shared SAN storage.
696
+ * `serial` - Serial number of the disk device.
683
697
 
684
698
  The following example creates two additional disks.
685
699
 
@@ -854,6 +868,80 @@ end
854
868
 
855
869
  At the moment only the `random` backend is supported.
856
870
 
871
+ ## Watchdog device
872
+ A virtual hardware watchdog device can be added to the guest via the `libvirt.watchdog` element. The option `model` is mandatory and could have on of the following values.
873
+
874
+ * `i6300esb` - the recommended device, emulating a PCI Intel 6300ESB
875
+ * 'ib700` - emulating an ISA iBase IB700
876
+ * `diag288` - emulating an S390 DIAG288 device
877
+
878
+ The optional action attribute describes what `action` to take when the watchdog expires. Valid values are specific to the underlying hypervisor. The default behavior is `reset`.
879
+
880
+ * `reset` - default, forcefully reset the guest
881
+ * `shutdown` - gracefully shutdown the guest (not recommended)
882
+ * `poweroff` - forcefully power off the guest
883
+ * `pause` - pause the guest
884
+ * `none` - do nothing
885
+ * `dump` - automatically dump the guest
886
+ * `inject-nmi` - inject a non-maskable interrupt into the guest
887
+
888
+ ```ruby
889
+ Vagrant.configure("2") do |config|
890
+ config.vm.provider :libvirt do |libvirt|
891
+ # Add libvirt watchdog device model i6300esb
892
+ libvirt.watchdog :model => 'i6300esb', :action => 'reset'
893
+ end
894
+ end
895
+ ```
896
+
897
+ ## Smartcard device
898
+ A virtual smartcard device can be supplied to the guest via the `libvirt.smartcard` element. The option `mode` is mandatory and currently only value `passthrough` is supported. The value `spicevmc` for option `type` is default value and can be supressed. On using `type = tcp`, the options `source_mode`, `source_host` and `source_service` are mandatory.
899
+
900
+ ```ruby
901
+ Vagrant.configure("2") do |config|
902
+ config.vm.provider :libvirt do |libvirt|
903
+ # Add smartcard device with type 'spicevmc'
904
+ libvirt.smartcard :mode => 'passthrough', :type => 'spicevmc'
905
+ end
906
+ end
907
+ ```
908
+
909
+ ```ruby
910
+ Vagrant.configure("2") do |config|
911
+ config.vm.provider :libvirt do |libvirt|
912
+ # Add smartcard device with type 'tcp'
913
+ domain.smartcard :mode => 'passthrough', :type => 'tcp', :source_mode => 'bind', :source_host => '127.0.0.1', :source_service => '2001'
914
+ end
915
+ end
916
+ ```
917
+ ## Features
918
+
919
+ Hypervisor features can be specified via `libvirt.features` as a list. The default
920
+ options that are enabled are `acpi`, `apic` and `pae`. If you define `libvirt.features`
921
+ you overwrite the defaults, so keep that in mind.
922
+
923
+ An example:
924
+
925
+ ```ruby
926
+ Vagrant.configure("2") do |config|
927
+ config.vm.provider :libvirt do |libvirt|
928
+ # Specify the default hypervisor features
929
+ libvirt.features = ['acpi', 'apic', 'pae' ]
930
+ end
931
+ end
932
+ ```
933
+
934
+ A different example for ARM boards:
935
+
936
+ ```ruby
937
+ Vagrant.configure("2") do |config|
938
+ config.vm.provider :libvirt do |libvirt|
939
+ # Specify the default hypervisor features
940
+ libvirt.features = ["apic", "gic version='2'" ]
941
+ end
942
+ end
943
+ ```
944
+
857
945
  ## CPU features
858
946
 
859
947
  You can specify CPU feature policies via `libvirt.cpu_feature`. Available
@@ -22,7 +22,7 @@ end
22
22
  # This is a sanity check to make sure no one is attempting to install
23
23
  # this into an early Vagrant version.
24
24
  if Vagrant::VERSION < '1.5.0'
25
- raise 'The Vagrant Libvirt plugin is only compatible with Vagrant 1.5+'
25
+ raise 'The Vagrant Libvirt plugin is only compatible with Vagrant 1.5+.'
26
26
  end
27
27
 
28
28
  # make sure base module class defined before loading plugin
@@ -67,12 +67,16 @@ module VagrantPlugins
67
67
  Vagrant::Action::Builder.new.tap do |b|
68
68
  b.use ConfigValidate
69
69
  b.use Call, IsRunning do |env, b2|
70
- # If the VM is running, then our work here is done, exit
71
- next if env[:result]
70
+ # If the VM is running, run the necessary provisioners
71
+ if env[:result]
72
+ b2.use action_provision
73
+ next
74
+ end
72
75
 
73
76
  b2.use Call, IsSuspended do |env2, b3|
74
77
  # if vm is suspended resume it then exit
75
78
  if env2[:result]
79
+ b3.use CreateNetworks
76
80
  b3.use ResumeDomain
77
81
  next
78
82
  end
@@ -124,6 +128,7 @@ module VagrantPlugins
124
128
  end
125
129
 
126
130
  b2.use Call, IsSuspended do |env2, b3|
131
+ b3.use CreateNetworks if env2[:result]
127
132
  b3.use ResumeDomain if env2[:result]
128
133
  end
129
134
 
@@ -269,6 +274,7 @@ module VagrantPlugins
269
274
  b3.use MessageNotSuspended
270
275
  next
271
276
  end
277
+ b3.use CreateNetworks
272
278
  b3.use ResumeDomain
273
279
  end
274
280
  end
@@ -34,6 +34,7 @@ module VagrantPlugins
34
34
  @uuid = config.uuid
35
35
  @cpus = config.cpus.to_i
36
36
  @cpu_features = config.cpu_features
37
+ @features = config.features
37
38
  @cpu_mode = config.cpu_mode
38
39
  @cpu_model = config.cpu_model
39
40
  @cpu_fallback = config.cpu_fallback
@@ -42,6 +43,7 @@ module VagrantPlugins
42
43
  @machine_type = config.machine_type
43
44
  @machine_arch = config.machine_arch
44
45
  @disk_bus = config.disk_bus
46
+ @disk_device = config.disk_device
45
47
  @nested = config.nested
46
48
  @memory_size = config.memory.to_i * 1024
47
49
  @management_network_mac = config.management_network_mac
@@ -61,6 +63,7 @@ module VagrantPlugins
61
63
  "passwd='#{config.graphics_passwd}'"
62
64
  end
63
65
  @video_type = config.video_type
66
+ @sound_type = config.sound_type
64
67
  @video_vram = config.video_vram
65
68
  @keymap = config.keymap
66
69
  @kvm_hidden = config.kvm_hidden
@@ -85,6 +88,9 @@ module VagrantPlugins
85
88
 
86
89
  # PCI device passthrough
87
90
  @pcis = config.pcis
91
+
92
+ # Watchdog device
93
+ @watchdog_dev = config.watchdog_dev
88
94
 
89
95
  # USB device passthrough
90
96
  @usbs = config.usbs
@@ -93,6 +99,9 @@ module VagrantPlugins
93
99
  @redirdevs = config.redirdevs
94
100
  @redirfilters = config.redirfilters
95
101
 
102
+ # smartcard device
103
+ @smartcard_dev = config.smartcard_dev
104
+
96
105
  # RNG device passthrough
97
106
  @rng = config.rng
98
107
 
@@ -169,6 +178,9 @@ module VagrantPlugins
169
178
  @cpu_features.each do |cpu_feature|
170
179
  env[:ui].info(" -- CPU Feature: name=#{cpu_feature[:name]}, policy=#{cpu_feature[:policy]}")
171
180
  end
181
+ @features.each do |feature|
182
+ env[:ui].info(" -- Feature: #{feature}")
183
+ end
172
184
  env[:ui].info(" -- Memory: #{@memory_size / 1024}M")
173
185
  env[:ui].info(" -- Management MAC: #{@management_network_mac}")
174
186
  env[:ui].info(" -- Loader: #{@loader}")
@@ -186,6 +198,7 @@ module VagrantPlugins
186
198
  env[:ui].info(" -- Graphics Password: #{@graphics_passwd.empty? ? 'Not defined' : 'Defined'}")
187
199
  env[:ui].info(" -- Video Type: #{@video_type}")
188
200
  env[:ui].info(" -- Video VRAM: #{@video_vram}")
201
+ env[:ui].info(" -- Sound Type: #{@sound_type}")
189
202
  env[:ui].info(" -- Keymap: #{@keymap}")
190
203
  env[:ui].info(" -- TPM Path: #{@tpm_path}")
191
204
 
@@ -230,6 +243,10 @@ module VagrantPlugins
230
243
  env[:ui].info(" -- RNG device model: #{@rng[:model]}")
231
244
  end
232
245
 
246
+ if not @watchdog_dev.empty?
247
+ env[:ui].info(" -- Watchdog device: model=#{@watchdog_dev[:model]}, action=#{@watchdog_dev[:action]}")
248
+ end
249
+
233
250
  @usbs.each do |usb|
234
251
  usb_dev = []
235
252
  usb_dev.push("bus=#{usb[:bus]}") if usb[:bus]
@@ -259,6 +276,10 @@ module VagrantPlugins
259
276
  end
260
277
  end
261
278
 
279
+ if not @smartcard_dev.empty?
280
+ env[:ui].info(" -- smartcard device: mode=#{@smartcard_dev[:mode]}, type=#{@smartcard_dev[:type]}")
281
+ end
282
+
262
283
  env[:ui].info(" -- Command line : #{@cmd_line}")
263
284
 
264
285
  # Create libvirt domain.
@@ -41,8 +41,37 @@ module VagrantPlugins
41
41
  # Create new volume from xml template. Fog currently doesn't support
42
42
  # volume snapshots directly.
43
43
  begin
44
+ xml = Nokogiri::XML::Builder.new do |xml|
45
+ xml.volume do
46
+ xml.name(@name)
47
+ xml.capacity(@capacity, unit: 'G')
48
+ xml.target do
49
+ xml.format(type: 'qcow2')
50
+ xml.permissions do
51
+ xml.owner 0
52
+ xml.group 0
53
+ xml.mode '0600'
54
+ xml.label 'virt_image_t'
55
+ end
56
+ end
57
+ xml.backingStore do
58
+ xml.path(@backing_file)
59
+ xml.format(type: 'qcow2')
60
+ xml.permissions do
61
+ xml.owner 0
62
+ xml.group 0
63
+ xml.mode '0600'
64
+ xml.label 'virt_image_t'
65
+ end
66
+ end
67
+ end
68
+ end.to_xml(
69
+ save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
70
+ Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
71
+ Nokogiri::XML::Node::SaveOptions::FORMAT
72
+ )
44
73
  domain_volume = env[:machine].provider.driver.connection.volumes.create(
45
- xml: to_xml('volume_snapshot'),
74
+ xml: xml,
46
75
  pool_name: config.storage_pool_name
47
76
  )
48
77
  rescue Fog::Errors::Error => e
@@ -17,7 +17,7 @@ module VagrantPlugins
17
17
  @logger = Log4r::Logger.new('vagrant_libvirt::action::create_network_interfaces')
18
18
  @management_network_name = env[:machine].provider_config.management_network_name
19
19
  config = env[:machine].provider_config
20
- @nic_model_type = config.nic_model_type
20
+ @nic_model_type = config.nic_model_type || 'virtio'
21
21
  @nic_adapter_count = config.nic_adapter_count
22
22
  @app = app
23
23
  end
@@ -64,11 +64,17 @@ module VagrantPlugins
64
64
  end
65
65
 
66
66
  # Create each interface as new domain device.
67
+ @macs_per_network = Hash.new(0)
67
68
  adapters.each_with_index do |iface_configuration, slot_number|
68
69
  @iface_number = slot_number
69
70
  @network_name = iface_configuration[:network_name]
71
+ @source_options = {
72
+ network: @network_name
73
+ }
70
74
  @mac = iface_configuration.fetch(:mac, false)
71
75
  @model_type = iface_configuration.fetch(:model_type, @nic_model_type)
76
+ @driver_name = iface_configuration.fetch(:driver_name, false)
77
+ @driver_queues = iface_configuration.fetch(:driver_queues, false)
72
78
  @device_name = iface_configuration.fetch(:iface_name, false)
73
79
  template_name = 'interface'
74
80
  # Configuration for public interfaces which use the macvtap driver
@@ -77,6 +83,8 @@ module VagrantPlugins
77
83
  @mode = iface_configuration.fetch(:mode, 'bridge')
78
84
  @type = iface_configuration.fetch(:type, 'direct')
79
85
  @model_type = iface_configuration.fetch(:model_type, @nic_model_type)
86
+ @driver_name = iface_configuration.fetch(:driver_name, false)
87
+ @driver_queues = iface_configuration.fetch(:driver_queues, false)
80
88
  @portgroup = iface_configuration.fetch(:portgroup, nil)
81
89
  @network_name = iface_configuration.fetch(:network_name, @network_name)
82
90
  template_name = 'public_interface'
@@ -90,8 +98,10 @@ module VagrantPlugins
90
98
  raise Errors::TunnelPortNotDefined if @tunnel_port.nil?
91
99
  if @type == 'udp'
92
100
  # default udp tunnel source to 127.0.0.1
93
- @udp_tunnel_local_ip = iface_configuration.fetch(:tunnel_local_ip, '127.0.0.1')
94
- @udp_tunnel_local_port = iface_configuration.fetch(:tunnel_local_port)
101
+ @udp_tunnel={
102
+ address: iface_configuration.fetch(:tunnel_local_ip,'127.0.0.1'),
103
+ port: iface_configuration.fetch(:tunnel_local_port)
104
+ }
95
105
  end
96
106
  # default mcast tunnel to 239.255.1.1. Web search says this
97
107
  # 239.255.x.x is a safe range to use for general use mcast
@@ -100,8 +110,13 @@ module VagrantPlugins
100
110
  else
101
111
  '127.0.0.1'
102
112
  end
103
- @tunnel_ip = iface_configuration.fetch(:tunnel_ip, default_ip)
104
- @model_type = iface_configuration.fetch(:model_type, @nic_model_type)
113
+ @source_options = {
114
+ address: iface_configuration.fetch(:tunnel_ip, default_ip),
115
+ port: @tunnel_port
116
+ }
117
+ @tunnel_type = iface_configuration.fetch(:model_type, @nic_model_type)
118
+ @driver_name = iface_configuration.fetch(:driver_name, false)
119
+ @driver_queues = iface_configuration.fetch(:driver_queues, false)
105
120
  template_name = 'tunnel_interface'
106
121
  @logger.info("Setting up #{@type} tunnel interface using #{@tunnel_ip} port #{@tunnel_port}")
107
122
  end
@@ -115,27 +130,46 @@ module VagrantPlugins
115
130
  @logger.info(message)
116
131
 
117
132
  begin
118
- domain.attach_device(to_xml(template_name))
133
+ # FIXME: all options for network driver should be hash from Vagrantfile
134
+ driver_options = {}
135
+ driver_options[:name] = @driver_name if @driver_name
136
+ driver_options[:queues] = @driver_queues if @driver_queues
137
+ @udp_tunnel ||= {}
138
+ xml = if template_name == 'interface' or
139
+ template_name == 'tunnel_interface'
140
+ interface_xml(@type,
141
+ @source_options,
142
+ @mac,
143
+ @device_name,
144
+ @iface_number,
145
+ @model_type,
146
+ driver_options,
147
+ @udp_tunnel)
148
+ else
149
+ to_xml(template_name)
150
+ end
151
+ domain.attach_device(xml)
119
152
  rescue => e
120
153
  raise Errors::AttachDeviceError,
121
154
  error_message: e.message
122
155
  end
123
156
 
124
157
  # Re-read the network configuration and grab the MAC address
125
- next if @mac
126
- xml = Nokogiri::XML(domain.xml_desc)
127
158
  if iface_configuration[:iface_type] == :public_network
159
+ xml = Nokogiri::XML(domain.xml_desc)
160
+ source = "@network='#{@network_name}'"
128
161
  if @type == 'direct'
129
- @mac = xml.xpath("/domain/devices/interface[source[@dev='#{@device}']]/mac/@address")
130
- elsif !@portgroup.nil?
131
- @mac = xml.xpath("/domain/devices/interface[source[@network='#{@network_name}']]/mac/@address")
132
- else
133
- @mac = xml.xpath("/domain/devices/interface[source[@bridge='#{@device}']]/mac/@address")
162
+ source = "@dev='#{@device}'"
163
+ elsif @portgroup.nil?
164
+ source = "@bridge='#{@device}'"
134
165
  end
135
- else
136
- @mac = xml.xpath("/domain/devices/interface[source[@network='#{@network_name}']]/mac/@address")
166
+ if not @mac
167
+ macs = xml.xpath("/domain/devices/interface[source[#{source}]]/mac/@address")
168
+ @mac = macs[@macs_per_network[source]]
169
+ iface_configuration[:mac] = @mac.to_s
170
+ end
171
+ @macs_per_network[source] += 1
137
172
  end
138
- iface_configuration[:mac] = @mac.to_s
139
173
  end
140
174
 
141
175
  # Continue the middleware chain.
@@ -150,7 +184,7 @@ module VagrantPlugins
150
184
  # Skip configuring the management network, which is on the first interface.
151
185
  # It's used for provisioning and it has to be available during provisioning,
152
186
  # ifdown command is not acceptable here.
153
- next if slot_number == 0
187
+ next if slot_number.zero?
154
188
  next if options[:auto_config] === false
155
189
  @logger.debug "Configuring interface slot_number #{slot_number} options #{options}"
156
190
 
@@ -187,6 +221,39 @@ module VagrantPlugins
187
221
 
188
222
  private
189
223
 
224
+ def target_dev_name(device_name, type, iface_number)
225
+ if device_name
226
+ device_name
227
+ elsif type == 'netwrok'
228
+ "vnet#{iface_number}"
229
+ else
230
+ # TODO can we use same name vnet#ifnum?
231
+ #"tnet#{iface_number}" FIXME plugin vagrant-libvirt trying to create second tnet0 interface
232
+ "vnet#{iface_number}"
233
+ end
234
+ end
235
+
236
+ def interface_xml(type, source_options, mac, device_name,
237
+ iface_number, model_type, driver_options,
238
+ udp_tunnel={})
239
+ Nokogiri::XML::Builder.new do |xml|
240
+ xml.interface(type: type || 'network') do
241
+ xml.source(source_options) do
242
+ xml.local(udp_tunnel) if type == 'udp'
243
+ end
244
+ xml.mac(address: mac) if mac
245
+ xml.target(dev: target_dev_name(device_name, type, iface_number))
246
+ xml.alias(name: "net#{iface_number}")
247
+ xml.model(type: model_type.to_s)
248
+ xml.driver(driver_options)
249
+ end
250
+ end.to_xml(
251
+ save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
252
+ Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
253
+ Nokogiri::XML::Node::SaveOptions::FORMAT
254
+ )
255
+ end
256
+
190
257
  def find_empty(array, start = 0, stop = @nic_adapter_count)
191
258
  (start..stop).each do |i|
192
259
  return i unless array[i]
@@ -20,13 +20,19 @@ module VagrantPlugins
20
20
  libvirt_domain = env[:machine].provider.driver.connection.client.lookup_domain_by_uuid(
21
21
  env[:machine].id
22
22
  )
23
- libvirt_domain.list_snapshots.each do |name|
24
- @logger.info("Deleting snapshot '#{name}'")
25
- begin
26
- libvirt_domain.lookup_snapshot_by_name(name).delete
27
- rescue => e
28
- raise Errors::DeleteSnapshotError, error_message: e.message
23
+ begin
24
+ libvirt_domain.list_snapshots.each do |name|
25
+ @logger.info("Deleting snapshot '#{name}'")
26
+ begin
27
+ libvirt_domain.lookup_snapshot_by_name(name).delete
28
+ rescue => e
29
+ raise Errors::DeleteSnapshotError, error_message: e.message
30
+ end
29
31
  end
32
+ rescue
33
+ # Some drivers (xen) don't support getting list of snapshots,
34
+ # not much can be done here about it
35
+ @logger.warn("Failed to get list of snapshots")
30
36
  end
31
37
 
32
38
  # must remove managed saves
@@ -39,11 +39,29 @@ module VagrantPlugins
39
39
  # remove hw association with interface
40
40
  # working for centos with lvs default disks
41
41
  `virt-sysprep --no-logfile --operations defaults,-ssh-userdir -a #{@tmp_img}`
42
+ # add any user provided file
43
+ extra = ''
44
+ @tmp_include = @tmp_dir + '/_include'
45
+ if env['package.include']
46
+ extra = './_include'
47
+ Dir.mkdir(@tmp_include)
48
+ env['package.include'].each do |f|
49
+ env[:ui].info("Including user file: #{f}")
50
+ FileUtils.cp(f, @tmp_include)
51
+ end
52
+ end
53
+ if env['package.vagrantfile']
54
+ extra = './_include'
55
+ Dir.mkdir(@tmp_include) unless File.directory?(@tmp_include)
56
+ env[:ui].info('Including user Vagrantfile')
57
+ FileUtils.cp(env['package.vagrantfile'], @tmp_include + '/Vagrantfile')
58
+ end
42
59
  Dir.chdir(@tmp_dir)
43
- img_size = `qemu-img info #{@tmp_img} | grep 'virtual size' | awk '{print $3;}' | tr -d 'G'`.chomp
60
+ info = JSON.parse(`qemu-img info --output=json #{@tmp_img}`)
61
+ img_size = (Float(info['virtual-size'])/(1024**3)).ceil
44
62
  File.write(@tmp_dir + '/metadata.json', metadata_content(img_size))
45
63
  File.write(@tmp_dir + '/Vagrantfile', vagrantfile_content)
46
- assebmle_box(boxname)
64
+ assemble_box(boxname, extra)
47
65
  FileUtils.mv(@tmp_dir + '/' + boxname, '../' + boxname)
48
66
  FileUtils.rm_rf(@tmp_dir)
49
67
  env[:ui].info('Box created')
@@ -52,8 +70,8 @@ module VagrantPlugins
52
70
  @app.call(env)
53
71
  end
54
72
 
55
- def assebmle_box(boxname)
56
- `tar cvzf "#{boxname}" --totals ./metadata.json ./Vagrantfile ./box.img`
73
+ def assemble_box(boxname, extra)
74
+ `tar cvzf "#{boxname}" --totals ./metadata.json ./Vagrantfile ./box.img #{extra}`
57
75
  end
58
76
 
59
77
  def vagrantfile_content
@@ -66,6 +84,9 @@ module VagrantPlugins
66
84
  libvirt.storage_pool_name = "default"
67
85
  end
68
86
  end
87
+
88
+ user_vagrantfile = File.expand_path('../_include/Vagrantfile', __FILE__)
89
+ load user_vagrantfile if File.exists?(user_vagrantfile)
69
90
  EOF
70
91
  end
71
92
 
@@ -54,10 +54,12 @@ module VagrantPlugins
54
54
  end
55
55
 
56
56
  # Iterface type
57
- REXML::XPath.each(xml_descr, '/domain/devices/interface/model') do |iface_model|
58
- if iface_model.attributes['type'] != config.nic_model_type
59
- descr_changed = true
60
- iface_model.attributes['type'] = config.nic_model_type
57
+ unless config.nic_model_type.nil?
58
+ REXML::XPath.each(xml_descr, '/domain/devices/interface/model') do |iface_model|
59
+ if iface_model.attributes['type'] != config.nic_model_type
60
+ descr_changed = true
61
+ iface_model.attributes['type'] = config.nic_model_type
62
+ end
61
63
  end
62
64
  end
63
65
 
@@ -221,6 +223,12 @@ module VagrantPlugins
221
223
  end
222
224
  end
223
225
 
226
+ # Sound device
227
+ if config.sound_type
228
+ sound = REXML::XPath.first(xml_descr,'/domain/devices/sound/model')
229
+ end
230
+
231
+
224
232
  # dtb
225
233
  if config.dtb
226
234
  dtb = REXML::XPath.first(xml_descr, '/domain/os/dtb')
@@ -46,7 +46,19 @@ module VagrantPlugins
46
46
 
47
47
  machine.ui.info "================\nMachine id: #{machine.id}\nShould be mounting folders\n #{id}, opts: #{folder_opts}"
48
48
 
49
- xml = to_xml('filesystem', folder_opts)
49
+ #xml = to_xml('filesystem', folder_opts)
50
+ xml = Nokogiri::XML::Builder.new do |xml|
51
+ xml.filesystem(type: 'mount', accessmode: folder_opts[:accessmode]) do
52
+ xml.driver(type: 'path', wrpolicy: 'immediate')
53
+ xml.source(dir: folder_opts[:hostpath])
54
+ xml.target(dir: mount_tag)
55
+ xml.readonly unless folder_opts[:readonly].nil?
56
+ end
57
+ end.to_xml(
58
+ save_with: Nokogiri::XML::Node::SaveOptions::NO_DECLARATION |
59
+ Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
60
+ Nokogiri::XML::Node::SaveOptions::FORMAT
61
+ )
50
62
  # puts "<<<<< XML:\n #{xml}\n >>>>>"
51
63
  @conn.lookup_domain_by_uuid(machine.id).attach_device(xml, 0)
52
64
  end
@@ -64,6 +64,7 @@ module VagrantPlugins
64
64
  attr_accessor :cpu_model
65
65
  attr_accessor :cpu_fallback
66
66
  attr_accessor :cpu_features
67
+ attr_accessor :features
67
68
  attr_accessor :numa_nodes
68
69
  attr_accessor :loader
69
70
  attr_accessor :boot_order
@@ -71,6 +72,7 @@ module VagrantPlugins
71
72
  attr_accessor :machine_arch
72
73
  attr_accessor :machine_virtual_size
73
74
  attr_accessor :disk_bus
75
+ attr_accessor :disk_device
74
76
  attr_accessor :nic_model_type
75
77
  attr_accessor :nested
76
78
  attr_accessor :volume_cache
@@ -88,6 +90,7 @@ module VagrantPlugins
88
90
  attr_accessor :video_vram
89
91
  attr_accessor :keymap
90
92
  attr_accessor :kvm_hidden
93
+ attr_accessor :sound_type
91
94
 
92
95
  # Sets the information for connecting to a host TPM device
93
96
  # Only supports socket-based TPMs
@@ -116,6 +119,9 @@ module VagrantPlugins
116
119
  # Random number device passthrough
117
120
  attr_accessor :rng
118
121
 
122
+ # Watchdog device
123
+ attr_accessor :watchdog_dev
124
+
119
125
  # USB device passthrough
120
126
  attr_accessor :usbs
121
127
 
@@ -123,6 +129,9 @@ module VagrantPlugins
123
129
  attr_accessor :redirdevs
124
130
  attr_accessor :redirfilters
125
131
 
132
+ # smartcard device
133
+ attr_accessor :smartcard_dev
134
+
126
135
  # Suspend mode
127
136
  attr_accessor :suspend_mode
128
137
 
@@ -157,12 +166,14 @@ module VagrantPlugins
157
166
  @cpu_model = UNSET_VALUE
158
167
  @cpu_fallback = UNSET_VALUE
159
168
  @cpu_features = UNSET_VALUE
169
+ @features = UNSET_VALUE
160
170
  @numa_nodes = UNSET_VALUE
161
171
  @loader = UNSET_VALUE
162
172
  @machine_type = UNSET_VALUE
163
173
  @machine_arch = UNSET_VALUE
164
174
  @machine_virtual_size = UNSET_VALUE
165
175
  @disk_bus = UNSET_VALUE
176
+ @disk_device = UNSET_VALUE
166
177
  @nic_model_type = UNSET_VALUE
167
178
  @nested = UNSET_VALUE
168
179
  @volume_cache = UNSET_VALUE
@@ -178,6 +189,7 @@ module VagrantPlugins
178
189
  @graphics_passwd = UNSET_VALUE
179
190
  @video_type = UNSET_VALUE
180
191
  @video_vram = UNSET_VALUE
192
+ @sound_type = UNSET_VALUE
181
193
  @keymap = UNSET_VALUE
182
194
  @kvm_hidden = UNSET_VALUE
183
195
 
@@ -205,6 +217,9 @@ module VagrantPlugins
205
217
  # Random number device passthrough
206
218
  @rng = UNSET_VALUE
207
219
 
220
+ # Watchdog device
221
+ @watchdog_dev = UNSET_VALUE
222
+
208
223
  # USB device passthrough
209
224
  @usbs = UNSET_VALUE
210
225
 
@@ -212,6 +227,9 @@ module VagrantPlugins
212
227
  @redirdevs = UNSET_VALUE
213
228
  @redirfilters = UNSET_VALUE
214
229
 
230
+ # smartcard device
231
+ @smartcard_dev = UNSET_VALUE
232
+
215
233
  # Suspend mode
216
234
  @suspend_mode = UNSET_VALUE
217
235
 
@@ -344,6 +362,20 @@ module VagrantPlugins
344
362
  function: options[:function])
345
363
  end
346
364
 
365
+ def watchdog(options = {})
366
+ if options[:model].nil?
367
+ raise 'Model must be specified.'
368
+ end
369
+
370
+ if @watchdog_dev == UNSET_VALUE
371
+ @watchdog_dev = {}
372
+ end
373
+
374
+ @watchdog_dev[:model] = options[:model]
375
+ @watchdog_dev[:action] = options[:action] || 'reset'
376
+ end
377
+
378
+
347
379
  def usb(options = {})
348
380
  if (options[:bus].nil? || options[:device].nil?) && options[:vendor].nil? && options[:product].nil?
349
381
  raise 'Bus and device and/or vendor and/or product must be specified. Check `lsusb` for these.'
@@ -378,6 +410,26 @@ module VagrantPlugins
378
410
  allow: options[:allow])
379
411
  end
380
412
 
413
+ def smartcard(options = {})
414
+ if options[:mode].nil?
415
+ raise 'Option mode must be specified.'
416
+ elsif options[:mode] != 'passthrough'
417
+ raise 'Currently only passthrough mode is supported!'
418
+ elsif options[:type] == 'tcp' && (options[:source_mode].nil? || options[:source_host].nil? || options[:source_service].nil?)
419
+ raise 'If using type "tcp", option "source_mode", "source_host" and "source_service" must be specified.'
420
+ end
421
+
422
+ if @smartcard_dev == UNSET_VALUE
423
+ @smartcard_dev = {}
424
+ end
425
+
426
+ @smartcard_dev[:mode] = options[:mode]
427
+ @smartcard_dev[:type] = options[:type] || 'spicevmc'
428
+ @smartcard_dev[:source_mode] = options[:source_mode] if @smartcard_dev[:type] == 'tcp'
429
+ @smartcard_dev[:source_host] = options[:source_host] if @smartcard_dev[:type] == 'tcp'
430
+ @smartcard_dev[:source_service] = options[:source_service] if @smartcard_dev[:type] == 'tcp'
431
+ end
432
+
381
433
  # NOTE: this will run twice for each time it's needed- keep it idempotent
382
434
  def storage(storage_type, options = {})
383
435
  if storage_type == :file
@@ -430,7 +482,8 @@ module VagrantPlugins
430
482
  bus: options[:bus],
431
483
  cache: options[:cache] || 'default',
432
484
  allow_existing: options[:allow_existing],
433
- shareable: options[:shareable]
485
+ shareable: options[:shareable],
486
+ serial: options[:serial]
434
487
  }
435
488
 
436
489
  @disks << disk # append
@@ -515,13 +568,15 @@ module VagrantPlugins
515
568
  end
516
569
  @cpu_fallback = 'allow' if @cpu_fallback == UNSET_VALUE
517
570
  @cpu_features = [] if @cpu_features == UNSET_VALUE
571
+ @features = ['acpi','apic','pae'] if @features == UNSET_VALUE
518
572
  @numa_nodes = @numa_nodes == UNSET_VALUE ? nil : _generate_numa
519
573
  @loader = nil if @loader == UNSET_VALUE
520
574
  @machine_type = nil if @machine_type == UNSET_VALUE
521
575
  @machine_arch = nil if @machine_arch == UNSET_VALUE
522
576
  @machine_virtual_size = nil if @machine_virtual_size == UNSET_VALUE
523
577
  @disk_bus = 'virtio' if @disk_bus == UNSET_VALUE
524
- @nic_model_type = 'virtio' if @nic_model_type == UNSET_VALUE
578
+ @disk_device = 'vda' if @disk_device == UNSET_VALUE
579
+ @nic_model_type = nil if @nic_model_type == UNSET_VALUE
525
580
  @nested = false if @nested == UNSET_VALUE
526
581
  @volume_cache = 'default' if @volume_cache == UNSET_VALUE
527
582
  @kernel = nil if @kernel == UNSET_VALUE
@@ -539,6 +594,7 @@ module VagrantPlugins
539
594
  @graphics_ip = '127.0.0.1' if @graphics_ip == UNSET_VALUE
540
595
  @video_type = 'cirrus' if @video_type == UNSET_VALUE
541
596
  @video_vram = 9216 if @video_vram == UNSET_VALUE
597
+ @sound_type = nil if @sound_type == UNSET_VALUE
542
598
  @keymap = 'en-us' if @keymap == UNSET_VALUE
543
599
  @kvm_hidden = false if @kvm_hidden == UNSET_VALUE
544
600
  @tpm_model = 'tpm-tis' if @tpm_model == UNSET_VALUE
@@ -574,6 +630,9 @@ module VagrantPlugins
574
630
  # Random number generator passthrough
575
631
  @rng = {} if @rng == UNSET_VALUE
576
632
 
633
+ # Watchdog device
634
+ @watchdog_dev = {} if @watchdog_dev == UNSET_VALUE
635
+
577
636
  # USB device passthrough
578
637
  @usbs = [] if @usbs == UNSET_VALUE
579
638
 
@@ -581,6 +640,9 @@ module VagrantPlugins
581
640
  @redirdevs = [] if @redirdevs == UNSET_VALUE
582
641
  @redirfilters = [] if @redirfilters == UNSET_VALUE
583
642
 
643
+ # smartcard device
644
+ @smartcard_dev = {} if @smartcard_dev == UNSET_VALUE
645
+
584
646
  # Suspend mode
585
647
  @suspend_mode = 'pause' if @suspend_mode == UNSET_VALUE
586
648
 
@@ -55,9 +55,9 @@
55
55
  <% end %>
56
56
  </os>
57
57
  <features>
58
- <acpi/>
59
- <apic/>
60
- <pae/>
58
+ <% @features.each do |feature| %>
59
+ <<%= feature %>/>
60
+ <% end %>
61
61
  <% if @kvm_hidden %>
62
62
  <kvm>
63
63
  <hidden state='on'/>
@@ -74,7 +74,7 @@
74
74
  <driver name='qemu' type='qcow2' cache='<%= @domain_volume_cache %>'/>
75
75
  <source file='<%= @domain_volume_path %>'/>
76
76
  <%# we need to ensure a unique target dev -%>
77
- <target dev='vda' bus='<%= @disk_bus %>'/>
77
+ <target dev='<%= @disk_device %>' bus='<%= @disk_bus %>'/>
78
78
  </disk>
79
79
  <% end %>
80
80
  <%# additional disks -%>
@@ -86,6 +86,9 @@
86
86
  <% if d[:shareable] %>
87
87
  <shareable/>
88
88
  <% end %>
89
+ <% if d[:serial] %>
90
+ <serial><%= d[:serial] %></serial>
91
+ <% end %>
89
92
  <%# this will get auto generated by libvirt
90
93
  <address type='pci' domain='0x0000' bus='0x00' slot='???' function='0x0'/>
91
94
  -%>
@@ -132,6 +135,12 @@
132
135
  <input type='<%= input[:type] %>' bus='<%= input[:bus] %>'/>
133
136
  <% end %>
134
137
 
138
+ <% if !@sound_type.nil? %>
139
+ <%# Sound device-%>
140
+ <sound model='<%= @sound_type %>'>
141
+ </sound>
142
+ <%# End Sound%>
143
+ <% end %>
135
144
  <% if @graphics_type != 'none' %>
136
145
  <%# Video device -%>
137
146
  <graphics type='<%= @graphics_type %>' port='<%= @graphics_port %>' autoport='<%= @graphics_autoport %>' listen='<%= @graphics_ip %>' keymap='<%= @keymap %>' <%= @graphics_passwd%> />
@@ -183,6 +192,22 @@
183
192
  </redirfilter>
184
193
  <% end %>
185
194
  <% end %>
195
+ <% unless @watchdog_dev.empty? %>
196
+ <%# Watchdog Device -%>
197
+ <watchdog model='<%= @watchdog_dev[:model] %>' action='<%= @watchdog_dev[:action] %>'/>
198
+ <% end %>
199
+
200
+ <% unless @smartcard_dev.empty? -%>
201
+ <% if @smartcard_dev[:mode] == 'passthrough' %>
202
+ <% if @smartcard_dev[:type] == 'tcp' %>
203
+ <smartcard mode='<%= @smartcard_dev[:mode] %>' type='<%= @smartcard_dev[:type] %>'>
204
+ <source mode='<%= @smartcard_dev[:source_mode] %>' host='<%= @smartcard_dev[:source_host] %>' service='<%= @smartcard_dev[:source_service] %>'/>
205
+ </smartcard>
206
+ <% else %>
207
+ <smartcard mode='<%= @smartcard_dev[:mode] %>' type='<%= @smartcard_dev[:type] %>'/>
208
+ <% end %>
209
+ <% end %>
210
+ <% end -%>
186
211
 
187
212
  <% if @tpm_path -%>
188
213
  <%# TPM Device -%>
@@ -10,6 +10,13 @@
10
10
  <source bridge='<%=@device%>'/>
11
11
  <% end %>
12
12
  <model type='<%=@model_type%>'/>
13
+ <% if @driver_name and @driver_queues %>
14
+ <driver name='<%=@driver_name%>' queues='<%=@driver_queues%>'/>
15
+ <% elsif @driver_queues %>
16
+ <driver queues='<%=@driver_queues%>'/>
17
+ <% elsif @driver_name %>
18
+ <driver name='<%=@driver_name%>'/>
19
+ <% end %>
13
20
  <% if @ovs %>
14
21
  <virtualport type='openvswitch'/>
15
22
  <% end %>
@@ -4,6 +4,7 @@ module VagrantPlugins
4
4
  module ProviderLibvirt
5
5
  module Util
6
6
  module ErbTemplate
7
+ # TODO: remove and use nokogiri builder
7
8
  # TODO: might be a chance to use vagrant template system according to https://github.com/mitchellh/vagrant/issues/3231
8
9
  def to_xml(template_name = nil, data = binding)
9
10
  erb = template_name || self.class.to_s.split('::').last.downcase
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module ProviderLibvirt
3
- VERSION = '0.0.37'.freeze
3
+ VERSION = '0.0.38'.freeze
4
4
  end
5
5
  end
@@ -18,7 +18,7 @@ class EnvironmentHelper
18
18
  1024
19
19
  end
20
20
 
21
- %w(cpus cpu_mode loader boot_order machine_type disk_bus nested volume_cache kernel cmd_line initrd graphics_type graphics_autoport graphics_port graphics_ip graphics_passwd video_type video_vram keymap storage_pool_name disks cdroms driver).each do |name|
21
+ %w(cpus cpu_mode loader boot_order machine_type disk_bus disk_device nested volume_cache kernel cmd_line initrd graphics_type graphics_autoport graphics_port graphics_ip graphics_passwd video_type video_vram keymap storage_pool_name disks cdroms driver).each do |name|
22
22
  define_method(name.to_sym) do
23
23
  nil
24
24
  end
@@ -115,6 +115,9 @@
115
115
  <redirfilter>
116
116
  <usbdev class='0x0b' vendor='0x0b' product='0x0b' version='0x0b' allow='yes'/>
117
117
  </redirfilter>
118
+ <watchdog model='i6300esb' action='reset'/>
119
+
120
+ <smartcard mode='passthrough' type='spicevmc'/>
118
121
 
119
122
  <tpm model='tpm-tis'>
120
123
  <backend type='passthrough'>
@@ -40,5 +40,6 @@
40
40
  <model type='cirrus' vram='9216' heads='1'/>
41
41
  </video>
42
42
 
43
+
43
44
  </devices>
44
45
  </domain>
@@ -36,6 +36,7 @@ describe 'templates/domain' do
36
36
  domain.instance_variable_set('@domain_volume_path', '/var/lib/libvirt/images/test.qcow2')
37
37
  domain.instance_variable_set('@domain_volume_cache', 'unsafe')
38
38
  domain.disk_bus = 'ide'
39
+ domain.disk_device = 'vda'
39
40
  domain.storage(:file, path: 'test-disk1.qcow2')
40
41
  domain.storage(:file, path: 'test-disk2.qcow2')
41
42
  domain.disks.each do |disk|
@@ -58,6 +59,8 @@ describe 'templates/domain' do
58
59
  domain.redirdev(type: 'tcp', host: 'localhost', port: '4000')
59
60
  domain.redirfilter(class: '0x0b', vendor: '0x08e6',
60
61
  product: '0x3437', version: '2.00', allow: 'yes')
62
+ domain.watchdog(model: 'i6300esb', action: 'reset')
63
+ domain.smartcard(mode: 'passthrough')
61
64
  domain.tpm_path = '/dev/tpm0'
62
65
  end
63
66
  let(:test_file) { 'domain_all_settings.xml' }
data/tools/create_box.sh CHANGED
@@ -88,7 +88,7 @@ cd "$TMP_DIR"
88
88
  #Using the awk int function here to truncate the virtual image size to an
89
89
  #integer since the fog-libvirt library does not seem to properly handle
90
90
  #floating point.
91
- IMG_SIZE=$(qemu-img info "$TMP_IMG" | awk '/virtual size/{print int($3)+1;}' | tr -d 'G')
91
+ IMG_SIZE=$(qemu-img info --output=json "$TMP_IMG" | awk '/virtual-size/{s=int($2)/(1024^3); print (s == int(s)) ? s : int(s)+1 }')
92
92
 
93
93
  echo "{$IMG_SIZE}"
94
94
 
@@ -118,7 +118,7 @@ EOF
118
118
 
119
119
  echo "==> Creating box, tarring and gzipping"
120
120
 
121
- tar cvzf "$BOX" --totals ./metadata.json ./Vagrantfile ./box.img
121
+ tar cvzf "$BOX" -S --totals ./metadata.json ./Vagrantfile ./box.img
122
122
 
123
123
  # if box is in tmpdir move it to CWD before removing tmpdir
124
124
  if ! isabspath "$BOX"; then
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-libvirt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.37
4
+ version: 0.0.38
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lukas Stanek
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-09 00:00:00.000000000 Z
13
+ date: 2017-04-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec-core
@@ -160,12 +160,8 @@ files:
160
160
  - lib/vagrant-libvirt/provider.rb
161
161
  - lib/vagrant-libvirt/templates/default_storage_pool.xml.erb
162
162
  - lib/vagrant-libvirt/templates/domain.xml.erb
163
- - lib/vagrant-libvirt/templates/filesystem.xml.erb
164
- - lib/vagrant-libvirt/templates/interface.xml.erb
165
163
  - lib/vagrant-libvirt/templates/private_network.xml.erb
166
164
  - lib/vagrant-libvirt/templates/public_interface.xml.erb
167
- - lib/vagrant-libvirt/templates/tunnel_interface.xml.erb
168
- - lib/vagrant-libvirt/templates/volume_snapshot.xml.erb
169
165
  - lib/vagrant-libvirt/util.rb
170
166
  - lib/vagrant-libvirt/util/collection.rb
171
167
  - lib/vagrant-libvirt/util/erb_template.rb
@@ -1,8 +0,0 @@
1
- <filesystem type='mount' accessmode='<%= accessmode %>'>
2
- <driver type='path' wrpolicy='immediate'/>
3
- <source dir='<%= hostpath %>'/>
4
- <target dir='<%= mount_tag %>'/>
5
- <% unless readonly.nil? %>
6
- <readonly />
7
- <% end %>
8
- </filesystem>
@@ -1,14 +0,0 @@
1
- <interface type='network'>
2
- <source network='<%= @network_name %>'/>
3
- <% if @mac %>
4
- <mac address='<%= @mac %>'/>
5
- <% end %>
6
- <% if @device_name %>
7
- <target dev='<%= @device_name %>'/>
8
- <% else %>
9
- <target dev='vnet<%= @iface_number %>'/>
10
- <% end %>
11
- <alias name='net<%= @iface_number %>'/>
12
- <model type='<%=@model_type%>'/>
13
- </interface>
14
-
@@ -1,17 +0,0 @@
1
- <interface type='<%= @type %>'>
2
- <% if @mac %>
3
- <mac address='<%= @mac %>'/>
4
- <% end %>
5
- <source address='<%=@tunnel_ip%>' port='<%= @tunnel_port %>'>
6
- <% if @type == 'udp' %>
7
- <local address='<%=@udp_tunnel_local_ip%>' port='<%=@udp_tunnel_local_port%>' />
8
- <% end %>
9
- </source>
10
- <% if @device_name %>
11
- <target dev='<%= @device_name %>'/>
12
- <% else %>
13
- <target dev='tnet<%= @iface_number %>'/>
14
- <% end %>
15
- <alias name='net<%= @iface_number %>'/>
16
- <model type='<%=@model_type%>'/>
17
- </interface>
@@ -1,26 +0,0 @@
1
- <volume>
2
- <name><%= @name %></name>
3
- <capacity unit="G"><%= @capacity %></capacity>
4
-
5
- <target>
6
- <format type='qcow2'/>
7
- <permissions>
8
- <owner>0</owner>
9
- <group>0</group>
10
- <mode>0600</mode>
11
- <label>virt_image_t</label>
12
- </permissions>
13
- </target>
14
-
15
- <backingStore>
16
- <path><%= @backing_file %></path>
17
- <format type='qcow2'/>
18
- <permissions>
19
- <owner>0</owner>
20
- <group>0</group>
21
- <mode>0600</mode>
22
- <label>virt_image_t</label>
23
- </permissions>
24
- </backingStore>
25
- </volume>
26
-