vixen 0.0.6 → 0.0.7
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/lib/vixen.rb +16 -1
- data/lib/vixen/bridge.rb +61 -29
- data/lib/vixen/model/base.rb +0 -4
- data/lib/vixen/model/host.rb +7 -8
- data/lib/vixen/model/job.rb +4 -0
- data/lib/vixen/model/snapshot.rb +3 -3
- data/lib/vixen/model/vm.rb +1 -1
- data/vixen.gemspec +1 -1
- metadata +3 -2
data/lib/vixen.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'ffi'
|
2
2
|
|
3
3
|
module Vixen
|
4
|
+
|
5
|
+
@@logger = nil
|
6
|
+
|
4
7
|
def self.local_connect(login = nil, password = nil)
|
5
8
|
connect Vixen::Constants::VixServiceProvider[:vmware_workstation], nil, 0, login, password
|
6
9
|
end
|
@@ -10,6 +13,18 @@ module Vixen
|
|
10
13
|
Vixen::Model::Host.new(handle)
|
11
14
|
end
|
12
15
|
|
16
|
+
def self.logger
|
17
|
+
return @@logger unless @@logger.nil?
|
18
|
+
require 'logger'
|
19
|
+
@@logger ||= Logger.new STDOUT
|
20
|
+
@@logger.level = Logger::WARN
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.logger=(value)
|
24
|
+
@@logger = value
|
25
|
+
end
|
26
|
+
|
27
|
+
logger
|
13
28
|
end
|
14
29
|
|
15
30
|
$:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
|
@@ -20,4 +35,4 @@ require 'vixen/model/base'
|
|
20
35
|
require 'vixen/model/host'
|
21
36
|
require 'vixen/model/vm'
|
22
37
|
require 'vixen/model/snapshot'
|
23
|
-
|
38
|
+
require 'vixen/model/job'
|
data/lib/vixen/bridge.rb
CHANGED
@@ -1,11 +1,9 @@
|
|
1
1
|
require 'ffi'
|
2
2
|
require 'facter'
|
3
3
|
|
4
|
-
module Vixen; end
|
5
4
|
module Vixen::Bridge
|
6
5
|
extend FFI::Library
|
7
6
|
|
8
|
-
require File.join(File.dirname(__FILE__), 'constants')
|
9
7
|
extend Vixen::Constants
|
10
8
|
include Vixen::Constants
|
11
9
|
|
@@ -46,11 +44,12 @@ module Vixen::Bridge
|
|
46
44
|
attach_function :VixVM_PowerOn, [:handle, :int, :handle, :VixEventProc, :pointer], :handle
|
47
45
|
attach_function :VixVM_CreateSnapshot, [:handle, :string, :string, :int, :handle, :VixEventProc, :pointer], :handle
|
48
46
|
attach_function :VixJob_CheckCompletion, [:handle, :pointer], :int
|
47
|
+
attach_function :Vix_GetHandleType, [:handle], :int
|
49
48
|
|
50
49
|
def self.connect(hostType, hostname, port, username, password)
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
hostname = "https://%s%s/sdk" % [hostname, port == 0 ? '' : ":#{port}"] if hostname
|
51
|
+
Vixen.logger.info "connecting to %s with username %s" % [hostname.inspect, username.inspect]
|
52
|
+
job = Vixen::Model::Job.new(VixHost_Connect(VixApiVersion[:api_version],
|
54
53
|
hostType,
|
55
54
|
hostname,
|
56
55
|
port,
|
@@ -59,21 +58,20 @@ module Vixen::Bridge
|
|
59
58
|
0,
|
60
59
|
VixHandle[:invalid],
|
61
60
|
nil,
|
62
|
-
nil)
|
63
|
-
|
64
|
-
|
61
|
+
nil))
|
62
|
+
pointer_to_handle do |host_handle_pointer|
|
63
|
+
Vixen.logger.debug "waiting for connection to complete"
|
64
|
+
VixJob_Wait job.handle, VixPropertyId[:job_result_handle],
|
65
65
|
:pointer, host_handle_pointer,
|
66
66
|
:int, VixPropertyId[:none]
|
67
67
|
end
|
68
|
-
Vix_ReleaseHandle job_handle
|
69
|
-
host_handle
|
70
68
|
end
|
71
69
|
|
72
70
|
def self.pointer_to(type, &block)
|
73
71
|
pointer = FFI::MemoryPointer.new type, 1
|
74
72
|
err = yield pointer
|
75
73
|
unless err == VixError[:ok]
|
76
|
-
raise "problem executing
|
74
|
+
raise "problem executing pointer_to_#{type} block. (error: %s, %s)" %
|
77
75
|
[err, Vix_GetErrorText(err, nil)]
|
78
76
|
end
|
79
77
|
pointer.send "read_#{type}".to_sym
|
@@ -96,67 +94,92 @@ module Vixen::Bridge
|
|
96
94
|
end
|
97
95
|
|
98
96
|
def self.wait_for_async_job(operation, &block)
|
99
|
-
|
100
|
-
|
97
|
+
job = Vixen::Model::Job.new(yield)
|
98
|
+
Vixen.logger.debug "Waiting for async %s job (%s)" %
|
99
|
+
[operation, job.handle]
|
100
|
+
err = VixJob_Wait job.handle, VixPropertyId[:none]
|
101
101
|
unless err == VixError[:ok]
|
102
|
+
Vixen.logger.error "While executing %s VIX API returned error: %s: %s" %
|
103
|
+
[operation, err, Vix_GetErrorText(err, nil)]
|
102
104
|
raise "couldn't %s. (error: %s, %s)" %
|
103
105
|
[operation, err, Vix_GetErrorText(err, nil)]
|
104
106
|
end
|
105
|
-
Vix_ReleaseHandle job_handle
|
106
107
|
end
|
107
108
|
|
108
109
|
def self.wait_for_async_handle_creation_job(operation, pointer_to_handle, &block)
|
109
|
-
|
110
|
-
|
111
|
-
|
110
|
+
job = Vixen::Model::Job.new(yield)
|
111
|
+
Vixen.logger.debug "Waiting for async %s job (%s) to create a new handle" %
|
112
|
+
[operation, job.handle]
|
113
|
+
err = VixJob_Wait job.handle, VixPropertyId[:job_result_handle],
|
112
114
|
:pointer, pointer_to_handle,
|
113
115
|
:int, VixPropertyId[:none]
|
114
116
|
unless err == VixError[:ok]
|
117
|
+
Vixen.logger.error "While executing %s VIX API returned error: %s: %s" %
|
118
|
+
[operation, err, Vix_GetErrorText(err, nil)]
|
115
119
|
raise "couldn't %s. (error: %s, %s)" %
|
116
120
|
[operation, err, Vix_GetErrorText(err, nil)]
|
117
121
|
end
|
118
|
-
Vix_ReleaseHandle job_handle
|
119
122
|
err
|
120
123
|
end
|
121
124
|
|
122
|
-
def self.
|
125
|
+
def self.spin_until_job_complete(operation, job)
|
126
|
+
while ( not pointer_to_bool do |bool_pointer|
|
127
|
+
Vixen.logger.debug "sleeping waiting for %s job (%s) to complete" %
|
128
|
+
[operation, job.handle]
|
129
|
+
sleep 0.01
|
130
|
+
Vixen.logger.debug "checking completion of %s job (%s)" %
|
131
|
+
[operation, job.handle]
|
132
|
+
thr = Thread.start { VixJob_CheckCompletion(job.handle, bool_pointer) }
|
133
|
+
thr.value
|
134
|
+
end) do
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def self.running_vms(host_handle, &block)
|
123
139
|
available_vms = []
|
124
140
|
|
125
141
|
collect_proc = Proc.new do |job_handle, event_type, more_event_info, client_data|
|
126
142
|
if event_type == VixEventType[:find_item]
|
127
143
|
path = get_string_property more_event_info, VixPropertyId[:found_item_location]
|
128
|
-
|
144
|
+
if path
|
145
|
+
Vixen.logger.debug "adding running vms %s" % path
|
146
|
+
available_vms << path
|
147
|
+
end
|
148
|
+
end
|
149
|
+
if block_given?
|
150
|
+
Vixen.logger.debug "preparing to call user-supplied block for running vms progress"
|
151
|
+
block.call job_handle, event_type, more_event_info, client_data
|
129
152
|
end
|
130
153
|
end
|
131
154
|
|
132
|
-
|
155
|
+
Vixen.logger.debug "finding running vms"
|
156
|
+
job = Vixen::Model::Job.new(VixHost_FindItems(host_handle,
|
133
157
|
VixFindItemType[:running_vms],
|
134
158
|
VixHandle[:invalid],
|
135
159
|
-1,
|
136
160
|
collect_proc,
|
137
|
-
nil)
|
138
|
-
|
139
|
-
while ( not pointer_to_bool do |bool_pointer|
|
140
|
-
sleep 0.01
|
141
|
-
VixJob_CheckCompletion(job_handle, bool_pointer)
|
142
|
-
end) do
|
143
|
-
end
|
161
|
+
nil))
|
162
|
+
spin_until_job_complete "running vms", job
|
144
163
|
|
145
|
-
Vix_ReleaseHandle job_handle
|
146
164
|
available_vms
|
147
165
|
end
|
148
166
|
|
149
167
|
def self.disconnect(handle)
|
168
|
+
Vixen.logger.debug "disconnecting from %s handle (%s)" %
|
169
|
+
[Vixen::Constants::VixHandleType[Vix_GetHandleType(handle)], handle]
|
150
170
|
VixHost_Disconnect handle
|
151
171
|
end
|
152
172
|
|
153
173
|
def self.destroy(handle)
|
174
|
+
Vixen.logger.debug "destroying %s handle (%s)" %
|
175
|
+
[Vixen::Constants::VixHandleType[Vix_GetHandleType(handle)], handle]
|
154
176
|
Vix_ReleaseHandle handle
|
155
177
|
end
|
156
178
|
|
157
179
|
def self.open_vm(host_handle, vm_path)
|
158
180
|
vm_handle = pointer_to_handle do |vm_handle_pointer|
|
159
181
|
wait_for_async_handle_creation_job "open vm", vm_handle_pointer do
|
182
|
+
Vixen.logger.info "opening %s" % vm_path
|
160
183
|
VixHost_OpenVM host_handle, vm_path, VixVMOpenOptions[:normal],
|
161
184
|
VixHandle[:invalid], nil, nil
|
162
185
|
end
|
@@ -166,6 +189,7 @@ module Vixen::Bridge
|
|
166
189
|
def self.create_snapshot(vm_handle, name, description)
|
167
190
|
snapshot_handle = pointer_to_handle do |snapshot_handle_pointer|
|
168
191
|
wait_for_async_handle_creation_job "create snapshot", snapshot_handle_pointer do
|
192
|
+
Vixen.logger.info "creating %s snapshot" % name
|
169
193
|
VixVM_CreateSnapshot vm_handle, name, description,
|
170
194
|
VixCreateSnapshotOptions[:include_memory],
|
171
195
|
VixHandle[:invalid], nil, nil
|
@@ -175,18 +199,21 @@ module Vixen::Bridge
|
|
175
199
|
|
176
200
|
def self.current_snapshot(vm_handle)
|
177
201
|
pointer_to_handle do |snapshot_handle_pointer|
|
202
|
+
Vixen.logger.debug "retrieving current snapshot"
|
178
203
|
VixVM_GetCurrentSnapshot vm_handle, snapshot_handle_pointer
|
179
204
|
end
|
180
205
|
end
|
181
206
|
|
182
207
|
def self.get_parent(snapshot_handle)
|
183
208
|
pointer_to_handle do |snapshot_handle_pointer|
|
209
|
+
Vixen.logger.debug "retrieving snapshot parent"
|
184
210
|
VixSnapshot_GetParent snapshot_handle, snapshot_handle_pointer
|
185
211
|
end
|
186
212
|
end
|
187
213
|
|
188
214
|
def self.get_string_property(handle, property_id)
|
189
215
|
string = pointer_to_string do |string_pointer|
|
216
|
+
Vixen.logger.debug "getting %s property" % Vixen::Constants::VixPropertyId[property_id]
|
190
217
|
Vix_GetProperties(handle, property_id,
|
191
218
|
:pointer, string_pointer,
|
192
219
|
:int, VixPropertyId[:none])
|
@@ -198,6 +225,7 @@ module Vixen::Bridge
|
|
198
225
|
|
199
226
|
def self.get_int_property(handle, property_id)
|
200
227
|
pointer_to_int do |int_pointer|
|
228
|
+
Vixen.logger.debug "getting %s property" % Vixen::Constants::VixPropertyId[property_id]
|
201
229
|
Vix_GetProperties(handle, property_id,
|
202
230
|
:pointer, int_pointer,
|
203
231
|
:int, VixPropertyId[:none])
|
@@ -206,24 +234,28 @@ module Vixen::Bridge
|
|
206
234
|
|
207
235
|
def self.power_on(vm_handle)
|
208
236
|
wait_for_async_job "power on VM" do
|
237
|
+
Vixen.logger.debug "powering on vm (%s)" % vm_handle
|
209
238
|
VixVM_PowerOn vm_handle, VixVMPowerOptions[:normal], VixHandle[:invalid], nil, nil
|
210
239
|
end
|
211
240
|
end
|
212
241
|
|
213
242
|
def self.power_off(vm_handle)
|
214
243
|
wait_for_async_job "power off VM" do
|
244
|
+
Vixen.logger.debug "powering off vm (%s)" % vm_handle
|
215
245
|
VixVM_PowerOff vm_handle, VixVMPowerOptions[:normal], nil, nil
|
216
246
|
end
|
217
247
|
end
|
218
248
|
|
219
249
|
def self.reset(vm_handle)
|
220
250
|
wait_for_async_job "reset VM" do
|
251
|
+
Vixen.logger.debug "resetting vm (%s)" % vm_handle
|
221
252
|
VixVM_Reset vm_handle, VixVMPowerOptions[:normal], nil, nil
|
222
253
|
end
|
223
254
|
end
|
224
255
|
|
225
256
|
def self.suspend(vm_handle)
|
226
257
|
wait_for_async_job "suspend VM" do
|
258
|
+
Vixen.logger.debug "suspending vm (%s)" % vm_handle
|
227
259
|
VixVM_Suspend vm_handle, VixVMPowerOptions[:normal], nil, nil
|
228
260
|
end
|
229
261
|
end
|
data/lib/vixen/model/base.rb
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), '..', 'bridge')
|
2
|
-
require File.join(File.dirname(__FILE__), '..', 'constants')
|
3
2
|
|
4
3
|
module Vixen::Model; end
|
5
4
|
|
6
5
|
class Vixen::Model::Base
|
7
|
-
extend Vixen::Constants
|
8
|
-
include Vixen::Constants
|
9
|
-
|
10
6
|
attr_reader :handle
|
11
7
|
|
12
8
|
def initialize(handle)
|
data/lib/vixen/model/host.rb
CHANGED
@@ -5,24 +5,23 @@ class Vixen::Model::Host < Vixen::Model::Base
|
|
5
5
|
def self.finalize(handle)
|
6
6
|
proc do
|
7
7
|
Vixen::Bridge.disconnect(handle)
|
8
|
-
Vixen::Bridge.destroy(handle)
|
9
8
|
end
|
10
9
|
end
|
11
10
|
|
12
|
-
def open_vm(path)
|
13
|
-
Vixen::Model::VM.new(Vixen::Bridge.open_vm
|
11
|
+
def open_vm(path, &block)
|
12
|
+
Vixen::Model::VM.new(Vixen::Bridge.open_vm(handle, path, &block))
|
14
13
|
end
|
15
14
|
|
16
|
-
def running_vms
|
15
|
+
def running_vms(&block)
|
17
16
|
vms = []
|
18
|
-
paths_of_running_vms.each do |path|
|
19
|
-
vms << open_vm(path)
|
17
|
+
paths_of_running_vms(&block).each do |path|
|
18
|
+
vms << open_vm(path, &block)
|
20
19
|
end
|
21
20
|
vms
|
22
21
|
end
|
23
22
|
|
24
|
-
def paths_of_running_vms
|
25
|
-
Vixen::Bridge.running_vms(handle) || []
|
23
|
+
def paths_of_running_vms(&block)
|
24
|
+
Vixen::Bridge.running_vms(handle, &block) || []
|
26
25
|
end
|
27
26
|
|
28
27
|
end
|
data/lib/vixen/model/snapshot.rb
CHANGED
@@ -3,18 +3,18 @@ require File.join(File.dirname(__FILE__), 'base')
|
|
3
3
|
class Vixen::Model::Snapshot < Vixen::Model::Base
|
4
4
|
def display_name
|
5
5
|
return @display_name unless @display_name.nil?
|
6
|
-
@display_name = get_string_property VixPropertyId[:snapshot_displayname]
|
6
|
+
@display_name = get_string_property Vixen::Constants::VixPropertyId[:snapshot_displayname]
|
7
7
|
end
|
8
8
|
|
9
9
|
def description
|
10
10
|
return @description unless @description.nil?
|
11
|
-
@description = get_string_property VixPropertyId[:snapshot_description]
|
11
|
+
@description = get_string_property Vixen::Constants::VixPropertyId[:snapshot_description]
|
12
12
|
end
|
13
13
|
|
14
14
|
def parent
|
15
15
|
return @parent unless @parent.nil?
|
16
16
|
parent_handle = Vixen::Bridge.get_parent handle
|
17
|
-
@parent = parent_handle == VixHandle[:invalid] ? nil : self.class.new(parent_handle)
|
17
|
+
@parent = parent_handle == Vixen::Constants::VixHandle[:invalid] ? nil : self.class.new(parent_handle)
|
18
18
|
end
|
19
19
|
|
20
20
|
def full_name
|
data/lib/vixen/model/vm.rb
CHANGED
@@ -75,7 +75,7 @@ class Vixen::Model::VM < Vixen::Model::Base
|
|
75
75
|
:suspended, :tools_running, :resetting, :blocked_on_msg, :paused,
|
76
76
|
:resuming
|
77
77
|
].each do |state|
|
78
|
-
states << state if ((bitwise_state & VixPowerState[state]) == VixPowerState[state])
|
78
|
+
states << state if ((bitwise_state & Vixen::Constants::VixPowerState[state]) == Vixen::Constants::VixPowerState[state])
|
79
79
|
end
|
80
80
|
states
|
81
81
|
end
|
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.7
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-11-
|
12
|
+
date: 2012-11-20 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
@@ -63,6 +63,7 @@ files:
|
|
63
63
|
- lib/vixen/constants.rb
|
64
64
|
- lib/vixen/model/base.rb
|
65
65
|
- lib/vixen/model/host.rb
|
66
|
+
- lib/vixen/model/job.rb
|
66
67
|
- lib/vixen/model/snapshot.rb
|
67
68
|
- lib/vixen/model/vm.rb
|
68
69
|
- vixen.gemspec
|