mkuzmin-rbvmomi 1.8.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +6 -0
  3. data/LICENSE +19 -0
  4. data/README.rdoc +78 -0
  5. data/Rakefile +45 -0
  6. data/VERSION +1 -0
  7. data/bin/rbvmomish +138 -0
  8. data/devel/analyze-vim-declarations.rb +213 -0
  9. data/devel/analyze-xml.rb +46 -0
  10. data/devel/benchmark.rb +117 -0
  11. data/devel/collisions.rb +18 -0
  12. data/devel/merge-internal-vmodl.rb +59 -0
  13. data/devel/merge-manual-vmodl.rb +32 -0
  14. data/examples/annotate.rb +54 -0
  15. data/examples/cached_ovf_deploy.rb +120 -0
  16. data/examples/clone_vm.rb +84 -0
  17. data/examples/create_vm-1.9.rb +93 -0
  18. data/examples/create_vm.rb +93 -0
  19. data/examples/extraConfig.rb +54 -0
  20. data/examples/lease_tool.rb +102 -0
  21. data/examples/logbundle.rb +63 -0
  22. data/examples/logtail.rb +60 -0
  23. data/examples/nfs_datastore.rb +95 -0
  24. data/examples/power.rb +59 -0
  25. data/examples/readme-1.rb +35 -0
  26. data/examples/readme-2.rb +51 -0
  27. data/examples/run.sh +41 -0
  28. data/examples/screenshot.rb +48 -0
  29. data/examples/vdf.rb +81 -0
  30. data/examples/vm_drs_behavior.rb +76 -0
  31. data/lib/rbvmomi.rb +12 -0
  32. data/lib/rbvmomi/basic_types.rb +375 -0
  33. data/lib/rbvmomi/connection.rb +270 -0
  34. data/lib/rbvmomi/deserialization.rb +248 -0
  35. data/lib/rbvmomi/fault.rb +17 -0
  36. data/lib/rbvmomi/pbm.rb +66 -0
  37. data/lib/rbvmomi/sms.rb +61 -0
  38. data/lib/rbvmomi/sms/SmsStorageManager.rb +7 -0
  39. data/lib/rbvmomi/trivial_soap.rb +114 -0
  40. data/lib/rbvmomi/trollop.rb +70 -0
  41. data/lib/rbvmomi/type_loader.rb +136 -0
  42. data/lib/rbvmomi/utils/admission_control.rb +398 -0
  43. data/lib/rbvmomi/utils/deploy.rb +314 -0
  44. data/lib/rbvmomi/utils/leases.rb +142 -0
  45. data/lib/rbvmomi/utils/perfdump.rb +628 -0
  46. data/lib/rbvmomi/vim.rb +128 -0
  47. data/lib/rbvmomi/vim/ComputeResource.rb +51 -0
  48. data/lib/rbvmomi/vim/Datacenter.rb +17 -0
  49. data/lib/rbvmomi/vim/Datastore.rb +68 -0
  50. data/lib/rbvmomi/vim/DynamicTypeMgrAllTypeInfo.rb +75 -0
  51. data/lib/rbvmomi/vim/DynamicTypeMgrDataTypeInfo.rb +20 -0
  52. data/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb +46 -0
  53. data/lib/rbvmomi/vim/Folder.rb +207 -0
  54. data/lib/rbvmomi/vim/HostSystem.rb +174 -0
  55. data/lib/rbvmomi/vim/ManagedEntity.rb +57 -0
  56. data/lib/rbvmomi/vim/ManagedObject.rb +60 -0
  57. data/lib/rbvmomi/vim/ObjectContent.rb +23 -0
  58. data/lib/rbvmomi/vim/ObjectUpdate.rb +23 -0
  59. data/lib/rbvmomi/vim/OvfManager.rb +200 -0
  60. data/lib/rbvmomi/vim/PerfCounterInfo.rb +26 -0
  61. data/lib/rbvmomi/vim/PerformanceManager.rb +110 -0
  62. data/lib/rbvmomi/vim/PropertyCollector.rb +25 -0
  63. data/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb +30 -0
  64. data/lib/rbvmomi/vim/ResourcePool.rb +55 -0
  65. data/lib/rbvmomi/vim/ServiceInstance.rb +55 -0
  66. data/lib/rbvmomi/vim/Task.rb +65 -0
  67. data/lib/rbvmomi/vim/VirtualMachine.rb +74 -0
  68. data/test/test_deserialization.rb +383 -0
  69. data/test/test_emit_request.rb +128 -0
  70. data/test/test_exceptions.rb +14 -0
  71. data/test/test_helper.rb +14 -0
  72. data/test/test_misc.rb +24 -0
  73. data/test/test_parse_response.rb +69 -0
  74. data/test/test_serialization.rb +311 -0
  75. data/vmodl.db +0 -0
  76. metadata +163 -0
