rbvmomi2 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +114 -0
  4. data/exe/rbvmomish +138 -0
  5. data/lib/rbvmomi/basic_types.rb +383 -0
  6. data/lib/rbvmomi/connection.rb +272 -0
  7. data/lib/rbvmomi/deserialization.rb +249 -0
  8. data/lib/rbvmomi/fault.rb +19 -0
  9. data/lib/rbvmomi/optimist.rb +72 -0
  10. data/lib/rbvmomi/pbm.rb +68 -0
  11. data/lib/rbvmomi/sms/SmsStorageManager.rb +10 -0
  12. data/lib/rbvmomi/sms.rb +63 -0
  13. data/lib/rbvmomi/sso.rb +313 -0
  14. data/lib/rbvmomi/trivial_soap.rb +122 -0
  15. data/lib/rbvmomi/type_loader.rb +138 -0
  16. data/lib/rbvmomi/utils/admission_control.rb +401 -0
  17. data/lib/rbvmomi/utils/deploy.rb +318 -0
  18. data/lib/rbvmomi/utils/leases.rb +145 -0
  19. data/lib/rbvmomi/utils/perfdump.rb +631 -0
  20. data/lib/rbvmomi/version.rb +6 -0
  21. data/lib/rbvmomi/vim/ComputeResource.rb +54 -0
  22. data/lib/rbvmomi/vim/Datacenter.rb +25 -0
  23. data/lib/rbvmomi/vim/Datastore.rb +72 -0
  24. data/lib/rbvmomi/vim/DynamicTypeMgrAllTypeInfo.rb +78 -0
  25. data/lib/rbvmomi/vim/DynamicTypeMgrDataTypeInfo.rb +23 -0
  26. data/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb +54 -0
  27. data/lib/rbvmomi/vim/Folder.rb +214 -0
  28. data/lib/rbvmomi/vim/HostSystem.rb +177 -0
  29. data/lib/rbvmomi/vim/ManagedEntity.rb +60 -0
  30. data/lib/rbvmomi/vim/ManagedObject.rb +63 -0
  31. data/lib/rbvmomi/vim/ObjectContent.rb +26 -0
  32. data/lib/rbvmomi/vim/ObjectUpdate.rb +26 -0
  33. data/lib/rbvmomi/vim/OvfManager.rb +204 -0
  34. data/lib/rbvmomi/vim/PerfCounterInfo.rb +28 -0
  35. data/lib/rbvmomi/vim/PerformanceManager.rb +113 -0
  36. data/lib/rbvmomi/vim/PropertyCollector.rb +28 -0
  37. data/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb +33 -0
  38. data/lib/rbvmomi/vim/ResourcePool.rb +58 -0
  39. data/lib/rbvmomi/vim/ServiceInstance.rb +58 -0
  40. data/lib/rbvmomi/vim/Task.rb +68 -0
  41. data/lib/rbvmomi/vim/VirtualMachine.rb +75 -0
  42. data/lib/rbvmomi/vim.rb +157 -0
  43. data/lib/rbvmomi.rb +16 -0
  44. data/lib/rbvmomi2.rb +3 -0
  45. data/vmodl.db +0 -0
  46. metadata +214 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: a9290a6ccd179ef5e0dddb1d0956a1ba976a368ceb1534b44b13024fbe7a2fb5
