vagrant-rbvmomi 1.8.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +6 -0
- data/LICENSE +19 -0
- data/README.rdoc +78 -0
- data/Rakefile +31 -0
- data/VERSION +1 -0
- data/bin/rbvmomish +138 -0
- data/devel/analyze-vim-declarations.rb +213 -0
- data/devel/analyze-xml.rb +46 -0
- data/devel/benchmark.rb +117 -0
- data/devel/collisions.rb +18 -0
- data/devel/merge-internal-vmodl.rb +59 -0
- data/devel/merge-manual-vmodl.rb +32 -0
- data/examples/annotate.rb +54 -0
- data/examples/cached_ovf_deploy.rb +120 -0
- data/examples/clone_vm.rb +84 -0
- data/examples/create_vm-1.9.rb +93 -0
- data/examples/create_vm.rb +93 -0
- data/examples/extraConfig.rb +54 -0
- data/examples/lease_tool.rb +102 -0
- data/examples/logbundle.rb +63 -0
- data/examples/logtail.rb +60 -0
- data/examples/nfs_datastore.rb +95 -0
- data/examples/power.rb +59 -0
- data/examples/readme-1.rb +35 -0
- data/examples/readme-2.rb +51 -0
- data/examples/run.sh +41 -0
- data/examples/screenshot.rb +48 -0
- data/examples/vdf.rb +81 -0
- data/examples/vm_drs_behavior.rb +76 -0
- data/lib/rbvmomi.rb +12 -0
- data/lib/rbvmomi/basic_types.rb +375 -0
- data/lib/rbvmomi/connection.rb +270 -0
- data/lib/rbvmomi/deserialization.rb +248 -0
- data/lib/rbvmomi/fault.rb +17 -0
- data/lib/rbvmomi/pbm.rb +66 -0
- data/lib/rbvmomi/sms.rb +61 -0
- data/lib/rbvmomi/sms/SmsStorageManager.rb +7 -0
- data/lib/rbvmomi/trivial_soap.rb +114 -0
- data/lib/rbvmomi/trollop.rb +70 -0
- data/lib/rbvmomi/type_loader.rb +136 -0
- data/lib/rbvmomi/utils/admission_control.rb +398 -0
- data/lib/rbvmomi/utils/deploy.rb +336 -0
- data/lib/rbvmomi/utils/leases.rb +142 -0
- data/lib/rbvmomi/utils/perfdump.rb +628 -0
- data/lib/rbvmomi/vim.rb +128 -0
- data/lib/rbvmomi/vim/ComputeResource.rb +51 -0
- data/lib/rbvmomi/vim/Datacenter.rb +17 -0
- data/lib/rbvmomi/vim/Datastore.rb +68 -0
- data/lib/rbvmomi/vim/DynamicTypeMgrAllTypeInfo.rb +75 -0
- data/lib/rbvmomi/vim/DynamicTypeMgrDataTypeInfo.rb +20 -0
- data/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb +46 -0
- data/lib/rbvmomi/vim/Folder.rb +207 -0
- data/lib/rbvmomi/vim/HostSystem.rb +174 -0
- data/lib/rbvmomi/vim/ManagedEntity.rb +57 -0
- data/lib/rbvmomi/vim/ManagedObject.rb +60 -0
- data/lib/rbvmomi/vim/ObjectContent.rb +23 -0
- data/lib/rbvmomi/vim/ObjectUpdate.rb +23 -0
- data/lib/rbvmomi/vim/OvfManager.rb +200 -0
- data/lib/rbvmomi/vim/PerfCounterInfo.rb +26 -0
- data/lib/rbvmomi/vim/PerformanceManager.rb +110 -0
- data/lib/rbvmomi/vim/PropertyCollector.rb +25 -0
- data/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb +30 -0
- data/lib/rbvmomi/vim/ResourcePool.rb +55 -0
- data/lib/rbvmomi/vim/ServiceInstance.rb +55 -0
- data/lib/rbvmomi/vim/Task.rb +65 -0
- data/lib/rbvmomi/vim/VirtualMachine.rb +74 -0
- data/test/test_deserialization.rb +383 -0
- data/test/test_emit_request.rb +128 -0
- data/test/test_exceptions.rb +14 -0
- data/test/test_helper.rb +14 -0
- data/test/test_misc.rb +24 -0
- data/test/test_parse_response.rb +69 -0
- data/test/test_serialization.rb +311 -0
- data/vmodl.db +0 -0
- metadata +163 -0
data/lib/rbvmomi/vim.rb
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
# Copyright (c) 2011 VMware, Inc. All Rights Reserved.
|
2
|
+
require 'rbvmomi'
|
3
|
+
|
4
|
+
module RbVmomi
|
5
|
+
|
6
|
+
# A connection to one vSphere SDK endpoint.
|
7
|
+
# @see #serviceInstance
|
8
|
+
class VIM < Connection
|
9
|
+
# Connect to a vSphere SDK endpoint
|
10
|
+
#
|
11
|
+
# @param [Hash] opts The options hash.
|
12
|
+
# @option opts [String] :host Host to connect to.
|
13
|
+
# @option opts [Numeric] :port (443) Port to connect to.
|
14
|
+
# @option opts [Boolean] :ssl (true) Whether to use SSL.
|
15
|
+
# @option opts [Boolean] :insecure (false) If true, ignore SSL certificate errors.
|
16
|
+
# @option opts [String] :cookie If set, use cookie to connect instead of user/password
|
17
|
+
# @option opts [String] :user (root) Username.
|
18
|
+
# @option opts [String] :password Password.
|
19
|
+
# @option opts [String] :path (/sdk) SDK endpoint path.
|
20
|
+
# @option opts [Boolean] :debug (false) If true, print SOAP traffic to stderr.
|
21
|
+
def self.connect opts
|
22
|
+
fail unless opts.is_a? Hash
|
23
|
+
fail "host option required" unless opts[:host]
|
24
|
+
opts[:cookie] ||= nil
|
25
|
+
opts[:user] ||= 'root'
|
26
|
+
opts[:password] ||= ''
|
27
|
+
opts[:ssl] = true unless opts.member? :ssl or opts[:"no-ssl"]
|
28
|
+
opts[:insecure] ||= false
|
29
|
+
opts[:port] ||= (opts[:ssl] ? 443 : 80)
|
30
|
+
opts[:path] ||= '/sdk'
|
31
|
+
opts[:ns] ||= 'urn:vim25'
|
32
|
+
rev_given = opts[:rev] != nil
|
33
|
+
opts[:rev] = '4.0' unless rev_given
|
34
|
+
opts[:debug] = (!ENV['RBVMOMI_DEBUG'].empty? rescue false) unless opts.member? :debug
|
35
|
+
|
36
|
+
new(opts).tap do |vim|
|
37
|
+
unless opts[:cookie]
|
38
|
+
vim.serviceContent.sessionManager.Login :userName => opts[:user], :password => opts[:password]
|
39
|
+
end
|
40
|
+
unless rev_given
|
41
|
+
rev = vim.serviceContent.about.apiVersion
|
42
|
+
vim.rev = [rev, '5.5'].min
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def close
|
48
|
+
VIM::SessionManager(self, 'SessionManager').Logout rescue RbVmomi::Fault
|
49
|
+
self.cookie = nil
|
50
|
+
super
|
51
|
+
end
|
52
|
+
|
53
|
+
def rev= x
|
54
|
+
super
|
55
|
+
@serviceContent = nil
|
56
|
+
end
|
57
|
+
|
58
|
+
# Return the ServiceInstance
|
59
|
+
#
|
60
|
+
# The ServiceInstance is the root of the vSphere inventory.
|
61
|
+
# @see http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.ServiceInstance.html
|
62
|
+
def serviceInstance
|
63
|
+
VIM::ServiceInstance self, 'ServiceInstance'
|
64
|
+
end
|
65
|
+
|
66
|
+
# Alias to serviceInstance.RetrieveServiceContent
|
67
|
+
def serviceContent
|
68
|
+
@serviceContent ||= serviceInstance.RetrieveServiceContent
|
69
|
+
end
|
70
|
+
|
71
|
+
# Alias to serviceContent.rootFolder
|
72
|
+
def rootFolder
|
73
|
+
serviceContent.rootFolder
|
74
|
+
end
|
75
|
+
|
76
|
+
alias root rootFolder
|
77
|
+
|
78
|
+
# Alias to serviceContent.propertyCollector
|
79
|
+
def propertyCollector
|
80
|
+
serviceContent.propertyCollector
|
81
|
+
end
|
82
|
+
|
83
|
+
# Alias to serviceContent.searchIndex
|
84
|
+
def searchIndex
|
85
|
+
serviceContent.searchIndex
|
86
|
+
end
|
87
|
+
|
88
|
+
# @private
|
89
|
+
def pretty_print pp
|
90
|
+
pp.text "VIM(#{@opts[:host]})"
|
91
|
+
end
|
92
|
+
|
93
|
+
def instanceUuid
|
94
|
+
serviceContent.about.instanceUuid
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_log_lines logKey, lines=5, start=nil, host=nil
|
98
|
+
diagMgr = self.serviceContent.diagnosticManager
|
99
|
+
if !start
|
100
|
+
log = diagMgr.BrowseDiagnosticLog(:host => host, :key => logKey, :start => 999999999)
|
101
|
+
lineEnd = log.lineEnd
|
102
|
+
start = lineEnd - lines
|
103
|
+
end
|
104
|
+
start = start < 0 ? 0 : start
|
105
|
+
log = diagMgr.BrowseDiagnosticLog(:host => host, :key => logKey, :start => start)
|
106
|
+
if log.lineText.size > 0
|
107
|
+
[log.lineText.slice(-lines, log.lineText.size), log.lineEnd]
|
108
|
+
else
|
109
|
+
[log.lineText, log.lineEnd]
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def get_log_keys host=nil
|
114
|
+
diagMgr = self.serviceContent.diagnosticManager
|
115
|
+
keys = []
|
116
|
+
diagMgr.QueryDescriptions(:host => host).each do |desc|
|
117
|
+
keys << "#{desc.key}"
|
118
|
+
end
|
119
|
+
keys
|
120
|
+
end
|
121
|
+
|
122
|
+
add_extension_dir File.join(File.dirname(__FILE__), "vim")
|
123
|
+
(ENV['RBVMOMI_VIM_EXTENSION_PATH']||'').split(':').each { |dir| add_extension_dir dir }
|
124
|
+
|
125
|
+
load_vmodl(ENV['VMODL'] || File.join(File.dirname(__FILE__), "../../vmodl.db"))
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class RbVmomi::VIM::ComputeResource
|
2
|
+
# Aggregate cluster information.
|
3
|
+
#
|
4
|
+
# @note Values are returned in a hash.
|
5
|
+
#
|
6
|
+
# @return [Mhz] totalCPU: Sum of the frequencies of each CPU in the cluster.
|
7
|
+
# @return [Mhz] usedCPU: CPU cycles used across the cluster.
|
8
|
+
# @return [MB] totalMem: Total RAM.
|
9
|
+
# @return [MB] usedMem: Used RAM.
|
10
|
+
def stats
|
11
|
+
filterSpec = RbVmomi::VIM.PropertyFilterSpec(
|
12
|
+
:objectSet => [{
|
13
|
+
:obj => self,
|
14
|
+
:selectSet => [
|
15
|
+
RbVmomi::VIM.TraversalSpec(
|
16
|
+
:name => 'tsHosts',
|
17
|
+
:type => 'ComputeResource',
|
18
|
+
:path => 'host',
|
19
|
+
:skip => false
|
20
|
+
)
|
21
|
+
]
|
22
|
+
}],
|
23
|
+
:propSet => [{
|
24
|
+
:pathSet => %w(name overallStatus summary.hardware.cpuMhz
|
25
|
+
summary.hardware.numCpuCores summary.hardware.memorySize
|
26
|
+
summary.quickStats.overallCpuUsage
|
27
|
+
summary.quickStats.overallMemoryUsage),
|
28
|
+
:type => 'HostSystem'
|
29
|
+
}]
|
30
|
+
)
|
31
|
+
|
32
|
+
result = _connection.propertyCollector.RetrieveProperties(:specSet => [filterSpec])
|
33
|
+
|
34
|
+
stats = {
|
35
|
+
:totalCPU => 0,
|
36
|
+
:totalMem => 0,
|
37
|
+
:usedCPU => 0,
|
38
|
+
:usedMem => 0,
|
39
|
+
}
|
40
|
+
|
41
|
+
result.each do |x|
|
42
|
+
next if x['overallStatus'] == 'red'
|
43
|
+
stats[:totalCPU] += x['summary.hardware.cpuMhz'] * x['summary.hardware.numCpuCores']
|
44
|
+
stats[:totalMem] += x['summary.hardware.memorySize'] / (1024*1024)
|
45
|
+
stats[:usedCPU] += x['summary.quickStats.overallCpuUsage'] || 0
|
46
|
+
stats[:usedMem] += x['summary.quickStats.overallMemoryUsage'] || 0
|
47
|
+
end
|
48
|
+
|
49
|
+
stats
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class RbVmomi::VIM::Datacenter
|
2
|
+
# Traverse the given inventory +path+ to find a ComputeResource.
|
3
|
+
def find_compute_resource path
|
4
|
+
hostFolder.traverse path, RbVmomi::VIM::ComputeResource
|
5
|
+
end
|
6
|
+
|
7
|
+
# Find the Datastore with the given +name+.
|
8
|
+
def find_datastore name
|
9
|
+
datastore.find { |x| x.name == name }
|
10
|
+
end
|
11
|
+
|
12
|
+
# Traverse the given inventory +path+ to find a VirtualMachine.
|
13
|
+
def find_vm path
|
14
|
+
vmFolder.traverse path, RbVmomi::VIM::VirtualMachine
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# @note +download+ and +upload+ require +curl+. If +curl+ is not in your +PATH+
|
2
|
+
# then set the +CURL+ environment variable to point to it.
|
3
|
+
# @todo Use an HTTP library instead of executing +curl+.
|
4
|
+
class RbVmomi::VIM::Datastore
|
5
|
+
CURLBIN = ENV['CURL'] || "curl" #@private
|
6
|
+
|
7
|
+
# Check whether a file exists on this datastore.
|
8
|
+
# @param path [String] Path on the datastore.
|
9
|
+
def exists? path
|
10
|
+
req = Net::HTTP::Head.new mkuripath(path)
|
11
|
+
req.initialize_http_header 'cookie' => _connection.cookie
|
12
|
+
resp = _connection.http.request req
|
13
|
+
case resp
|
14
|
+
when Net::HTTPSuccess
|
15
|
+
true
|
16
|
+
when Net::HTTPNotFound
|
17
|
+
false
|
18
|
+
else
|
19
|
+
fail resp.inspect
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# Download a file from this datastore.
|
24
|
+
# @param remote_path [String] Source path on the datastore.
|
25
|
+
# @param local_path [String] Destination path on the local machine.
|
26
|
+
# @return [void]
|
27
|
+
def download remote_path, local_path
|
28
|
+
url = "http#{_connection.http.use_ssl? ? 's' : ''}://#{_connection.http.address}:#{_connection.http.port}#{mkuripath(remote_path)}"
|
29
|
+
pid = spawn CURLBIN, "-k", '--noproxy', '*', '-f',
|
30
|
+
"-o", local_path,
|
31
|
+
"-b", _connection.cookie,
|
32
|
+
url,
|
33
|
+
:out => '/dev/null'
|
34
|
+
Process.waitpid(pid, 0)
|
35
|
+
fail "download failed" unless $?.success?
|
36
|
+
end
|
37
|
+
|
38
|
+
# Upload a file to this datastore.
|
39
|
+
# @param remote_path [String] Destination path on the datastore.
|
40
|
+
# @param local_path [String] Source path on the local machine.
|
41
|
+
# @return [void]
|
42
|
+
def upload remote_path, local_path
|
43
|
+
url = "http#{_connection.http.use_ssl? ? 's' : ''}://#{_connection.http.address}:#{_connection.http.port}#{mkuripath(remote_path)}"
|
44
|
+
pid = spawn CURLBIN, "-k", '--noproxy', '*', '-f',
|
45
|
+
"-T", local_path,
|
46
|
+
"-b", _connection.cookie,
|
47
|
+
url,
|
48
|
+
:out => '/dev/null'
|
49
|
+
Process.waitpid(pid, 0)
|
50
|
+
fail "upload failed" unless $?.success?
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def datacenter
|
56
|
+
return @datacenter if @datacenter
|
57
|
+
x = parent
|
58
|
+
while not x.is_a? RbVmomi::VIM::Datacenter
|
59
|
+
x = x.parent
|
60
|
+
end
|
61
|
+
fail unless x.is_a? RbVmomi::VIM::Datacenter
|
62
|
+
@datacenter = x
|
63
|
+
end
|
64
|
+
|
65
|
+
def mkuripath path
|
66
|
+
"/folder/#{URI.escape path}?dcPath=#{URI.escape datacenter.name}&dsName=#{URI.escape name}"
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
class RbVmomi::VIM::DynamicTypeMgrAllTypeInfo
|
2
|
+
def toRbvmomiTypeHash
|
3
|
+
id2name = {}
|
4
|
+
id2name.merge!({
|
5
|
+
'string' => 'xsd:string',
|
6
|
+
'java.lang.String' => 'xsd:string',
|
7
|
+
'BOOLEAN' => 'xsd:boolean',
|
8
|
+
'BYTE' => 'xsd:byte',
|
9
|
+
'SHORT' => 'xsd:short',
|
10
|
+
'INT' => 'xsd:int',
|
11
|
+
'LONG' => 'xsd:long',
|
12
|
+
'FLOAT' => 'xsd:float',
|
13
|
+
'DOUBLE' => 'xsd:double',
|
14
|
+
'boolean' => 'xsd:boolean',
|
15
|
+
'byte' => 'xsd:byte',
|
16
|
+
'short' => 'xsd:short',
|
17
|
+
'int' => 'xsd:int',
|
18
|
+
'long' => 'xsd:long',
|
19
|
+
'float' => 'xsd:float',
|
20
|
+
'double' => 'xsd:double',
|
21
|
+
'vmodl.DateTime' => 'xsd:dateTime',
|
22
|
+
'vmodl.Binary' => 'xsd:base64Binary',
|
23
|
+
'vmodl.Any' => 'xsd:anyType',
|
24
|
+
'vim.KeyValue' => 'KeyValue',
|
25
|
+
'void' => nil,
|
26
|
+
})
|
27
|
+
|
28
|
+
%w(DataObject ManagedObject MethodFault MethodName DynamicData
|
29
|
+
PropertyPath RuntimeFault TypeName).each do |x|
|
30
|
+
id2name['vmodl.' + x] = x
|
31
|
+
end
|
32
|
+
|
33
|
+
types = {}
|
34
|
+
self.managedTypeInfo.each{|x| types.merge!(x.toRbvmomiTypeHash) }
|
35
|
+
self.dataTypeInfo.each{|x| types.merge!(x.toRbvmomiTypeHash) }
|
36
|
+
|
37
|
+
types.each do |k,t|
|
38
|
+
id2name[t['type-id']] = k
|
39
|
+
end
|
40
|
+
|
41
|
+
types = Hash[types.map do |k,t|
|
42
|
+
case t['kind']
|
43
|
+
when 'data'
|
44
|
+
t['wsdl_base'] = t['base-type-id'] ? id2name[t['base-type-id']] : 'DataObject'
|
45
|
+
#t.delete 'base-type-id'
|
46
|
+
t['props'].each do |x|
|
47
|
+
x['wsdl_type'] = id2name[x['type-id-ref']]
|
48
|
+
x.delete 'type-id-ref'
|
49
|
+
end
|
50
|
+
when 'managed'
|
51
|
+
t['wsdl_base'] = t['base-type-id'] ? id2name[t['base-type-id']] : 'ManagedObject'
|
52
|
+
#t.delete 'base-type-id'
|
53
|
+
t['props'].each do |x|
|
54
|
+
x['wsdl_type'] = id2name[x['type-id-ref']]
|
55
|
+
x.delete 'type-id-ref'
|
56
|
+
end
|
57
|
+
t['methods'].each do |mName,x|
|
58
|
+
if y = x['result']
|
59
|
+
y['wsdl_type'] = id2name[y['type-id-ref']]
|
60
|
+
#y.delete 'type-id-ref'
|
61
|
+
end
|
62
|
+
x['params'].each do |r|
|
63
|
+
r['wsdl_type'] = id2name[r['type-id-ref']]
|
64
|
+
r.delete 'type-id-ref'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
when 'enum'
|
68
|
+
else fail
|
69
|
+
end
|
70
|
+
[k, t]
|
71
|
+
end]
|
72
|
+
|
73
|
+
types
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class RbVmomi::VIM::DynamicTypeMgrDataTypeInfo
|
2
|
+
def toRbvmomiTypeHash
|
3
|
+
{
|
4
|
+
self.wsdlName => {
|
5
|
+
'kind' => 'data',
|
6
|
+
'type-id' => self.name,
|
7
|
+
'base-type-id' => self.base.first,
|
8
|
+
'props' => self.property.map do |prop|
|
9
|
+
{
|
10
|
+
'name' => prop.name,
|
11
|
+
'type-id-ref' => prop.type.gsub("[]", ""),
|
12
|
+
'is-array' => (prop.type =~ /\[\]$/) ? true : false,
|
13
|
+
'is-optional' => prop.annotation.find{|a| a.name == "optional"} ? true : false,
|
14
|
+
'version-id-ref' => prop.version,
|
15
|
+
}
|
16
|
+
end,
|
17
|
+
}
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class RbVmomi::VIM::DynamicTypeMgrManagedTypeInfo
|
2
|
+
def toRbvmomiTypeHash
|
3
|
+
{
|
4
|
+
self.wsdlName => {
|
5
|
+
'kind' => 'managed',
|
6
|
+
'type-id' => self.name,
|
7
|
+
'base-type-id' => self.base.first,
|
8
|
+
'props' => self.property.map do |prop|
|
9
|
+
{
|
10
|
+
'name' => prop.name,
|
11
|
+
'type-id-ref' => prop.type.gsub("[]", ""),
|
12
|
+
'is-array' => (prop.type =~ /\[\]$/) ? true : false,
|
13
|
+
'is-optional' => prop.annotation.find{|a| a.name == "optional"} ? true : false,
|
14
|
+
'version-id-ref' => prop.version,
|
15
|
+
}
|
16
|
+
end,
|
17
|
+
'methods' => Hash[
|
18
|
+
self.method.map do |method|
|
19
|
+
result = method.returnTypeInfo
|
20
|
+
|
21
|
+
[method.wsdlName,
|
22
|
+
{
|
23
|
+
'params' => method.paramTypeInfo.map do |param|
|
24
|
+
{
|
25
|
+
'name' => param.name,
|
26
|
+
'type-id-ref' => param.type.gsub("[]", ""),
|
27
|
+
'is-array' => (param.type =~ /\[\]$/) ? true : false,
|
28
|
+
'is-optional' => param.annotation.find{|a| a.name == "optional"} ? true : false,
|
29
|
+
'version-id-ref' => param.version,
|
30
|
+
}
|
31
|
+
end,
|
32
|
+
'result' => {
|
33
|
+
'name' => result.name,
|
34
|
+
'type-id-ref' => result.type.gsub("[]", ""),
|
35
|
+
'is-array' => (result.type =~ /\[\]$/) ? true : false,
|
36
|
+
'is-optional' => result.annotation.find{|a| a.name == "optional"} ? true : false,
|
37
|
+
'version-id-ref' => result.version,
|
38
|
+
}
|
39
|
+
}
|
40
|
+
]
|
41
|
+
end
|
42
|
+
]
|
43
|
+
}
|
44
|
+
}
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,207 @@
|
|
1
|
+
class RbVmomi::VIM::Folder
|
2
|
+
# Retrieve a child entity
|
3
|
+
# @param name [String] Name of the child.
|
4
|
+
# @param type [Class] Return nil unless the found entity <tt>is_a? type</tt>.
|
5
|
+
# @return [VIM::ManagedEntity]
|
6
|
+
def find name, type=Object
|
7
|
+
x = _connection.searchIndex.FindChild(:entity => self, :name => name)
|
8
|
+
x if x.is_a? type
|
9
|
+
end
|
10
|
+
|
11
|
+
# Retrieve a virtual machine or host by DNS name
|
12
|
+
# @param name [String] The fully qualified domain name to find.
|
13
|
+
# @param type [Class] Return nil unless the found entity <tt>is_a? type</tt>.
|
14
|
+
# @param dc [RbVmomi::VIM::Datacenter] Restricts the query to entities in the given Datacenter.
|
15
|
+
# @return [VIM::ManagedEntity]
|
16
|
+
def findByDnsName name, type=RbVmomi::VIM::VirtualMachine, dc=nil
|
17
|
+
propSpecs = {
|
18
|
+
:entity => self, :dnsName => name,
|
19
|
+
:vmSearch => type == RbVmomi::VIM::VirtualMachine
|
20
|
+
}
|
21
|
+
propSpecs[:datacenter] = dc if dc
|
22
|
+
x = _connection.searchIndex.FindByDnsName(propSpecs)
|
23
|
+
x if x.is_a? type
|
24
|
+
end
|
25
|
+
|
26
|
+
# Retrieve a virtual machine or host by IP address
|
27
|
+
# @param ip [String] The IP address is in dot-decimal notation.
|
28
|
+
# @param type [Class] Return nil unless the found entity <tt>is_a? type</tt>.
|
29
|
+
# @param dc [RbVmomi::VIM::Datacenter] Restricts the query to entities in the given Datacenter.
|
30
|
+
# @return [VIM::ManagedEntity]
|
31
|
+
def findByIp ip, type=RbVmomi::VIM::VirtualMachine, dc=nil
|
32
|
+
propSpecs = {
|
33
|
+
:entity => self, :ip => ip,
|
34
|
+
:vmSearch => type == RbVmomi::VIM::VirtualMachine
|
35
|
+
}
|
36
|
+
propSpecs[:datacenter] = dc if dc
|
37
|
+
x = _connection.searchIndex.FindByIp(propSpecs)
|
38
|
+
x if x.is_a? type
|
39
|
+
end
|
40
|
+
|
41
|
+
# Retrieve a virtual machine or host by BIOS UUID.
|
42
|
+
# @param uuid [String] The UUID to find.
|
43
|
+
# @param type [Class] Return nil unless the found entity <tt>is_a? type</tt>.
|
44
|
+
# @param dc [RbVmomi::VIM::Datacenter] Restricts the query to entities in the given Datacenter.
|
45
|
+
# @return [VIM::ManagedEntity]
|
46
|
+
def findByUuid uuid, type=RbVmomi::VIM::VirtualMachine, dc=nil
|
47
|
+
propSpecs = {
|
48
|
+
:entity => self, :uuid => uuid, :instanceUuid => false,
|
49
|
+
:vmSearch => type == RbVmomi::VIM::VirtualMachine
|
50
|
+
}
|
51
|
+
propSpecs[:datacenter] = dc if dc
|
52
|
+
x = _connection.searchIndex.FindByUuid(propSpecs)
|
53
|
+
x if x.is_a? type
|
54
|
+
end
|
55
|
+
|
56
|
+
# Retrieve a managed entity by inventory path.
|
57
|
+
# @param path [String] A path of the form "My Folder/My Datacenter/vm/Discovered VM/VM1"
|
58
|
+
# @return [VIM::ManagedEntity]
|
59
|
+
def findByInventoryPath path
|
60
|
+
propSpecs = {
|
61
|
+
:entity => self, :inventoryPath => path
|
62
|
+
}
|
63
|
+
x = _connection.searchIndex.FindByInventoryPath(propSpecs)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Alias to <tt>traverse path, type, true</tt>
|
67
|
+
# @see #traverse
|
68
|
+
def traverse! path, type=Object
|
69
|
+
traverse path, type, true
|
70
|
+
end
|
71
|
+
|
72
|
+
# Retrieve a descendant of this Folder.
|
73
|
+
# @param path [String] Path delimited by '/', or an array of path elements.
|
74
|
+
# @param type (see Folder#find)
|
75
|
+
# @param create [Boolean] If set, create folders that don't exist.
|
76
|
+
# @return (see Folder#find)
|
77
|
+
# @todo Move +create+ functionality into another method.
|
78
|
+
def traverse path, type=Object, create=false
|
79
|
+
if path.is_a? String
|
80
|
+
es = path.split('/').reject(&:empty?)
|
81
|
+
elsif path.is_a? Enumerable
|
82
|
+
es = path
|
83
|
+
else
|
84
|
+
fail "unexpected path class #{path.class}"
|
85
|
+
end
|
86
|
+
return self if es.empty?
|
87
|
+
final = es.pop
|
88
|
+
|
89
|
+
p = es.inject(self) do |f,e|
|
90
|
+
f.find(e, RbVmomi::VIM::Folder) || (create && f.CreateFolder(:name => e)) || return
|
91
|
+
end
|
92
|
+
|
93
|
+
if x = p.find(final, type)
|
94
|
+
x
|
95
|
+
elsif create and type == RbVmomi::VIM::Folder
|
96
|
+
p.CreateFolder(:name => final)
|
97
|
+
elsif create and type == RbVmomi::VIM::Datacenter
|
98
|
+
p.CreateDatacenter(:name => final)
|
99
|
+
else
|
100
|
+
nil
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Alias to +childEntity+.
|
105
|
+
def children
|
106
|
+
childEntity
|
107
|
+
end
|
108
|
+
|
109
|
+
# Efficiently retrieve properties from descendants of this folder.
|
110
|
+
#
|
111
|
+
# @param propSpecs [Hash] Specification of which properties to retrieve from
|
112
|
+
# which entities. Keys may be symbols, strings, or
|
113
|
+
# classes identifying ManagedEntity subtypes to be
|
114
|
+
# included in the results. Values are an array of
|
115
|
+
# property paths (strings) or the symbol :all.
|
116
|
+
#
|
117
|
+
# @return [Hash] Hash of ManagedObjects to properties.
|
118
|
+
def inventory_flat propSpecs={}
|
119
|
+
propSet = [{ :type => 'Folder', :pathSet => ['name', 'parent', 'childEntity'] }]
|
120
|
+
propSpecs.each do |k,v|
|
121
|
+
case k
|
122
|
+
when Class
|
123
|
+
fail "key must be a subclass of ManagedEntity" unless k < RbVmomi::VIM::ManagedEntity
|
124
|
+
k = k.wsdl_name
|
125
|
+
when Symbol, String
|
126
|
+
k = k.to_s
|
127
|
+
else
|
128
|
+
fail "invalid key"
|
129
|
+
end
|
130
|
+
|
131
|
+
h = { :type => k }
|
132
|
+
if v == :all
|
133
|
+
h[:all] = true
|
134
|
+
elsif v.is_a? Array
|
135
|
+
h[:pathSet] = v + %w(parent)
|
136
|
+
else
|
137
|
+
fail "value must be an array of property paths or :all"
|
138
|
+
end
|
139
|
+
propSet << h
|
140
|
+
end
|
141
|
+
|
142
|
+
filterSpec = RbVmomi::VIM.PropertyFilterSpec(
|
143
|
+
:objectSet => [
|
144
|
+
:obj => self,
|
145
|
+
:selectSet => [
|
146
|
+
RbVmomi::VIM.TraversalSpec(
|
147
|
+
:name => 'tsFolder',
|
148
|
+
:type => 'Folder',
|
149
|
+
:path => 'childEntity',
|
150
|
+
:skip => false,
|
151
|
+
:selectSet => [
|
152
|
+
RbVmomi::VIM.SelectionSpec(:name => 'tsFolder')
|
153
|
+
]
|
154
|
+
)
|
155
|
+
]
|
156
|
+
],
|
157
|
+
:propSet => propSet
|
158
|
+
)
|
159
|
+
|
160
|
+
result = _connection.propertyCollector.RetrieveProperties(:specSet => [filterSpec])
|
161
|
+
{}.tap do |h|
|
162
|
+
result.each { |r| h[r.obj] = r }
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Efficiently retrieve properties from descendants of this folder.
|
167
|
+
#
|
168
|
+
# @param propSpecs [Hash] Specification of which properties to retrieve from
|
169
|
+
# which entities. Keys may be symbols, strings, or
|
170
|
+
# classes identifying ManagedEntity subtypes to be
|
171
|
+
# included in the results. Values are an array of
|
172
|
+
# property paths (strings) or the symbol :all.
|
173
|
+
#
|
174
|
+
# @return [Hash] Tree of inventory items. Each node is a hash from
|
175
|
+
# VIM::ObjectContent to children.
|
176
|
+
def inventory_tree propSpecs={}
|
177
|
+
inv = inventory_flat propSpecs
|
178
|
+
children = inv.values.group_by { |v| v['parent'] }
|
179
|
+
rec = lambda { |parent| Hash[(children[parent]||[]).map { |x| [x, rec[x.obj]] }] }
|
180
|
+
rec[self]
|
181
|
+
end
|
182
|
+
|
183
|
+
# Efficiently retrieve properties from descendants of this folder.
|
184
|
+
#
|
185
|
+
# @param propSpecs [Hash] Specification of which properties to retrieve from
|
186
|
+
# which entities. Keys may be symbols, strings, or
|
187
|
+
# classes identifying ManagedEntity subtypes to be
|
188
|
+
# included in the results. Values are an array of
|
189
|
+
# property paths (strings) or the symbol :all.
|
190
|
+
#
|
191
|
+
# @return [Hash] Tree of inventory items. Folders are hashes from child name
|
192
|
+
# to child result. Objects are hashes from property path to
|
193
|
+
# value.
|
194
|
+
#
|
195
|
+
# @deprecated
|
196
|
+
def inventory propSpecs={}
|
197
|
+
inv = inventory_flat propSpecs
|
198
|
+
tree = { self => {} }
|
199
|
+
inv.each do |obj,x|
|
200
|
+
next if obj == self
|
201
|
+
h = Hash[x.propSet.map { |y| [y.name, y.val] }]
|
202
|
+
tree[h['parent']][h['name']] = [obj, h]
|
203
|
+
tree[obj] = {} if obj.is_a? RbVmomi::VIM::Folder
|
204
|
+
end
|
205
|
+
tree
|
206
|
+
end
|
207
|
+
end
|