rbvmomi 1.8.2 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. checksums.yaml +5 -13
  2. data/LICENSE +1 -1
  3. data/README.md +114 -0
  4. data/{bin → exe}/rbvmomish +5 -5
  5. data/lib/rbvmomi.rb +11 -7
  6. data/lib/rbvmomi/basic_types.rb +9 -1
  7. data/lib/rbvmomi/connection.rb +11 -9
  8. data/lib/rbvmomi/deserialization.rb +4 -3
  9. data/lib/rbvmomi/fault.rb +3 -1
  10. data/lib/rbvmomi/{trollop.rb → optimist.rb} +10 -8
  11. data/lib/rbvmomi/pbm.rb +3 -1
  12. data/lib/rbvmomi/sms.rb +3 -1
  13. data/lib/rbvmomi/sms/SmsStorageManager.rb +3 -0
  14. data/lib/rbvmomi/sso.rb +313 -0
  15. data/lib/rbvmomi/trivial_soap.rb +19 -11
  16. data/lib/rbvmomi/type_loader.rb +4 -2
  17. data/lib/rbvmomi/utils/admission_control.rb +22 -19
  18. data/lib/rbvmomi/utils/deploy.rb +18 -14
  19. data/lib/rbvmomi/utils/leases.rb +4 -1
  20. data/lib/rbvmomi/utils/perfdump.rb +4 -1
  21. data/lib/rbvmomi/version.rb +6 -0
  22. data/lib/rbvmomi/vim.rb +41 -12
  23. data/lib/rbvmomi/vim/ComputeResource.rb +3 -0
  24. data/lib/rbvmomi/vim/Datacenter.rb +8 -0
  25. data/lib/rbvmomi/vim/Datastore.rb +5 -1
  26. data/lib/rbvmomi/vim/DynamicTypeMgrAllTypeInfo.rb +3 -0
  27. data/lib/rbvmomi/vim/DynamicTypeMgrDataTypeInfo.rb +4 -1
  28. data/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb +15 -7
  29. data/lib/rbvmomi/vim/Folder.rb +19 -12
  30. data/lib/rbvmomi/vim/HostSystem.rb +5 -2
  31. data/lib/rbvmomi/vim/ManagedEntity.rb +3 -0
  32. data/lib/rbvmomi/vim/ManagedObject.rb +4 -1
  33. data/lib/rbvmomi/vim/ObjectContent.rb +3 -0
  34. data/lib/rbvmomi/vim/ObjectUpdate.rb +3 -0
  35. data/lib/rbvmomi/vim/OvfManager.rb +6 -2
  36. data/lib/rbvmomi/vim/PerfCounterInfo.rb +3 -1
  37. data/lib/rbvmomi/vim/PerformanceManager.rb +3 -0
  38. data/lib/rbvmomi/vim/PropertyCollector.rb +3 -0
  39. data/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb +5 -2
  40. data/lib/rbvmomi/vim/ResourcePool.rb +3 -0
  41. data/lib/rbvmomi/vim/ServiceInstance.rb +3 -0
  42. data/lib/rbvmomi/vim/Task.rb +3 -0
  43. data/lib/rbvmomi/vim/VirtualMachine.rb +13 -12
  44. data/vmodl.db +0 -0
  45. metadata +100 -63
  46. data/.yardopts +0 -6
  47. data/README.rdoc +0 -78
  48. data/Rakefile +0 -45
  49. data/VERSION +0 -1
  50. data/devel/analyze-vim-declarations.rb +0 -213
  51. data/devel/analyze-xml.rb +0 -46
  52. data/devel/benchmark.rb +0 -117
  53. data/devel/collisions.rb +0 -18
  54. data/devel/merge-internal-vmodl.rb +0 -59
  55. data/devel/merge-manual-vmodl.rb +0 -32
  56. data/examples/annotate.rb +0 -54
  57. data/examples/cached_ovf_deploy.rb +0 -120
  58. data/examples/clone_vm.rb +0 -84
  59. data/examples/create_vm-1.9.rb +0 -93
  60. data/examples/create_vm.rb +0 -93
  61. data/examples/extraConfig.rb +0 -54
  62. data/examples/lease_tool.rb +0 -102
  63. data/examples/logbundle.rb +0 -63
  64. data/examples/logtail.rb +0 -60
  65. data/examples/nfs_datastore.rb +0 -95
  66. data/examples/power.rb +0 -59
  67. data/examples/readme-1.rb +0 -35
  68. data/examples/readme-2.rb +0 -51
  69. data/examples/run.sh +0 -41
  70. data/examples/screenshot.rb +0 -48
  71. data/examples/vdf.rb +0 -81
  72. data/examples/vm_drs_behavior.rb +0 -76
  73. data/test/test_deserialization.rb +0 -383
  74. data/test/test_emit_request.rb +0 -128
  75. data/test/test_exceptions.rb +0 -14
  76. data/test/test_helper.rb +0 -14
  77. data/test/test_misc.rb +0 -24
  78. data/test/test_parse_response.rb +0 -69
  79. data/test/test_serialization.rb +0 -311
