vixen 0.0.7 → 0.0.8
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/README.md +70 -1
- data/lib/vixen.rb +4 -4
- data/lib/vixen/bridge.rb +98 -24
- data/lib/vixen/model/vm.rb +36 -12
- data/vixen-example.rb +51 -0
- data/vixen.gemspec +1 -1
- metadata +2 -1
data/README.md
CHANGED
@@ -123,6 +123,8 @@ Vixen::Model::VM
|
|
123
123
|
|
124
124
|
* `current_snapshot`
|
125
125
|
* `create_snapshot`
|
126
|
+
* `revert_to_snapshot`
|
127
|
+
* `remove_snapshot`
|
126
128
|
* Power Operations
|
127
129
|
* `power_on`
|
128
130
|
* `power_off`
|
@@ -145,7 +147,74 @@ Vixen::Model::Snapshot
|
|
145
147
|
* `parent` - the parent snapshot, if any
|
146
148
|
* `full_name` - the full name of the snapshot (traverses parent hierarchy)
|
147
149
|
|
150
|
+
Progress Callbacks
|
151
|
+
==================
|
152
|
+
|
153
|
+
The VIX API allows for progress callbacks which Vixen exposes through the use
|
154
|
+
of blocks passed to the method.
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
require 'rubygems'
|
158
|
+
require 'vixen'
|
159
|
+
|
160
|
+
#Vixen.logger.level = Logger::DEBUG
|
161
|
+
start = Time.now
|
162
|
+
|
163
|
+
def elapsed_time(start)
|
164
|
+
"[%s]" % (Time.at(Time.now - start).utc.strftime '%T')
|
165
|
+
end
|
166
|
+
|
167
|
+
host = Vixen.local_connect
|
168
|
+
|
169
|
+
vm = host.open_vm '/Users/jeff/Desktop/centos-5.8-pe-2.5.3-vmware/centos-5.8-pe-2.5.3-vmware.vmx' do |*args|
|
170
|
+
print "\r#{elapsed_time(start)} waiting for my vm to open"
|
171
|
+
$stdout.flush
|
172
|
+
end
|
173
|
+
|
174
|
+
vm.resume do |*args|
|
175
|
+
print "\r#{elapsed_time(start)} resuming..."
|
176
|
+
$stdout.flush
|
177
|
+
end
|
178
|
+
puts
|
179
|
+
|
180
|
+
previous_snapshot = vm.current_snapshot
|
181
|
+
|
182
|
+
puts "#{elapsed_time(start)} previous_snapshot: #{previous_snapshot}"
|
183
|
+
|
184
|
+
snapshot_name = "vixen-created #{Time.now}"
|
185
|
+
new_snapshot = vm.create_snapshot snapshot_name do |*args|
|
186
|
+
print "\r#{elapsed_time(start)} creating snapshot: #{snapshot_name}"
|
187
|
+
$stdout.flush
|
188
|
+
end
|
189
|
+
puts
|
190
|
+
|
191
|
+
vm.revert_to_snapshot previous_snapshot do |*args|
|
192
|
+
print "\r#{elapsed_time(start)} reverting to #{previous_snapshot}..."
|
193
|
+
$stdout.flush
|
194
|
+
end
|
195
|
+
puts
|
196
|
+
|
197
|
+
vm.suspend do |*args|
|
198
|
+
print "\r#{elapsed_time(start)} suspending..."
|
199
|
+
$stdout.flush
|
200
|
+
end
|
201
|
+
puts
|
202
|
+
```
|
203
|
+
|
204
|
+
produces output like
|
205
|
+
|
206
|
+
```shell
|
207
|
+
$ ruby vixen-example.rb
|
208
|
+
[00:00:00] waiting for my vm to open
|
209
|
+
[00:00:02] resuming...
|
210
|
+
[00:00:02] previous_snapshot: vixen-created
|
211
|
+
[00:02:18] creating snapshot: vixen-created Tue Nov 20 02:18:04 -0800 2012
|
212
|
+
[00:02:33] reverting to vixen-created...
|
213
|
+
[00:02:36] reverting to vixen-created...
|
214
|
+
[00:02:38] suspending...
|
215
|
+
```
|
216
|
+
|
148
217
|
See Also
|
149
|
-
|
218
|
+
========
|
150
219
|
|
151
220
|
* [Official VMware VIX 1.12 documentation](http://www.vmware.com/support/developer/vix-api/vix112_reference/)
|
data/lib/vixen.rb
CHANGED
@@ -4,12 +4,12 @@ module Vixen
|
|
4
4
|
|
5
5
|
@@logger = nil
|
6
6
|
|
7
|
-
def self.local_connect(login = nil, password = nil)
|
8
|
-
connect Vixen::Constants::VixServiceProvider[:vmware_workstation], nil, 0, login, password
|
7
|
+
def self.local_connect(login = nil, password = nil, &block)
|
8
|
+
connect Vixen::Constants::VixServiceProvider[:vmware_workstation], nil, 0, login, password, &block
|
9
9
|
end
|
10
10
|
|
11
|
-
def self.connect(host_type, hostname, port, username, password)
|
12
|
-
handle = Vixen::Bridge.connect(host_type, hostname, port, username, password)
|
11
|
+
def self.connect(host_type, hostname, port, username, password, &block)
|
12
|
+
handle = Vixen::Bridge.connect(host_type, hostname, port, username, password, &block)
|
13
13
|
Vixen::Model::Host.new(handle)
|
14
14
|
end
|
15
15
|
|
data/lib/vixen/bridge.rb
CHANGED
@@ -42,11 +42,30 @@ module Vixen::Bridge
|
|
42
42
|
attach_function :VixVM_GetCurrentSnapshot, [:handle, :pointer], :int
|
43
43
|
attach_function :VixSnapshot_GetParent, [:handle, :pointer], :int
|
44
44
|
attach_function :VixVM_PowerOn, [:handle, :int, :handle, :VixEventProc, :pointer], :handle
|
45
|
+
attach_function :VixVM_PowerOff, [:handle, :int, :VixEventProc, :pointer], :handle
|
46
|
+
attach_function :VixVM_Reset, [:handle, :int, :VixEventProc, :pointer], :handle
|
47
|
+
attach_function :VixVM_Suspend, [:handle, :int, :VixEventProc, :pointer], :handle
|
45
48
|
attach_function :VixVM_CreateSnapshot, [:handle, :string, :string, :int, :handle, :VixEventProc, :pointer], :handle
|
49
|
+
attach_function :VixVM_RevertToSnapshot, [:handle, :handle, :int, :handle, :VixEventProc, :pointer], :handle
|
50
|
+
attach_function :VixVM_RemoveSnapshot, [:handle, :handle, :int, :VixEventProc, :pointer], :handle
|
46
51
|
attach_function :VixJob_CheckCompletion, [:handle, :pointer], :int
|
47
52
|
attach_function :Vix_GetHandleType, [:handle], :int
|
48
53
|
|
49
|
-
|
54
|
+
@@all_my_blocks = []
|
55
|
+
|
56
|
+
def self.safe_proc_from_block(&block)
|
57
|
+
return nil unless block_given?
|
58
|
+
Proc.new do |*args|
|
59
|
+
begin
|
60
|
+
block.call args
|
61
|
+
rescue
|
62
|
+
puts STDERR, $!
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.connect(hostType, hostname, port, username, password, &block)
|
68
|
+
progress_proc = safe_proc_from_block &block
|
50
69
|
hostname = "https://%s%s/sdk" % [hostname, port == 0 ? '' : ":#{port}"] if hostname
|
51
70
|
Vixen.logger.info "connecting to %s with username %s" % [hostname.inspect, username.inspect]
|
52
71
|
job = Vixen::Model::Job.new(VixHost_Connect(VixApiVersion[:api_version],
|
@@ -57,10 +76,11 @@ module Vixen::Bridge
|
|
57
76
|
password,
|
58
77
|
0,
|
59
78
|
VixHandle[:invalid],
|
60
|
-
|
79
|
+
progress_proc,
|
61
80
|
nil))
|
81
|
+
spin_until_job_complete("connect to host", job)
|
62
82
|
pointer_to_handle do |host_handle_pointer|
|
63
|
-
Vixen.logger.debug "
|
83
|
+
Vixen.logger.debug "getting handle from connection job"
|
64
84
|
VixJob_Wait job.handle, VixPropertyId[:job_result_handle],
|
65
85
|
:pointer, host_handle_pointer,
|
66
86
|
:int, VixPropertyId[:none]
|
@@ -93,10 +113,11 @@ module Vixen::Bridge
|
|
93
113
|
(pointer_to :int, &block) != 0
|
94
114
|
end
|
95
115
|
|
96
|
-
def self.wait_for_async_job(operation, &block)
|
116
|
+
def self.wait_for_async_job(operation, initial_sleep_time = 0.1, sleep_increment = 0.02, &block)
|
97
117
|
job = Vixen::Model::Job.new(yield)
|
98
118
|
Vixen.logger.debug "Waiting for async %s job (%s)" %
|
99
119
|
[operation, job.handle]
|
120
|
+
spin_until_job_complete(operation, job, initial_sleep_time, sleep_increment)
|
100
121
|
err = VixJob_Wait job.handle, VixPropertyId[:none]
|
101
122
|
unless err == VixError[:ok]
|
102
123
|
Vixen.logger.error "While executing %s VIX API returned error: %s: %s" %
|
@@ -106,10 +127,11 @@ module Vixen::Bridge
|
|
106
127
|
end
|
107
128
|
end
|
108
129
|
|
109
|
-
def self.wait_for_async_handle_creation_job(operation, pointer_to_handle, &block)
|
130
|
+
def self.wait_for_async_handle_creation_job(operation, pointer_to_handle, initial_sleep_time = 0.1, sleep_increment = 0.02, &block)
|
110
131
|
job = Vixen::Model::Job.new(yield)
|
111
132
|
Vixen.logger.debug "Waiting for async %s job (%s) to create a new handle" %
|
112
133
|
[operation, job.handle]
|
134
|
+
spin_until_job_complete(operation, job, initial_sleep_time, sleep_increment)
|
113
135
|
err = VixJob_Wait job.handle, VixPropertyId[:job_result_handle],
|
114
136
|
:pointer, pointer_to_handle,
|
115
137
|
:int, VixPropertyId[:none]
|
@@ -122,15 +144,20 @@ module Vixen::Bridge
|
|
122
144
|
err
|
123
145
|
end
|
124
146
|
|
125
|
-
def self.spin_until_job_complete(operation, job)
|
147
|
+
def self.spin_until_job_complete(operation, job, initial_sleep_time = 0.1, sleep_increment = 0.02)
|
148
|
+
sleep_time = initial_sleep_time
|
126
149
|
while ( not pointer_to_bool do |bool_pointer|
|
127
150
|
Vixen.logger.debug "sleeping waiting for %s job (%s) to complete" %
|
128
151
|
[operation, job.handle]
|
129
|
-
sleep
|
152
|
+
sleep sleep_time
|
153
|
+
sleep_time += sleep_increment
|
130
154
|
Vixen.logger.debug "checking completion of %s job (%s)" %
|
131
155
|
[operation, job.handle]
|
132
|
-
thr = Thread.start { VixJob_CheckCompletion(job.handle, bool_pointer) }
|
133
|
-
|
156
|
+
thr = Thread.start { sleep 0.01; VixJob_CheckCompletion(job.handle, bool_pointer) }
|
157
|
+
Vixen.logger.debug "waiting for thread to complete"
|
158
|
+
x = thr.value
|
159
|
+
Vixen.logger.debug "thread completed with #{x}"
|
160
|
+
x
|
134
161
|
end) do
|
135
162
|
end
|
136
163
|
end
|
@@ -138,7 +165,7 @@ module Vixen::Bridge
|
|
138
165
|
def self.running_vms(host_handle, &block)
|
139
166
|
available_vms = []
|
140
167
|
|
141
|
-
collect_proc =
|
168
|
+
collect_proc = safe_proc_from_block do |job_handle, event_type, more_event_info, client_data|
|
142
169
|
if event_type == VixEventType[:find_item]
|
143
170
|
path = get_string_property more_event_info, VixPropertyId[:found_item_location]
|
144
171
|
if path
|
@@ -176,27 +203,44 @@ module Vixen::Bridge
|
|
176
203
|
Vix_ReleaseHandle handle
|
177
204
|
end
|
178
205
|
|
179
|
-
def self.open_vm(host_handle, vm_path)
|
206
|
+
def self.open_vm(host_handle, vm_path, &block)
|
207
|
+
progress_proc = safe_proc_from_block &block
|
180
208
|
vm_handle = pointer_to_handle do |vm_handle_pointer|
|
181
209
|
wait_for_async_handle_creation_job "open vm", vm_handle_pointer do
|
182
210
|
Vixen.logger.info "opening %s" % vm_path
|
183
211
|
VixHost_OpenVM host_handle, vm_path, VixVMOpenOptions[:normal],
|
184
|
-
VixHandle[:invalid],
|
212
|
+
VixHandle[:invalid], progress_proc, nil
|
185
213
|
end
|
186
214
|
end
|
187
215
|
end
|
188
216
|
|
189
|
-
def self.create_snapshot(vm_handle, name, description)
|
217
|
+
def self.create_snapshot(vm_handle, name, description, &block)
|
218
|
+
progress_proc = safe_proc_from_block &block
|
190
219
|
snapshot_handle = pointer_to_handle do |snapshot_handle_pointer|
|
191
|
-
wait_for_async_handle_creation_job "create snapshot", snapshot_handle_pointer do
|
220
|
+
wait_for_async_handle_creation_job "create snapshot", snapshot_handle_pointer, 1, 0.2 do
|
192
221
|
Vixen.logger.info "creating %s snapshot" % name
|
193
222
|
VixVM_CreateSnapshot vm_handle, name, description,
|
194
223
|
VixCreateSnapshotOptions[:include_memory],
|
195
|
-
VixHandle[:invalid],
|
224
|
+
VixHandle[:invalid], progress_proc, nil
|
196
225
|
end
|
197
226
|
end
|
198
227
|
end
|
199
228
|
|
229
|
+
def self.revert_to_snapshot(vm, snapshot, &block)
|
230
|
+
progress_proc = safe_proc_from_block &block
|
231
|
+
wait_for_async_job(("revert to %s snapshot" % snapshot.display_name), 1, 0.2) do
|
232
|
+
VixVM_RevertToSnapshot vm.handle, snapshot.handle, VixVMPowerOptions[:normal],
|
233
|
+
VixHandle[:invalid], progress_proc, nil
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def self.remove_snapshot(vm, snapshot, &block)
|
238
|
+
progress_proc = safe_proc_from_block &block
|
239
|
+
wait_for_async_job(("remove %s snapshot" % snapshot.display_name), 1, 0.2) do
|
240
|
+
VixVM_RemoveSnapshot vm.handle, snapshot.handle, 0, progress_proc, nil
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
200
244
|
def self.current_snapshot(vm_handle)
|
201
245
|
pointer_to_handle do |snapshot_handle_pointer|
|
202
246
|
Vixen.logger.debug "retrieving current snapshot"
|
@@ -218,7 +262,7 @@ module Vixen::Bridge
|
|
218
262
|
:pointer, string_pointer,
|
219
263
|
:int, VixPropertyId[:none])
|
220
264
|
end
|
221
|
-
value = string.read_string.
|
265
|
+
value = string.read_string.dup
|
222
266
|
Vix_FreeBuffer(string)
|
223
267
|
return value
|
224
268
|
end
|
@@ -232,31 +276,61 @@ module Vixen::Bridge
|
|
232
276
|
end
|
233
277
|
end
|
234
278
|
|
235
|
-
def self.power_on(vm_handle)
|
279
|
+
def self.power_on(vm_handle, &block)
|
280
|
+
progress_proc = safe_proc_from_block &block
|
236
281
|
wait_for_async_job "power on VM" do
|
237
282
|
Vixen.logger.debug "powering on vm (%s)" % vm_handle
|
238
|
-
VixVM_PowerOn vm_handle, VixVMPowerOptions[:normal], VixHandle[:invalid],
|
283
|
+
VixVM_PowerOn vm_handle, VixVMPowerOptions[:normal], VixHandle[:invalid], progress_proc, nil
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
def self.power_off_using_guest(vm_handle, &block)
|
288
|
+
begin
|
289
|
+
progress_proc = safe_proc_from_block &block
|
290
|
+
wait_for_async_job "power off VM using tools" do
|
291
|
+
Vixen.logger.debug "powering off vm (%s)" % vm_handle
|
292
|
+
VixVM_PowerOff vm_handle, VixVMPowerOptions[:from_guest], progress_proc, nil
|
293
|
+
end
|
294
|
+
true
|
295
|
+
rescue
|
296
|
+
false
|
239
297
|
end
|
240
298
|
end
|
241
299
|
|
242
|
-
def self.power_off(vm_handle)
|
300
|
+
def self.power_off(vm_handle, &block)
|
301
|
+
progress_proc = safe_proc_from_block &block
|
243
302
|
wait_for_async_job "power off VM" do
|
244
303
|
Vixen.logger.debug "powering off vm (%s)" % vm_handle
|
245
|
-
VixVM_PowerOff vm_handle, VixVMPowerOptions[:normal],
|
304
|
+
VixVM_PowerOff vm_handle, VixVMPowerOptions[:normal], progress_proc, nil
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
def self.reset_using_guest(vm_handle, &block)
|
309
|
+
begin
|
310
|
+
progress_proc = safe_proc_from_block &block
|
311
|
+
wait_for_async_job "reset VM using tools" do
|
312
|
+
Vixen.logger.debug "resetting vm (%s)" % vm_handle
|
313
|
+
VixVM_Reset vm_handle, VixVMPowerOptions[:from_guest], progress_proc, nil
|
314
|
+
end
|
315
|
+
true
|
316
|
+
rescue
|
317
|
+
false
|
246
318
|
end
|
247
319
|
end
|
248
320
|
|
249
|
-
def self.reset(vm_handle)
|
321
|
+
def self.reset(vm_handle, &block)
|
322
|
+
progress_proc = safe_proc_from_block &block
|
250
323
|
wait_for_async_job "reset VM" do
|
251
324
|
Vixen.logger.debug "resetting vm (%s)" % vm_handle
|
252
|
-
VixVM_Reset vm_handle, VixVMPowerOptions[:normal],
|
325
|
+
VixVM_Reset vm_handle, VixVMPowerOptions[:normal], progress_proc, nil
|
253
326
|
end
|
254
327
|
end
|
255
328
|
|
256
|
-
def self.suspend(vm_handle)
|
329
|
+
def self.suspend(vm_handle, &block)
|
330
|
+
progress_proc = safe_proc_from_block &block
|
257
331
|
wait_for_async_job "suspend VM" do
|
258
332
|
Vixen.logger.debug "suspending vm (%s)" % vm_handle
|
259
|
-
VixVM_Suspend vm_handle, VixVMPowerOptions[:normal],
|
333
|
+
VixVM_Suspend vm_handle, VixVMPowerOptions[:normal], progress_proc, nil
|
260
334
|
end
|
261
335
|
end
|
262
336
|
|
data/lib/vixen/model/vm.rb
CHANGED
@@ -7,32 +7,56 @@ class Vixen::Model::VM < Vixen::Model::Base
|
|
7
7
|
Vixen::Model::Snapshot.new(Vixen::Bridge.current_snapshot(handle))
|
8
8
|
end
|
9
9
|
|
10
|
-
def create_snapshot(name, description)
|
11
|
-
Vixen::Model::Snapshot.new(Vixen::Bridge.create_snapshot handle, name, description)
|
10
|
+
def create_snapshot(name, description="", &block)
|
11
|
+
Vixen::Model::Snapshot.new(Vixen::Bridge.create_snapshot handle, name, description, &block)
|
12
12
|
end
|
13
13
|
|
14
|
-
def
|
14
|
+
def revert_to_snapshot(snapshot, &block)
|
15
|
+
Vixen::Bridge.revert_to_snapshot self, snapshot, &block
|
16
|
+
end
|
17
|
+
|
18
|
+
def remove_snapshot(snapshot, &block)
|
19
|
+
Vixen::Bridge.remove_snaphost self, snapshot, &block
|
20
|
+
end
|
21
|
+
|
22
|
+
def power_on(&block)
|
15
23
|
return self if powered_on? or powering_on? or resuming? or resetting?
|
16
|
-
Vixen::Bridge.power_on handle
|
24
|
+
Vixen::Bridge.power_on handle, &block
|
17
25
|
self
|
18
26
|
end
|
19
27
|
|
20
|
-
def resume
|
21
|
-
power_on
|
28
|
+
def resume(&block)
|
29
|
+
power_on &block
|
22
30
|
end
|
23
31
|
|
24
|
-
def suspend
|
25
|
-
Vixen::Bridge.suspend handle
|
32
|
+
def suspend(&block)
|
33
|
+
Vixen::Bridge.suspend handle, &block
|
26
34
|
self
|
27
35
|
end
|
28
36
|
|
29
|
-
def power_off
|
30
|
-
|
37
|
+
def power_off(opts={}, &block)
|
38
|
+
hard_power_off = opts[:hard] || :if_necessary
|
39
|
+
case hard_power_off
|
40
|
+
when :if_necessary
|
41
|
+
Vixen::Bridge.power_off_using_guest(handle, &block) || Vixen::Bridge.power_off(handle, &block)
|
42
|
+
when :always
|
43
|
+
Vixen::Bridge.power_off(handle, &block)
|
44
|
+
else
|
45
|
+
Vixen::Bridge.power_off_using_guest(handle, &block)
|
46
|
+
end
|
31
47
|
self
|
32
48
|
end
|
33
49
|
|
34
|
-
def reset
|
35
|
-
|
50
|
+
def reset(opts={}, &block)
|
51
|
+
hard_reset = opts[:hard] || :if_necessary
|
52
|
+
case hard_reset
|
53
|
+
when :if_necessary
|
54
|
+
Vixen::Bridge.reset_using_guest(handle, &block) || Vixen::Bridge.reset(handle, &block)
|
55
|
+
when :always
|
56
|
+
Vixen::Bridge.reset(handle, &block)
|
57
|
+
else
|
58
|
+
Vixen::Bridge.reset_using_guest(handle, &block)
|
59
|
+
end
|
36
60
|
self
|
37
61
|
end
|
38
62
|
|
data/vixen-example.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'vixen'
|
3
|
+
|
4
|
+
#Vixen.logger.level = Logger::DEBUG
|
5
|
+
start = Time.now
|
6
|
+
|
7
|
+
def elapsed_time(start)
|
8
|
+
"[%s]" % (Time.at(Time.now - start).utc.strftime '%T')
|
9
|
+
end
|
10
|
+
|
11
|
+
host = Vixen.local_connect
|
12
|
+
|
13
|
+
vm = host.open_vm '/Users/jeff/Desktop/centos-5.8-pe-2.5.3-vmware/centos-5.8-pe-2.5.3-vmware.vmx' do |*args|
|
14
|
+
print "\r#{elapsed_time(start)} waiting for my vm to open"
|
15
|
+
$stdout.flush
|
16
|
+
end
|
17
|
+
|
18
|
+
vm.resume do |*args|
|
19
|
+
print "\r#{elapsed_time(start)} resuming..."
|
20
|
+
$stdout.flush
|
21
|
+
end
|
22
|
+
puts
|
23
|
+
|
24
|
+
previous_snapshot = vm.current_snapshot
|
25
|
+
|
26
|
+
puts "#{elapsed_time(start)} previous_snapshot: #{previous_snapshot}"
|
27
|
+
|
28
|
+
snapshot_name = "vixen-created #{Time.now}"
|
29
|
+
new_snapshot = vm.create_snapshot snapshot_name do |*args|
|
30
|
+
print "\r#{elapsed_time(start)} creating snapshot: #{snapshot_name}"
|
31
|
+
$stdout.flush
|
32
|
+
end
|
33
|
+
puts
|
34
|
+
|
35
|
+
vm.revert_to_snapshot previous_snapshot do |*args|
|
36
|
+
print "\r#{elapsed_time(start)} reverting to #{previous_snapshot}..."
|
37
|
+
$stdout.flush
|
38
|
+
end
|
39
|
+
puts
|
40
|
+
|
41
|
+
vm.remove_snapshot new_snapshot do |*args|
|
42
|
+
print "\r#{elapsed_time(start)} deleting snapshot: #{new_snapshot}"
|
43
|
+
$stdout.flush
|
44
|
+
end
|
45
|
+
|
46
|
+
vm.suspend do |*args|
|
47
|
+
print "\r#{elapsed_time(start)} suspending..."
|
48
|
+
$stdout.flush
|
49
|
+
end
|
50
|
+
puts
|
51
|
+
|
data/vixen.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vixen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.8
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -66,6 +66,7 @@ files:
|
|
66
66
|
- lib/vixen/model/job.rb
|
67
67
|
- lib/vixen/model/snapshot.rb
|
68
68
|
- lib/vixen/model/vm.rb
|
69
|
+
- vixen-example.rb
|
69
70
|
- vixen.gemspec
|
70
71
|
homepage: https://github.com/jeffweiss/vixen
|
71
72
|
licenses:
|