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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8ddba032ab15df68d000f9680429c73fa712f678
|
4
|
+
data.tar.gz: 7b527eeaf0248fb68649da81281943a7c32b71f7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9d0952c8d2bd5ea62c712173b82514849ccc06c9dd412418b46de2d69b70564e21c5b42861697bb24b24f534c940081c0644979bd01961048cb5b9ce3ed63b65
|
7
|
+
data.tar.gz: 9728600a699f9785faff11985866dd89c2bb89ecf00b4f5409ecdf2d486aa1d682da533f7859cb678fdf3679913f1fc7a566408c854317ef90be4779db4c3a06
|
data/.yardopts
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Copyright (c) 2010 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.rdoc
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
= RbVmomi
|
2
|
+
|
3
|
+
== Introduction
|
4
|
+
|
5
|
+
RbVmomi is a Ruby interface to the vSphere API. Like the Perl and Java SDKs,
|
6
|
+
you can use it to manage ESX and VirtualCenter servers. The current release
|
7
|
+
supports the vSphere 5.0 API. RbVmomi specific documentation is
|
8
|
+
online[http://rdoc.info/github/rlane/rbvmomi/master/frames] and is meant to
|
9
|
+
be used alongside the official documentation[http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/index.html].
|
10
|
+
|
11
|
+
== Installation
|
12
|
+
|
13
|
+
gem install rbvmomi
|
14
|
+
|
15
|
+
== Usage
|
16
|
+
|
17
|
+
A simple example of turning on a VM:
|
18
|
+
|
19
|
+
require 'rbvmomi'
|
20
|
+
vim = RbVmomi::VIM.connect host: 'foo', user: 'bar', password: 'baz'
|
21
|
+
dc = vim.serviceInstance.find_datacenter("mydatacenter") or fail "datacenter not found"
|
22
|
+
vm = dc.find_vm("myvm") or fail "VM not found"
|
23
|
+
vm.PowerOnVM_Task.wait_for_completion
|
24
|
+
|
25
|
+
This code uses several RbVmomi extensions to the vSphere API for concision. The
|
26
|
+
expanded snippet below uses only standard API calls and should be familiar to
|
27
|
+
users of the Java SDK:
|
28
|
+
|
29
|
+
require 'rbvmomi'
|
30
|
+
vim = RbVmomi::VIM.connect host: 'foo', user: 'bar', password: 'baz'
|
31
|
+
rootFolder = vim.serviceInstance.content.rootFolder
|
32
|
+
dc = rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).find { |x| x.name == "mydatacenter" } or fail "datacenter not found"
|
33
|
+
vm = dc.vmFolder.childEntity.grep(RbVmomi::VIM::VirtualMachine).find { |x| x.name == "myvm" } or fail "VM not found"
|
34
|
+
task = vm.PowerOnVM_Task
|
35
|
+
filter = vim.propertyCollector.CreateFilter(
|
36
|
+
spec: {
|
37
|
+
propSet: [{ type: 'Task', all: false, pathSet: ['info.state']}],
|
38
|
+
objectSet: [{ obj: task }]
|
39
|
+
},
|
40
|
+
partialUpdates: false
|
41
|
+
)
|
42
|
+
ver = ''
|
43
|
+
while true
|
44
|
+
result = vim.propertyCollector.WaitForUpdates(version: ver)
|
45
|
+
ver = result.version
|
46
|
+
break if ['success', 'error'].member? task.info.state
|
47
|
+
end
|
48
|
+
filter.DestroyPropertyFilter
|
49
|
+
raise task.info.error if task.info.state == 'error'
|
50
|
+
|
51
|
+
As you can see, the extensions RbVmomi adds can dramatically decrease the code
|
52
|
+
needed to perform simple tasks while still letting you use the full power of
|
53
|
+
the API when necessary. RbVmomi extensions are often more efficient than a
|
54
|
+
naive implementation; for example, the find_vm method on VIM::Datacenter used
|
55
|
+
in the first example uses the SearchIndex for fast lookups.
|
56
|
+
|
57
|
+
A few important points:
|
58
|
+
|
59
|
+
* All class, method, parameter, and property names match the official documentation[http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/index.html].
|
60
|
+
* Properties are exposed as accessor methods.
|
61
|
+
* Data object types can usually be inferred from context, so you may use a hash instead.
|
62
|
+
* Enumeration values are simply strings.
|
63
|
+
* Example code is included in the examples/ directory.
|
64
|
+
* A set of helper methods for Trollop is included to speed up development of
|
65
|
+
command line apps. See the included examples for usage.
|
66
|
+
* If you don't have trusted SSL certificates installed on the host you're
|
67
|
+
connecting to, you'll get an +OpenSSL::SSL::SSLError+ "certificate verify failed".
|
68
|
+
You can work around this by using the +:insecure+ option to +RbVmomi::VIM.connect+.
|
69
|
+
* This is a side project of a VMware employee and is entirely unsupported by VMware.
|
70
|
+
|
71
|
+
Built-in extensions are under +lib/rbvmomi/vim/+. You are encouraged to
|
72
|
+
reopen VIM classes in your applications and add extensions of your own. If you
|
73
|
+
write something generally useful please send it to me and I'll add it in.
|
74
|
+
|
75
|
+
== Development
|
76
|
+
|
77
|
+
Fork the project on Github and send me a merge request, or send a patch to
|
78
|
+
rlane@vmware.com. RbVmomi developers hang out in #rbvmomi on Freenode.
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
require 'rdoc/task'
|
3
|
+
require 'yard'
|
4
|
+
|
5
|
+
begin
|
6
|
+
require 'jeweler'
|
7
|
+
Jeweler::Tasks.new do |gem|
|
8
|
+
gem.name = "vagrant-rbvmomi"
|
9
|
+
gem.summary = "Ruby interface to the VMware vSphere API - Vagrant edition"
|
10
|
+
#gem.description = ""
|
11
|
+
gem.email = "fabio@rapposelli.org"
|
12
|
+
gem.homepage = "https://github.com/frapposelli/vagrant-rbvmomi"
|
13
|
+
gem.authors = ["Rich Lane", "Christian Dickmann", "Fabio Rapposelli"]
|
14
|
+
gem.add_dependency 'nokogiri', '>= 1.4.1'
|
15
|
+
gem.add_dependency 'builder'
|
16
|
+
gem.add_dependency 'trollop'
|
17
|
+
gem.required_ruby_version = '>= 1.8.7'
|
18
|
+
gem.files.include 'vmodl.db'
|
19
|
+
gem.files.include '.yardopts'
|
20
|
+
end
|
21
|
+
rescue LoadError
|
22
|
+
puts "Jeweler not available. Install it with: gem install jeweler"
|
23
|
+
end
|
24
|
+
|
25
|
+
Rake::TestTask.new do |t|
|
26
|
+
t.libs << "test"
|
27
|
+
t.test_files = FileList['test/test_*.rb']
|
28
|
+
t.verbose = true
|
29
|
+
end
|
30
|
+
|
31
|
+
YARD::Rake::YardocTask.new
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
1.8.1
|
data/bin/rbvmomish
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# TODO keepalive
|
3
|
+
# TODO rc file
|
4
|
+
# TODO proxy support?
|
5
|
+
require 'trollop'
|
6
|
+
require 'readline'
|
7
|
+
require 'rbvmomi'
|
8
|
+
require 'rbvmomi/trollop'
|
9
|
+
|
10
|
+
VIM = RbVmomi::VIM
|
11
|
+
|
12
|
+
opts = Trollop.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
|
+
$trollop = 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
|
+
$trollop.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,213 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'nokogiri'
|
3
|
+
require 'pp'
|
4
|
+
# :usage => analyze-vim-declarations.rb vim-declarations.xml foo-declarations.xml vmodl.db
|
5
|
+
|
6
|
+
XML_FNS = ARGV[0...-1]
|
7
|
+
abort "must specify path to vim-declarations.xml" if XML_FNS.empty?
|
8
|
+
OUT_FN = ARGV[-1] or abort "must specify path to output database"
|
9
|
+
|
10
|
+
XML_FNS.each do |x|
|
11
|
+
abort "XML file #{x} does not exist" unless File.exists? x
|
12
|
+
end
|
13
|
+
|
14
|
+
TYPES = {}
|
15
|
+
VERSIONS = []
|
16
|
+
|
17
|
+
ID2NAME = Hash.new { |h,k| fail "unknown type-id #{k.inspect}" }
|
18
|
+
|
19
|
+
ID2NAME.merge!({
|
20
|
+
'java.lang.String' => 'xsd:string',
|
21
|
+
'BOOLEAN' => 'xsd:boolean',
|
22
|
+
'BYTE' => 'xsd:byte',
|
23
|
+
'SHORT' => 'xsd:short',
|
24
|
+
'INT' => 'xsd:int',
|
25
|
+
'LONG' => 'xsd:long',
|
26
|
+
'FLOAT' => 'xsd:float',
|
27
|
+
'DOUBLE' => 'xsd:double',
|
28
|
+
'vmodl.DateTime' => 'xsd:dateTime',
|
29
|
+
'vmodl.Binary' => 'xsd:base64Binary',
|
30
|
+
'vmodl.Any' => 'xsd:anyType',
|
31
|
+
'vmodl.URI' => 'xsd:anyURI',
|
32
|
+
'void' => nil,
|
33
|
+
})
|
34
|
+
|
35
|
+
%w(DataObject ManagedObject MethodFault MethodName
|
36
|
+
PropertyPath RuntimeFault TypeName).each do |x|
|
37
|
+
ID2NAME['vmodl.' + x] = x
|
38
|
+
end
|
39
|
+
|
40
|
+
def handle_data_object node
|
41
|
+
if TYPES[node['name']]
|
42
|
+
puts "Type #{node['name']} already exists"
|
43
|
+
return
|
44
|
+
end
|
45
|
+
|
46
|
+
ID2NAME[node['type-id']] = node['name']
|
47
|
+
TYPES[node['name']] = {
|
48
|
+
'kind' => 'data',
|
49
|
+
'base-type-id' => node['base-type-id'],
|
50
|
+
'props' => node.children.select { |x| x.name == 'property' }.map do |property|
|
51
|
+
{
|
52
|
+
'name' => property['name'],
|
53
|
+
'type-id-ref' => property['type-id-ref'],
|
54
|
+
'is-optional' => property['is-optional'] ? true : false,
|
55
|
+
'is-array' => property['is-array'] ? true : false,
|
56
|
+
'version-id-ref' => property['version-id-ref'],
|
57
|
+
}
|
58
|
+
end
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
def handle_managed_object node
|
63
|
+
if TYPES[node['name']]
|
64
|
+
puts "Type #{node['name']} already exists"
|
65
|
+
return
|
66
|
+
end
|
67
|
+
ID2NAME[node['type-id']] = node['name']
|
68
|
+
TYPES[node['name']] = {
|
69
|
+
'kind' => 'managed',
|
70
|
+
'base-type-id' => node['base-type-id'],
|
71
|
+
'props' => node.children.select { |x| x.name == 'property' }.map do |property|
|
72
|
+
{
|
73
|
+
'name' => property['name'],
|
74
|
+
'type-id-ref' => property['type-id-ref'],
|
75
|
+
'is-optional' => property['is-optional'] ? true : false,
|
76
|
+
'is-array' => property['is-array'] ? true : false,
|
77
|
+
'version-id-ref' => property['version-id-ref'],
|
78
|
+
}
|
79
|
+
end,
|
80
|
+
'methods' => Hash[
|
81
|
+
node.children.select { |x| x.name == 'method' }.map do |method|
|
82
|
+
[method['is-task'] ? "#{method['name']}_Task" : method['name'],
|
83
|
+
{
|
84
|
+
'params' => method.children.select { |x| x.name == 'parameter' }.map do |param|
|
85
|
+
{
|
86
|
+
'name' => param['name'],
|
87
|
+
'type-id-ref' => param['type-id-ref'],
|
88
|
+
'is-array' => param['is-array'] ? true : false,
|
89
|
+
'is-optional' => param['is-optional'] ? true : false,
|
90
|
+
'version-id-ref' => param['version-id-ref'],
|
91
|
+
}
|
92
|
+
end,
|
93
|
+
'result' => {
|
94
|
+
'type-id-ref' => method['type-id-ref'],
|
95
|
+
'is-array' => method['is-array'] ? true : false,
|
96
|
+
'is-optional' => method['is-optional'] ? true : false,
|
97
|
+
'is-task' => method['is-task'] ? true : false,
|
98
|
+
'version-id-ref' => method['version-id-ref'],
|
99
|
+
}
|
100
|
+
}
|
101
|
+
]
|
102
|
+
end
|
103
|
+
]
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
def handle_enum node
|
108
|
+
if TYPES[node['name']]
|
109
|
+
puts "Type #{node['name']} already exists"
|
110
|
+
return
|
111
|
+
end
|
112
|
+
|
113
|
+
ID2NAME[node['type-id']] = node['name']
|
114
|
+
TYPES[node['name']] = {
|
115
|
+
'kind' => 'enum',
|
116
|
+
'values' => node.children.map { |child| child['name'] },
|
117
|
+
}
|
118
|
+
end
|
119
|
+
|
120
|
+
def handle_fault node
|
121
|
+
handle_data_object node
|
122
|
+
end
|
123
|
+
|
124
|
+
def handle_version x
|
125
|
+
attrs = %w(display-name name service-namespace type-id version-id vmodl-name)
|
126
|
+
h = Hash[attrs.map { |k| [k, x[k]] }]
|
127
|
+
h['compatible'] = x.children.select(&:element?).map { |y| y.text }
|
128
|
+
VERSIONS << h
|
129
|
+
end
|
130
|
+
|
131
|
+
XML_FNS.each do |fn|
|
132
|
+
puts "parsing #{fn} ..."
|
133
|
+
xml_str = File.read(fn)
|
134
|
+
xml_str = xml_str.gsub(/\<description-html\>(.*?)\<\/description-html\>/m, "")
|
135
|
+
xml = Nokogiri.parse(xml_str, nil, nil, Nokogiri::XML::ParseOptions::NOBLANKS)
|
136
|
+
xml.root.at('enums').children.each { |x| handle_enum x }
|
137
|
+
xml.root.at('managed-objects').children.each { |x| handle_managed_object x }
|
138
|
+
xml.root.at('data-objects').children.each { |x| handle_data_object x }
|
139
|
+
xml.root.at('faults').children.each { |x| handle_fault x }
|
140
|
+
#xml.root.at('definitions').at('version-types').children.each { |x| handle_version x }
|
141
|
+
end
|
142
|
+
|
143
|
+
#pp ID2NAME
|
144
|
+
|
145
|
+
munge_fault = lambda { |x| true }
|
146
|
+
|
147
|
+
TYPES.each do |k,t|
|
148
|
+
case t['kind']
|
149
|
+
when 'data'
|
150
|
+
t['wsdl_base'] = t['base-type-id'] ? ID2NAME[t['base-type-id']] : 'DataObject'
|
151
|
+
t.delete 'base-type-id'
|
152
|
+
t['props'].each do |x|
|
153
|
+
x['wsdl_type'] = ID2NAME[x['type-id-ref']]
|
154
|
+
x.delete 'type-id-ref'
|
155
|
+
munge_fault[x]
|
156
|
+
end
|
157
|
+
when 'managed'
|
158
|
+
t['wsdl_base'] = t['base-type-id'] ? ID2NAME[t['base-type-id']] : 'ManagedObject'
|
159
|
+
t.delete 'base-type-id'
|
160
|
+
t['props'].each do |x|
|
161
|
+
x['wsdl_type'] = ID2NAME[x['type-id-ref']]
|
162
|
+
x.delete 'type-id-ref'
|
163
|
+
munge_fault[x]
|
164
|
+
end
|
165
|
+
t['methods'].each do |mName,x|
|
166
|
+
if y = x['result']
|
167
|
+
begin
|
168
|
+
y['wsdl_type'] = ID2NAME[y['type-id-ref']]
|
169
|
+
rescue Exception => ex
|
170
|
+
pp ex
|
171
|
+
end
|
172
|
+
y.delete 'type-id-ref'
|
173
|
+
munge_fault[y]
|
174
|
+
end
|
175
|
+
x['params'].each do |r|
|
176
|
+
begin
|
177
|
+
r['wsdl_type'] = ID2NAME[r['type-id-ref']]
|
178
|
+
rescue Exception => ex
|
179
|
+
pp ex
|
180
|
+
end
|
181
|
+
r.delete 'type-id-ref'
|
182
|
+
munge_fault[r]
|
183
|
+
end
|
184
|
+
end
|
185
|
+
when 'enum'
|
186
|
+
else fail
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
db = {}
|
191
|
+
|
192
|
+
TYPES.each do |k,t|
|
193
|
+
db[k] = t
|
194
|
+
end
|
195
|
+
|
196
|
+
db['_typenames'] = TYPES.keys
|
197
|
+
db['_versions'] = VERSIONS
|
198
|
+
|
199
|
+
File.open(OUT_FN, 'w') { |io| Marshal.dump db, io }
|
200
|
+
|
201
|
+
if filename = ENV['VERSION_GRAPH']
|
202
|
+
File.open(filename, 'w') do |io|
|
203
|
+
io.puts "digraph versions\n{"
|
204
|
+
VERSIONS.each do |h|
|
205
|
+
io.puts "\"#{h['vmodl-name']}\" [label=\"#{h['vmodl-name']} (#{h['version-id']})\"]"
|
206
|
+
h['compatible'].each do |x|
|
207
|
+
x =~ /^interface / or fail x
|
208
|
+
io.puts "\"#{h['vmodl-name']}\" -> \"#{$'}\""
|
209
|
+
end
|
210
|
+
end
|
211
|
+
io.puts "}\n"
|
212
|
+
end
|
213
|
+
end
|