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 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
- job_handle = VixHandle[:invalid]
52
- host_handle = VixHandle[:invalid]
53
- job_handle = VixHost_Connect(VixApiVersion[:api_version],
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
- host_handle = pointer_to_handle do |host_handle_pointer|
64
- VixJob_Wait job_handle, VixPropertyId[:job_result_handle],
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 pointer_to_handle block. (error: %s, %s)" %
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
- job_handle = yield
100
- err = VixJob_Wait job_handle, VixPropertyId[:none]
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
- job_handle = yield
110
- sleep 0.5
111
- err = VixJob_Wait job_handle, VixPropertyId[:job_result_handle],
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.running_vms(host_handle)
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
- available_vms << path if path
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
- job_handle = VixHost_FindItems(host_handle,
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
@@ -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)
@@ -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 handle, path)
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
@@ -0,0 +1,4 @@
1
+ require File.join(File.dirname(__FILE__), 'base')
2
+
3
+ class Vixen::Model::Job < Vixen::Model::Base
4
+ end
@@ -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
@@ -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
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'vixen'
3
- s.version = '0.0.6'
3
+ s.version = '0.0.7'
4
4
  s.summary = 'Ruby bindings for VMware VIX API'
5
5
  s.description = <<-EOF
6
6
  Vixen is an easy way to interact with VMware virtual machines from Ruby.
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.6
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-19 00:00:00.000000000 Z
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