vixen 0.0.11 → 0.0.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -50,8 +50,11 @@ module Vixen::Bridge
50
50
  attach_function :VixVM_RemoveSnapshot, [:handle, :handle, :int, :VixEventProc, :pointer], :handle
51
51
  attach_function :VixJob_CheckCompletion, [:handle, :pointer], :int
52
52
  attach_function :Vix_GetHandleType, [:handle], :int
53
-
54
- @@all_my_blocks = []
53
+ attach_function :VixVM_GetNumRootSnapshots, [:handle, :pointer], :int
54
+ attach_function :VixVM_GetRootSnapshot, [:handle, :int, :pointer], :int
55
+ attach_function :VixVM_GetNamedSnapshot, [:handle, :string, :pointer], :int
56
+ attach_function :VixSnapshot_GetNumChildren, [:handle, :pointer], :int
57
+ attach_function :VixSnapshot_GetChild, [:handle, :int, :pointer], :int
55
58
 
56
59
  def self.safe_proc_from_block(&block)
57
60
  return nil unless block_given?
@@ -217,7 +220,7 @@ module Vixen::Bridge
217
220
  def self.create_snapshot(vm_handle, name, description, &block)
218
221
  progress_proc = safe_proc_from_block &block
219
222
  snapshot_handle = pointer_to_handle do |snapshot_handle_pointer|
220
- wait_for_async_handle_creation_job "create snapshot", snapshot_handle_pointer, 1, 0.2 do
223
+ wait_for_async_handle_creation_job "create snapshot", snapshot_handle_pointer, 0.2, 0.2 do
221
224
  Vixen.logger.info "creating %s snapshot" % name
222
225
  VixVM_CreateSnapshot vm_handle, name, description,
223
226
  VixCreateSnapshotOptions[:include_memory],
@@ -228,7 +231,7 @@ module Vixen::Bridge
228
231
 
229
232
  def self.revert_to_snapshot(vm, snapshot, &block)
230
233
  progress_proc = safe_proc_from_block &block
231
- wait_for_async_job(("revert to %s snapshot" % snapshot.display_name), 1, 0.2) do
234
+ wait_for_async_job(("revert to %s snapshot" % snapshot.display_name), 0.2, 0.2) do
232
235
  VixVM_RevertToSnapshot vm.handle, snapshot.handle, VixVMPowerOptions[:normal],
233
236
  VixHandle[:invalid], progress_proc, nil
234
237
  end
@@ -236,7 +239,7 @@ module Vixen::Bridge
236
239
 
237
240
  def self.remove_snapshot(vm, snapshot, &block)
238
241
  progress_proc = safe_proc_from_block &block
239
- wait_for_async_job(("remove %s snapshot" % snapshot.display_name), 1, 0.2) do
242
+ wait_for_async_job(("remove %s snapshot" % snapshot.display_name), 0.2, 0.2) do
240
243
  VixVM_RemoveSnapshot vm.handle, snapshot.handle, 0, progress_proc, nil
241
244
  end
242
245
  end
@@ -248,6 +251,18 @@ module Vixen::Bridge
248
251
  end
249
252
  end
250
253
 
254
+ def self.get_root_snapshots(vm_handle)
255
+ count = pointer_to_int { |int_pointer| VixVM_GetNumRootSnapshots(vm_handle, int_pointer) }
256
+ snapshots = []
257
+ count.times do |n|
258
+ handle = pointer_to_handle do |handle_pointer|
259
+ VixVM_GetRootSnapshot(vm_handle, n, handle_pointer)
260
+ end
261
+ snapshots << Vixen::Model::Snapshot.new( handle )
262
+ end
263
+ snapshots
264
+ end
265
+
251
266
  def self.get_parent(snapshot_handle)
252
267
  pointer_to_handle do |snapshot_handle_pointer|
253
268
  Vixen.logger.debug "retrieving snapshot parent"
@@ -255,6 +270,19 @@ module Vixen::Bridge
255
270
  end
256
271
  end
257
272
 
