rbvmomi 1.8.2 → 2.4.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 +5 -13
- data/LICENSE +1 -1
- data/README.md +114 -0
- data/{bin → exe}/rbvmomish +5 -5
- data/lib/rbvmomi.rb +11 -7
- data/lib/rbvmomi/basic_types.rb +9 -1
- data/lib/rbvmomi/connection.rb +11 -9
- data/lib/rbvmomi/deserialization.rb +4 -3
- data/lib/rbvmomi/fault.rb +3 -1
- data/lib/rbvmomi/{trollop.rb → optimist.rb} +10 -8
- data/lib/rbvmomi/pbm.rb +3 -1
- data/lib/rbvmomi/sms.rb +3 -1
- data/lib/rbvmomi/sms/SmsStorageManager.rb +3 -0
- data/lib/rbvmomi/sso.rb +313 -0
- data/lib/rbvmomi/trivial_soap.rb +19 -11
- data/lib/rbvmomi/type_loader.rb +4 -2
- data/lib/rbvmomi/utils/admission_control.rb +22 -19
- data/lib/rbvmomi/utils/deploy.rb +18 -14
- data/lib/rbvmomi/utils/leases.rb +4 -1
- data/lib/rbvmomi/utils/perfdump.rb +4 -1
- data/lib/rbvmomi/version.rb +6 -0
- data/lib/rbvmomi/vim.rb +41 -12
- data/lib/rbvmomi/vim/ComputeResource.rb +3 -0
- data/lib/rbvmomi/vim/Datacenter.rb +8 -0
- data/lib/rbvmomi/vim/Datastore.rb +5 -1
- data/lib/rbvmomi/vim/DynamicTypeMgrAllTypeInfo.rb +3 -0
- data/lib/rbvmomi/vim/DynamicTypeMgrDataTypeInfo.rb +4 -1
- data/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb +15 -7
- data/lib/rbvmomi/vim/Folder.rb +19 -12
- data/lib/rbvmomi/vim/HostSystem.rb +5 -2
- data/lib/rbvmomi/vim/ManagedEntity.rb +3 -0
- data/lib/rbvmomi/vim/ManagedObject.rb +4 -1
- data/lib/rbvmomi/vim/ObjectContent.rb +3 -0
- data/lib/rbvmomi/vim/ObjectUpdate.rb +3 -0
- data/lib/rbvmomi/vim/OvfManager.rb +6 -2
- data/lib/rbvmomi/vim/PerfCounterInfo.rb +3 -1
- data/lib/rbvmomi/vim/PerformanceManager.rb +3 -0
- data/lib/rbvmomi/vim/PropertyCollector.rb +3 -0
- data/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb +5 -2
- data/lib/rbvmomi/vim/ResourcePool.rb +3 -0
- data/lib/rbvmomi/vim/ServiceInstance.rb +3 -0
- data/lib/rbvmomi/vim/Task.rb +3 -0
- data/lib/rbvmomi/vim/VirtualMachine.rb +13 -12
- data/vmodl.db +0 -0
- metadata +100 -63
- data/.yardopts +0 -6
- data/README.rdoc +0 -78
- data/Rakefile +0 -45
- data/VERSION +0 -1
- data/devel/analyze-vim-declarations.rb +0 -213
- data/devel/analyze-xml.rb +0 -46
- data/devel/benchmark.rb +0 -117
- data/devel/collisions.rb +0 -18
- data/devel/merge-internal-vmodl.rb +0 -59
- data/devel/merge-manual-vmodl.rb +0 -32
- data/examples/annotate.rb +0 -54
- data/examples/cached_ovf_deploy.rb +0 -120
- data/examples/clone_vm.rb +0 -84
- data/examples/create_vm-1.9.rb +0 -93
- data/examples/create_vm.rb +0 -93
- data/examples/extraConfig.rb +0 -54
- data/examples/lease_tool.rb +0 -102
- data/examples/logbundle.rb +0 -63
- data/examples/logtail.rb +0 -60
- data/examples/nfs_datastore.rb +0 -95
- data/examples/power.rb +0 -59
- data/examples/readme-1.rb +0 -35
- data/examples/readme-2.rb +0 -51
- data/examples/run.sh +0 -41
- data/examples/screenshot.rb +0 -48
- data/examples/vdf.rb +0 -81
- data/examples/vm_drs_behavior.rb +0 -76
- data/test/test_deserialization.rb +0 -383
- data/test/test_emit_request.rb +0 -128
- data/test/test_exceptions.rb +0 -14
- data/test/test_helper.rb +0 -14
- data/test/test_misc.rb +0 -24
- data/test/test_parse_response.rb +0 -69
- data/test/test_serialization.rb +0 -311
data/.yardopts
DELETED
data/README.rdoc
DELETED
@@ -1,78 +0,0 @@
|
|
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
DELETED
@@ -1,45 +0,0 @@
|
|
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 = "rbvmomi"
|
9
|
-
gem.summary = "Ruby interface to the VMware vSphere API"
|
10
|
-
#gem.description = ""
|
11
|
-
gem.email = "rlane@vmware.com"
|
12
|
-
gem.homepage = "https://github.com/vmware/rbvmomi"
|
13
|
-
gem.authors = ["Rich Lane", "Christian Dickmann"]
|
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
|
32
|
-
|
33
|
-
begin
|
34
|
-
require 'rcov/rcovtask'
|
35
|
-
desc 'Measures test coverage using rcov'
|
36
|
-
Rcov::RcovTask.new do |rcov|
|
37
|
-
rcov.pattern = 'test/test_*.rb'
|
38
|
-
rcov.output_dir = 'coverage'
|
39
|
-
rcov.verbose = true
|
40
|
-
rcov.libs << "test"
|
41
|
-
rcov.rcov_opts << '--exclude "gems/*"'
|
42
|
-
end
|
43
|
-
rescue LoadError
|
44
|
-
puts "Rcov not available. Install it with: gem install rcov"
|
45
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
1.8.2
|
@@ -1,213 +0,0 @@
|
|
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
|
data/devel/analyze-xml.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'nokogiri'
|
2
|
-
|
3
|
-
# removes line breaks and whitespace between xml nodes.
|
4
|
-
def prepare_xml(xml)
|
5
|
-
xml = xml.gsub(/\n+/, "")
|
6
|
-
xml = xml.gsub(/(>)\s*(<)/, '\1\2')
|
7
|
-
end
|
8
|
-
|
9
|
-
def analyze_xml x, tree
|
10
|
-
subtree = (tree[x.name] ||= { :attributes => [], :min_occur => nil, :max_occur => nil })
|
11
|
-
attrs = x.attributes.keys.sort
|
12
|
-
subtree[:attributes] << attrs unless subtree[:attributes].member? attrs
|
13
|
-
|
14
|
-
child_occurs = Hash.new 0
|
15
|
-
x.children.select(&:element?).each do |c|
|
16
|
-
child_occurs[c.name] += 1
|
17
|
-
analyze_xml c, subtree
|
18
|
-
end
|
19
|
-
|
20
|
-
subtree.select { |k,v| k.is_a? String }.each do |k,v|
|
21
|
-
v[:min_occur] = [v[:min_occur], child_occurs[k]].compact.min
|
22
|
-
v[:max_occur] = [v[:max_occur], child_occurs[k]].compact.max
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def print_tree tree, indent=0
|
27
|
-
tree.select { |k,v| k.is_a? String }.sort.each do |k,v|
|
28
|
-
attrs = v[:attributes] || []
|
29
|
-
min, max = v[:min_occur], v[:max_occur]
|
30
|
-
numsym = if min == 0 and max == 0 then fail
|
31
|
-
elsif min == 0 and max == 1 then '?'
|
32
|
-
elsif min == 0 then '*'
|
33
|
-
elsif min == 1 and max == 1 then ''
|
34
|
-
else '+'
|
35
|
-
end
|
36
|
-
puts "#{' '*indent}#{k}#{numsym}: #{attrs.sort.map { |a| "[#{a * ' '}]"} * ', '} {#{min},#{max}}"
|
37
|
-
print_tree v, (indent+1)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
tree = {}
|
42
|
-
ARGV.each do |fn|
|
43
|
-
nk = Nokogiri(prepare_xml(File.read fn))
|
44
|
-
analyze_xml nk.root, tree
|
45
|
-
end
|
46
|
-
print_tree tree
|
data/devel/benchmark.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
require 'tempfile'
|
3
|
-
|
4
|
-
if ENV['RBVMOMI_COVERAGE'] == '1'
|
5
|
-
require 'simplecov'
|
6
|
-
SimpleCov.start
|
7
|
-
end
|
8
|
-
|
9
|
-
require 'rbvmomi'
|
10
|
-
require 'rbvmomi/deserialization'
|
11
|
-
require 'benchmark'
|
12
|
-
require 'libxml'
|
13
|
-
|
14
|
-
NS_XSI = 'http://www.w3.org/2001/XMLSchema-instance'
|
15
|
-
|
16
|
-
VIM = RbVmomi::VIM
|
17
|
-
$conn = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
|
18
|
-
raw = File.read(ARGV[0])
|
19
|
-
|
20
|
-
def diff a, b
|
21
|
-
a_io = Tempfile.new 'rbvmomi-diff-a'
|
22
|
-
b_io = Tempfile.new 'rbvmomi-diff-b'
|
23
|
-
PP.pp a, a_io
|
24
|
-
PP.pp b, b_io
|
25
|
-
a_io.close
|
26
|
-
b_io.close
|
27
|
-
system("diff -u #{a_io.path} #{b_io.path}")
|
28
|
-
a_io.unlink
|
29
|
-
b_io.unlink
|
30
|
-
end
|
31
|
-
|
32
|
-
begin
|
33
|
-
deserializer = RbVmomi::OldDeserializer.new($conn)
|
34
|
-
end_time = Time.now + 1
|
35
|
-
n = 0
|
36
|
-
while n == 0 or end_time > Time.now
|
37
|
-
deserializer.deserialize Nokogiri::XML(raw).root
|
38
|
-
n += 1
|
39
|
-
end
|
40
|
-
N = n*10
|
41
|
-
end
|
42
|
-
|
43
|
-
puts "iterations: #{N}"
|
44
|
-
|
45
|
-
parsed_nokogiri = Nokogiri::XML(raw)
|
46
|
-
parsed_libxml = LibXML::XML::Parser.string(raw).parse
|
47
|
-
|
48
|
-
if true
|
49
|
-
nokogiri_xml = parsed_nokogiri.root
|
50
|
-
libxml_xml = parsed_libxml.root
|
51
|
-
|
52
|
-
old_nokogiri_result = RbVmomi::OldDeserializer.new($conn).deserialize nokogiri_xml
|
53
|
-
new_nokogiri_result = RbVmomi::NewDeserializer.new($conn).deserialize nokogiri_xml
|
54
|
-
new_libxml_result = RbVmomi::NewDeserializer.new($conn).deserialize libxml_xml
|
55
|
-
|
56
|
-
if new_nokogiri_result != old_nokogiri_result
|
57
|
-
puts "new_nokogiri_result doesnt match old_nokogiri_result"
|
58
|
-
puts "old_nokogiri_result:"
|
59
|
-
pp old_nokogiri_result
|
60
|
-
puts "new_nokogiri_result:"
|
61
|
-
pp new_nokogiri_result
|
62
|
-
puts "diff:"
|
63
|
-
diff old_nokogiri_result, new_nokogiri_result
|
64
|
-
exit 1
|
65
|
-
end
|
66
|
-
|
67
|
-
if new_libxml_result != old_nokogiri_result
|
68
|
-
puts "new_libxml_result doesnt match old_nokogiri_result"
|
69
|
-
puts "old_nokogiri_result:"
|
70
|
-
pp old_nokogiri_result
|
71
|
-
puts "new_libxml_result:"
|
72
|
-
pp new_libxml_result
|
73
|
-
puts "diff:"
|
74
|
-
diff old_nokogiri_result, new_libxml_result
|
75
|
-
exit 1
|
76
|
-
end
|
77
|
-
|
78
|
-
puts "all results match"
|
79
|
-
end
|
80
|
-
|
81
|
-
Benchmark.bmbm do|b|
|
82
|
-
GC.start
|
83
|
-
b.report("nokogiri parsing") do
|
84
|
-
N.times { Nokogiri::XML(raw) }
|
85
|
-
end
|
86
|
-
|
87
|
-
GC.start
|
88
|
-
b.report("libxml parsing") do
|
89
|
-
N.times do
|
90
|
-
LibXML::XML::Parser.string(raw).parse
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
GC.start
|
95
|
-
b.report("old deserialization (nokogiri)") do
|
96
|
-
deserializer = RbVmomi::OldDeserializer.new($conn)
|
97
|
-
N.times do
|
98
|
-
deserializer.deserialize Nokogiri::XML(raw).root
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
GC.start
|
103
|
-
b.report("new deserialization (nokogiri)") do
|
104
|
-
deserializer = RbVmomi::NewDeserializer.new($conn)
|
105
|
-
N.times do
|
106
|
-
deserializer.deserialize Nokogiri::XML(raw).root
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
GC.start
|
111
|
-
b.report("new deserialization (libxml)") do
|
112
|
-
deserializer = RbVmomi::NewDeserializer.new($conn)
|
113
|
-
N.times do
|
114
|
-
deserializer.deserialize LibXML::XML::Parser.string(raw).parse.root
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|