@@ -0,0 +1,60 @@
1
+ # Translation of example 2-2 from the vSphere SDK for Perl Programming Guide
2
+ require 'trollop'
3
+ require 'rbvmomi'
4
+ require 'rbvmomi/trollop'
5
+
6
+ VIM = RbVmomi::VIM
7
+
8
+ opts = Trollop.options do
9
+ banner <<-EOS
10
+ Follow a log file.
11
+
12
+ Usage:
13
+ logtail.rb [options] [logKey]
14
+
15
+ If logKey is not provided the list of available log keys will be printed and
16
+ the program will exit.
17
+
18
+ VIM connection options:
19
+ EOS
20
+
21
+ rbvmomi_connection_opts
22
+
23
+ text <<-EOS
24
+
25
+ Other options:
26
+ EOS
27
+ end
28
+
29
+ Trollop.die("must specify host") unless opts[:host]
30
+ logKey = ARGV[0]
31
+
32
+ vim = VIM.connect opts
33
+ diagMgr = vim.serviceContent.diagnosticManager
34
+
35
+ if not logKey
36
+ puts "Available logs:"
37
+ diagMgr.QueryDescriptions.each do |desc|
38
+ puts "#{desc.key}: #{desc.info.label}"
39
+ end
40
+ exit 0
41
+ end
42
+
43
+ # Obtain the last line of the logfile by setting an arbitrarily large
44
+ # line number as the starting point
45
+ log = diagMgr.BrowseDiagnosticLog(key: logKey, start: 999999999)
46
+ lineEnd = log.lineEnd
47
+
48
+ # Get the last 5 lines of the log first, and then check every 2 seconds
49
+ # to see if the log size has increased.
50
+ start = lineEnd - 5
51
+ while true
52
+ log = diagMgr.BrowseDiagnosticLog(key: logKey, start: start)
53
+ if log.lineStart != 0
54
+ log.lineText.each do |l|
55
+ puts l
56
+ end
57
+ end
58
+ start = log.lineEnd + 1
59
+ sleep 2
60
+ end
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env ruby
2
+ require 'trollop'
3
+ require 'rbvmomi'
4
+ require 'rbvmomi/trollop'
5
+
6
+ VIM = RbVmomi::VIM
7
+ CMDS = %w(mount unmount)
8
+
9
+ opts = Trollop.options do
10
+ banner <<-EOS
11
+ Mount/Unmount an NFS datastore from a cluster or single host system.
12
+
13
+ Usage:
14
+ nfs_datastore.rb [options] resource mount nfs-hostname:/remote/path [name]
15
+ nfs_datastore.rb [options] resource unmount nfs-hostname:/remote/path [name]
16
+
17
+ Commands: #{CMDS * ' '}
18
+
19
+ VIM connection options:
20
+ EOS
21
+
22
+ rbvmomi_connection_opts
23
+
24
+ text <<-EOS
25
+
26
+ VM location options:
27
+ EOS
28
+
29
+ rbvmomi_datacenter_opt
30
+
31
+ text <<-EOS
32
+
33
+ Other options:
34
+ EOS
35
+
36
+ stop_on CMDS
37
+ end
38
+
39
+ Trollop.die("must specify host") unless opts[:host]
40
+
41
+ cr_path = ARGV[0] or Trollop.die("no system name given")
42
+ cmd = ARGV[1] or Trollop.die("no command given")
43
+ abort "invalid command" unless CMDS.member? cmd
44
+ nfs_spec = ARGV[2] or Trollop.die("no nfs path given")
45
+ remoteHost, remotePath = nfs_spec.split(":")
46
+ localPath = ARGV[3] || remoteHost
47
+ mode = "readOnly" #hardcoded.
48
+
49
+ vim = VIM.connect opts
50
+ dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
51
+ cr = dc.find_compute_resource(cr_path) || dc.hostFolder.children.find(cr_path).first
52
+ abort "compute resource not found" unless cr
53
+
54
+ case cr
55
+ when VIM::ClusterComputeResource
56
+ hosts = cr.host
57
+ when VIM::ComputeResource
58
+ hosts = [cr]
59
+ else
60
+ abort "invalid resource"
61
+ end
62
+
63
+ hosts.each do |host|
64
+ hds = host.configManager.datastoreSystem
65
+
66
+ ds = hds.datastore.select {|ds|
67
+ ds.info.respond_to?(:nas) and
68
+ ds.info.name == localPath and
69
+ ds.info.nas.remoteHost == remoteHost and
70
+ ds.info.nas.remotePath == remotePath
71
+ }.first
72
+
73
+ case cmd
74
+ when 'mount'
75
+ if ds
76
+ puts "already mounted on #{host.name} as #{ds.name}"
77
+ else
78
+ ds =
79
+ hds.CreateNasDatastore(:spec => VIM.HostNasVolumeSpec(:remoteHost => remoteHost,
80
+ :remotePath => remotePath,
81
+ :localPath => localPath,
82
+ :accessMode => mode))
83
+ puts "mounted on #{host.name} as #{ds.name}"
84
+ end
85
+ when 'unmount'
86
+ if ds
87
+ hds.RemoveDatastore(:datastore => ds)
88
+ puts "unmounted from #{host.name}"
89
+ else
90
+ puts "not mounted on #{host.name}"
91
+ end
92
+ else
93
+ abort "invalid command"
94
+ end
95
+ end
data/examples/power.rb ADDED
@@ -0,0 +1,59 @@
1
+ require 'trollop'
2
+ require 'rbvmomi'
3
+ require 'rbvmomi/trollop'
4
+
5
+ VIM = RbVmomi::VIM
6
+ CMDS = %w(on off reset suspend destroy)
7
+
8
+ opts = Trollop.options do
9
+ banner <<-EOS
10
+ Perform VM power operations.
11
+
12
+ Usage:
13
+ power.rb [options] cmd VM
14
+
15
+ Commands: #{CMDS * ' '}
16
+
17
+ VIM connection options:
18
+ EOS
19
+
20
+ rbvmomi_connection_opts
21
+
22
+ text <<-EOS
23
+
24
+ VM location options:
25
+ EOS
26
+
27
+ rbvmomi_datacenter_opt
28
+
29
+ text <<-EOS
30
+
31
+ Other options:
32
+ EOS
33
+
34
+ stop_on CMDS
35
+ end
36
+
37
+ cmd = ARGV[0] or Trollop.die("no command given")
38
+ vm_name = ARGV[1] or Trollop.die("no VM name given")
39
+ Trollop.die("must specify host") unless opts[:host]
40
+
41
+ vim = VIM.connect opts
42
+
43
+ dc = vim.serviceInstance.content.rootFolder.traverse(opts[:datacenter], VIM::Datacenter) or abort "datacenter not found"
44
+ vm = dc.vmFolder.traverse(vm_name, VIM::VirtualMachine) or abort "VM not found"
45
+
46
+ case cmd
47
+ when 'on'
48
+ vm.PowerOnVM_Task.wait_for_completion
49
+ when 'off'
50
+ vm.PowerOffVM_Task.wait_for_completion
51
+ when 'reset'
52
+ vm.ResetVM_Task.wait_for_completion
53
+ when 'suspend'
54
+ vm.SuspendVM_Task.wait_for_completion
55
+ when 'destroy'
56
+ vm.Destroy_Task.wait_for_completion
57
+ else
58
+ abort "invalid command"
59
+ end
@@ -0,0 +1,35 @@
1
+ require 'rbvmomi'
2
+ require 'rbvmomi/trollop'
3
+
4
+ opts = Trollop.options do
5
+ banner <<-EOS
6
+ Example 1 from the README: Power on a VM.
7
+
8
+ Usage:
9
+ readme-1.rb [options] VM name
10
+
11
+ VIM connection options:
12
+ EOS
13
+
14
+ rbvmomi_connection_opts
15
+
16
+ text <<-EOS
17
+
18
+ VM location options:
19
+ EOS
20
+
21
+ rbvmomi_datacenter_opt
22
+
23
+ text <<-EOS
24
+
25
+ Other options:
26
+ EOS
27
+ end
28
+
29
+ Trollop.die("must specify host") unless opts[:host]
30
+ vm_name = ARGV[0] or abort "must specify VM name"
31
+
32
+ vim = RbVmomi::VIM.connect opts
33
+ dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or fail "datacenter not found"
34
+ vm = dc.find_vm(vm_name) or fail "VM not found"
35
+ vm.PowerOnVM_Task.wait_for_completion
@@ -0,0 +1,51 @@
1
+ require 'rbvmomi'
2
+ require 'rbvmomi/trollop'
3
+
4
+ opts = Trollop.options do
5
+ banner <<-EOS
6
+ Example 2 from the README: Power on a VM the hard way.
7
+
8
+ Usage:
9
+ readme-2.rb [options] VM name
10
+
11
+ VIM connection options:
12
+ EOS
13
+
14
+ rbvmomi_connection_opts
15
+
16
+ text <<-EOS
17
+
18
+ VM location options:
19
+ EOS
20
+
21
+ rbvmomi_datacenter_opt
22
+
23
+ text <<-EOS
24
+
25
+ Other options:
26
+ EOS
27
+ end
28
+
29
+ Trollop.die("must specify host") unless opts[:host]
30
+ vm_name = ARGV[0] or abort "must specify VM name"
31
+
32
+ vim = RbVmomi::VIM.connect opts
33
+ rootFolder = vim.serviceInstance.content.rootFolder
34
+ dc = rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).find { |x| x.name == opts[:datacenter] } or fail "datacenter not found"
35
+ vm = dc.vmFolder.childEntity.grep(RbVmomi::VIM::VirtualMachine).find { |x| x.name == vm_name } or fail "VM not found"
36
+ task = vm.PowerOnVM_Task
37
+ filter = vim.propertyCollector.CreateFilter(
38
+ :spec => {
39
+ :propSet => [{ :type => 'Task', :all => false, :pathSet => ['info.state']}],
40
+ :objectSet => [{ :obj => task }]
41
+ },
42
+ :partialUpdates => false
43
+ )
44
+ ver = ''
45
+ while true
46
+ result = vim.propertyCollector.WaitForUpdates(:version => ver)
47
+ ver = result.version
48
+ break if ['success', 'error'].member? task.info.state
49
+ end
50
+ filter.DestroyPropertyFilter
51
+ raise task.info.error if task.info.state == 'error'
data/examples/run.sh ADDED
@@ -0,0 +1,41 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ if [ -z "$RBVMOMI_HOST" ]
5
+ then
6
+ echo "export at least RBVMOMI_HOST"
7
+ exit 1
8
+ fi
9
+
10
+ EXAMPLES="$(dirname $(which $0))"
11
+ export RUBYOPT="-I$EXAMPLES/../lib -rubygems"
12
+
13
+ source "$HOME/.rvm/scripts/rvm"
14
+ rvm use 1.8.7
15
+ ruby -v
16
+ RUBY=ruby
17
+
18
+ echo Creating VM
19
+ $RUBY $EXAMPLES/create_vm.rb foo
20
+ echo Powering on VM
21
+ $RUBY $EXAMPLES/power.rb on foo
22
+ echo Resetting VM
23
+ $RUBY $EXAMPLES/power.rb reset foo
24
+ echo Powering off VM
25
+ $RUBY $EXAMPLES/power.rb off foo
26
+ echo "Powering on VM (1)"
27
+ $RUBY $EXAMPLES/readme-1.rb foo
28
+ echo Powering off VM
29
+ $RUBY $EXAMPLES/power.rb off foo
30
+ echo "Powering on VM (2)"
31
+ $RUBY $EXAMPLES/readme-2.rb foo
32
+ echo "Setting extraConfig"
33
+ $RUBY $EXAMPLES/extraConfig.rb foo set guestinfo.bar=baz
34
+ echo "Listing extraConfig"
35
+ $RUBY $EXAMPLES/extraConfig.rb foo list | grep guestinfo.bar
36
+ echo Powering off VM
37
+ $RUBY $EXAMPLES/power.rb off foo
38
+ echo Querying datastore utilization
39
+ $RUBY $EXAMPLES/vdf.rb
40
+ echo Destroying VM
41
+ $RUBY $EXAMPLES/power.rb destroy foo
@@ -0,0 +1,48 @@
1
+ # Based on takeVMScreenshot.pl by William Lam
2
+ require 'trollop'
3
+ require 'rbvmomi'
4
+ require 'rbvmomi/trollop'
5
+
6
+ VIM = RbVmomi::VIM
7
+
8
+ opts = Trollop.options do
9
+ banner <<-EOS
10
+ Take a screenshot.
11
+
12
+ Usage:
13
+ screenshot.rb [options] vm filename
14
+
15
+ A PNG image will be saved to the given filename.
16
+
17
+ VIM connection options:
18
+ EOS
19
+
20
+ rbvmomi_connection_opts
21
+
22
+ text <<-EOS
23
+
24
+ VM location options:
25
+ EOS
26
+
27
+ rbvmomi_datacenter_opt
28
+
29
+ text <<-EOS
30
+
31
+ Other options:
32
+ EOS
33
+ end
34
+
35
+ Trollop.die("must specify host") unless opts[:host]
36
+ vm_name = ARGV[0] or abort("must specify VM name")
37
+ output_path = ARGV[1] or abort("must specify output filename")
38
+
39
+ vim = VIM.connect opts
40
+ dc = vim.serviceInstance.find_datacenter(opts[:datacenter])
41
+ vm = dc.find_vm vm_name
42
+ abort "VM must be running" unless vm.runtime.powerState == 'poweredOn'
43
+ remote_path = vm.CreateScreenshot_Task.wait_for_completion
44
+ remote_path =~ /^(\/vmfs\/volumes\/[^\/]+)\// or fail
45
+ datastore_prefix = $1
46
+ datastore_path = $'
47
+ datastore = vm.datastore.find { |ds| ds.info.url == datastore_prefix }
48
+ datastore.download datastore_path, output_path
data/examples/vdf.rb ADDED
@@ -0,0 +1,81 @@
1
+ # Translation of vGhetto vdf, originally by William Lam
2
+ require 'trollop'
3
+ require 'rbvmomi'
4
+ require 'rbvmomi/trollop'
5
+
6
+ VIM = RbVmomi::VIM
7
+
8
+ opts = Trollop.options do
9
+ banner <<-EOS
10
+ Display utilization of each datastore in the datacenter.
11
+
12
+ Usage:
13
+ vdf.rb [options]
14
+
15
+ VIM connection options:
16
+ EOS
17
+
18
+ rbvmomi_connection_opts
19
+
20
+ text <<-EOS
21
+
22
+ Datacenter selection:
23
+ EOS
24
+
25
+ rbvmomi_datacenter_opt
26
+
27
+ text <<-EOS
28
+
29
+ Other options:
30
+ EOS
31
+ end
32
+
33
+ Trollop.die("must specify host") unless opts[:host]
34
+
35
+ vim = VIM.connect opts
36
+
37
+ dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
38
+
39
+ def si n
40
+ ['', 'K', 'M', 'G', 'T', 'P'].each_with_index do |x,i|
41
+ v = n.to_f/(1000**i)
42
+ return v,x if v < 1000 or x == 'P'
43
+ end
44
+ end
45
+
46
+ def unit n, u, p
47
+ "%.*g%s%s" % [p, si(n), u].flatten
48
+ end
49
+
50
+ def b n
51
+ unit(n,'B',3)
52
+ end
53
+
54
+ puts "Filesystem#{' '*53}Size Used Avail Use% Mounted on"
55
+ fmt = "%-62s %-8s %-8s %-8s %-8s %s"
56
+
57
+ if false
58
+ # simple version
59
+ dc.datastore.sort_by { |ds| ds.info.url }.each do |ds|
60
+ s = ds.summary
61
+ next unless s.accessible
62
+ size = s.capacity
63
+ free = s.freeSpace
64
+ used = size - free
65
+ pct_used = used*100.0/size
66
+ puts(fmt % [ds.info.url, b(size), b(used), b(free), unit(pct_used,'%',3), ds.name])
67
+ end
68
+ else
69
+ # fast version
70
+ paths = %w(name info.url summary.accessible summary.capacity summary.freeSpace)
71
+ propSet = [{ :type => 'Datastore', :pathSet => paths }]
72
+ filterSpec = { :objectSet => dc.datastore.map { |ds| { :obj => ds } }, :propSet => propSet }
73
+ data = vim.propertyCollector.RetrieveProperties(:specSet => [filterSpec])
74
+ data.select { |d| d['summary.accessible'] }.sort_by { |d| d['info.url'] }.each do |d|
75
+ size = d['summary.capacity']
76
+ free = d['summary.freeSpace']
77
+ used = size - free
78
+ pct_used = used*100.0/size
79
+ puts(fmt % [d['info.url'], b(size), b(used), b(free), unit(pct_used,'%',3), d['name']])
80
+ end
81
+ end