273
+ def self.get_children(snapshot_handle)
274
+ count = pointer_to_int { |int_pointer| VixSnapshot_GetNumChildren(snapshot_handle, int_pointer) }
275
+ children = []
276
+ count.times do |n|
277
+ handle = pointer_to_handle do |handle_pointer|
278
+ VixSnapshot_GetChild(snapshot_handle, n, handle_pointer)
279
+ end
280
+ child = Vixen::Model::Snapshot.new( handle )
281
+ children << child
282
+ end
283
+ children
284
+ end
285
+
258
286
  def self.get_string_property(handle, property_id)
259
287
  string = pointer_to_string do |string_pointer|
260
288
  Vixen.logger.debug "getting %s property" % Vixen::Constants::VixPropertyId[property_id]
@@ -2,18 +2,26 @@ require 'vixen'
2
2
 
3
3
  class Vixen::CommandLine
4
4
  def execute
5
+
6
+ context = {}
7
+
5
8
  command = ARGV.shift
6
9
  command ||= 'status'
7
10
 
8
- begin
9
- require "vixen/command_line/#{command}"
11
+ ARGV.unshift command
12
+
13
+ while ! ARGV.empty?
14
+ begin
15
+ command = ARGV.shift
16
+ require "vixen/command_line/#{command}"
10
17
 
11
- klass = self.class.const_get(command.split('_').map {|s| s.capitalize }.join)
12
- raise "Couldn't find #{command}" unless klass
18
+ klass = self.class.const_get(command.split('_').map {|s| s.capitalize }.join)
19
+ raise "Couldn't find #{command}" unless klass
13
20
 
14
- klass.new.execute
15
- rescue LoadError
16
- puts "Unknown command: #{command}"
21
+ klass.new(context).execute
22
+ rescue LoadError
23
+ puts "Unknown command: #{command}"
24
+ end
17
25
  end
18
26
  end
19
27
  end
@@ -1,8 +1,9 @@
1
1
  class Vixen::CommandLine::Base
2
- attr_reader :start
2
+ attr_reader :start, :context
3
3
 
4
- def initialize
4
+ def initialize(context)
5
5
  @start = Time.now
6
+ @context = context
6
7
  end
7
8
 
8
9
  def elapsed_time
@@ -11,14 +12,29 @@ class Vixen::CommandLine::Base
11
12
 
12
13
  def new_line_after
13
14
  val = yield if block_given?
14
- puts
15
+ $stdout.puts
15
16
  val
16
17
  end
17
18
 
18
19
  def print(message, *args)
19
- timed_message = "\r \r#{elapsed_time} " + message
20
+ timed_message = "\r \r#{elapsed_time} " + message.to_s
20
21
  $stdout.print timed_message, args
21
22
  $stdout.flush
22
23
  end
23
24
 
25
+ def puts(message, *args)
26
+ new_line_after { print(message, args) }
27
+ end
28
+
29
+ def host
30
+ return @host unless @host.nil?
31
+ @host = context[:host] || Vixen.local_connect
32
+ end
33
+
34
+ def vms
35
+ return @vms unless @vms.nil?
36
+ context[:vms] ||= host.running_vms
37
+ @vms = context[:vms]
38
+ end
39
+
24
40
  end
@@ -2,6 +2,55 @@ require 'vixen/command_line/base'
2
2
 
3
3
  class Vixen::CommandLine::Snapshot < Vixen::CommandLine::Base
4
4
  def execute