data/devel/collisions.rb DELETED
@@ -1,18 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Find collisions between VMODL property names and Ruby methods
3
- require 'rbvmomi'
4
- VIM = RbVmomi::VIM
5
-
6
- conn = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
7
-
8
- VIM.loader.typenames.each do |name|
9
- klass = VIM.loader.get name
10
- next unless klass.respond_to? :kind and [:managed, :data].member? klass.kind
11
- methods = klass.kind == :managed ?
12
- RbVmomi::BasicTypes::ObjectWithMethods.instance_methods :
13
- RbVmomi::BasicTypes::ObjectWithProperties.instance_methods
14
- klass.props_desc.each do |x|
15
- name = x['name']
16
- puts "collision: #{klass}##{name}" if methods.member? name.to_sym
17
- end
18
- end
@@ -1,59 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # These types are not public and so may change between releases. Do not
3
- # use them directly.
4
-
5
- public_vmodl_filename = ARGV[0] or abort "public vmodl filename required"
6
- internal_vmodl_filename = ARGV[1] or abort "internal vmodl filename required"
7
- output_vmodl_filename = ARGV[2] or abort "output vmodl filename required"
8
-
9
- TYPES = %w(
10
- DVSKeyedOpaqueData
11
- DVSOpaqueDataConfigSpec
12
- DVPortgroupSelection
13
- DVPortSelection
14
- DVSSelection
15
- DynamicTypeEnumTypeInfo
16
- DynamicTypeMgrAllTypeInfo
17
- DynamicTypeMgrAnnotation
18
- DynamicTypeMgrDataTypeInfo
19
- DynamicTypeMgrFilterSpec
20
- DynamicTypeMgrManagedTypeInfo
21
- DynamicTypeMgrMethodTypeInfo
22
- DynamicTypeMgrMethodTypeInfoAnnotationType
23
- DynamicTypeMgrMoFilterSpec
24
- DynamicTypeMgrMoInstance
25
- DynamicTypeMgrParamTypeInfo
26
- DynamicTypeMgrParamTypeInfoAnnotationType
27
- DynamicTypeMgrPropertyTypeInfo
28
- DynamicTypeMgrPropertyTypeInfoAnnotationType
29
- DynamicTypeMgrTypeFilterSpec
30
- InternalDynamicTypeManager
31
- ReflectManagedMethodExecuter
32
- ReflectManagedMethodExecuterSoapArgument
33
- ReflectManagedMethodExecuterSoapFault
34
- ReflectManagedMethodExecuterSoapResult
35
- SelectionSet
36
- )
37
-
38
- METHODS = %w(
39
- DistributedVirtualSwitchManager.UpdateDvsOpaqueData_Task
40
- HostSystem.RetrieveDynamicTypeManager
41
- HostSystem.RetrieveManagedMethodExecuter
42
- )
43
-
44
- public_vmodl = File.open(public_vmodl_filename, 'r') { |io| Marshal.load io }
45
- internal_vmodl = File.open(internal_vmodl_filename, 'r') { |io| Marshal.load io }
46
-
47
- TYPES.each do |k|
48
- puts "Merging in #{k}"
49
- fail "Couldn't find type #{k} in internal VMODL" unless internal_vmodl.member? k
50
- public_vmodl[k] = internal_vmodl[k]
51
- end
52
-
53
- METHODS.each do |x|
54
- puts "Merging in #{x}"
55
- type, method = x.split '.'
56
- public_vmodl[type]['methods'][method] = internal_vmodl[type]['methods'][method] or fail
57
- end
58
-
59
- File.open(output_vmodl_filename, 'w') { |io| Marshal.dump public_vmodl, io }
@@ -1,32 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Manually merge two versions of vmodl.db
3
-
4
- public_vmodl_filename = ARGV[0] or abort "public vmodl filename required"
5
- internal_vmodl_filename = ARGV[1] or abort "internal vmodl filename required"
6
- output_vmodl_filename = ARGV[2] or abort "output vmodl filename required"
7
-
8
- public_vmodl = File.open(public_vmodl_filename, 'r') { |io| Marshal.load io }
9
- internal_vmodl = File.open(internal_vmodl_filename, 'r') { |io| Marshal.load io }
10
-
11
- db = {}
12
- tn = {}
13
- public_vmodl.each do |k,v|
14
- unless k == '_typenames'
15
- db[k] = v
16
- else
17
- tn['_typenames'] = v
18
- end
19
- end
20
-
21
- internal_vmodl.each do |k, v|
22
- unless k == '_typenames'
23
- db[k] = v unless db[k]
24
- else
25
- tn['_typenames'] = tn['_typenames'] + v
26
- end
27
- end
28
-
29
- db['_typenames'] = tn
30
-
31
-
32
- File.open(output_vmodl_filename, 'w') { |io| Marshal.dump db, io }
data/examples/annotate.rb DELETED
@@ -1,54 +0,0 @@
1
- require 'trollop'
2
- require 'rbvmomi'
3
- require 'rbvmomi/trollop'
4
-
5
- VIM = RbVmomi::VIM
6
- CMDS = %w(get set)
7
-
8
- opts = Trollop.options do
9
- banner <<-EOS
10
- Annotate a VM.
11
-
12
- Usage:
13
- annotate.rb [options] VM get
14
- annotate.rb [options] VM set annotation
15
-
16
- Commands: #{CMDS * ' '}
17
-
18
- VIM connection options:
19
- EOS
20
-
21
- rbvmomi_connection_opts
22
-
23
- text <<-EOS
24
-
25
- VM location options:
26
- EOS
27
-
28
- rbvmomi_datacenter_opt
29
-
30
- text <<-EOS
31
-
32
- Other options:
33
- EOS
34
-
35
- stop_on CMDS
36
- end
37
-
38
- vm_name = ARGV[0] or Trollop.die("no VM name given")
39
- cmd = ARGV[1] or Trollop.die("no command given")
40
- abort "invalid command" unless CMDS.member? cmd
41
- Trollop.die("must specify host") unless opts[:host]
42
-
43
- vim = VIM.connect opts
44
-
45
- dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
46
- vm = dc.find_vm(vm_name) or abort "VM not found"
47
-
48
- case cmd
49
- when 'get'
50
- puts vm.config.annotation
51
- when 'set'
52
- value = ARGV[2] or Trollop.die("no annotation given")
53
- vm.ReconfigVM_Task(:spec => VIM.VirtualMachineConfigSpec(:annotation => value)).wait_for_completion
54
- end
@@ -1,120 +0,0 @@
1
- #!/usr/bin/env ruby
2
- require 'trollop'
3
- require 'rbvmomi'
4
- require 'rbvmomi/trollop'
5
- require 'rbvmomi/utils/deploy'
6
- require 'rbvmomi/utils/admission_control'
7
- require 'yaml'
8
-
9
- VIM = RbVmomi::VIM
10
-
11
- opts = Trollop.options do
12
- banner <<-EOS
13
- Deploy an OVF to a cluster, using a cached template if available.
14
-
15
- Usage:
16
- cached_ovf_deploy.rb [options] <vmname> <ovfurl>
17
-
18
- VIM connection options:
19
- EOS
20
-
21
- rbvmomi_connection_opts
22
-
23
- text <<-EOS
24
-
25
- VM location options:
26
- EOS
27
-
28
- rbvmomi_datacenter_opt
29
- rbvmomi_datastore_opt
30
-
31
- text <<-EOS
32
-
33
- Other options:
34
- EOS
35
-
36
- opt :template_name, "Name to give to the (cached) template", :type => :string
37
- opt :template_path, "Path where templates are stored", :default => 'templates', :type => :string
38
- opt :computer_path, "Path to the cluster to deploy into", :type => :string
39
- opt :network, "Name of the network to attach template to", :type => :string
40
- opt :vm_folder_path, "Path to VM folder to deploy VM into", :type => :string
41
- opt :lease, "Lease in days", :type => :int, :default => 3
42
- end
43
-
44
- Trollop.die("must specify host") unless opts[:host]
45
- Trollop.die("no cluster path given") unless opts[:computer_path]
46
- template_folder_path = opts[:template_path]
47
- template_name = opts[:template_name] or Trollop.die("no template name given")
48
- vm_name = ARGV[0] or Trollop.die("no VM name given")
49
- ovf_url = ARGV[1] or Trollop.die("No OVF URL given")
50
-
51
- vim = VIM.connect opts
52
- dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
53
-
54
- root_vm_folder = dc.vmFolder
55
- vm_folder = root_vm_folder
56
- if opts[:vm_folder_path]
57
- vm_folder = root_vm_folder.traverse(opts[:vm_folder_path], VIM::Folder)
58
- end
59
- template_folder = root_vm_folder.traverse!(template_folder_path, VIM::Folder)
60
-
61
- scheduler = AdmissionControlledResourceScheduler.new(
62
- vim,
63
- :datacenter => dc,
64
- :computer_names => [opts[:computer_path]],
65
- :vm_folder => vm_folder,
66
- :rp_path => '/',
67
- :datastore_paths => [opts[:datastore]],
68
- :max_vms_per_pod => nil, # No limits
69
- :min_ds_free => nil, # No limits
70
- )
71
- scheduler.make_placement_decision
72
-
73
- datastore = scheduler.datastore
74
- computer = scheduler.pick_computer
75
- # XXX: Do this properly
76
- if opts[:network]
77
- network = computer.network.find{|x| x.name == opts[:network]}
78
- else
79
- network = computer.network[0]
80
- end
81
-
82
- lease_tool = LeaseTool.new
83
- lease = opts[:lease] * 24 * 60 * 60
84
- deployer = CachedOvfDeployer.new(
85
- vim, network, computer, template_folder, vm_folder, datastore
86
- )
87
- template = deployer.lookup_template template_name
88
-
89
- if !template
90
- puts "#{Time.now}: Uploading/Preparing OVF template ..."
91
-
92
- template = deployer.upload_ovf_as_template(
93
- ovf_url, template_name,
94
- :run_without_interruptions => true,
95
- :config => lease_tool.set_lease_in_vm_config({}, lease)
96
- )
97
- end
98
-
99
- puts "#{Time.now}: Cloning template ..."
100
- config = {
101
- :numCPUs => opts[:cpus],
102
- :memoryMB => opts[:memory],
103
- }
104
- config = lease_tool.set_lease_in_vm_config(config, lease)
105
- vm = deployer.linked_clone template, vm_name, config
106
-
107
- puts "#{Time.now}: Powering On VM ..."
108
- # XXX: Add a retrying version?
109
- vm.PowerOnVM_Task.wait_for_completion
110
-
111
- puts "#{Time.now}: Waiting for VM to be up ..."
112
- ip = nil
113
- while !(ip = vm.guest_ip)
114
- sleep 5
115
- end
116
-
117
- puts "#{Time.now}: VM got IP: #{ip}"
118
-
119
- puts "#{Time.now}: Done"
120
-
data/examples/clone_vm.rb DELETED
@@ -1,84 +0,0 @@
1
- #!/usr/bin/env ruby
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
- Clone a VM.
11
-
12
- Usage:
13
- clone_vm.rb [options] source_vm dest_vm
14
-
15
- VIM connection options:
16
- EOS
17
-
18
- rbvmomi_connection_opts
19
-
20
- text <<-EOS
21
-
22
- VM location options:
23
- EOS
24
-
25
- rbvmomi_datacenter_opt
26
-
27
- text <<-EOS
28
-
29
- Other options:
30
- EOS
31
-
32
- opt :linked_clone, "Use a linked clone instead of a full clone"
33
- end
34
-
35
- Trollop.die("must specify host") unless opts[:host]
36
- ARGV.size == 2 or abort "must specify VM source name and VM target name"
37
- vm_source = ARGV[0]
38
- vm_target = ARGV[1]
39
-
40
- vim = VIM.connect opts
41
- dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
42
- vm = dc.find_vm(vm_source) or abort "VM not found"
43
-
44
- if opts[:linked_clone]
45
- # The API for linked clones is quite strange. We can't create a linked
46
- # straight from any VM. The disks of the VM for which we can create a
47
- # linked clone need to be read-only and thus VC demands that the VM we
48
- # are cloning from uses delta-disks. Only then it will allow us to
49
- # share the base disk.
50
- #
51
- # Thus, this code first create a delta disk on top of the base disk for
52
- # the to-be-cloned VM, if delta disks aren't used already.
53
- disks = vm.config.hardware.device.grep(VIM::VirtualDisk)
54
- disks.select { |x| x.backing.parent == nil }.each do |disk|
55
- spec = {
56
- :deviceChange => [
57
- {
58
- :operation => :remove,
59
- :device => disk
60
- },
61
- {
62
- :operation => :add,
63
- :fileOperation => :create,
64
- :device => disk.dup.tap { |x|
65
- x.backing = x.backing.dup
66
- x.backing.fileName = "[#{disk.backing.datastore.name}]"
67
- x.backing.parent = disk.backing
68
- },
69
- }
70
- ]
71
- }
72
- vm.ReconfigVM_Task(:spec => spec).wait_for_completion
73
- end
74
-
75
- relocateSpec = VIM.VirtualMachineRelocateSpec(:diskMoveType => :moveChildMostDiskBacking)
76
- else
77
- relocateSpec = VIM.VirtualMachineRelocateSpec
78
- end
79
-
80
- spec = VIM.VirtualMachineCloneSpec(:location => relocateSpec,
81
- :powerOn => false,
82
- :template => false)
83
-
84
- vm.CloneVM_Task(:folder => vm.parent, :name => vm_target, :spec => spec).wait_for_completion
@@ -1,93 +0,0 @@
1
- #!/usr/bin/env ruby
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
- Create a VM.
11
-
12
- Usage:
13
- create_vm-1.9.rb [options]
14
-
15
- VIM connection options:
16
- EOS
17
-
18
- rbvmomi_connection_opts
19
-
20
- text <<-EOS
21
-
22
- VM location options:
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
- vm_name = ARGV[0] or abort "must specify VM name"
35
-
36
- vim = VIM.connect opts
37
- dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
38
- vmFolder = dc.vmFolder
39
- hosts = dc.hostFolder.children
40
- rp = hosts.first.resourcePool
41
-
42
- vm_cfg = {
43
- name: vm_name,
44
- guestId: 'otherGuest',
45
- files: { vmPathName: '[datastore1]' },
46
- numCPUs: 1,
47
- memoryMB: 128,
48
- deviceChange: [
49
- {
50
- operation: :add,
51
- device: VIM.VirtualLsiLogicController(
52
- key: 1000,
53
- busNumber: 0,
54
- sharedBus: :noSharing,
55
- )
56
- }, {
57
- operation: :add,
58
- fileOperation: :create,
59
- device: VIM.VirtualDisk(
60
- key: 0,
61
- backing: VIM.VirtualDiskFlatVer2BackingInfo(
62
- fileName: '[datastore1]',
63
- diskMode: :persistent,
64
- thinProvisioned: true,
65
- ),
66
- controllerKey: 1000,
67
- unitNumber: 0,
68
- capacityInKB: 4000000,
69
- )
70
- }, {
71
- operation: :add,
72
- device: VIM.VirtualE1000(
73
- key: 0,
74
- deviceInfo: {
75
- label: 'Network Adapter 1',
76
- summary: 'VM Network',
77
- },
78
- backing: VIM.VirtualEthernetCardNetworkBackingInfo(
79
- deviceName: 'VM Network',
80
- ),
81
- addressType: 'generated'
82
- )
83
- }
84
- ],
85
- extraConfig: [
86
- {
87
- key: 'bios.bootOrder',
88
- value: 'ethernet0'
89
- }
90
- ]
91
- }
92
-
93
- vmFolder.CreateVM_Task(:config => vm_cfg, :pool => rp).wait_for_completion