vixen 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|