4
+ data.tar.gz: 2cb20596b8f3cef9db32468e2f110f3abdcef70235a466efe81726259a650ea7
5
+ SHA512:
6
+ metadata.gz: 8238c2c399f04f57930ac7bb2437de3eb2abc16723700366a6c57c97076f9043e342393bca69cc511ebe1fe91d9df354149144cff04f859c8178471fe5644381
7
+ data.tar.gz: ed586f8b93ded01b4ade32d1c4e95b1e349c94584084db14e83a6433b011e0c70f85a6df7674ac4228e1bc4d7d94814ba91bb0d2cb55f84bcfd828dc6fc802bf
data/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ Copyright (c) 2010-2017 VMware, Inc. All Rights Reserved.
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to deal
5
+ in the Software without restriction, including without limitation the rights
6
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,114 @@
1
+ # RbVmomi
2
+
3
+ [<img src="https://badge.fury.io/rb/rbvmomi.svg" alt="gem-version">](https://rubygems.org/gems/rbvmomi)
4
+ [<img src="https://travis-ci.org/vmware/rbvmomi.svg?branch=master" alt="travis-ci">](http://travis-ci.org/vmware/rbvmomi)
5
+ [<img src="https://badges.gitter.im/vmware/rbvmomi.svg">](https://gitter.im/vmware/rbvmomi)
6
+
7
+ This is a community-supported, open source project at VMware. It is built and
8
+ maintained by programmers like you!
9
+
10
+ ## Introduction
11
+
12
+ RbVmomi is a Ruby interface to the vSphere API. Like the Perl and Java SDKs,
13
+ you can use it to manage ESX and vCenter servers. The current release
14
+ supports the vSphere 6.5 API. RbVmomi specific documentation is
15
+ [online](http://rdoc.info/github/vmware/rbvmomi/master/frames) and is meant to
16
+ be used alongside the official [documentation](http://pubs.vmware.com/vsphere-65/index.jsp#com.vmware.wssdk.apiref.doc/right-pane.html).
17
+
18
+ ## Installation
19
+
20
+ gem install rbvmomi
21
+
22
+ ### Support for older Ruby versions
23
+
24
+ RbVmomi supports Ruby 1.8.7 and higher, but certain dependencies may need
25
+ pinning to older versions to get a compatible set of gems.
26
+
27
+ On Ruby 1.8.7:
28
+
29
+ * use `nokogiri` 1.5.x (Gemfile: `gem 'nokogiri', '< 1.6'`)
30
+
31
+
32
+ On both Ruby 1.9 and 1.8.7:
33
+
34
+ * use `json` 1.x (Gemfile: `gem 'json', '< 2'`)
35
+
36
+
37
+ ## Usage
38
+
39
+ A simple example of turning on a VM:
40
+
41
+ ```ruby
42
+ require 'rbvmomi'
43
+
44
+ vim = RbVmomi::VIM.connect(host: 'foo', user: 'bar', password: 'baz')
45
+ dc = vim.serviceInstance.find_datacenter('my_datacenter') || fail('datacenter not found')
46
+ vm = dc.find_vm('my_vm') || fail('VM not found')
47
+ vm.PowerOnVM_Task.wait_for_completion
48
+ ```
49
+
50
+ This code uses several RbVmomi extensions to the vSphere API for concision.
51
+ The expanded snippet below uses only standard API calls and should be familiar
52
+ to users of the Java SDK:
53
+
54
+ ```ruby
55
+ require 'rbvmomi'
56
+
57
+ vim = RbVmomi::VIM.connect(host: 'foo', user: 'bar', password: 'baz')
58
+ root_folder = vim.serviceInstance.content.rootFolder
59
+ dc = root_folder.childEntity.grep(RbVmomi::VIM::Datacenter).find { |x| x.name == 'mydatacenter' } || fail('datacenter not found')
60
+ vm = dc.vmFolder.childEntity.grep(RbVmomi::VIM::VirtualMachine).find { |x| x.name == 'my_vm' } || fail('VM not found')
61
+ task = vm.PowerOnVM_Task
62
+ filter = vim.propertyCollector.CreateFilter(
63
+ spec: {
64
+ propSet: [{ type: 'Task', all: false, pathSet: ['info.state']}],
65
+ objectSet: [{ obj: task }]
66
+ },
67
+ partialUpdates: false
68
+ )
69
+ ver = ''
70
+ loop do
71
+ result = vim.propertyCollector.WaitForUpdates(version: ver)
72
+ ver = result.version
73
+ break if ['success', 'error'].member?(task.info.state)
74
+ end
75
+ filter.DestroyPropertyFilter
76
+ raise(task.info.error) if task.info.state == 'error'
77
+ ```
78
+
79
+ As you can see, the extensions RbVmomi adds can dramatically decrease the code
80
+ needed to perform simple tasks while still letting you use the full power of
81
+ the API when necessary. RbVmomi extensions are often more efficient than a
82
+ naive implementation; for example, the find_vm method on VIM::Datacenter used
83
+ in the first example uses the SearchIndex for fast lookups.
84
+
85
+ A few important points:
86
+
87
+ * All class, method, parameter, and property names match the official [documentation](http://pubs.vmware.com/vsphere-65/index.jsp#com.vmware.wssdk.apiref.doc/right-pane.html).
88
+ * Properties are exposed as accessor methods.
89
+ * Data object types can usually be inferred from context, so you may use a hash instead.
90
+ * Enumeration values are simply strings.
91
+ * Example code is included in the examples/ directory.
92
+ * A set of helper methods for Optimist is included to speed up development of
93
+ command line apps. See the included examples for usage.
94
+ * If you don't have trusted SSL certificates installed on the host you're
95
+ connecting to, you'll get an `OpenSSL::SSL::SSLError` "certificate verify
96
+ failed". You can work around this by using the `:insecure` option to
97
+ `RbVmomi::VIM.connect`.
98
+ * This is a side project of a VMware employee and is entirely unsupported by
99
+ VMware.
100
+
101
+
102
+ Built-in extensions are under `lib/rbvmomi/vim/`. You are encouraged to reopen
103
+ VIM classes in your applications and add extensions of your own. If you write
104
+ something generally useful please open a [pull request](https://github.com/vmware/rbvmomi/pulls) so it can be merged back in
105
+
106
+ ## Development
107
+
108
+ Open an issue on the [issues page](https://github.com/vmware/rbvmomi/issues)
109
+ or fork the project on [GitHub](https://github.com/vmware/rbvmomi) and send a
110
+ [pull request](https://github.com/vmware/rbvmomi/pulls).
111
+
112
+ ## Support
113
+
114
+ You can chat on [Gitter](https://gitter.im/vmware/rbvmomi) or join the [VMware {code} Slack team](https://vmwarecode.slack.com/) and join the [#rbvmomi channel](https://vmwarecode.slack.com/messages/rbvmomi).
data/exe/rbvmomish ADDED
@@ -0,0 +1,138 @@
1
+ #!/usr/bin/env ruby
2
+ # TODO keepalive
3
+ # TODO rc file
4
+ # TODO proxy support?
5
+ require 'optimist'
6
+ require 'readline'
7
+ require 'rbvmomi'
8
+ require 'rbvmomi/optimist'
9
+
10
+ VIM = RbVmomi::VIM
11
+
12
+ opts = Optimist.options do
13
+ banner <<-EOS
14
+ vSphere API console.
15
+
16
+ Usage:
17
+ rbvmomish [options]
18
+
19
+ Predefined methods:
20
+ conn: Returns the VIM connection
21
+ si: Returns the ServiceInstance
22
+ help: Displays this text.
23
+
24
+ Special syntax:
25
+ Adding a '#' suffix to an expression displays information about the type of the
26
+ result, including its properties and methods, instead of the value.
27
+
28
+ VIM connection options:
29
+ EOS
30
+
31
+ rbvmomi_connection_opts
32
+
33
+ text <<-EOS
34
+
35
+ Other options:
36
+ EOS
37
+
38
+ $optimist = self
39
+ end
40
+
41
+ begin
42
+ $vim = VIM.connect opts
43
+ rescue Errno::EHOSTUNREACH
44
+ abort $!.message
45
+ end
46
+
47
+ typenames = VIM.loader.typenames
48
+ Readline.completion_append_character = " "
49
+ Readline.completion_proc = lambda do |word|
50
+ return unless word
51
+ prefix_regex = /^#{Regexp.escape(word)}/
52
+ candidates = typenames.sort
53
+ candidates.find_all { |e| e.match(prefix_regex) }
54
+ end
55
+
56
+ history_fn = "#{ENV['HOME']}/.rbvmomish-history"
57
+ IO.foreach(history_fn) { |l| Readline::HISTORY << l.chomp } rescue nil
58
+ history = File.open(history_fn, 'a')
59
+
60
+ def type name
61
+ klass = VIM.type(name) rescue err("invalid type #{name.inspect}")
62
+ q = lambda { |x| x =~ /^xsd:/ ? $' : x }
63
+ if klass < VIM::DataObject
64
+ puts "Data Object #{klass}"
65
+ klass.full_props_desc.each do |desc|
66
+ puts " #{desc['name']}: #{q[desc['wsdl_type']]}#{desc['is-array'] ? '[]' : ''}"
67
+ end
68
+ elsif klass < VIM::ManagedObject
69
+ puts "Managed Object #{klass}"
70
+ puts
71
+ puts "Properties:"
72
+ klass.full_props_desc.each do |desc|
73
+ puts " #{desc['name']}: #{q[desc['wsdl_type']]}#{desc['is-array'] ? '[]' : ''}"
74
+ end
75
+ puts
76
+ puts "Methods:"
77
+ klass.full_methods_desc.sort_by(&:first).each do |name,desc|
78
+ params = desc['params']
79
+ puts " #{name}(#{params.map { |x| "#{x['name']} : #{q[x['wsdl_type'] || 'void']}#{x['is-array'] ? '[]' : ''}" } * ', '}) : #{q[desc['result']['wsdl_type'] || 'void']}"
80
+ end
81
+ else
82
+ err("cannot introspect type #{klass}")
83
+ end
84
+ nil
85
+ end
86
+
87
+ class UserError < RuntimeError; end
88
+ def err msg
89
+ raise UserError.new(msg)
90
+ end
91
+
92
+ def cookie str
93
+ $vim.cookie = str
94
+ end
95
+
96
+ def conn
97
+ $vim
98
+ end
99
+
100
+ def si
101
+ $vim.serviceInstance
102
+ end
103
+
104
+ def help
105
+ $optimist.educate
106
+ :no_result
107
+ end
108
+
109
+ $binding = $vim.instance_eval { binding }
110
+
111
+ loop do
112
+ begin
113
+ input = Readline.readline("#{opts[:host]}> ", false) or break
114
+ input = input.strip
115
+ next if input.empty?
116
+
117
+ (history.puts input; Readline::HISTORY << input) unless input == Readline::HISTORY.to_a[-1]
118
+
119
+ result = eval(input, $binding)
120
+ if input =~ /\#$/
121
+ type result.class.wsdl_name
122
+ else
123
+ pp result unless result == :no_result
124
+ end
125
+ rescue SystemExit, IOError
126
+ raise
127
+ rescue RuntimeError, RbVmomi::Fault
128
+ puts "#{$!.class}: #{$!.message}"
129
+ puts $!.backtrace * "\n"
130
+ rescue UserError
131
+ puts $!.message
132
+ rescue Interrupt
133
+ puts
134
+ rescue Exception
135
+ puts "#{$!.class}: #{$!.message}"
136
+ puts $!.backtrace * "\n"
137
+ end
138
+ end
@@ -0,0 +1,383 @@
1
+ # Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
2
+ # SPDX-License-Identifier: MIT
3
+
4
+ require 'pp'
5
+ require 'set'
6
+
7
+ module RbVmomi
8
+ module BasicTypes
9
+
10
+ BUILTIN = Set.new %w(ManagedObject DataObject TypeName PropertyPath ManagedObjectReference MethodName MethodFault LocalizedMethodFault KeyValue)
11
+
12
+ class Base
13
+ class << self
14
+ attr_accessor :wsdl_name
15
+
16
+ def init wsdl_name=self.name
17
+ @wsdl_name = wsdl_name
18
+ end
19
+
20
+ def to_s
21
+ @wsdl_name
22
+ end
23
+ end
24
+
25
+ init
26
+ end
27
+
28
+ class ObjectWithProperties < Base
29
+ class << self
30
+ attr_accessor :props_desc
31
+
32
+ def init name=self.name, props=[]
33
+ super name
34
+ @props_desc = props
35
+ @props_desc.each do |d|
36
+ sym = d['name'].to_sym
37
+ define_method(sym) { _get_property sym }
38
+ define_method(:"#{sym}=") { |x| _set_property sym, x }
39
+ end
40
+ end
41
+
42
+ def full_props_set
43
+ @full_props_set ||= Set.new(full_props_desc.map { |x| x['name'] })
44
+ end
45
+
46
+ def full_props_desc
47
+ @full_props_desc ||= (self == ObjectWithProperties ? [] : superclass.full_props_desc) + props_desc
48
+ end
49
+
50
+ def find_prop_desc name
51
+ full_props_desc.find { |x| x['name'] == name.to_s }
52
+ end
53
+ end
54
+
55
+ def _get_property sym
56
+ fail 'unimplemented'
57
+ end
58
+
59
+ def _set_property sym, val
60
+ fail 'unimplemented'
61
+ end
62
+
63
+ init
64
+ end
65
+
66
+ class ObjectWithMethods < ObjectWithProperties
67
+ class << self
68
+ attr_accessor :methods_desc
69
+
70
+ def init name=self.name, props=[], methods={}
71
+ super name, props
72
+ @methods_desc = methods
73
+
74
+ @methods_desc.each do |k,d|
75
+ sym = k.to_sym
76
+ define_method(sym) { |*args| _call sym, *args }
77
+ define_method(:"#{sym}!") { |*args| _call sym, *args }
78
+ end
79
+ end
80
+
81
+ # XXX cache
82
+ def full_methods_desc
83
+ (self == ObjectWithMethods ? {} : superclass.full_methods_desc).merge methods_desc
84
+ end
85
+ end
86
+
87
+ init
88
+ end
89
+
90
+ class DataObject < ObjectWithProperties
91
+ attr_reader :props
92
+
93
+ def self.kind; :data end
94
+
95
+ def initialize props={}
96
+ # Deserialization fast path
97
+ if props == nil
98
+ @props = {}
99
+ return
100
+ end
101
+
102
+ @props = Hash[props.map { |k,v| [k.to_sym, v] }]
103
+ #self.class.full_props_desc.each do |desc|
104
+ #fail "missing required property #{desc['name'].inspect} of #{self.class.wsdl_name}" if @props[desc['name'].to_sym].nil? and not desc['is-optional']
105
+ #end
106
+ @props.each do |k,v|
107
+ fail "unexpected property name #{k}" unless self.class.find_prop_desc(k)
108
+ end
109
+ end
110
+
111
+ def initialize_copy(source)
112
+ super
113
+ @props = @props.dup
114
+ end
115
+
116
+ def _get_property sym
117
+ @props[sym]
118
+ end
119
+
120
+ def [] sym
121
+ _get_property sym
122
+ end
123
+
124
+ def _set_property sym, val
125
+ @props[sym] = val
126
+ end
127
+
128
+ def []= sym, val
129
+ _set_property sym, val
130
+ end
131
+
132
+ def == o
133
+ return false unless o.class == self.class
134
+ keys = (props.keys + o.props.keys).uniq
135
+ keys.all? { |k| props[k] == o.props[k] }
136
+ end
137
+
138
+ alias eql? ==
139
+
140
+ def hash
141
+ props.hash
142
+ end
143
+
144
+ def pretty_print q
145
+ q.text self.class.wsdl_name
146
+ q.group 2 do
147
+ q.text '('
148
+ q.breakable
149
+ props = @props.sort_by { |k,v| k.to_s }
150
+ q.seplist props, nil, :each do |e|
151
+ k, v = e
152
+ q.group do
153
+ q.text k.to_s
154
+ q.text ': '
155
+ q.pp v
156
+ end
157
+ end
158
+ end
159
+ q.breakable
160
+ q.text ')'
161
+ end
162
+
163
+ def to_json(*args)
164
+ h = self.props
165
+ m = h.merge({ JSON.create_id => self.class.name })
166
+ m.to_json(*args)
167
+ end
168
+
169
+ init
170
+ end
171
+
172
+ class ManagedObject < ObjectWithMethods
173
+ def self.kind; :managed end
174
+
175
+ def initialize connection, ref
176
+ super()
177
+ @connection = connection
178
+ @soap = @connection # XXX deprecated
179
+ @ref = ref
180
+ end
181
+
182
+ def _connection
183
+ @connection
184
+ end
185
+
186
+ def _ref
187
+ @ref
188
+ end
189
+
190
+ def _get_property sym
191
+ ret = @connection.propertyCollector.RetrieveProperties(:specSet => [{
192
+ :propSet => [{ :type => self.class.wsdl_name, :pathSet => [sym.to_s] }],
193
+ :objectSet => [{ :obj => self }],
194
+ }])[0]
195
+
196
+ if !ret
197
+ return nil
198
+ elsif ret.propSet.empty?
199
+ return nil if ret.missingSet.empty?
200
+ raise ret.missingSet[0].fault
201
+ else
202
+ ret.propSet[0].val
203
+ end
204
+ end
205
+
206
+ def _set_property sym, val
207
+ fail 'unimplemented'
208
+ end
209
+
210
+ def _call method, o={}
211
+ fail "parameters must be passed as a hash" unless o.is_a? Hash
212
+ desc = self.class.full_methods_desc[method.to_s] or fail "unknown method"
213
+ @connection.call method, desc, self, o
214
+ end
215
+
216
+ def to_s
217
+ "#{self.class.wsdl_name}(#{@ref.inspect})"
218
+ end
219
+
220
+ def pretty_print pp
221
+ pp.text to_s
222
+ end
223
+
224
+ def [] k
225
+ _get_property k
226
+ end
227
+
228
+ def == x
229
+ out = (x.class == self.class && x._ref == @ref)
230
+ out = (x._connection.instanceUuid == self._connection.instanceUuid) if out && x._connection.host
231
+ out
232
+ end
233
+
234
+ alias eql? ==
235
+
236
+ def hash
237
+ [self.class, @ref].hash
238
+ end
239
+
240
+ init 'ManagedObject'
241
+ end
242
+
243
+ class Enum < Base
244
+ class << self
245
+ attr_accessor :values
246
+
247
+ def init name=self.name, values=[]
248
+ super name
249
+ @values = values
250
+ end
251
+ end
252
+
253
+ def self.kind; :enum end
254
+
255
+ attr_reader :value
256
+
257
+ def initialize value
258
+ @value = value
259
+ end
260
+
261
+ init
262
+ end
263
+
264
+ class MethodFault < DataObject
265
+ init 'MethodFault', [
266
+ {
267
+ 'name' => 'faultCause',
268
+ 'wsdl_type' => 'LocalizedMethodFault',
269
+ 'is-array' => false,
270
+ 'is-optional' => true,
271
+ }, {
272
+ 'name' => 'faultMessage',
273
+ 'wsdl_type' => 'LocalizableMessage',
274
+ 'is-array' => true,
275
+ 'is-optional' => true,
276
+ },
277
+ ]
278
+
279
+ def self.=== exn
280
+ exn.class == RbVmomi::Fault and self <= exn.fault.class
281
+ end
282
+ end
283
+
284
+ class LocalizedMethodFault < DataObject
285
+ init 'LocalizedMethodFault', [
286
+ {
287
+ 'name' => 'fault',
288
+ 'wsdl_type' => 'MethodFault',
289
+ 'is-array' => false,
290
+ 'is-optional' => false,
291
+ }, {
292
+ 'name' => 'localizedMessage',
293
+ 'wsdl_type' => 'xsd:string',
294
+ 'is-array' => false,
295
+ 'is-optional' => true,
296
+ },
297
+ ]
298
+
299
+ def exception
300
+ RbVmomi::Fault.new(self.localizedMessage, self.fault)
301
+ end
302
+ end
303
+
304
+ class RuntimeFault < MethodFault
305
+ init
306
+ end
307
+
308
+ class MethodName < String
309
+ def self.wsdl_name; 'MethodName' end
310
+ end
311
+
312
+ class PropertyPath < String
313
+ def self.wsdl_name; 'PropertyPath' end
314
+ end
315
+
316
+ class TypeName < String
317
+ def self.wsdl_name; 'TypeName' end
318
+ end
319
+
320
+ class ManagedObjectReference
321
+ def self.wsdl_name; 'ManagedObjectReference' end
322
+ end
323
+
324
+ class Boolean
325
+ def self.wsdl_name; 'xsd:boolean' end
326
+ end
327
+
328
+ class AnyType
329
+ def self.wsdl_name; 'xsd:anyType' end
330
+ end
331
+
332
+ class Binary
333
+ def self.wsdl_name; 'xsd:base64Binary' end
334
+ end
335
+
336
+ class ::Class
337
+ def wsdl_name; self.class.name end
338
+ end
339
+
340
+ class ::String
341
+ def self.wsdl_name; 'xsd:string' end
342
+ end
343
+
344
+ class ::Integer
345
+ def self.wsdl_name; 'xsd:int' end
346
+ end
347
+
348
+ class ::Float
349
+ def self.wsdl_name; 'xsd:float' end
350
+ end
351
+
352
+ class Int
353
+ def self.wsdl_name; 'xsd:int' end
354
+
355
+ def initialize x
356
+ @val = x
357
+ end
358
+
359
+ def to_s
360
+ @val.to_s
361
+ end
362
+ end
363
+
364
+ class KeyValue
365
+ def self.wsdl_name; 'KeyValue' end
366
+ attr_accessor :key, :value
367
+
368
+ def initialize k, v
369
+ @key = k
370
+ @value = v
371
+ end
372
+
373
+ def [] i
374
+ if i == 0 then @key
375
+ elsif i == 1 then @value
376
+ else fail "invalid index #{i.inspect}"
377
+ end
378
+ end
379
+ end
380
+
381
+
382
+ end
383
+ end