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
@@ -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,245 +6,240 @@ require 'time'
|
|
5
6
|
|
6
7
|
module RbVmomi
|
7
8
|
|
8
|
-
class NewDeserializer
|
9
|
-
|
9
|
+
class NewDeserializer
|
10
|
+
NS_XSI = 'http://www.w3.org/2001/XMLSchema-instance'
|
10
11
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
BUILTIN_TYPE_ACTIONS = {
|
20
|
-
'xsd:string' => :string,
|
21
|
-
'xsd:boolean' => :boolean,
|
22
|
-
'xsd:byte' => :int,
|
23
|
-
'xsd:short' => :int,
|
24
|
-
'xsd:int' => :int,
|
25
|
-
'xsd:long' => :int,
|
26
|
-
'xsd:float' => :float,
|
27
|
-
'xsd:dateTime' => :date,
|
28
|
-
'PropertyPath' => :string,
|
29
|
-
'MethodName' => :string,
|
30
|
-
'TypeName' => :string,
|
31
|
-
'xsd:base64Binary' => :binary,
|
32
|
-
'KeyValue' => :keyvalue,
|
33
|
-
}
|
34
|
-
|
35
|
-
BUILTIN_TYPE_ACTIONS.dup.each do |k,v|
|
36
|
-
if k =~ /^xsd:/
|
37
|
-
BUILTIN_TYPE_ACTIONS[$'] = v
|
12
|
+
DEMANGLED_ARRAY_TYPES = {
|
13
|
+
'AnyType' => 'xsd:anyType',
|
14
|
+
'DateTime' => 'xsd:dateTime',
|
15
|
+
}
|
16
|
+
%w(Boolean String Byte Short Int Long Float Double).each do |x|
|
17
|
+
DEMANGLED_ARRAY_TYPES[x] = "xsd:#{x.downcase}"
|
38
18
|
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def initialize conn
|
42
|
-
@conn = conn
|
43
|
-
@loader = conn.class.loader
|
44
|
-
end
|
45
|
-
|
46
|
-
def deserialize node, type=nil
|
47
|
-
type_attr = node['type']
|
48
19
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
20
|
+
BUILTIN_TYPE_ACTIONS = {
|
21
|
+
'xsd:string' => :string,
|
22
|
+
'xsd:boolean' => :boolean,
|
23
|
+
'xsd:byte' => :int,
|
24
|
+
'xsd:short' => :int,
|
25
|
+
'xsd:int' => :int,
|
26
|
+
'xsd:long' => :int,
|
27
|
+
'xsd:float' => :float,
|
28
|
+
'xsd:dateTime' => :date,
|
29
|
+
'PropertyPath' => :string,
|
30
|
+
'MethodName' => :string,
|
31
|
+
'TypeName' => :string,
|
32
|
+
'xsd:base64Binary' => :binary,
|
33
|
+
'KeyValue' => :keyvalue,
|
34
|
+
}
|
35
|
+
|
36
|
+
BUILTIN_TYPE_ACTIONS.dup.each do |k, v|
|
37
|
+
BUILTIN_TYPE_ACTIONS[$'] = v if k =~ /^xsd:/
|
53
38
|
end
|
54
39
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
when :string
|
60
|
-
node.content
|
61
|
-
when :boolean
|
62
|
-
node.content == '1' || node.content == 'true'
|
63
|
-
when :int
|
64
|
-
node.content.to_i
|
65
|
-
when :float
|
66
|
-
node.content.to_f
|
67
|
-
when :date
|
68
|
-
leaf_date node
|
69
|
-
when :binary
|
70
|
-
leaf_binary node
|
71
|
-
when :keyvalue
|
72
|
-
leaf_keyvalue node
|
73
|
-
else fail
|
74
|
-
end
|
75
|
-
else
|
76
|
-
if type =~ /:/
|
77
|
-
type = type.split(":", 2)[1]
|
78
|
-
end
|
79
|
-
if type =~ /^ArrayOf/
|
80
|
-
type = DEMANGLED_ARRAY_TYPES[$'] || $'
|
81
|
-
return node.children.select(&:element?).map { |c| deserialize c, type }
|
82
|
-
end
|
83
|
-
if type =~ /:/
|
84
|
-
type = type.split(":", 2)[1]
|
85
|
-
end
|
40
|
+
def initialize conn
|
41
|
+
@conn = conn
|
42
|
+
@loader = conn.class.loader
|
43
|
+
end
|
86
44
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
45
|
+
def deserialize node, type=nil
|
46
|
+
type_attr = node['type']
|
47
|
+
|
48
|
+
# Work around for 1.5.x which doesn't populate node['type']
|
49
|
+
# XXX what changed
|
50
|
+
type_attr = node.attributes['type'].value if node.attributes['type'] and not type_attr
|
51
|
+
|
52
|
+
type = type_attr if type_attr
|
53
|
+
|
54
|
+
if action = BUILTIN_TYPE_ACTIONS[type]
|
55
|
+
case action
|
56
|
+
when :string
|
57
|
+
node.content
|
58
|
+
when :boolean
|
59
|
+
node.content == '1' || node.content == 'true'
|
60
|
+
when :int
|
61
|
+
node.content.to_i
|
62
|
+
when :float
|
63
|
+
node.content.to_f
|
64
|
+
when :date
|
65
|
+
leaf_date node
|
66
|
+
when :binary
|
67
|
+
leaf_binary node
|
68
|
+
when :keyvalue
|
69
|
+
leaf_keyvalue node
|
70
|
+
else raise
|
71
|
+
end
|
72
|
+
else
|
73
|
+
type = type.split(':', 2)[1] if type =~ /:/
|
74
|
+
if type =~ /^ArrayOf/
|
75
|
+
type = DEMANGLED_ARRAY_TYPES[$'] || $'
|
76
|
+
return node.children.select(&:element?).map { |c| deserialize c, type }
|
77
|
+
end
|
78
|
+
type = type.split(':', 2)[1] if type =~ /:/
|
79
|
+
|
80
|
+
klass = @loader.get(type) or raise "no such type '#{type}'"
|
81
|
+
case klass.kind
|
82
|
+
when :data
|
83
|
+
traverse_data node, klass
|
84
|
+
when :enum
|
85
|
+
node.content
|
86
|
+
when :managed
|
87
|
+
leaf_managed node, klass
|
88
|
+
else raise
|
89
|
+
end
|
96
90
|
end
|
97
91
|
end
|
98
|
-
end
|
99
92
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
93
|
+
def traverse_data node, klass
|
94
|
+
obj = klass.new nil
|
95
|
+
props = obj.props
|
96
|
+
children = node.children.select(&:element?)
|
97
|
+
i = 0
|
105
98
|
|
106
|
-
|
107
|
-
|
108
|
-
|
99
|
+
klass.full_props_desc.each do |desc|
|
100
|
+
name = desc['name']
|
101
|
+
child_type = desc['wsdl_type']
|
109
102
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
103
|
+
# Ignore unknown fields
|
104
|
+
while child = children[i] and not klass.full_props_set.member? child.name
|
105
|
+
i += 1
|
106
|
+
end
|
114
107
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
108
|
+
if desc['is-array']
|
109
|
+
a = []
|
110
|
+
while ((child = children[i]) && (child.name == name))
|
111
|
+
child = children[i]
|
112
|
+
a << deserialize(child, child_type)
|
113
|
+
i += 1
|
114
|
+
end
|
115
|
+
props[name.to_sym] = a
|
116
|
+
elsif ((child = children[i]) && (child.name == name))
|
117
|
+
props[name.to_sym] = deserialize(child, child_type)
|
120
118
|
i += 1
|
121
119
|
end
|
122
|
-
props[name.to_sym] = a
|
123
|
-
elsif ((child = children[i]) && (child.name == name))
|
124
|
-
props[name.to_sym] = deserialize(child, child_type)
|
125
|
-
i += 1
|
126
120
|
end
|
121
|
+
|
122
|
+
obj
|
127
123
|
end
|
128
124
|
|
129
|
-
|
130
|
-
|
125
|
+
def leaf_managed node, klass
|
126
|
+
type_attr = node['type']
|
127
|
+
klass = @loader.get(type_attr) if type_attr
|
128
|
+
klass.new(@conn, node.content)
|
129
|
+
end
|
131
130
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
klass.new(@conn, node.content)
|
136
|
-
end
|
131
|
+
def leaf_date node
|
132
|
+
Time.parse node.content
|
133
|
+
end
|
137
134
|
|
138
|
-
|
139
|
-
|
140
|
-
|
135
|
+
def leaf_binary node
|
136
|
+
node.content.unpack('m')[0]
|
137
|
+
end
|
141
138
|
|
142
|
-
|
143
|
-
node
|
144
|
-
|
139
|
+
# XXX does the value need to be deserialized?
|
140
|
+
def leaf_keyvalue node
|
141
|
+
h = {}
|
142
|
+
node.children.each do |child|
|
143
|
+
next unless child.element?
|
145
144
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
node.children.each do |child|
|
150
|
-
next unless child.element?
|
151
|
-
h[child.name] = child.content
|
145
|
+
h[child.name] = child.content
|
146
|
+
end
|
147
|
+
[h['key'], h['value']]
|
152
148
|
end
|
153
|
-
[h['key'], h['value']]
|
154
149
|
end
|
155
|
-
end
|
156
|
-
|
157
|
-
class OldDeserializer
|
158
|
-
NS_XSI = 'http://www.w3.org/2001/XMLSchema-instance'
|
159
150
|
|
160
|
-
|
161
|
-
|
162
|
-
end
|
151
|
+
class OldDeserializer
|
152
|
+
NS_XSI = 'http://www.w3.org/2001/XMLSchema-instance'
|
163
153
|
|
164
|
-
|
165
|
-
|
166
|
-
type_attr = xml.attribute_nodes.find { |a| a.name == 'type' &&
|
167
|
-
a.namespace &&
|
168
|
-
a.namespace.prefix == 'xsi' }
|
169
|
-
else
|
170
|
-
type_attr = xml.attribute_with_ns('type', NS_XSI)
|
154
|
+
def initialize conn
|
155
|
+
@conn = conn
|
171
156
|
end
|
172
|
-
typename = (type_attr || typename).to_s
|
173
157
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
158
|
+
def deserialize xml, typename=nil
|
159
|
+
if IS_JRUBY
|
160
|
+
type_attr = xml.attribute_nodes.find { |a| a.name == 'type' &&
|
161
|
+
a.namespace &&
|
162
|
+
a.namespace.prefix == 'xsi' }
|
163
|
+
else
|
164
|
+
type_attr = xml.attribute_with_ns('type', NS_XSI)
|
165
|
+
end
|
166
|
+
typename = (type_attr || typename).to_s
|
178
167
|
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
h = {}
|
183
|
-
props_desc.select { |d| d['is-array'] }.each { |d| h[d['name'].to_sym] = [] }
|
184
|
-
xml.children.each do |c|
|
185
|
-
next unless c.element?
|
186
|
-
field = c.name.to_sym
|
187
|
-
d = t.find_prop_desc(field.to_s) or next
|
188
|
-
o = deserialize c, d['wsdl_type']
|
189
|
-
if h[field].is_a? Array
|
190
|
-
h[field] << o
|
191
|
-
else
|
192
|
-
h[field] = o
|
193
|
-
end
|
168
|
+
if typename =~ /^ArrayOf/
|
169
|
+
typename = demangle_array_type $'
|
170
|
+
return xml.children.select(&:element?).map { |c| deserialize c, typename }
|
194
171
|
end
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
172
|
+
|
173
|
+
t = @conn.type typename
|
174
|
+
if t <= BasicTypes::DataObject
|
175
|
+
props_desc = t.full_props_desc
|
176
|
+
h = {}
|
177
|
+
props_desc.select { |d| d['is-array'] }.each { |d| h[d['name'].to_sym] = [] }
|
178
|
+
xml.children.each do |c|
|
179
|
+
next unless c.element?
|
180
|
+
|
181
|
+
field = c.name.to_sym
|
182
|
+
d = t.find_prop_desc(field.to_s) or next
|
183
|
+
o = deserialize c, d['wsdl_type']
|
184
|
+
if h[field].is_a? Array
|
185
|
+
h[field] << o
|
186
|
+
else
|
187
|
+
h[field] = o
|
188
|
+
end
|
189
|
+
end
|
190
|
+
t.new h
|
191
|
+
elsif t == BasicTypes::ManagedObjectReference
|
192
|
+
@conn.type(xml['type']).new @conn, xml.text
|
193
|
+
elsif t <= BasicTypes::ManagedObject
|
194
|
+
@conn.type(xml['type'] || t.wsdl_name).new @conn, xml.text
|
195
|
+
elsif t <= BasicTypes::Enum
|
196
|
+
xml.text
|
197
|
+
elsif t <= BasicTypes::KeyValue
|
198
|
+
h = {}
|
199
|
+
xml.children.each do |c|
|
200
|
+
next unless c.element?
|
201
|
+
|
202
|
+
h[c.name] = c.text
|
203
|
+
end
|
204
|
+
[h['key'], h['value']]
|
205
|
+
elsif t <= String
|
206
|
+
xml.text
|
207
|
+
elsif t <= Symbol
|
208
|
+
xml.text.to_sym
|
209
|
+
elsif t <= Integer
|
210
|
+
xml.text.to_i
|
211
|
+
elsif t <= Float
|
212
|
+
xml.text.to_f
|
213
|
+
elsif t <= Time
|
214
|
+
Time.parse xml.text
|
215
|
+
elsif t == BasicTypes::Boolean
|
216
|
+
xml.text == 'true' || xml.text == '1'
|
217
|
+
elsif t == BasicTypes::Binary
|
218
|
+
xml.text.unpack('m')[0]
|
219
|
+
elsif t == BasicTypes::AnyType
|
220
|
+
raise 'attempted to deserialize an AnyType'
|
221
|
+
else raise "unexpected type #{t.inspect} (#{t.ancestors * '/'})"
|
207
222
|
end
|
208
|
-
|
209
|
-
|
210
|
-
xml.
|
211
|
-
|
212
|
-
xml.text.to_sym
|
213
|
-
elsif t <= Integer
|
214
|
-
xml.text.to_i
|
215
|
-
elsif t <= Float
|
216
|
-
xml.text.to_f
|
217
|
-
elsif t <= Time
|
218
|
-
Time.parse xml.text
|
219
|
-
elsif t == BasicTypes::Boolean
|
220
|
-
xml.text == 'true' || xml.text == '1'
|
221
|
-
elsif t == BasicTypes::Binary
|
222
|
-
xml.text.unpack('m')[0]
|
223
|
-
elsif t == BasicTypes::AnyType
|
224
|
-
fail "attempted to deserialize an AnyType"
|
225
|
-
else fail "unexpected type #{t.inspect} (#{t.ancestors * '/'})"
|
223
|
+
rescue
|
224
|
+
$stderr.puts "#{$!.class} while deserializing #{xml.name} (#{typename}):"
|
225
|
+
$stderr.puts xml.to_s
|
226
|
+
raise
|
226
227
|
end
|
227
|
-
rescue
|
228
|
-
$stderr.puts "#{$!.class} while deserializing #{xml.name} (#{typename}):"
|
229
|
-
$stderr.puts xml.to_s
|
230
|
-
raise
|
231
|
-
end
|
232
228
|
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
229
|
+
def demangle_array_type x
|
230
|
+
case x
|
231
|
+
when 'AnyType' then 'anyType'
|
232
|
+
when 'DateTime' then 'dateTime'
|
233
|
+
when 'Boolean', 'String', 'Byte', 'Short', 'Int', 'Long', 'Float', 'Double' then x.downcase
|
234
|
+
else x
|
235
|
+
end
|
239
236
|
end
|
240
237
|
end
|
241
|
-
end
|
242
238
|
|
243
|
-
if ENV['RBVMOMI_NEW_DESERIALIZER'] == '1' || true # Always use new one now
|
244
|
-
|
245
|
-
else
|
246
|
-
|
247
|
-
end
|
239
|
+
if ENV['RBVMOMI_NEW_DESERIALIZER'] == '1' || true # Always use new one now
|
240
|
+
Deserializer = NewDeserializer
|
241
|
+
else
|
242
|
+
Deserializer = OldDeserializer
|
243
|
+
end
|
248
244
|
|
249
245
|
end
|
data/lib/rbvmomi/fault.rb
CHANGED
@@ -1,19 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
4
5
|
module RbVmomi
|
5
6
|
|
6
|
-
class Fault < StandardError
|
7
|
-
|
7
|
+
class Fault < StandardError
|
8
|
+
attr_reader :fault
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
def initialize msg, fault
|
11
|
+
super "#{fault.class.wsdl_name}: #{msg}"
|
12
|
+
@fault = fault
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
15
|
+
def method_missing *a
|
16
|
+
@fault.send(*a)
|
17
|
+
end
|
16
18
|
end
|
17
|
-
end
|
18
19
|
|
19
20
|
end
|
data/lib/rbvmomi/optimist.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
# Copyright (c) 2010-2017 VMware, Inc. All Rights Reserved.
|
2
3
|
# SPDX-License-Identifier: MIT
|
3
4
|
|
@@ -14,59 +15,59 @@ module Optimist
|
|
14
15
|
# Descriptions are of the form:
|
15
16
|
# <key>: <options> <environment variable> (<default>)
|
16
17
|
# @see http://optimist.rubyforge.org/
|
17
|
-
class Parser
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
18
|
+
class Parser
|
19
|
+
# Options used by VIM.connect
|
20
|
+
#
|
21
|
+
# !!!plain
|
22
|
+
# host: -o --host RBVMOMI_HOST
|
23
|
+
# port: --port RBVMOMI_PORT (443)
|
24
|
+
# no-ssl: --no-ssl RBVMOMI_SSL (false)
|
25
|
+
# insecure: -k --insecure RBVMOMI_INSECURE (false)
|
26
|
+
# user: -u --user RBVMOMI_USER (root)
|
27
|
+
# password: -p --password RBVMOMI_PASSWORD ()
|
28
|
+
# path: --path RBVMOMI_PATH (/sdk)
|
29
|
+
# debug: -d --debug RBVMOMI_DEBUG (false)
|
30
|
+
def rbvmomi_connection_opts
|
31
|
+
opt :host, 'host', type: :string, short: 'o', default: ENV['RBVMOMI_HOST']
|
32
|
+
opt :port, 'port', type: :int, short: :none, default: (ENV.member?('RBVMOMI_PORT') ? ENV['RBVMOMI_PORT'].to_i : 443)
|
33
|
+
opt :"no-ssl", "don't use ssl", short: :none, default: (ENV['RBVMOMI_SSL'] == '0')
|
34
|
+
opt :insecure, "don't verify ssl certificate", short: 'k', default: (ENV['RBVMOMI_INSECURE'] == '1')
|
35
|
+
opt :user, 'username', short: 'u', default: (ENV['RBVMOMI_USER'] || 'root')
|
36
|
+
opt :password, 'password', short: 'p', default: (ENV['RBVMOMI_PASSWORD'] || '')
|
37
|
+
opt :path, 'SOAP endpoint path', short: :none, default: (ENV['RBVMOMI_PATH'] || '/sdk')
|
38
|
+
opt :debug, 'Log SOAP messages', short: 'd', default: (ENV['RBVMOMI_DEBUG'] || false)
|
39
|
+
end
|
39
40
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
41
|
+
# Select a datacenter
|
42
|
+
#
|
43
|
+
# !!!plain
|
44
|
+
# datacenter: -D --datacenter RBVMOMI_DATACENTER (ha-datacenter)
|
45
|
+
def rbvmomi_datacenter_opt
|
46
|
+
opt :datacenter, 'datacenter', type: :string, short: 'D', default: (ENV['RBVMOMI_DATACENTER'] || 'ha-datacenter')
|
47
|
+
end
|
47
48
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
49
|
+
# Select a folder
|
50
|
+
#
|
51
|
+
# !!!plain
|
52
|
+
# folder: -F --folder RBVMOMI_FOLDER ()
|
53
|
+
def rbvmomi_folder_opt
|
54
|
+
opt :folder, 'VM folder', type: :string, short: 'F', default: (ENV['RBVMOMI_FOLDER'] || '')
|
55
|
+
end
|
55
56
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
57
|
+
# Select a compute resource
|
58
|
+
#
|
59
|
+
# !!!plain
|
60
|
+
# computer: -R --computer RBVMOMI_COMPUTER
|
61
|
+
def rbvmomi_computer_opt
|
62
|
+
opt :computer, 'Compute resource', type: :string, short: 'R', default: (ENV['RBVMOMI_COMPUTER']||'ha-compute-res')
|
63
|
+
end
|
63
64
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
65
|
+
# Select a datastore
|
66
|
+
#
|
67
|
+
# !!!plain
|
68
|
+
# datastore: -s --datastore RBVMOMI_DATASTORE (datastore1)
|
69
|
+
def rbvmomi_datastore_opt
|
70
|
+
opt :datastore, 'Datastore', short: 's', default: (ENV['RBVMOMI_DATASTORE'] || 'datastore1')
|
71
|
+
end
|
70
72
|
end
|
71
73
|
end
|
72
|
-
end
|