vagrant-rbvmomi 1.8.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 +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
@@ -0,0 +1,76 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'trollop'
|
3
|
+
require 'rbvmomi'
|
4
|
+
require 'rbvmomi/trollop'
|
5
|
+
|
6
|
+
VIM = RbVmomi::VIM
|
7
|
+
CMDS = %w(get set)
|
8
|
+
BEHAVIOR = %w(fullyAutomated manual partiallyAutomated default)
|
9
|
+
|
10
|
+
opts = Trollop.options do
|
11
|
+
banner <<-EOS
|
12
|
+
Configure VM DRS behavior.
|
13
|
+
|
14
|
+
Usage:
|
15
|
+
vm_drs_behavior.rb [options] VM get
|
16
|
+
vm_drs_behavior.rb [options] VM set #{BEHAVIOR.join('|')}
|
17
|
+
|
18
|
+
Commands: #{CMDS * ' '}
|
19
|
+
|
20
|
+
VIM connection options:
|
21
|
+
EOS
|
22
|
+
|
23
|
+
rbvmomi_connection_opts
|
24
|
+
|
25
|
+
text <<-EOS
|
26
|
+
|
27
|
+
VM location options:
|
28
|
+
EOS
|
29
|
+
|
30
|
+
rbvmomi_datacenter_opt
|
31
|
+
|
32
|
+
text <<-EOS
|
33
|
+
|
34
|
+
Other options:
|
35
|
+
EOS
|
36
|
+
|
37
|
+
stop_on CMDS
|
38
|
+
end
|
39
|
+
|
40
|
+
Trollop.die("must specify host") unless opts[:host]
|
41
|
+
|
42
|
+
vm_name = ARGV[0] or Trollop.die("no VM name given")
|
43
|
+
cmd = ARGV[1] or Trollop.die("no command given")
|
44
|
+
abort "invalid command" unless CMDS.member? cmd
|
45
|
+
|
46
|
+
vim = VIM.connect opts
|
47
|
+
dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
|
48
|
+
vm = dc.find_vm(vm_name) or abort "VM not found"
|
49
|
+
|
50
|
+
cluster = vm.runtime.host.parent
|
51
|
+
config = cluster.configurationEx.drsVmConfig.select {|c| c.key.name == vm.name }.first
|
52
|
+
default = cluster.configurationEx.drsConfig.defaultVmBehavior
|
53
|
+
|
54
|
+
case cmd
|
55
|
+
when 'get'
|
56
|
+
if config
|
57
|
+
behavior = config.behavior
|
58
|
+
else
|
59
|
+
behavior = "#{default} (default)"
|
60
|
+
end
|
61
|
+
puts "#{vm.name} is #{behavior}"
|
62
|
+
when 'set'
|
63
|
+
behavior = ARGV[2] or Trollop.die("no behavior given")
|
64
|
+
abort "invalid behavior" unless BEHAVIOR.member? behavior
|
65
|
+
|
66
|
+
if behavior == "default"
|
67
|
+
behavior = default
|
68
|
+
end
|
69
|
+
vm_spec =
|
70
|
+
VIM.ClusterDrsVmConfigSpec(:operation => VIM.ArrayUpdateOperation(config ? "edit" : "add"),
|
71
|
+
:info => VIM.ClusterDrsVmConfigInfo(:key => vm,
|
72
|
+
:behavior => VIM.DrsBehavior(behavior)))
|
73
|
+
spec = VIM.ClusterConfigSpecEx(:drsVmConfigSpec => [vm_spec])
|
74
|
+
cluster.ReconfigureComputeResource_Task(:spec => spec, :modify => true).wait_for_completion
|
75
|
+
end
|
76
|
+
|
data/lib/rbvmomi.rb
ADDED
@@ -0,0 +1,375 @@
|
|
1
|
+
# Copyright (c) 2010 VMware, Inc. All Rights Reserved.
|
2
|
+
require 'pp'
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
module RbVmomi
|
6
|
+
module BasicTypes
|
7
|
+
|
8
|
+
BUILTIN = Set.new %w(ManagedObject DataObject TypeName PropertyPath ManagedObjectReference MethodName MethodFault LocalizedMethodFault KeyValue)
|
9
|
+
|
10
|
+
class Base
|
11
|
+
class << self
|
12
|
+
attr_accessor :wsdl_name
|
13
|
+
|
14
|
+
def init wsdl_name=self.name
|
15
|
+
@wsdl_name = wsdl_name
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
@wsdl_name
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
init
|
24
|
+
end
|
25
|
+
|
26
|
+
class ObjectWithProperties < Base
|
27
|
+
class << self
|
28
|
+
attr_accessor :props_desc
|
29
|
+
|
30
|
+
def init name=self.name, props=[]
|
31
|
+
super name
|
32
|
+
@props_desc = props
|
33
|
+
@props_desc.each do |d|
|
34
|
+
sym = d['name'].to_sym
|
35
|
+
define_method(sym) { _get_property sym }
|
36
|
+
define_method(:"#{sym}=") { |x| _set_property sym, x }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def full_props_set
|
41
|
+
@full_props_set ||= Set.new(full_props_desc.map { |x| x['name'] })
|
42
|
+
end
|
43
|
+
|
44
|
+
def full_props_desc
|
45
|
+
@full_props_desc ||= (self == ObjectWithProperties ? [] : superclass.full_props_desc) + props_desc
|
46
|
+
end
|
47
|
+
|
48
|
+
def find_prop_desc name
|
49
|
+
full_props_desc.find { |x| x['name'] == name.to_s }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def _get_property sym
|
54
|
+
fail 'unimplemented'
|
55
|
+
end
|
56
|
+
|
57
|
+
def _set_property sym, val
|
58
|
+
fail 'unimplemented'
|
59
|
+
end
|
60
|
+
|
61
|
+
init
|
62
|
+
end
|
63
|
+
|
64
|
+
class ObjectWithMethods < ObjectWithProperties
|
65
|
+
class << self
|
66
|
+
attr_accessor :methods_desc
|
67
|
+
|
68
|
+
def init name=self.name, props=[], methods={}
|
69
|
+
super name, props
|
70
|
+
@methods_desc = methods
|
71
|
+
|
72
|
+
@methods_desc.each do |k,d|
|
73
|
+
sym = k.to_sym
|
74
|
+
define_method(sym) { |*args| _call sym, *args }
|
75
|
+
define_method(:"#{sym}!") { |*args| _call sym, *args }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# XXX cache
|
80
|
+
def full_methods_desc
|
81
|
+
(self == ObjectWithMethods ? {} : superclass.full_methods_desc).merge methods_desc
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
init
|
86
|
+
end
|
87
|
+
|
88
|
+
class DataObject < ObjectWithProperties
|
89
|
+
attr_reader :props
|
90
|
+
|
91
|
+
def self.kind; :data end
|
92
|
+
|
93
|
+
def initialize props={}
|
94
|
+
# Deserialization fast path
|
95
|
+
if props == nil
|
96
|
+
@props = {}
|
97
|
+
return
|
98
|
+
end
|
99
|
+
|
100
|
+
@props = Hash[props.map { |k,v| [k.to_sym, v] }]
|
101
|
+
#self.class.full_props_desc.each do |desc|
|
102
|
+
#fail "missing required property #{desc['name'].inspect} of #{self.class.wsdl_name}" if @props[desc['name'].to_sym].nil? and not desc['is-optional']
|
103
|
+
#end
|
104
|
+
@props.each do |k,v|
|
105
|
+
fail "unexpected property name #{k}" unless self.class.find_prop_desc(k)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def initialize_copy(source)
|
110
|
+
super
|
111
|
+
@props = @props.dup
|
112
|
+
end
|
113
|
+
|
114
|
+
def _get_property sym
|
115
|
+
@props[sym]
|
116
|
+
end
|
117
|
+
|
118
|
+
def [] sym
|
119
|
+
_get_property sym
|
120
|
+
end
|
121
|
+
|
122
|
+
def _set_property sym, val
|
123
|
+
@props[sym] = val
|
124
|
+
end
|
125
|
+
|
126
|
+
def []= sym, val
|
127
|
+
_set_property sym, val
|
128
|
+
end
|
129
|
+
|
130
|
+
def == o
|
131
|
+
return false unless o.class == self.class
|
132
|
+
keys = (props.keys + o.props.keys).uniq
|
133
|
+
keys.all? { |k| props[k] == o.props[k] }
|
134
|
+
end
|
135
|
+
|
136
|
+
alias eql? ==
|
137
|
+
|
138
|
+
def hash
|
139
|
+
props.hash
|
140
|
+
end
|
141
|
+
|
142
|
+
def pretty_print q
|
143
|
+
q.text self.class.wsdl_name
|
144
|
+
q.group 2 do
|
145
|
+
q.text '('
|
146
|
+
q.breakable
|
147
|
+
props = @props.sort_by { |k,v| k.to_s }
|
148
|
+
q.seplist props, nil, :each do |e|
|
149
|
+
k, v = e
|
150
|
+
q.group do
|
151
|
+
q.text k.to_s
|
152
|
+
q.text ': '
|
153
|
+
q.pp v
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
157
|
+
q.breakable
|
158
|
+
q.text ')'
|
159
|
+
end
|
160
|
+
|
161
|
+
init
|
162
|
+
end
|
163
|
+
|
164
|
+
class ManagedObject < ObjectWithMethods
|
165
|
+
def self.kind; :managed end
|
166
|
+
|
167
|
+
def initialize connection, ref
|
168
|
+
super()
|
169
|
+
@connection = connection
|
170
|
+
@soap = @connection # XXX deprecated
|
171
|
+
@ref = ref
|
172
|
+
end
|
173
|
+
|
174
|
+
def _connection
|
175
|
+
@connection
|
176
|
+
end
|
177
|
+
|
178
|
+
def _ref
|
179
|
+
@ref
|
180
|
+
end
|
181
|
+
|
182
|
+
def _get_property sym
|
183
|
+
ret = @connection.propertyCollector.RetrieveProperties(:specSet => [{
|
184
|
+
:propSet => [{ :type => self.class.wsdl_name, :pathSet => [sym.to_s] }],
|
185
|
+
:objectSet => [{ :obj => self }],
|
186
|
+
}])[0]
|
187
|
+
|
188
|
+
if !ret
|
189
|
+
return nil
|
190
|
+
elsif ret.propSet.empty?
|
191
|
+
return nil if ret.missingSet.empty?
|
192
|
+
raise ret.missingSet[0].fault
|
193
|
+
else
|
194
|
+
ret.propSet[0].val
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def _set_property sym, val
|
199
|
+
fail 'unimplemented'
|
200
|
+
end
|
201
|
+
|
202
|
+
def _call method, o={}
|
203
|
+
fail "parameters must be passed as a hash" unless o.is_a? Hash
|
204
|
+
desc = self.class.full_methods_desc[method.to_s] or fail "unknown method"
|
205
|
+
@connection.call method, desc, self, o
|
206
|
+
end
|
207
|
+
|
208
|
+
def to_s
|
209
|
+
"#{self.class.wsdl_name}(#{@ref.inspect})"
|
210
|
+
end
|
211
|
+
|
212
|
+
def pretty_print pp
|
213
|
+
pp.text to_s
|
214
|
+
end
|
215
|
+
|
216
|
+
def [] k
|
217
|
+
_get_property k
|
218
|
+
end
|
219
|
+
|
220
|
+
def == x
|
221
|
+
out = (x.class == self.class && x._ref == @ref)
|
222
|
+
out = (x._connection.instanceUuid == self._connection.instanceUuid) if out && x._connection.host
|
223
|
+
out
|
224
|
+
end
|
225
|
+
|
226
|
+
alias eql? ==
|
227
|
+
|
228
|
+
def hash
|
229
|
+
[self.class, @ref].hash
|
230
|
+
end
|
231
|
+
|
232
|
+
init 'ManagedObject'
|
233
|
+
end
|
234
|
+
|
235
|
+
class Enum < Base
|
236
|
+
class << self
|
237
|
+
attr_accessor :values
|
238
|
+
|
239
|
+
def init name=self.name, values=[]
|
240
|
+
super name
|
241
|
+
@values = values
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def self.kind; :enum end
|
246
|
+
|
247
|
+
attr_reader :value
|
248
|
+
|
249
|
+
def initialize value
|
250
|
+
@value = value
|
251
|
+
end
|
252
|
+
|
253
|
+
init
|
254
|
+
end
|
255
|
+
|
256
|
+
class MethodFault < DataObject
|
257
|
+
init 'MethodFault', [
|
258
|
+
{
|
259
|
+
'name' => 'faultCause',
|
260
|
+
'wsdl_type' => 'LocalizedMethodFault',
|
261
|
+
'is-array' => false,
|
262
|
+
'is-optional' => true,
|
263
|
+
}, {
|
264
|
+
'name' => 'faultMessage',
|
265
|
+
'wsdl_type' => 'LocalizableMessage',
|
266
|
+
'is-array' => true,
|
267
|
+
'is-optional' => true,
|
268
|
+
},
|
269
|
+
]
|
270
|
+
|
271
|
+
def self.=== exn
|
272
|
+
exn.class == RbVmomi::Fault and self <= exn.fault.class
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
276
|
+
class LocalizedMethodFault < DataObject
|
277
|
+
init 'LocalizedMethodFault', [
|
278
|
+
{
|
279
|
+
'name' => 'fault',
|
280
|
+
'wsdl_type' => 'MethodFault',
|
281
|
+
'is-array' => false,
|
282
|
+
'is-optional' => false,
|
283
|
+
}, {
|
284
|
+
'name' => 'localizedMessage',
|
285
|
+
'wsdl_type' => 'xsd:string',
|
286
|
+
'is-array' => false,
|
287
|
+
'is-optional' => true,
|
288
|
+
},
|
289
|
+
]
|
290
|
+
|
291
|
+
def exception
|
292
|
+
RbVmomi::Fault.new(self.localizedMessage, self.fault)
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
class RuntimeFault < MethodFault
|
297
|
+
init
|
298
|
+
end
|
299
|
+
|
300
|
+
class MethodName < String
|
301
|
+
def self.wsdl_name; 'MethodName' end
|
302
|
+
end
|
303
|
+
|
304
|
+
class PropertyPath < String
|
305
|
+
def self.wsdl_name; 'PropertyPath' end
|
306
|
+
end
|
307
|
+
|
308
|
+
class TypeName < String
|
309
|
+
def self.wsdl_name; 'TypeName' end
|
310
|
+
end
|
311
|
+
|
312
|
+
class ManagedObjectReference
|
313
|
+
def self.wsdl_name; 'ManagedObjectReference' end
|
314
|
+
end
|
315
|
+
|
316
|
+
class Boolean
|
317
|
+
def self.wsdl_name; 'xsd:boolean' end
|
318
|
+
end
|
319
|
+
|
320
|
+
class AnyType
|
321
|
+
def self.wsdl_name; 'xsd:anyType' end
|
322
|
+
end
|
323
|
+
|
324
|
+
class Binary
|
325
|
+
def self.wsdl_name; 'xsd:base64Binary' end
|
326
|
+
end
|
327
|
+
|
328
|
+
class ::Class
|
329
|
+
def wsdl_name; self.class.name end
|
330
|
+
end
|
331
|
+
|
332
|
+
class ::String
|
333
|
+
def self.wsdl_name; 'xsd:string' end
|
334
|
+
end
|
335
|
+
|
336
|
+
class ::Integer
|
337
|
+
def self.wsdl_name; 'xsd:int' end
|
338
|
+
end
|
339
|
+
|
340
|
+
class ::Float
|
341
|
+
def self.wsdl_name; 'xsd:float' end
|
342
|
+
end
|
343
|
+
|
344
|
+
class Int
|
345
|
+
def self.wsdl_name; 'xsd:int' end
|
346
|
+
|
347
|
+
def initialize x
|
348
|
+
@val = x
|
349
|
+
end
|
350
|
+
|
351
|
+
def to_s
|
352
|
+
@val.to_s
|
353
|
+
end
|
354
|
+
end
|
355
|
+
|
356
|
+
class KeyValue
|
357
|
+
def self.wsdl_name; 'KeyValue' end
|
358
|
+
attr_accessor :key, :value
|
359
|
+
|
360
|
+
def initialize k, v
|
361
|
+
@key = k
|
362
|
+
@value = v
|
363
|
+
end
|
364
|
+
|
365
|
+
def [] i
|
366
|
+
if i == 0 then @key
|
367
|
+
elsif i == 1 then @value
|
368
|
+
else fail "invalid index #{i.inspect}"
|
369
|
+
end
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
|
374
|
+
end
|
375
|
+
end
|