5
- puts "Snapshot is not yet implemented"
5
+ action = ARGV.shift
6
+ action ||= default_action
7
+
8
+ action = action.to_sym
9
+
10
+ if defined? action
11
+ send action
12
+ end
13
+ end
14
+
15
+ def list
16
+ total_snapshots = 0
17
+
18
+ vms.each do |vm|
19
+ puts "#{vm.name} : (#{vm.current_snapshot.display_name})"
20
+ all_snaps = vm.all_snapshots
21
+ total_snapshots += all_snaps.count
22
+ all_snaps.each do |snap|
23
+ puts " - #{snap.display_name}"
24
+ end
25
+ end
26
+ puts "Found #{total_snapshots} snapshots on #{vms.count} virtual machines"
27
+ end
28
+
29
+ def current
30
+ vms.each do |vm|
31
+ puts "#{vm.name}"
32
+ puts " - #{vm.current_snapshot.full_name}"
33
+ end
34
+ end
35
+
36
+ def create
37
+ snapshot_name = ARGV.shift
38
+ vms.each do |vm|
39
+ new_line_after do
40
+ vm.create_snapshot(snapshot_name) do |job_handle, event_type, more_event_info, client_data|
41
+ print "Creating #{snapshot_name} snapshot on #{vm.name}"
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ def revert
48
+ end
49
+
50
+ def remove
51
+ end
52
+
53
+ def default_action
54
+ 'list'
6
55
  end
7
56
  end
@@ -0,0 +1,19 @@
1
+ require 'vixen/command_line/base'
2
+
3
+ class Vixen::CommandLine::Start < Vixen::CommandLine::Base
4
+ def execute
5
+ count = 0
6
+
7
+ vms.each do |vm|
8
+ unless vm.powered_on?
9
+ new_line_after do
10
+ vm.power_on do |*args|
11
+ print "Powering on #{vm.name}"
12
+ end
13
+ end
14
+ count += 1
15
+ end
16
+ end
17
+ puts "Powered on #{count} machines"
18
+ end
19
+ end
@@ -2,19 +2,18 @@ require 'vixen/command_line/base'
2
2
 
3
3
  class Vixen::CommandLine::Status < Vixen::CommandLine::Base
4
4
  def execute
5
- new_line_after { print "Connecting to local host" }
6
- host = Vixen.local_connect
5
+ new_line_after { print "Connecting to host" }
7
6
 
8
7
  vms = host.paths_of_running_vms do |job_handle, event_type, more_event_info, client_data|
9
8
  print " <searching> "
10
9
  if event_type == Vixen::Constants::VixEventType[:find_item]
11
10
  path = Vixen::Bridge.get_string_property more_event_info, Vixen::Constants::VixPropertyId[:found_item_location]
12
11
  if path
13
- new_line_after { print File.basename path }
12
+ new_line_after { print " #{File.basename path}" }
14
13
  end
15
14
  end
16
15
  end
17
16
 
18
- new_line_after { print "Found #{vms.size} running virtual machines" }
17
+ puts "Found #{vms.size} running virtual machines"
19
18
  end
20
19
  end
@@ -0,0 +1,19 @@
1
+ require 'vixen/command_line/base'
2
+
3
+ class Vixen::CommandLine::Stop < Vixen::CommandLine::Base
4
+ def execute
5
+ count = 0
6
+
7
+ vms.each do |vm|
8
+ if vm.powered_on?
9
+ new_line_after do
10
+ vm.power_off do |*args|
11
+ print "Powering off #{vm.name}"
12
+ end
13
+ end
14
+ count += 1
15
+ end
16
+ end
17
+ puts "Powered off #{count} machines"
18
+ end
19
+ end
@@ -2,6 +2,18 @@ require 'vixen/command_line/base'
2
2
 
3
3
  class Vixen::CommandLine::Suspend < Vixen::CommandLine::Base
4
4
  def execute
5
- puts "Suspend is not yet implemented"
5
+ count = 0
6
+
7
+ vms.each do |vm|
8
+ if vm.powered_on?
9
+ new_line_after do
10
+ vm.suspend do |*args|
11
+ print "Suspending #{vm.name}"
12
+ end
13
+ end
14
+ count += 1
15
+ end
16
+ end
17
+ puts "Suspended #{count} machines"
6
18
  end
7
19
  end
