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 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