virtualbox 0.4.3 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -3
- data/Gemfile +8 -8
- data/Rakefile +2 -0
- data/Readme.md +11 -2
- data/VERSION +1 -1
- data/docs/WhatsNew.md +40 -24
- data/lib/virtualbox.rb +9 -0
- data/lib/virtualbox/abstract_model.rb +80 -10
- data/lib/virtualbox/abstract_model/attributable.rb +61 -1
- data/lib/virtualbox/abstract_model/relatable.rb +88 -6
- data/lib/virtualbox/attached_device.rb +18 -10
- data/lib/virtualbox/command.rb +13 -0
- data/lib/virtualbox/dvd.rb +35 -0
- data/lib/virtualbox/exceptions.rb +1 -0
- data/lib/virtualbox/extra_data.rb +10 -21
- data/lib/virtualbox/global.rb +126 -0
- data/lib/virtualbox/hard_drive.rb +33 -9
- data/lib/virtualbox/image.rb +2 -3
- data/lib/virtualbox/media.rb +19 -0
- data/lib/virtualbox/nic.rb +28 -67
- data/lib/virtualbox/shared_folder.rb +7 -12
- data/lib/virtualbox/storage_controller.rb +8 -36
- data/lib/virtualbox/system_property.rb +55 -0
- data/lib/virtualbox/usb.rb +72 -0
- data/lib/virtualbox/vm.rb +126 -25
- data/test/test_helper.rb +118 -12
- data/test/virtualbox/abstract_model/attributable_test.rb +55 -5
- data/test/virtualbox/abstract_model/relatable_test.rb +66 -4
- data/test/virtualbox/abstract_model_test.rb +140 -8
- data/test/virtualbox/attached_device_test.rb +10 -7
- data/test/virtualbox/command_test.rb +13 -0
- data/test/virtualbox/dvd_test.rb +50 -28
- data/test/virtualbox/extra_data_test.rb +11 -51
- data/test/virtualbox/global_test.rb +78 -0
- data/test/virtualbox/hard_drive_test.rb +34 -57
- data/test/virtualbox/image_test.rb +0 -5
- data/test/virtualbox/nic_test.rb +11 -64
- data/test/virtualbox/shared_folder_test.rb +5 -5
- data/test/virtualbox/storage_controller_test.rb +15 -30
- data/test/virtualbox/system_property_test.rb +71 -0
- data/test/virtualbox/usb_test.rb +35 -0
- data/test/virtualbox/vm_test.rb +62 -121
- data/virtualbox.gemspec +15 -2
- metadata +23 -4
@@ -86,8 +86,8 @@ module VirtualBox
|
|
86
86
|
#
|
87
87
|
class SharedFolder < AbstractModel
|
88
88
|
attribute :parent, :readonly => :readonly
|
89
|
-
attribute :name
|
90
|
-
attribute :hostpath
|
89
|
+
attribute :name
|
90
|
+
attribute :hostpath
|
91
91
|
|
92
92
|
class <<self
|
93
93
|
# Populates the shared folder relationship for anything which is related to it.
|
@@ -95,15 +95,12 @@ module VirtualBox
|
|
95
95
|
# **This method typically won't be used except internally.**
|
96
96
|
#
|
97
97
|
# @return [Array<SharedFolder>]
|
98
|
-
def populate_relationship(caller,
|
98
|
+
def populate_relationship(caller, doc)
|
99
99
|
relation = Proxies::Collection.new(caller)
|
100
100
|
|
101
101
|
counter = 1
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
folder = new(counter, caller, data)
|
106
|
-
relation.push(folder)
|
102
|
+
doc.css("Hardware SharedFolders SharedFolder").each do |folder|
|
103
|
+
relation << new(counter, caller, folder)
|
107
104
|
counter += 1
|
108
105
|
end
|
109
106
|
|
@@ -156,10 +153,8 @@ module VirtualBox
|
|
156
153
|
def initialize_for_relationship(index, caller, data)
|
157
154
|
# Setup the index specific attributes
|
158
155
|
populate_data = {}
|
159
|
-
|
160
|
-
key =
|
161
|
-
value = data["#{key}#{index}".downcase.to_sym]
|
162
|
-
populate_data[key] = value
|
156
|
+
data.attributes.each do |key, value|
|
157
|
+
populate_data[key.downcase.to_sym] = value.to_s
|
163
158
|
end
|
164
159
|
|
165
160
|
populate_attributes(populate_data.merge({
|
@@ -43,7 +43,6 @@ module VirtualBox
|
|
43
43
|
attribute :parent, :readonly => true
|
44
44
|
attribute :name
|
45
45
|
attribute :type
|
46
|
-
attribute :max_ports, :populate_key => :maxportcount
|
47
46
|
attribute :ports, :populate_key => :portcount
|
48
47
|
relationship :devices, AttachedDevice, :dependent => :destroy
|
49
48
|
|
@@ -53,14 +52,12 @@ module VirtualBox
|
|
53
52
|
# **This method typically won't be used except internally.**
|
54
53
|
#
|
55
54
|
# @return [Array<StorageController>]
|
56
|
-
def populate_relationship(caller,
|
57
|
-
relation =
|
55
|
+
def populate_relationship(caller, doc)
|
56
|
+
relation = Proxies::Collection.new(caller)
|
58
57
|
|
59
58
|
counter = 0
|
60
|
-
|
61
|
-
|
62
|
-
nic = new(counter, caller, data)
|
63
|
-
relation.push(nic)
|
59
|
+
doc.css("StorageControllers StorageController").each do |sc|
|
60
|
+
relation << new(counter, caller, sc)
|
64
61
|
counter += 1
|
65
62
|
end
|
66
63
|
|
@@ -96,37 +93,12 @@ module VirtualBox
|
|
96
93
|
|
97
94
|
# Setup the index specific attributes
|
98
95
|
populate_data = {}
|
99
|
-
|
100
|
-
key =
|
101
|
-
value = data["storagecontroller#{key}#{index}".to_sym]
|
102
|
-
populate_data[key] = value
|
96
|
+
data.attributes.each do |key,value|
|
97
|
+
populate_data[key.downcase.to_sym] = value.to_s
|
103
98
|
end
|
104
99
|
|
105
|
-
|
106
|
-
|
107
|
-
populate_data.merge!(extract_devices(index, data))
|
108
|
-
|
109
|
-
populate_attributes(populate_data.merge({
|
110
|
-
:parent => caller
|
111
|
-
}))
|
112
|
-
end
|
113
|
-
|
114
|
-
# Extracts related devices for a storage controller.
|
115
|
-
#
|
116
|
-
# **This method typically won't be used except internally.**
|
117
|
-
#
|
118
|
-
# @return [Hash]
|
119
|
-
def extract_devices(index, data)
|
120
|
-
name = data["storagecontrollername#{index}".downcase.to_sym].downcase
|
121
|
-
|
122
|
-
device_data = {}
|
123
|
-
data.each do |k,v|
|
124
|
-
next unless k.to_s =~ /^#{name}-/
|
125
|
-
|
126
|
-
device_data[k] = v
|
127
|
-
end
|
128
|
-
|
129
|
-
device_data
|
100
|
+
populate_attributes(populate_data.merge({:parent => caller}), :ignore_relationships => true)
|
101
|
+
populate_relationship(:devices, data)
|
130
102
|
end
|
131
103
|
end
|
132
104
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module VirtualBox
|
2
|
+
# Represents the system properties of the system which VirtualBox
|
3
|
+
# is running on. These system properties are immutable values which
|
4
|
+
# are typically limits or specs of the host system. Some examples
|
5
|
+
# of available properties are `Maximum guest RAM size` or
|
6
|
+
# `Maximum Devices per SATA Port`.
|
7
|
+
#
|
8
|
+
# # Retrieving the System Properties
|
9
|
+
#
|
10
|
+
# Retrieving the system properties is done by calling the {all} method.
|
11
|
+
# Since {SystemProperty} inherits from `Hash`, you can treat it just like
|
12
|
+
# one. The keys are simply the typical keys downcased with spaces replaced
|
13
|
+
# with underscores, and converted to a symbol. An example of accessing
|
14
|
+
# system properties is shown below:
|
15
|
+
#
|
16
|
+
# properties = VirtualBox::SystemProperty.all
|
17
|
+
# puts properties[:log_history_count]
|
18
|
+
# puts properties[:maximum_guest_ram_size]
|
19
|
+
#
|
20
|
+
# Since {SystemProperty} is simply a hash, you can also iterate over it,
|
21
|
+
# convert it easily to an array, etc.
|
22
|
+
class SystemProperty < Hash
|
23
|
+
class <<self
|
24
|
+
# Returns the hash of all system properties. Each call will invoke a
|
25
|
+
# system call to retrieve the properties (as in they're not cached
|
26
|
+
# on the class), so if you need to access them many times, please
|
27
|
+
# cache them yourself.
|
28
|
+
#
|
29
|
+
# @return [SystemProperty]
|
30
|
+
def all
|
31
|
+
raw = Command.vboxmanage("list", "systemproperties")
|
32
|
+
parse_raw(raw)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Parses the raw output of vboxmanage. This parses the raw output from
|
36
|
+
# VBoxManage to parse the system properties.
|
37
|
+
#
|
38
|
+
# **This method typically won't be used except internally.**
|
39
|
+
#
|
40
|
+
# @param [String] data The raw output from vboxmanage.
|
41
|
+
# @return [SystemProperty]
|
42
|
+
def parse_raw(data)
|
43
|
+
result = new
|
44
|
+
data.split("\n").each do |line|
|
45
|
+
next unless line =~ /^(.+?):\s+(.+?)$/
|
46
|
+
value = $2.to_s
|
47
|
+
key = $1.to_s.downcase.gsub(/\s/, "_")
|
48
|
+
result[key.to_sym] = value
|
49
|
+
end
|
50
|
+
|
51
|
+
result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module VirtualBox
|
2
|
+
# Represents a single USB device of a virtual machine.
|
3
|
+
#
|
4
|
+
# **Currently, new USB devices can't be created, so the only way to get this
|
5
|
+
# object is through a {VM}'s `usbs` relationship.**
|
6
|
+
#
|
7
|
+
# # Attributes
|
8
|
+
#
|
9
|
+
# Properties of the model are exposed using standard ruby instance
|
10
|
+
# methods which are generated on the fly. Because of this, they are not listed
|
11
|
+
# below as available instance methods.
|
12
|
+
#
|
13
|
+
# These attributes can be accessed and modified via standard ruby-style
|
14
|
+
# `instance.attribute` and `instance.attribute=` methods. The attributes are
|
15
|
+
# listed below. If you aren't sure what this means or you can't understand
|
16
|
+
# why the below is listed, please read {Attributable}.
|
17
|
+
#
|
18
|
+
# attribute :parent, :readonly => :readonly
|
19
|
+
# attribute :name
|
20
|
+
# attribute :active
|
21
|
+
# attribute :manufacturer
|
22
|
+
# attribute :product
|
23
|
+
# attribute :remote
|
24
|
+
#
|
25
|
+
class USB < AbstractModel
|
26
|
+
attribute :parent, :readonly => :readonly
|
27
|
+
attribute :name
|
28
|
+
attribute :active
|
29
|
+
attribute :manufacturer
|
30
|
+
attribute :product
|
31
|
+
attribute :remote
|
32
|
+
|
33
|
+
class <<self
|
34
|
+
# Populates the usb device relationship for anything which is related to it.
|
35
|
+
#
|
36
|
+
# **This method typically won't be used except internally.**
|
37
|
+
#
|
38
|
+
# @return [Array<USB>]
|
39
|
+
def populate_relationship(caller, doc)
|
40
|
+
relation = Proxies::Collection.new(caller)
|
41
|
+
|
42
|
+
doc.css("Hardware USBController DeviceFilter").each do |device|
|
43
|
+
relation << new(caller, device)
|
44
|
+
end
|
45
|
+
|
46
|
+
relation
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Since there is currently no way to create a _new_ usb device, this is
|
51
|
+
# only used internally. Developers should NOT try to initialize their
|
52
|
+
# own usb device objects.
|
53
|
+
def initialize(caller, data)
|
54
|
+
super()
|
55
|
+
|
56
|
+
# Set the parent
|
57
|
+
write_attribute(:parent, caller)
|
58
|
+
|
59
|
+
# Convert each attribute value to a string
|
60
|
+
attrs = {}
|
61
|
+
|
62
|
+
data.attributes.each do |key, value|
|
63
|
+
attrs[key.to_sym] = value.to_s
|
64
|
+
end
|
65
|
+
|
66
|
+
populate_attributes(attrs)
|
67
|
+
|
68
|
+
# Clear dirtiness
|
69
|
+
clear_dirty!
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
data/lib/virtualbox/vm.rb
CHANGED
@@ -42,6 +42,7 @@ module VirtualBox
|
|
42
42
|
# attribute :uuid, :readonly => true
|
43
43
|
# attribute :name
|
44
44
|
# attribute :ostype
|
45
|
+
# attribute :description, :readonly => true
|
45
46
|
# attribute :memory
|
46
47
|
# attribute :vram
|
47
48
|
# attribute :acpi
|
@@ -63,9 +64,14 @@ module VirtualBox
|
|
63
64
|
# attribute :clipboard
|
64
65
|
# attribute :monitorcount
|
65
66
|
# attribute :usb
|
67
|
+
# attribute :ehci
|
66
68
|
# attribute :audio
|
69
|
+
# attribute :audiocontroller
|
70
|
+
# attribute :audiodriver
|
67
71
|
# attribute :vrdp
|
68
|
-
# attribute :
|
72
|
+
# attribute :vrdpport
|
73
|
+
# attribute :vrdpauthtype
|
74
|
+
# attribute :vrdpauthtimeout
|
69
75
|
# attribute :state, :populate_key => :vmstate, :readonly => true
|
70
76
|
#
|
71
77
|
# ## Relationships
|
@@ -75,6 +81,7 @@ module VirtualBox
|
|
75
81
|
# understand this, read {Relatable}.
|
76
82
|
#
|
77
83
|
# relationship :nics, Nic
|
84
|
+
# relationship :usbs, USB
|
78
85
|
# relationship :storage_controllers, StorageController, :dependent => :destroy
|
79
86
|
# relationship :shared_folders, SharedFolder
|
80
87
|
# relationship :extra_data, ExtraData
|
@@ -84,12 +91,13 @@ module VirtualBox
|
|
84
91
|
attribute :uuid, :readonly => true
|
85
92
|
attribute :name
|
86
93
|
attribute :ostype
|
94
|
+
attribute :description, :readonly => true
|
87
95
|
attribute :memory
|
88
96
|
attribute :vram
|
89
97
|
attribute :acpi
|
90
98
|
attribute :ioapic
|
91
99
|
attribute :cpus
|
92
|
-
attribute :synthcpu
|
100
|
+
attribute :synthcpu, :lazy => true
|
93
101
|
attribute :pae
|
94
102
|
attribute :hwvirtex
|
95
103
|
attribute :hwvirtexexcl
|
@@ -105,11 +113,17 @@ module VirtualBox
|
|
105
113
|
attribute :clipboard
|
106
114
|
attribute :monitorcount
|
107
115
|
attribute :usb
|
116
|
+
attribute :ehci
|
108
117
|
attribute :audio
|
118
|
+
attribute :audiocontroller
|
119
|
+
attribute :audiodriver
|
109
120
|
attribute :vrdp
|
110
|
-
attribute :
|
111
|
-
attribute :
|
121
|
+
attribute :vrdpport
|
122
|
+
attribute :vrdpauthtype
|
123
|
+
attribute :vrdpauthtimeout
|
124
|
+
attribute :state, :populate_key => :vmstate, :readonly => true, :lazy => true
|
112
125
|
relationship :nics, Nic
|
126
|
+
relationship :usbs, USB
|
113
127
|
relationship :storage_controllers, StorageController, :dependent => :destroy
|
114
128
|
relationship :shared_folders, SharedFolder
|
115
129
|
relationship :extra_data, ExtraData
|
@@ -119,9 +133,8 @@ module VirtualBox
|
|
119
133
|
# Returns an array of all available VMs.
|
120
134
|
#
|
121
135
|
# @return [Array<VM>]
|
122
|
-
def all
|
123
|
-
|
124
|
-
parse_vm_list(raw)
|
136
|
+
def all(reload=false)
|
137
|
+
Global.global(reload).vms
|
125
138
|
end
|
126
139
|
|
127
140
|
# Finds a VM by UUID or registered name and returns a
|
@@ -129,9 +142,20 @@ module VirtualBox
|
|
129
142
|
#
|
130
143
|
# @return [VM]
|
131
144
|
def find(name)
|
132
|
-
|
133
|
-
|
134
|
-
|
145
|
+
all(true).detect { |o| o.name == name || o.uuid == name }
|
146
|
+
end
|
147
|
+
|
148
|
+
# Loads a VM from its XML configuration file. All VMs managed
|
149
|
+
# by VirtualBox have an XML configuration file somewhere. If
|
150
|
+
# given the path, this will instantiate the VM that way. Typically
|
151
|
+
# this method will only be called internally. Users of the class
|
152
|
+
# should use {all} or {find} instead.
|
153
|
+
#
|
154
|
+
# @param [String] location Full path to the XML file.
|
155
|
+
# @return [VM]
|
156
|
+
def load_from_xml(location)
|
157
|
+
vm_doc = Command.parse_xml(location)
|
158
|
+
new(vm_doc)
|
135
159
|
end
|
136
160
|
|
137
161
|
# Imports a VM, blocking the entire thread during this time.
|
@@ -147,16 +171,6 @@ module VirtualBox
|
|
147
171
|
find(parse_vm_name(raw))
|
148
172
|
end
|
149
173
|
|
150
|
-
# Gets the non-machine-readable info for a given VM and returns
|
151
|
-
# it as a raw string.
|
152
|
-
#
|
153
|
-
# **This method typically won't be used except internally.**
|
154
|
-
#
|
155
|
-
# @return [String]
|
156
|
-
def human_info(name)
|
157
|
-
Command.vboxmanage("showvminfo", name)
|
158
|
-
end
|
159
|
-
|
160
174
|
# Gets the VM info (machine readable) for a given VM and returns it
|
161
175
|
# as a hash.
|
162
176
|
#
|
@@ -204,6 +218,17 @@ module VirtualBox
|
|
204
218
|
return nil unless raw =~ /VM name "(.+?)"/
|
205
219
|
$1.to_s
|
206
220
|
end
|
221
|
+
|
222
|
+
def populate_relationship(caller, doc)
|
223
|
+
result = Proxies::Collection.new(caller)
|
224
|
+
|
225
|
+
doc.css("Global MachineRegistry MachineEntry").each do |entry|
|
226
|
+
location = Global.expand_path(entry[:src])
|
227
|
+
result << load_from_xml(location)
|
228
|
+
end
|
229
|
+
|
230
|
+
result
|
231
|
+
end
|
207
232
|
end
|
208
233
|
|
209
234
|
# Creates a new instance of a virtual machine.
|
@@ -215,8 +240,77 @@ module VirtualBox
|
|
215
240
|
def initialize(data)
|
216
241
|
super()
|
217
242
|
|
218
|
-
|
219
|
-
|
243
|
+
initialize_attributes(data)
|
244
|
+
populate_relationships(data)
|
245
|
+
@original_name = name
|
246
|
+
end
|
247
|
+
|
248
|
+
def initialize_attributes(doc)
|
249
|
+
attribute_associations = {
|
250
|
+
:uuid => ["Machine", :uuid],
|
251
|
+
:name => ["Machine", :name],
|
252
|
+
:ostype => ["Machine", :OSType],
|
253
|
+
:description => ["Machine Description"],
|
254
|
+
:memory => ["Hardware Memory", :RAMSize],
|
255
|
+
:vram => ["Hardware Display", :VRAMSize],
|
256
|
+
:acpi => ["Hardware BIOS ACPI", :enabled],
|
257
|
+
:ioapic => ["Hardware BIOS IOAPIC", :enabled],
|
258
|
+
:cpus => ["Hardware CPU", :count],
|
259
|
+
:pae => ["Hardware CPU PAE", :enabled],
|
260
|
+
:hwvirtex => ["Hardware CPU HardwareVirtEx", :enabled],
|
261
|
+
:hwvirtexexcl => ["Hardware CPU HardwareVirtEx", :exclusive],
|
262
|
+
:nestedpaging => ["Hardware CPU HardwareVirtExNestedPaging", :enabled],
|
263
|
+
:vtxvpid => ["Hardware CPU HardwareVirtExVPID", :enabled],
|
264
|
+
:accelerate3d => ["Hardware Display", :accelerate3D],
|
265
|
+
:accelerate2dvideo => ["Hardware Display", :accelerate2DVideo],
|
266
|
+
:biosbootmenu => ["Hardware BIOS BootMenu", :mode],
|
267
|
+
:boot1 => ["Hardware Boot Order[position=\"1\"]", :device],
|
268
|
+
:boot2 => ["Hardware Boot Order[position=\"2\"]", :device],
|
269
|
+
:boot3 => ["Hardware Boot Order[position=\"3\"]", :device],
|
270
|
+
:boot4 => ["Hardware Boot Order[position=\"4\"]", :device],
|
271
|
+
:clipboard => ["Hardware Clipboard", :mode],
|
272
|
+
:monitorcount => ["Hardware Display", :monitorCount],
|
273
|
+
:usb => ["Hardware USBController", :enabled],
|
274
|
+
:ehci => ["Hardware USBController", :enabledEhci],
|
275
|
+
:audio => ["Hardware AudioAdapter", :enabled],
|
276
|
+
:audiocontroller => ["Hardware AudioAdapter", :controller],
|
277
|
+
:audiodriver => ["Hardware AudioAdapter", :driver],
|
278
|
+
:vrdp => ["Hardware RemoteDisplay", :enabled],
|
279
|
+
:vrdpport => ["Hardware RemoteDisplay", :port],
|
280
|
+
:vrdpauthtype => ["Hardware RemoteDisplay", :authType],
|
281
|
+
:vrdpauthtimeout => ["Hardware RemoteDisplay", :authTimeout],
|
282
|
+
}
|
283
|
+
|
284
|
+
attribute_associations.each do |name, search_data|
|
285
|
+
css, key = search_data
|
286
|
+
node = doc.css(css)[0]
|
287
|
+
|
288
|
+
# key is passed in for attributes, else you get the element inner text
|
289
|
+
value = (key ? node[key] : node.inner_text) if node
|
290
|
+
|
291
|
+
# Special cases
|
292
|
+
value = value[1..-2] if name == :uuid
|
293
|
+
|
294
|
+
write_attribute(name, value)
|
295
|
+
end
|
296
|
+
|
297
|
+
# Clear dirtiness, since this should only be called initially and
|
298
|
+
# therefore shouldn't affect dirtiness
|
299
|
+
clear_dirty!
|
300
|
+
|
301
|
+
# But this is an existing record
|
302
|
+
existing_record!
|
303
|
+
end
|
304
|
+
|
305
|
+
def load_attribute(name)
|
306
|
+
info = self.class.raw_info(@original_name)
|
307
|
+
|
308
|
+
if name == :state
|
309
|
+
# Simply force a state reload, and it'll write the attribute up
|
310
|
+
write_attribute(:state, info[:vmstate])
|
311
|
+
end
|
312
|
+
|
313
|
+
write_attribute(:synthcpu, info[:synthcpu]) unless loaded_attribute?(:synthcpu)
|
220
314
|
end
|
221
315
|
|
222
316
|
# State of the virtual machine. Returns the state of the virtual
|
@@ -228,8 +322,7 @@ module VirtualBox
|
|
228
322
|
# @return [String] Virtual machine state.
|
229
323
|
def state(reload=false)
|
230
324
|
if reload
|
231
|
-
|
232
|
-
write_attribute(:state, info[:vmstate])
|
325
|
+
load_attribute(:state)
|
233
326
|
end
|
234
327
|
|
235
328
|
read_attribute(:state)
|
@@ -248,6 +341,9 @@ module VirtualBox
|
|
248
341
|
|
249
342
|
super()
|
250
343
|
|
344
|
+
# Force reload
|
345
|
+
Global.reload!
|
346
|
+
|
251
347
|
true
|
252
348
|
rescue Exceptions::CommandFailedException
|
253
349
|
raise if raise_errors
|
@@ -420,7 +516,12 @@ module VirtualBox
|
|
420
516
|
# unregistering a VM
|
421
517
|
super
|
422
518
|
|
423
|
-
Command.vboxmanage("unregistervm", @original_name, "--delete")
|
519
|
+
if Command.vboxmanage("unregistervm", @original_name, "--delete")
|
520
|
+
Global.reload!
|
521
|
+
return true
|
522
|
+
else
|
523
|
+
return false
|
524
|
+
end
|
424
525
|
end
|
425
526
|
|
426
527
|
# Returns true if the virtual machine state is running
|