@@ -0,0 +1,23 @@
1
+ require 'vixen/command_line/base'
2
+
3
+ class Vixen::CommandLine::Vm < Vixen::CommandLine::Base
4
+ def execute
5
+ machines = ARGV.shift
6
+
7
+ return puts "A path to a virtual machine must be included" if machines.nil?
8
+
9
+ powered_count = 0
10
+
11
+ vm_paths = machines.split ','
12
+ vms = []
13
+ vm_paths.each do |path|
14
+ vm = new_line_after do
15
+ host.open_vm path do
16
+ print "Opening #{path}"
17
+ end
18
+ end
19
+ vms << vm
20
+ end
21
+ context[:vms] = vms
22
+ end
23
+ end
@@ -22,6 +22,15 @@ class Vixen::Model::Snapshot < Vixen::Model::Base
22
22
  File.join(root, display_name)
23
23
  end
24
24
 
25
+ def children
26
+ Vixen::Bridge.get_children(handle)
27
+ end
28
+
29
+ def all_children
30
+ childs = children
31
+ (childs + childs.map {|child| child.all_children}).flatten
32
+ end
33
+
25
34
  def to_s
26
35
  display_name
27
36
  end
@@ -3,10 +3,32 @@ require File.join(File.dirname(__FILE__), 'snapshot')
3
3
 
4
4
  class Vixen::Model::VM < Vixen::Model::Base
5
5
 
6
+ def name
7
+ get_string_property Vixen::Constants::VixPropertyId[:vm_name]
8
+ end
9
+
10
+ def path
11
+ get_string_property Vixen::Constants::VixPropertyId[:vmx_pathname]
12
+ end
13
+
14
+ def guest_os
15
+ get_string_property Vixen::Constants::VixPropertyId[:vm_guestos]
16
+ end
17
+
6
18
  def current_snapshot
7
19
  Vixen::Model::Snapshot.new(Vixen::Bridge.current_snapshot(handle))
8
20
  end
9
21
 
22
+ def root_snapshots
23
+ Vixen::Bridge.get_root_snapshots handle
24
+ end
25
+
26
+ def all_snapshots
27
+ roots = root_snapshots
28
+ childs = roots.map {|s| s.all_children }
29
+ (roots + childs).flatten
30
+ end
31
+
10
32
  def create_snapshot(name, description="", &block)
11
33
  Vixen::Model::Snapshot.new(Vixen::Bridge.create_snapshot handle, name, description, &block)
12
34
  end
@@ -1,7 +1,7 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'vixen'
3
- s.version = '0.0.11'
4
- s.date = '2012-11-20'
3
+ s.version = '0.0.12'
4
+ s.date = '2012-11-23'
5
5
 
6
6
 
7
7
  s.summary = 'Ruby bindings for VMware VIX API'
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.11
4
+ version: 0.0.12
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-20 00:00:00.000000000 Z
12
+ date: 2012-11-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -64,12 +64,13 @@ files:
64
64
  - lib/vixen/bridge.rb
65
65
  - lib/vixen/command_line.rb
66
66
  - lib/vixen/command_line/base.rb
67
- - lib/vixen/command_line/halt.rb
68
67
  - lib/vixen/command_line/resume.rb
69
68
  - lib/vixen/command_line/snapshot.rb
69
+ - lib/vixen/command_line/start.rb
70
70
  - lib/vixen/command_line/status.rb
71
+ - lib/vixen/command_line/stop.rb
71
72
  - lib/vixen/command_line/suspend.rb
72
- - lib/vixen/command_line/up.rb
73
+ - lib/vixen/command_line/vm.rb
73
74
  - lib/vixen/constants.rb
74
75
  - lib/vixen/model/base.rb
75
76
  - lib/vixen/model/host.rb
@@ -1,7 +0,0 @@
1
- require 'vixen/command_line/base'
2
-
3
- class Vixen::CommandLine::Halt < Vixen::CommandLine::Base
4
- def execute
5
- puts "Halt is not yet implemented"
6
- end
7
- end
@@ -1,7 +0,0 @@
1
- require 'vixen/command_line/base'
2
-
3
- class Vixen::CommandLine::Up < Vixen::CommandLine::Base
4
- def execute
5
- puts "Up is not yet implemented"
6
- end
7
- end