rbvmomi 2.0.0 → 2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rbvmomi/#vim.rb# +155 -0
- data/lib/rbvmomi/version.rb +1 -1
- data/lib/rbvmomi/vmodl.rb +49 -0
- data/vmodl.db +0 -0
- metadata +5 -35
- data/.gitignore +0 -13
- data/.travis.yml +0 -11
- data/.yardopts +0 -6
- data/CONTRIBUTORS.md +0 -44
- data/Gemfile +0 -10
- data/Rakefile +0 -16
- data/devel/analyze-vim-declarations.rb +0 -217
- data/devel/analyze-xml.rb +0 -49
- data/devel/benchmark.rb +0 -121
- data/devel/collisions.rb +0 -22
- data/devel/merge-internal-vmodl.rb +0 -63
- data/devel/merge-manual-vmodl.rb +0 -36
- data/examples/annotate.rb +0 -57
- data/examples/cached_ovf_deploy.rb +0 -124
- data/examples/clone_vm.rb +0 -88
- data/examples/create_vm-1.9.rb +0 -97
- data/examples/create_vm.rb +0 -97
- data/examples/delete_disk_from_vm.rb +0 -57
- data/examples/extraConfig.rb +0 -57
- data/examples/lease_tool.rb +0 -106
- data/examples/logbundle.rb +0 -66
- data/examples/logtail.rb +0 -63
- data/examples/nfs_datastore.rb +0 -99
- data/examples/power.rb +0 -62
- data/examples/readme-1.rb +0 -38
- data/examples/readme-2.rb +0 -54
- data/examples/run.sh +0 -41
- data/examples/screenshot.rb +0 -51
- data/examples/vdf.rb +0 -84
- data/examples/vm_drs_behavior.rb +0 -80
- data/rbvmomi.gemspec +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff1e2a42dc5de2b400dbc180315e922746090ee5feac055dc56d03db52ed861b
|
4
|
+
data.tar.gz: 957d2c4641b68cf99a0c493743ce344972093302e7939cb67d1fd7a7e70d25c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d586c72331490dafd93074737069b9b9526e1d4b986f0cd410ed51279897ed2d1ee046c589c393ece0db3e81cbece07d2be4f1c56004404b94db9c045bd31378
|
7
|
+
data.tar.gz: cdaecffc1a9fa2c4de85ebaf684bf5e1e51aac843e6c27cae9eaaefc15b36969c936cc76360ac4d27184efdaf528af67b1d9fb93a015e36f73df55a745e5bc3f
|
@@ -0,0 +1,155 @@
|
|
1
|
+
# Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
|
2
|
+
# SPDX-License-Identifier: MIT
|
3
|
+
|
4
|
+
require 'rbvmomi'
|
5
|
+
|
6
|
+
# Win32::SSPI is part of core on Windows
|
7
|
+
begin
|
8
|
+
require 'win32/sspi'
|
9
|
+
rescue LoadError
|
10
|
+
end
|
11
|
+
WIN32 = (defined? Win32::SSPI)
|
12
|
+
|
13
|
+
module RbVmomi
|
14
|
+
|
15
|
+
# A connection to one vSphere SDK endpoint.
|
16
|
+
# @see #serviceInstance
|
17
|
+
class VIM < Connection
|
18
|
+
# Connect to a vSphere SDK endpoint
|
19
|
+
#
|
20
|
+
# @param [Hash] opts The options hash.
|
21
|
+
# @option opts [String] :host Host to connect to.
|
22
|
+
# @option opts [Numeric] :port (443) Port to connect to.
|
23
|
+
# @option opts [Boolean] :ssl (true) Whether to use SSL.
|
24
|
+
# @option opts [Boolean] :insecure (false) If true, ignore SSL certificate errors.
|
25
|
+
# @option opts [String] :cookie If set, use cookie to connect instead of user/password
|
26
|
+
# @option opts [String] :user (root) Username.
|
27
|
+
# @option opts [String] :password Password.
|
28
|
+
# @option opts [String] :path (/sdk) SDK endpoint path.
|
29
|
+
# @option opts [Boolean] :debug (false) If true, print SOAP traffic to stderr.
|
30
|
+
# @option opts [String] :operation_id If set, use for operationID
|
31
|
+
def self.connect opts
|
32
|
+
fail unless opts.is_a? Hash
|
33
|
+
fail "host option required" unless opts[:host]
|
34
|
+
opts[:cookie] ||= nil
|
35
|
+
opts[:user] ||= (WIN32 ? ENV['USERNAME'].dup : 'root')
|
36
|
+
opts[:password] ||= ''
|
37
|
+
opts[:ssl] = true unless opts.member? :ssl or opts[:"no-ssl"]
|
38
|
+
opts[:insecure] ||= false
|
39
|
+
opts[:port] ||= (opts[:ssl] ? 443 : 80)
|
40
|
+
opts[:path] ||= '/sdk'
|
41
|
+
opts[:ns] ||= 'urn:vim25'
|
42
|
+
opts[:rev] = '6.5' if opts[:rev].nil?
|
43
|
+
opts[:debug] = (!ENV['RBVMOMI_DEBUG'].empty? rescue false) unless opts.member? :debug
|
44
|
+
|
45
|
+
conn = new(opts).tap do |vim|
|
46
|
+
unless opts[:cookie]
|
47
|
+
if WIN32 && opts[:password] == ''
|
48
|
+
# Attempt login by SSPI if no password specified on Windows
|
49
|
+
negotiation = Win32::SSPI::NegotiateAuth.new opts[:user], ENV['USERDOMAIN'].dup
|
50
|
+
begin
|
51
|
+
vim.serviceContent.sessionManager.LoginBySSPI :base64Token => negotiation.get_initial_token
|
52
|
+
rescue RbVmomi::Fault => fault
|
53
|
+
if !fault.fault.is_a?(RbVmomi::VIM::SSPIChallenge)
|
54
|
+
raise
|
55
|
+
else
|
56
|
+
vim.serviceContent.sessionManager.LoginBySSPI :base64Token => negotiation.complete_authentication(fault.base64Token)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
else
|
60
|
+
vim.serviceContent.sessionManager.Login :userName => opts[:user], :password => opts[:password]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
rev = vim.serviceContent.about.apiVersion
|
64
|
+
vim.rev = [rev, opts[:rev]].min { |a, b| Gem::Version.new(a) <=> Gem::Version.new(b) }
|
65
|
+
end
|
66
|
+
|
67
|
+
at_exit { conn.close }
|
68
|
+
conn
|
69
|
+
end
|
70
|
+
|
71
|
+
def close
|
72
|
+
serviceContent.sessionManager.Logout
|
73
|
+
rescue RbVmomi::Fault => e
|
74
|
+
$stderr.puts(e.message) if debug
|
75
|
+
ensure
|
76
|
+
self.cookie = nil
|
77
|
+
super
|
78
|
+
end
|
79
|
+
|
80
|
+
def rev= x
|
81
|
+
super
|
82
|
+
@serviceContent = nil
|
83
|
+
end
|
84
|
+
|
85
|
+
# Return the ServiceInstance
|
86
|
+
#
|
87
|
+
# The ServiceInstance is the root of the vSphere inventory.
|
88
|
+
# @see http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.ServiceInstance.html
|
89
|
+
def serviceInstance
|
90
|
+
VIM::ServiceInstance self, 'ServiceInstance'
|
91
|
+
end
|
92
|
+
|
93
|
+
# Alias to serviceInstance.RetrieveServiceContent
|
94
|
+
def serviceContent
|
95
|
+
@serviceContent ||= serviceInstance.RetrieveServiceContent
|
96
|
+
end
|
97
|
+
|
98
|
+
# Alias to serviceContent.rootFolder
|
99
|
+
def rootFolder
|
100
|
+
serviceContent.rootFolder
|
101
|
+
end
|
102
|
+
|
103
|
+
alias root rootFolder
|
104
|
+
|
105
|
+
# Alias to serviceContent.propertyCollector
|
106
|
+
def propertyCollector
|
107
|
+
serviceContent.propertyCollector
|
108
|
+
end
|
109
|
+
|
110
|
+
# Alias to serviceContent.searchIndex
|
111
|
+
def searchIndex
|
112
|
+
serviceContent.searchIndex
|
113
|
+
end
|
114
|
+
|
115
|
+
# @private
|
116
|
+
def pretty_print pp
|
117
|
+
pp.text "VIM(#{@opts[:host]})"
|
118
|
+
end
|
119
|
+
|
120
|
+
def instanceUuid
|
121
|
+
serviceContent.about.instanceUuid
|
122
|
+
end
|
123
|
+
|
124
|
+
def get_log_lines logKey, lines=5, start=nil, host=nil
|
125
|
+
diagMgr = self.serviceContent.diagnosticManager
|
126
|
+
if !start
|
127
|
+
log = diagMgr.BrowseDiagnosticLog(:host => host, :key => logKey, :start => 999999999)
|
128
|
+
lineEnd = log.lineEnd
|
129
|
+
start = lineEnd - lines
|
130
|
+
end
|
131
|
+
start = start < 0 ? 0 : start
|
132
|
+
log = diagMgr.BrowseDiagnosticLog(:host => host, :key => logKey, :start => start)
|
133
|
+
if log.lineText.size > 0
|
134
|
+
[log.lineText.slice(-lines, log.lineText.size), log.lineEnd]
|
135
|
+
else
|
136
|
+
[log.lineText, log.lineEnd]
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
def get_log_keys host=nil
|
141
|
+
diagMgr = self.serviceContent.diagnosticManager
|
142
|
+
keys = []
|
143
|
+
diagMgr.QueryDescriptions(:host => host).each do |desc|
|
144
|
+
keys << "#{desc.key}"
|
145
|
+
end
|
146
|
+
keys
|
147
|
+
end
|
148
|
+
|
149
|
+
add_extension_dir File.join(File.dirname(__FILE__), "vim")
|
150
|
+
(ENV['RBVMOMI_VIM_EXTENSION_PATH']||'').split(':').each { |dir| add_extension_dir dir }
|
151
|
+
|
152
|
+
load_vmodl(ENV['VMODL'] || File.join(File.dirname(__FILE__), "../../vmodl.db"))
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
data/lib/rbvmomi/version.rb
CHANGED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'hashdiff'
|
2
|
+
|
3
|
+
module RbVmomi
|
4
|
+
# Utility class for VMware Managed Object Designed Language
|
5
|
+
#
|
6
|
+
# @author J.R. Garcia <jrg@vmware.com>
|
7
|
+
# @since 2.0.1
|
8
|
+
class VMODL
|
9
|
+
# Create a VMODL object from a marshaled file
|
10
|
+
#
|
11
|
+
# @author J.R. Garcia <jrg@vmware.com>
|
12
|
+
#
|
13
|
+
# @since 2.0.1
|
14
|
+
#
|
15
|
+
# @param [String] file the path to create the VMODL object from
|
16
|
+
#
|
17
|
+
# @return [VMODL] the created VMODL
|
18
|
+
def self.from_file(file = '')
|
19
|
+
raise ArgumentError, "'#{file}' doesn't exist" unless File.exist?(file)
|
20
|
+
new.tap { |o| o.instance_variable_set(:@file, file) }
|
21
|
+
end
|
22
|
+
|
23
|
+
# Translate a VMODL object to a Hash
|
24
|
+
#
|
25
|
+
# @author J.R. Garcia <jrg@vmware.com>
|
26
|
+
#
|
27
|
+
# @since 2.0.1
|
28
|
+
#
|
29
|
+
# @return [Hash] a Hash representation of the VMODL
|
30
|
+
def to_h
|
31
|
+
Marshal.load(IO.read(@file))
|
32
|
+
end
|
33
|
+
|
34
|
+
# Diff this VMODL with another VMODL
|
35
|
+
#
|
36
|
+
# @author J.R. Garcia <jrg@vmware.com>
|
37
|
+
#
|
38
|
+
# @since 2.0.1
|
39
|
+
#
|
40
|
+
# @return a diff of the VMODLs
|
41
|
+
def diff(other)
|
42
|
+
HashDiff.diff(self.to_h, other.to_h)
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
attr_accessor :file
|
48
|
+
end
|
49
|
+
end
|
data/vmodl.db
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbvmomi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rich Lane
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2019-02-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: builder
|
@@ -130,40 +130,11 @@ executables:
|
|
130
130
|
extensions: []
|
131
131
|
extra_rdoc_files: []
|
132
132
|
files:
|
133
|
-
- ".gitignore"
|
134
|
-
- ".travis.yml"
|
135
|
-
- ".yardopts"
|
136
|
-
- CONTRIBUTORS.md
|
137
|
-
- Gemfile
|
138
133
|
- LICENSE
|
139
134
|
- README.md
|
140
|
-
- Rakefile
|
141
|
-
- devel/analyze-vim-declarations.rb
|
142
|
-
- devel/analyze-xml.rb
|
143
|
-
- devel/benchmark.rb
|
144
|
-
- devel/collisions.rb
|
145
|
-
- devel/merge-internal-vmodl.rb
|
146
|
-
- devel/merge-manual-vmodl.rb
|
147
|
-
- examples/annotate.rb
|
148
|
-
- examples/cached_ovf_deploy.rb
|
149
|
-
- examples/clone_vm.rb
|
150
|
-
- examples/create_vm-1.9.rb
|
151
|
-
- examples/create_vm.rb
|
152
|
-
- examples/delete_disk_from_vm.rb
|
153
|
-
- examples/extraConfig.rb
|
154
|
-
- examples/lease_tool.rb
|
155
|
-
- examples/logbundle.rb
|
156
|
-
- examples/logtail.rb
|
157
|
-
- examples/nfs_datastore.rb
|
158
|
-
- examples/power.rb
|
159
|
-
- examples/readme-1.rb
|
160
|
-
- examples/readme-2.rb
|
161
|
-
- examples/run.sh
|
162
|
-
- examples/screenshot.rb
|
163
|
-
- examples/vdf.rb
|
164
|
-
- examples/vm_drs_behavior.rb
|
165
135
|
- exe/rbvmomish
|
166
136
|
- lib/rbvmomi.rb
|
137
|
+
- lib/rbvmomi/#vim.rb#
|
167
138
|
- lib/rbvmomi/basic_types.rb
|
168
139
|
- lib/rbvmomi/connection.rb
|
169
140
|
- lib/rbvmomi/deserialization.rb
|
@@ -201,7 +172,7 @@ files:
|
|
201
172
|
- lib/rbvmomi/vim/ServiceInstance.rb
|
202
173
|
- lib/rbvmomi/vim/Task.rb
|
203
174
|
- lib/rbvmomi/vim/VirtualMachine.rb
|
204
|
-
- rbvmomi.
|
175
|
+
- lib/rbvmomi/vmodl.rb
|
205
176
|
- vmodl.db
|
206
177
|
homepage: https://github.com/vmware/rbvmomi
|
207
178
|
licenses:
|
@@ -222,8 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
222
193
|
- !ruby/object:Gem::Version
|
223
194
|
version: '0'
|
224
195
|
requirements: []
|
225
|
-
|
226
|
-
rubygems_version: 2.7.6
|
196
|
+
rubygems_version: 3.0.2
|
227
197
|
signing_key:
|
228
198
|
specification_version: 4
|
229
199
|
summary: Ruby interface to the VMware vSphere API
|
data/.gitignore
DELETED
data/.travis.yml
DELETED
data/.yardopts
DELETED
data/CONTRIBUTORS.md
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
* Adam Grare <agrare@redhat.com>
|
2
|
-
* Anurag Uniyal <auniyal@vmware.com>
|
3
|
-
* Benjamin Bytheway <ben.bytheway@imail.org>
|
4
|
-
* Christian Dickmann <cdickmann@ubuntu.(none)>
|
5
|
-
* Christian Dickmann <cdickmann@vmware.com>
|
6
|
-
* Colin O'Byrne and Martin Marinov <cobyrne@vmware.com>
|
7
|
-
* Colin O'Byrne and Nick Coelius <cobyrne@vmware.com>
|
8
|
-
* Daniel Rife <daniel.rife@rightscale.com>
|
9
|
-
* Dave Hewitt <43970119+davehewitt@users.noreply.github.com>
|
10
|
-
* Dominic Cleal <dcleal@redhat.com>
|
11
|
-
* Dominic Cleal <dominic@cleal.org>
|
12
|
-
* Doug MacEachern <dougm@vmware.com>
|
13
|
-
* E Arvidson <earvidso@users.noreply.github.com>
|
14
|
-
* Erik Peterson <erik@subwindow.com>
|
15
|
-
* Fabio Rapposelli <fabio@rapposelli.org>
|
16
|
-
* Giuliano <giuliano@108.bz>
|
17
|
-
* Guido Günther <agx@sigxcpu.org>
|
18
|
-
* Hari Krishnamurthy <hkrishna@vmware.com>
|
19
|
-
* J.R. Garcia <jr@garciaole.com>
|
20
|
-
* Jacob Evans <jacob@dekz.net>
|
21
|
-
* Justin <justin@labs.epiuse.com>
|
22
|
-
* Kevin Menard <nirvdrum@gmail.com>
|
23
|
-
* Lalitha Sripada <lsripada@vmware.com>
|
24
|
-
* Martin Englund <martin@englund.nu>
|
25
|
-
* Nan Liu <nan.liu@gmail.com>
|
26
|
-
* Omar Baba <obaba@infinio.com>
|
27
|
-
* Peter <peter.adkins@kernelpicnic.net>
|
28
|
-
* Puneet Katyal <pkatyal@vmware.com>
|
29
|
-
* Randy Robertson <rmrobert@vmware.com>
|
30
|
-
* Rich Lane <lanerl@gmail.com>
|
31
|
-
* Rich Lane <rlane@club.cc.cmu.edu>
|
32
|
-
* Rich Lane <rlane@vmware.com>
|
33
|
-
* Scott J. Goldman <scottjg@vmware.com>
|
34
|
-
* Shawn Hartsock <hartsock@users.noreply.github.com>
|
35
|
-
* Shawn Hartsock <hartsocks@vmware.com>
|
36
|
-
* Shawn Hartsock <shawn.hartsock@gmail.com>
|
37
|
-
* Soner Sevinc <sevincs@vmware.com>
|
38
|
-
* Tom Bortels <bortels@gmail.com>
|
39
|
-
* Tu Hoang <rebyn@me.com>
|
40
|
-
* administrator <administrator@cdickmann-mbpro.gateway.2wire.net>
|
41
|
-
* cdickmann <christian.dickmann@gmail.com>
|
42
|
-
* howels <howels@users.noreply.github.com>
|
43
|
-
* kumabuchi.kenji <k.kumabuchi+github@gmail.com>
|
44
|
-
* thanhngn <thanhngn@users.noreply.github.com>
|
data/Gemfile
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
# Copyright (c) 2016-2017 VMware, Inc. All Rights Reserved.
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
|
4
|
-
source 'https://rubygems.org'
|
5
|
-
|
6
|
-
gemspec
|
7
|
-
|
8
|
-
gem 'json', '< 2' if RUBY_VERSION.start_with?('1.')
|
9
|
-
gem 'nokogiri', '< 1.6' if RUBY_VERSION.start_with?('1.8.')
|
10
|
-
gem 'test-unit', '~> 2.5' if RUBY_VERSION.start_with?('1.8.')
|
data/Rakefile
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
# Copyright (c) 2010-2017 VMware, Inc. All Rights Reserved.
|
2
|
-
# SPDX-License-Identifier: MIT
|
3
|
-
|
4
|
-
require 'bundler/gem_tasks'
|
5
|
-
require 'rake/testtask'
|
6
|
-
require 'yard'
|
7
|
-
|
8
|
-
task(:default => :test)
|
9
|
-
|
10
|
-
Rake::TestTask.new do |t|
|
11
|
-
t.libs << "test"
|
12
|
-
t.test_files = FileList['test/test_*.rb']
|
13
|
-
t.verbose = true
|
14
|
-
end
|
15
|
-
|
16
|
-
YARD::Rake::YardocTask.new
|
@@ -1,217 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
# Copyright (c) 2010-2017 VMware, Inc. All Rights Reserved.
|
4
|
-
# SPDX-License-Identifier: MIT
|
5
|
-
|
6
|
-
require 'nokogiri'
|
7
|
-
require 'pp'
|
8
|
-
# :usage => analyze-vim-declarations.rb vim-declarations.xml foo-declarations.xml vmodl.db
|
9
|
-
|
10
|
-
XML_FNS = ARGV[0...-1]
|
11
|
-
abort "must specify path to vim-declarations.xml" if XML_FNS.empty?
|
12
|
-
OUT_FN = ARGV[-1] or abort "must specify path to output database"
|
13
|
-
|
14
|
-
XML_FNS.each do |x|
|
15
|
-
abort "XML file #{x} does not exist" unless File.exists? x
|
16
|
-
end
|
17
|
-
|
18
|
-
TYPES = {}
|
19
|
-
VERSIONS = []
|
20
|
-
|
21
|
-
ID2NAME = Hash.new { |h,k| fail "unknown type-id #{k.inspect}" }
|
22
|
-
|
23
|
-
ID2NAME.merge!({
|
24
|
-
'java.lang.String' => 'xsd:string',
|
25
|
-
'BOOLEAN' => 'xsd:boolean',
|
26
|
-
'BYTE' => 'xsd:byte',
|
27
|
-
'SHORT' => 'xsd:short',
|
28
|
-
'INT' => 'xsd:int',
|
29
|
-
'LONG' => 'xsd:long',
|
30
|
-
'FLOAT' => 'xsd:float',
|
31
|
-
'DOUBLE' => 'xsd:double',
|
32
|
-
'vmodl.DateTime' => 'xsd:dateTime',
|
33
|
-
'vmodl.Binary' => 'xsd:base64Binary',
|
34
|
-
'vmodl.Any' => 'xsd:anyType',
|
35
|
-
'vmodl.URI' => 'xsd:anyURI',
|
36
|
-
'void' => nil,
|
37
|
-
})
|
38
|
-
|
39
|
-
%w(DataObject ManagedObject MethodFault MethodName
|
40
|
-
PropertyPath RuntimeFault TypeName).each do |x|
|
41
|
-
ID2NAME['vmodl.' + x] = x
|
42
|
-
end
|
43
|
-
|
44
|
-
def handle_data_object node
|
45
|
-
if TYPES[node['name']]
|
46
|
-
puts "Type #{node['name']} already exists"
|
47
|
-
return
|
48
|
-
end
|
49
|
-
|
50
|
-
ID2NAME[node['type-id']] = node['name']
|
51
|
-
TYPES[node['name']] = {
|
52
|
-
'kind' => 'data',
|
53
|
-
'base-type-id' => node['base-type-id'],
|
54
|
-
'props' => node.children.select { |x| x.name == 'property' }.map do |property|
|
55
|
-
{
|
56
|
-
'name' => property['name'],
|
57
|
-
'type-id-ref' => property['type-id-ref'],
|
58
|
-
'is-optional' => property['is-optional'] ? true : false,
|
59
|
-
'is-array' => property['is-array'] ? true : false,
|
60
|
-
'version-id-ref' => property['version-id-ref'],
|
61
|
-
}
|
62
|
-
end
|
63
|
-
}
|
64
|
-
end
|
65
|
-
|
66
|
-
def handle_managed_object node
|
67
|
-
if TYPES[node['name']]
|
68
|
-
puts "Type #{node['name']} already exists"
|
69
|
-
return
|
70
|
-
end
|
71
|
-
ID2NAME[node['type-id']] = node['name']
|
72
|
-
TYPES[node['name']] = {
|
73
|
-
'kind' => 'managed',
|
74
|
-
'base-type-id' => node['base-type-id'],
|
75
|
-
'props' => node.children.select { |x| x.name == 'property' }.map do |property|
|
76
|
-
{
|
77
|
-
'name' => property['name'],
|
78
|
-
'type-id-ref' => property['type-id-ref'],
|
79
|
-
'is-optional' => property['is-optional'] ? true : false,
|
80
|
-
'is-array' => property['is-array'] ? true : false,
|
81
|
-
'version-id-ref' => property['version-id-ref'],
|
82
|
-
}
|
83
|
-
end,
|
84
|
-
'methods' => Hash[
|
85
|
-
node.children.select { |x| x.name == 'method' }.map do |method|
|
86
|
-
[method['is-task'] ? "#{method['name']}_Task" : method['name'],
|
87
|
-
{
|
88
|
-
'params' => method.children.select { |x| x.name == 'parameter' }.map do |param|
|
89
|
-
{
|
90
|
-
'name' => param['name'],
|
91
|
-
'type-id-ref' => param['type-id-ref'],
|
92
|
-
'is-array' => param['is-array'] ? true : false,
|
93
|
-
'is-optional' => param['is-optional'] ? true : false,
|
94
|
-
'version-id-ref' => param['version-id-ref'],
|
95
|
-
}
|
96
|
-
end,
|
97
|
-
'result' => {
|
98
|
-
'type-id-ref' => method['type-id-ref'],
|
99
|
-
'is-array' => method['is-array'] ? true : false,
|
100
|
-
'is-optional' => method['is-optional'] ? true : false,
|
101
|
-
'is-task' => method['is-task'] ? true : false,
|
102
|
-
'version-id-ref' => method['version-id-ref'],
|
103
|
-
}
|
104
|
-
}
|
105
|
-
]
|
106
|
-
end
|
107
|
-
]
|
108
|
-
}
|
109
|
-
end
|
110
|
-
|
111
|
-
def handle_enum node
|
112
|
-
if TYPES[node['name']]
|
113
|
-
puts "Type #{node['name']} already exists"
|
114
|
-
return
|
115
|
-
end
|
116
|
-
|
117
|
-
ID2NAME[node['type-id']] = node['name']
|
118
|
-
TYPES[node['name']] = {
|
119
|
-
'kind' => 'enum',
|
120
|
-
'values' => node.children.map { |child| child['name'] },
|
121
|
-
}
|
122
|
-
end
|
123
|
-
|
124
|
-
def handle_fault node
|
125
|
-
handle_data_object node
|
126
|
-
end
|
127
|
-
|
128
|
-
def handle_version x
|
129
|
-
attrs = %w(display-name name service-namespace type-id version-id vmodl-name)
|
130
|
-
h = Hash[attrs.map { |k| [k, x[k]] }]
|
131
|
-
h['compatible'] = x.children.select(&:element?).map { |y| y.text }
|
132
|
-
VERSIONS << h
|
133
|
-
end
|
134
|
-
|
135
|
-
XML_FNS.each do |fn|
|
136
|
-
puts "parsing #{fn} ..."
|
137
|
-
xml_str = File.read(fn)
|
138
|
-
xml_str = xml_str.gsub(/\<description-html\>(.*?)\<\/description-html\>/m, "")
|
139
|
-
xml = Nokogiri.parse(xml_str, nil, nil, Nokogiri::XML::ParseOptions::NOBLANKS)
|
140
|
-
xml.root.at('enums').children.each { |x| handle_enum x }
|
141
|
-
xml.root.at('managed-objects').children.each { |x| handle_managed_object x }
|
142
|
-
xml.root.at('data-objects').children.each { |x| handle_data_object x }
|
143
|
-
xml.root.at('faults').children.each { |x| handle_fault x }
|
144
|
-
#xml.root.at('definitions').at('version-types').children.each { |x| handle_version x }
|
145
|
-
end
|
146
|
-
|
147
|
-
#pp ID2NAME
|
148
|
-
|
149
|
-
munge_fault = lambda { |x| true }
|
150
|
-
|
151
|
-
TYPES.each do |k,t|
|
152
|
-
case t['kind']
|
153
|
-
when 'data'
|
154
|
-
t['wsdl_base'] = t['base-type-id'] ? ID2NAME[t['base-type-id']] : 'DataObject'
|
155
|
-
t.delete 'base-type-id'
|
156
|
-
t['props'].each do |x|
|
157
|
-
x['wsdl_type'] = ID2NAME[x['type-id-ref']]
|
158
|
-
x.delete 'type-id-ref'
|
159
|
-
munge_fault[x]
|
160
|
-
end
|
161
|
-
when 'managed'
|
162
|
-
t['wsdl_base'] = t['base-type-id'] ? ID2NAME[t['base-type-id']] : 'ManagedObject'
|
163
|
-
t.delete 'base-type-id'
|
164
|
-
t['props'].each do |x|
|
165
|
-
x['wsdl_type'] = ID2NAME[x['type-id-ref']]
|
166
|
-
x.delete 'type-id-ref'
|
167
|
-
munge_fault[x]
|
168
|
-
end
|
169
|
-
t['methods'].each do |mName,x|
|
170
|
-
if y = x['result']
|
171
|
-
begin
|
172
|
-
y['wsdl_type'] = ID2NAME[y['type-id-ref']]
|
173
|
-
rescue Exception => ex
|
174
|
-
pp ex
|
175
|
-
end
|
176
|
-
y.delete 'type-id-ref'
|
177
|
-
munge_fault[y]
|
178
|
-
end
|
179
|
-
x['params'].each do |r|
|
180
|
-
begin
|
181
|
-
r['wsdl_type'] = ID2NAME[r['type-id-ref']]
|
182
|
-
rescue Exception => ex
|
183
|
-
pp ex
|
184
|
-
end
|
185
|
-
r.delete 'type-id-ref'
|
186
|
-
munge_fault[r]
|
187
|
-
end
|
188
|
-
end
|
189
|
-
when 'enum'
|
190
|
-
else fail
|
191
|
-
end
|
192
|
-
end
|
193
|
-
|
194
|
-
db = {}
|
195
|
-
|
196
|
-
TYPES.each do |k,t|
|
197
|
-
db[k] = t
|
198
|
-
end
|
199
|
-
|
200
|
-
db['_typenames'] = TYPES.keys
|
201
|
-
db['_versions'] = VERSIONS
|
202
|
-
|
203
|
-
File.open(OUT_FN, 'w') { |io| Marshal.dump db, io }
|
204
|
-
|
205
|
-
if filename = ENV['VERSION_GRAPH']
|
206
|
-
File.open(filename, 'w') do |io|
|
207
|
-
io.puts "digraph versions\n{"
|
208
|
-
VERSIONS.each do |h|
|
209
|
-
io.puts "\"#{h['vmodl-name']}\" [label=\"#{h['vmodl-name']} (#{h['version-id']})\"]"
|
210
|
-
h['compatible'].each do |x|
|
211
|
-
x =~ /^interface / or fail x
|
212
|
-
io.puts "\"#{h['vmodl-name']}\" -> \"#{$'}\""
|
213
|
-
end
|
214
|
-
end
|
215
|
-
io.puts "}\n"
|
216
|
-
end
|
217
|
-
end
|