rbvmomi2 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +11 -25
- data/exe/rbvmomish +50 -48
- data/lib/rbvmomi/basic_types.rb +318 -294
- data/lib/rbvmomi/connection.rb +221 -216
- data/lib/rbvmomi/deserialization.rb +201 -205
- data/lib/rbvmomi/fault.rb +10 -9
- data/lib/rbvmomi/optimist.rb +51 -50
- data/lib/rbvmomi/pbm.rb +52 -50
- data/lib/rbvmomi/sms/SmsStorageManager.rb +2 -1
- data/lib/rbvmomi/sms.rb +48 -46
- data/lib/rbvmomi/sso.rb +13 -18
- data/lib/rbvmomi/trivial_soap.rb +9 -8
- data/lib/rbvmomi/type_loader.rb +100 -101
- data/lib/rbvmomi/utils/admission_control.rb +90 -106
- data/lib/rbvmomi/utils/deploy.rb +77 -85
- data/lib/rbvmomi/utils/leases.rb +31 -33
- data/lib/rbvmomi/utils/perfdump.rb +177 -207
- data/lib/rbvmomi/version.rb +2 -1
- data/lib/rbvmomi/vim/ComputeResource.rb +17 -15
- data/lib/rbvmomi/vim/Datacenter.rb +1 -0
- data/lib/rbvmomi/vim/Datastore.rb +18 -15
- data/lib/rbvmomi/vim/DynamicTypeMgrAllTypeInfo.rb +7 -6
- data/lib/rbvmomi/vim/DynamicTypeMgrDataTypeInfo.rb +3 -2
- data/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb +7 -6
- data/lib/rbvmomi/vim/Folder.rb +37 -33
- data/lib/rbvmomi/vim/HostSystem.rb +139 -136
- data/lib/rbvmomi/vim/ManagedEntity.rb +15 -14
- data/lib/rbvmomi/vim/ManagedObject.rb +11 -10
- data/lib/rbvmomi/vim/ObjectContent.rb +3 -1
- data/lib/rbvmomi/vim/ObjectUpdate.rb +3 -1
- data/lib/rbvmomi/vim/OvfManager.rb +50 -57
- data/lib/rbvmomi/vim/PerfCounterInfo.rb +4 -3
- data/lib/rbvmomi/vim/PerformanceManager.rb +28 -31
- data/lib/rbvmomi/vim/PropertyCollector.rb +8 -7
- data/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb +22 -21
- data/lib/rbvmomi/vim/ResourcePool.rb +19 -18
- data/lib/rbvmomi/vim/ServiceInstance.rb +8 -7
- data/lib/rbvmomi/vim/Task.rb +6 -5
- data/lib/rbvmomi/vim/VirtualMachine.rb +8 -7
- data/lib/rbvmomi/vim.rb +112 -129
- data/lib/rbvmomi.rb +1 -0
- metadata +54 -10
data/lib/rbvmomi/version.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
@@ -12,37 +13,38 @@ class RbVmomi::VIM::ComputeResource
|
|
12
13
|
# @return [MB] usedMem: Used RAM.
|
13
14
|
def stats
|
14
15
|
filterSpec = RbVmomi::VIM.PropertyFilterSpec(
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
16
|
+
objectSet: [{
|
17
|
+
obj: self,
|
18
|
+
selectSet: [
|
18
19
|
RbVmomi::VIM.TraversalSpec(
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
20
|
+
name: 'tsHosts',
|
21
|
+
type: 'ComputeResource',
|
22
|
+
path: 'host',
|
23
|
+
skip: false
|
23
24
|
)
|
24
25
|
]
|
25
26
|
}],
|
26
|
-
:
|
27
|
-
:
|
27
|
+
propSet: [{
|
28
|
+
pathSet: %w(name overallStatus summary.hardware.cpuMhz
|
28
29
|
summary.hardware.numCpuCores summary.hardware.memorySize
|
29
30
|
summary.quickStats.overallCpuUsage
|
30
31
|
summary.quickStats.overallMemoryUsage),
|
31
|
-
:
|
32
|
+
type: 'HostSystem'
|
32
33
|
}]
|
33
34
|
)
|
34
35
|
|
35
|
-
result = _connection.propertyCollector.RetrieveProperties(:
|
36
|
+
result = _connection.propertyCollector.RetrieveProperties(specSet: [filterSpec])
|
36
37
|
|
37
38
|
stats = {
|
38
|
-
:
|
39
|
-
:
|
40
|
-
:
|
41
|
-
:
|
39
|
+
totalCPU: 0,
|
40
|
+
totalMem: 0,
|
41
|
+
usedCPU: 0,
|
42
|
+
usedMem: 0,
|
42
43
|
}
|
43
44
|
|
44
45
|
result.each do |x|
|
45
46
|
next if x['overallStatus'] == 'red'
|
47
|
+
|
46
48
|
stats[:totalCPU] += x['summary.hardware.cpuMhz'] * x['summary.hardware.numCpuCores']
|
47
49
|
stats[:totalMem] += x['summary.hardware.memorySize'] / (1024*1024)
|
48
50
|
stats[:usedCPU] += x['summary.quickStats.overallCpuUsage'] || 0
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
@@ -5,7 +6,7 @@
|
|
5
6
|
# then set the +CURL+ environment variable to point to it.
|
6
7
|
# @todo Use an HTTP library instead of executing +curl+.
|
7
8
|
class RbVmomi::VIM::Datastore
|
8
|
-
CURLBIN = ENV['CURL'] ||
|
9
|
+
CURLBIN = ENV['CURL'] || 'curl' #@private
|
9
10
|
|
10
11
|
# Check whether a file exists on this datastore.
|
11
12
|
# @param path [String] Path on the datastore.
|
@@ -19,7 +20,7 @@ class RbVmomi::VIM::Datastore
|
|
19
20
|
when Net::HTTPNotFound
|
20
21
|
false
|
21
22
|
else
|
22
|
-
|
23
|
+
raise resp.inspect
|
23
24
|
end
|
24
25
|
end
|
25
26
|
|
@@ -29,13 +30,13 @@ class RbVmomi::VIM::Datastore
|
|
29
30
|
# @return [void]
|
30
31
|
def download remote_path, local_path
|
31
32
|
url = "http#{_connection.http.use_ssl? ? 's' : ''}://#{_connection.http.address}:#{_connection.http.port}#{mkuripath(remote_path)}"
|
32
|
-
pid = spawn CURLBIN,
|
33
|
-
|
34
|
-
|
33
|
+
pid = spawn CURLBIN, '-k', '--noproxy', '*', '-f',
|
34
|
+
'-o', local_path,
|
35
|
+
'-b', _connection.cookie,
|
35
36
|
url,
|
36
|
-
:
|
37
|
+
out: '/dev/null'
|
37
38
|
Process.waitpid(pid, 0)
|
38
|
-
|
39
|
+
raise 'download failed' unless $?.success?
|
39
40
|
end
|
40
41
|
|
41
42
|
# Upload a file to this datastore.
|
@@ -44,29 +45,31 @@ class RbVmomi::VIM::Datastore
|
|
44
45
|
# @return [void]
|
45
46
|
def upload remote_path, local_path
|
46
47
|
url = "http#{_connection.http.use_ssl? ? 's' : ''}://#{_connection.http.address}:#{_connection.http.port}#{mkuripath(remote_path)}"
|
47
|
-
pid = spawn CURLBIN,
|
48
|
-
|
49
|
-
|
48
|
+
pid = spawn CURLBIN, '-k', '--noproxy', '*', '-f',
|
49
|
+
'-T', local_path,
|
50
|
+
'-b', _connection.cookie,
|
50
51
|
url,
|
51
|
-
:
|
52
|
+
out: '/dev/null'
|
52
53
|
Process.waitpid(pid, 0)
|
53
|
-
|
54
|
+
raise 'upload failed' unless $?.success?
|
54
55
|
end
|
55
56
|
|
56
57
|
private
|
57
58
|
|
58
59
|
def datacenter
|
59
60
|
return @datacenter if @datacenter
|
61
|
+
|
60
62
|
x = parent
|
61
63
|
while not x.is_a? RbVmomi::VIM::Datacenter
|
62
64
|
x = x.parent
|
63
65
|
end
|
64
|
-
|
66
|
+
raise unless x.is_a? RbVmomi::VIM::Datacenter
|
67
|
+
|
65
68
|
@datacenter = x
|
66
69
|
end
|
67
70
|
|
68
71
|
def mkuripath path
|
69
|
-
datacenter_path_str = datacenter.path[1..-1].map{|elem| elem[1]}.join('/')
|
70
|
-
"/folder/#{URI.
|
72
|
+
datacenter_path_str = datacenter.path[1..-1].map{ |elem| elem[1] }.join('/')
|
73
|
+
"/folder/#{URI.encode_www_form_component path}?dcPath=#{URI.encode_www_form_component datacenter_path_str }&dsName=#{URI.encode_www_form_component name}"
|
71
74
|
end
|
72
75
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
@@ -34,14 +35,14 @@ class RbVmomi::VIM::DynamicTypeMgrAllTypeInfo
|
|
34
35
|
end
|
35
36
|
|
36
37
|
types = {}
|
37
|
-
self.managedTypeInfo.each{|x| types.merge!(x.toRbvmomiTypeHash) }
|
38
|
-
self.dataTypeInfo.each{|x| types.merge!(x.toRbvmomiTypeHash) }
|
38
|
+
self.managedTypeInfo.each{ |x| types.merge!(x.toRbvmomiTypeHash) }
|
39
|
+
self.dataTypeInfo.each{ |x| types.merge!(x.toRbvmomiTypeHash) }
|
39
40
|
|
40
|
-
types.each do |k,t|
|
41
|
+
types.each do |k, t|
|
41
42
|
id2name[t['type-id']] = k
|
42
43
|
end
|
43
44
|
|
44
|
-
types = Hash[types.map do |k,t|
|
45
|
+
types = Hash[types.map do |k, t|
|
45
46
|
case t['kind']
|
46
47
|
when 'data'
|
47
48
|
t['wsdl_base'] = t['base-type-id'] ? id2name[t['base-type-id']] : 'DataObject'
|
@@ -57,7 +58,7 @@ class RbVmomi::VIM::DynamicTypeMgrAllTypeInfo
|
|
57
58
|
x['wsdl_type'] = id2name[x['type-id-ref']]
|
58
59
|
x.delete 'type-id-ref'
|
59
60
|
end
|
60
|
-
t['methods'].each do |mName,x|
|
61
|
+
t['methods'].each do |mName, x|
|
61
62
|
if y = x['result']
|
62
63
|
y['wsdl_type'] = id2name[y['type-id-ref']]
|
63
64
|
#y.delete 'type-id-ref'
|
@@ -68,7 +69,7 @@ class RbVmomi::VIM::DynamicTypeMgrAllTypeInfo
|
|
68
69
|
end
|
69
70
|
end
|
70
71
|
when 'enum'
|
71
|
-
else
|
72
|
+
else raise
|
72
73
|
end
|
73
74
|
[k, t]
|
74
75
|
end]
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
@@ -11,9 +12,9 @@ class RbVmomi::VIM::DynamicTypeMgrDataTypeInfo
|
|
11
12
|
'props' => self.property.map do |prop|
|
12
13
|
{
|
13
14
|
'name' => prop.name,
|
14
|
-
'type-id-ref' => prop.type.gsub(
|
15
|
+
'type-id-ref' => prop.type.gsub('[]', ''),
|
15
16
|
'is-array' => (prop.type =~ /\[\]$/) ? true : false,
|
16
|
-
'is-optional' => prop.annotation.find{|a| a.name ==
|
17
|
+
'is-optional' => prop.annotation.find{ |a| a.name == 'optional' } ? true : false,
|
17
18
|
'version-id-ref' => prop.version,
|
18
19
|
}
|
19
20
|
end,
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
@@ -11,9 +12,9 @@ class RbVmomi::VIM::DynamicTypeMgrManagedTypeInfo
|
|
11
12
|
'props' => self.property.map do |prop|
|
12
13
|
{
|
13
14
|
'name' => prop.name,
|
14
|
-
'type-id-ref' => prop.type.gsub(
|
15
|
+
'type-id-ref' => prop.type.gsub('[]', ''),
|
15
16
|
'is-array' => (prop.type =~ /\[\]$/) ? true : false,
|
16
|
-
'is-optional' => prop.annotation.find{|a| a.name ==
|
17
|
+
'is-optional' => prop.annotation.find{ |a| a.name == 'optional' } ? true : false,
|
17
18
|
'version-id-ref' => prop.version,
|
18
19
|
}
|
19
20
|
end,
|
@@ -26,9 +27,9 @@ class RbVmomi::VIM::DynamicTypeMgrManagedTypeInfo
|
|
26
27
|
'params' => method.paramTypeInfo.map do |param|
|
27
28
|
{
|
28
29
|
'name' => param.name,
|
29
|
-
'type-id-ref' => param.type.gsub(
|
30
|
+
'type-id-ref' => param.type.gsub('[]', ''),
|
30
31
|
'is-array' => (param.type =~ /\[\]$/) ? true : false,
|
31
|
-
'is-optional' => param.annotation.find{|a| a.name ==
|
32
|
+
'is-optional' => param.annotation.find{ |a| a.name == 'optional' } ? true : false,
|
32
33
|
'version-id-ref' => param.version,
|
33
34
|
}
|
34
35
|
end,
|
@@ -38,9 +39,9 @@ class RbVmomi::VIM::DynamicTypeMgrManagedTypeInfo
|
|
38
39
|
else
|
39
40
|
{
|
40
41
|
'name' => result.name,
|
41
|
-
'type-id-ref' => result.type.gsub(
|
42
|
+
'type-id-ref' => result.type.gsub('[]', ''),
|
42
43
|
'is-array' => (result.type =~ /\[\]$/) ? true : false,
|
43
|
-
'is-optional' => result.annotation.find{|a| a.name ==
|
44
|
+
'is-optional' => result.annotation.find{ |a| a.name == 'optional' } ? true : false,
|
44
45
|
'version-id-ref' => result.version,
|
45
46
|
}
|
46
47
|
end)
|
data/lib/rbvmomi/vim/Folder.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
@@ -7,7 +8,7 @@ class RbVmomi::VIM::Folder
|
|
7
8
|
# @param type [Class] Return nil unless the found entity <tt>is_a? type</tt>.
|
8
9
|
# @return [VIM::ManagedEntity]
|
9
10
|
def find name, type=Object
|
10
|
-
x = _connection.searchIndex.FindChild(:
|
11
|
+
x = _connection.searchIndex.FindChild(entity: self, name: name)
|
11
12
|
x if x.is_a? type
|
12
13
|
end
|
13
14
|
|
@@ -18,8 +19,8 @@ class RbVmomi::VIM::Folder
|
|
18
19
|
# @return [VIM::ManagedEntity]
|
19
20
|
def findByDnsName name, type=RbVmomi::VIM::VirtualMachine, dc=nil
|
20
21
|
propSpecs = {
|
21
|
-
:
|
22
|
-
:
|
22
|
+
entity: self, dnsName: name,
|
23
|
+
vmSearch: type == RbVmomi::VIM::VirtualMachine
|
23
24
|
}
|
24
25
|
propSpecs[:datacenter] = dc if dc
|
25
26
|
x = _connection.searchIndex.FindByDnsName(propSpecs)
|
@@ -33,8 +34,8 @@ class RbVmomi::VIM::Folder
|
|
33
34
|
# @return [VIM::ManagedEntity]
|
34
35
|
def findByIp ip, type=RbVmomi::VIM::VirtualMachine, dc=nil
|
35
36
|
propSpecs = {
|
36
|
-
:
|
37
|
-
:
|
37
|
+
entity: self, ip: ip,
|
38
|
+
vmSearch: type == RbVmomi::VIM::VirtualMachine
|
38
39
|
}
|
39
40
|
propSpecs[:datacenter] = dc if dc
|
40
41
|
x = _connection.searchIndex.FindByIp(propSpecs)
|
@@ -50,10 +51,10 @@ class RbVmomi::VIM::Folder
|
|
50
51
|
# @return [VIM::ManagedEntity]
|
51
52
|
def findByUuid(uuid, type = RbVmomi::VIM::VirtualMachine, dc = nil, instance_uuid = false)
|
52
53
|
prop_specs = {
|
53
|
-
:
|
54
|
-
:
|
55
|
-
:
|
56
|
-
:
|
54
|
+
entity: self,
|
55
|
+
instanceUuid: instance_uuid,
|
56
|
+
uuid: uuid,
|
57
|
+
vmSearch: type == RbVmomi::VIM::VirtualMachine
|
57
58
|
}
|
58
59
|
prop_specs[:datacenter] = dc if dc
|
59
60
|
x = _connection.searchIndex.FindByUuid(prop_specs)
|
@@ -65,7 +66,7 @@ class RbVmomi::VIM::Folder
|
|
65
66
|
# @return [VIM::ManagedEntity]
|
66
67
|
def findByInventoryPath path
|
67
68
|
propSpecs = {
|
68
|
-
:
|
69
|
+
entity: self, inventoryPath: path
|
69
70
|
}
|
70
71
|
_connection.searchIndex.FindByInventoryPath(propSpecs)
|
71
72
|
end
|
@@ -88,21 +89,22 @@ class RbVmomi::VIM::Folder
|
|
88
89
|
elsif path.is_a? Enumerable
|
89
90
|
es = path
|
90
91
|
else
|
91
|
-
|
92
|
+
raise "unexpected path class #{path.class}"
|
92
93
|
end
|
93
94
|
return self if es.empty?
|
95
|
+
|
94
96
|
final = es.pop
|
95
97
|
|
96
|
-
p = es.inject(self) do |f,e|
|
97
|
-
f.find(e, RbVmomi::VIM::Folder) || (create && f.CreateFolder(:
|
98
|
+
p = es.inject(self) do |f, e|
|
99
|
+
f.find(e, RbVmomi::VIM::Folder) || (create && f.CreateFolder(name: e)) || return
|
98
100
|
end
|
99
101
|
|
100
102
|
if x = p.find(final, type)
|
101
103
|
x
|
102
104
|
elsif create and type == RbVmomi::VIM::Folder
|
103
|
-
p.CreateFolder(:
|
105
|
+
p.CreateFolder(name: final)
|
104
106
|
elsif create and type == RbVmomi::VIM::Datacenter
|
105
|
-
p.CreateDatacenter(:
|
107
|
+
p.CreateDatacenter(name: final)
|
106
108
|
else
|
107
109
|
nil
|
108
110
|
end
|
@@ -123,48 +125,49 @@ class RbVmomi::VIM::Folder
|
|
123
125
|
#
|
124
126
|
# @return [Hash] Hash of ManagedObjects to properties.
|
125
127
|
def inventory_flat propSpecs={}
|
126
|
-
propSet = [{ :
|
127
|
-
propSpecs.each do |k,v|
|
128
|
+
propSet = [{ type: 'Folder', pathSet: ['name', 'parent', 'childEntity'] }]
|
129
|
+
propSpecs.each do |k, v|
|
128
130
|
case k
|
129
131
|
when Class
|
130
|
-
|
132
|
+
raise 'key must be a subclass of ManagedEntity' unless k < RbVmomi::VIM::ManagedEntity
|
133
|
+
|
131
134
|
k = k.wsdl_name
|
132
135
|
when Symbol, String
|
133
136
|
k = k.to_s
|
134
137
|
else
|
135
|
-
|
138
|
+
raise 'invalid key'
|
136
139
|
end
|
137
140
|
|
138
|
-
h = { :
|
141
|
+
h = { type: k }
|
139
142
|
if v == :all
|
140
143
|
h[:all] = true
|
141
144
|
elsif v.is_a? Array
|
142
145
|
h[:pathSet] = v + %w(parent)
|
143
146
|
else
|
144
|
-
|
147
|
+
raise 'value must be an array of property paths or :all'
|
145
148
|
end
|
146
149
|
propSet << h
|
147
150
|
end
|
148
151
|
|
149
152
|
filterSpec = RbVmomi::VIM.PropertyFilterSpec(
|
150
|
-
:
|
151
|
-
:
|
152
|
-
:
|
153
|
+
objectSet: [
|
154
|
+
obj: self,
|
155
|
+
selectSet: [
|
153
156
|
RbVmomi::VIM.TraversalSpec(
|
154
|
-
:
|
155
|
-
:
|
156
|
-
:
|
157
|
-
:
|
158
|
-
:
|
159
|
-
RbVmomi::VIM.SelectionSpec(:
|
157
|
+
name: 'tsFolder',
|
158
|
+
type: 'Folder',
|
159
|
+
path: 'childEntity',
|
160
|
+
skip: false,
|
161
|
+
selectSet: [
|
162
|
+
RbVmomi::VIM.SelectionSpec(name: 'tsFolder')
|
160
163
|
]
|
161
164
|
)
|
162
165
|
]
|
163
166
|
],
|
164
|
-
:
|
167
|
+
propSet: propSet
|
165
168
|
)
|
166
169
|
|
167
|
-
result = _connection.propertyCollector.RetrieveProperties(:
|
170
|
+
result = _connection.propertyCollector.RetrieveProperties(specSet: [filterSpec])
|
168
171
|
{}.tap do |h|
|
169
172
|
result.each { |r| h[r.obj] = r }
|
170
173
|
end
|
@@ -203,8 +206,9 @@ class RbVmomi::VIM::Folder
|
|
203
206
|
def inventory propSpecs={}
|
204
207
|
inv = inventory_flat propSpecs
|
205
208
|
tree = { self => {} }
|
206
|
-
inv.each do |obj,x|
|
209
|
+
inv.each do |obj, x|
|
207
210
|
next if obj == self
|
211
|
+
|
208
212
|
h = Hash[x.propSet.map { |y| [y.name, y.val] }]
|
209
213
|
tree[h['parent']][h['name']] = [obj, h]
|
210
214
|
tree[obj] = {} if obj.is_a? RbVmomi::VIM::Folder
|