rbvmomi2 3.0.0 → 3.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|