rbvmomi 1.8.2 → 2.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/LICENSE +1 -1
- data/README.md +114 -0
- data/{bin → exe}/rbvmomish +5 -5
- data/lib/rbvmomi.rb +11 -7
- data/lib/rbvmomi/basic_types.rb +9 -1
- data/lib/rbvmomi/connection.rb +11 -9
- data/lib/rbvmomi/deserialization.rb +4 -3
- data/lib/rbvmomi/fault.rb +3 -1
- data/lib/rbvmomi/{trollop.rb → optimist.rb} +10 -8
- data/lib/rbvmomi/pbm.rb +3 -1
- data/lib/rbvmomi/sms.rb +3 -1
- data/lib/rbvmomi/sms/SmsStorageManager.rb +3 -0
- data/lib/rbvmomi/sso.rb +313 -0
- data/lib/rbvmomi/trivial_soap.rb +19 -11
- data/lib/rbvmomi/type_loader.rb +4 -2
- data/lib/rbvmomi/utils/admission_control.rb +22 -19
- data/lib/rbvmomi/utils/deploy.rb +18 -14
- data/lib/rbvmomi/utils/leases.rb +4 -1
- data/lib/rbvmomi/utils/perfdump.rb +4 -1
- data/lib/rbvmomi/version.rb +6 -0
- data/lib/rbvmomi/vim.rb +41 -12
- data/lib/rbvmomi/vim/ComputeResource.rb +3 -0
- data/lib/rbvmomi/vim/Datacenter.rb +8 -0
- data/lib/rbvmomi/vim/Datastore.rb +5 -1
- data/lib/rbvmomi/vim/DynamicTypeMgrAllTypeInfo.rb +3 -0
- data/lib/rbvmomi/vim/DynamicTypeMgrDataTypeInfo.rb +4 -1
- data/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb +15 -7
- data/lib/rbvmomi/vim/Folder.rb +19 -12
- data/lib/rbvmomi/vim/HostSystem.rb +5 -2
- data/lib/rbvmomi/vim/ManagedEntity.rb +3 -0
- data/lib/rbvmomi/vim/ManagedObject.rb +4 -1
- data/lib/rbvmomi/vim/ObjectContent.rb +3 -0
- data/lib/rbvmomi/vim/ObjectUpdate.rb +3 -0
- data/lib/rbvmomi/vim/OvfManager.rb +6 -2
- data/lib/rbvmomi/vim/PerfCounterInfo.rb +3 -1
- data/lib/rbvmomi/vim/PerformanceManager.rb +3 -0
- data/lib/rbvmomi/vim/PropertyCollector.rb +3 -0
- data/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb +5 -2
- data/lib/rbvmomi/vim/ResourcePool.rb +3 -0
- data/lib/rbvmomi/vim/ServiceInstance.rb +3 -0
- data/lib/rbvmomi/vim/Task.rb +3 -0
- data/lib/rbvmomi/vim/VirtualMachine.rb +13 -12
- data/vmodl.db +0 -0
- metadata +100 -63
- data/.yardopts +0 -6
- data/README.rdoc +0 -78
- data/Rakefile +0 -45
- data/VERSION +0 -1
- data/devel/analyze-vim-declarations.rb +0 -213
- data/devel/analyze-xml.rb +0 -46
- data/devel/benchmark.rb +0 -117
- data/devel/collisions.rb +0 -18
- data/devel/merge-internal-vmodl.rb +0 -59
- data/devel/merge-manual-vmodl.rb +0 -32
- data/examples/annotate.rb +0 -54
- data/examples/cached_ovf_deploy.rb +0 -120
- data/examples/clone_vm.rb +0 -84
- data/examples/create_vm-1.9.rb +0 -93
- data/examples/create_vm.rb +0 -93
- data/examples/extraConfig.rb +0 -54
- data/examples/lease_tool.rb +0 -102
- data/examples/logbundle.rb +0 -63
- data/examples/logtail.rb +0 -60
- data/examples/nfs_datastore.rb +0 -95
- data/examples/power.rb +0 -59
- data/examples/readme-1.rb +0 -35
- data/examples/readme-2.rb +0 -51
- data/examples/run.sh +0 -41
- data/examples/screenshot.rb +0 -48
- data/examples/vdf.rb +0 -81
- data/examples/vm_drs_behavior.rb +0 -76
- data/test/test_deserialization.rb +0 -383
- data/test/test_emit_request.rb +0 -128
- data/test/test_exceptions.rb +0 -14
- data/test/test_helper.rb +0 -14
- data/test/test_misc.rb +0 -24
- data/test/test_parse_response.rb +0 -69
- 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 }
|
data/devel/merge-manual-vmodl.rb
DELETED
@@ -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
|
data/examples/create_vm-1.9.rb
DELETED
@@ -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
|