rbvmomi2 3.3.0 → 3.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3cd7c8f7c07cfc8e042bc125747b279ff88430ab531068b3bb56aeb937ec5009
4
- data.tar.gz: 1c76cde83a228ac728cdd747b3367a32d19a2a98c7c07eb796a2a73fd414fd2b
3
+ metadata.gz: ca23adf85e7f9aa7fc531ed9c16e45a07c4ed9aedc6725afed17b94aa978c45b
4
+ data.tar.gz: 3b2be36f622eb5ac2311315ce3a39e75245e91684fb22a3fb7574e58fc33375f
5
5
  SHA512:
6
- metadata.gz: d9779867969725d9d0eeb72fda7193e5a6e8725cc53a5d4c41518089203657ca7eb30ed8bbcf1f5e17f7a48aec52accbb975fb32e6d19a9a63c1c01d2796d560
7
- data.tar.gz: 88421663c3b937da0fe46cb021c3f17830670738cb5297851db5ee3a0a605b994c5c12d3402b835d6418481f5348d4a6e3cb8a354d6cc67192597527bc8bcfad
6
+ metadata.gz: 429eb97268d0b4be01876bb6b19371726e7177589418fe7fcae34729b77fc333e19e0d897fbcb6fd3aa5d988b4ed9b36c396e2f2ffb990bd20921dd93052eb52
7
+ data.tar.gz: 037b902b0da661ddc142c2a5eb27df979ac9b91db18c778ec40f102bc094ef16fd9b0f575d290d15299dbe7361ec1cbadbc43f921795615b5acddcc29c20f3ae
@@ -3,5 +3,5 @@
3
3
  # SPDX-License-Identifier: MIT
4
4
 
5
5
  module RbVmomi
6
- VERSION = '3.3.0'.freeze
6
+ VERSION = '3.4.0'.freeze
7
7
  end
@@ -50,7 +50,7 @@ class VmodlHelper
50
50
  def verify!
51
51
  # Loop through the ComplexTypes in the WSDL and compare their types
52
52
  # to the types which are defined in the vmodl.db
53
- wsdl_types_by_name.each_value do |type|
53
+ wsdl_classes_by_name.each_value do |type|
54
54
  type_name = type.name.name
55
55
  vmodl_data = @vmodl[type_name]
56
56
 
@@ -60,7 +60,7 @@ class VmodlHelper
60
60
  #
61
61
  # Print a warning that the type is missing and skip it.
62
62
  if vmodl_data.nil?
63
- puts " #{type_name} is missing"
63
+ puts " class #{type_name} is missing"
64
64
  next
65
65
  end
66
66
 
@@ -82,42 +82,49 @@ class VmodlHelper
82
82
  puts "#{type_name}.#{vmodl_prop["name"]} #{wsdl_klass.wsdl_name} doesn't match #{vmodl_klass.wsdl_name}" unless vmodl_klass <= wsdl_klass
83
83
  end
84
84
  end
85
+
86
+ # Loop through the SimpleTypes (enums) in the WSDL
87
+ wsdl_enums_by_name.each_value do |enum|
88
+ enum_name = enum.name.name
89
+ vmodl_data = @vmodl[enum_name]
90
+
91
+ if vmodl_data.nil?
92
+ puts " enum #{enum_name} is missing"
93
+ next
94
+ end
95
+ end
85
96
  end
86
97
 
87
98
  def generate!
88
- wsdl_types_by_name.each_value do |type|
89
- type_name = type.name.name
90
- vmodl_data = @vmodl[type_name]
99
+ wsdl_classes_by_name.each_value do |type|
100
+ type_name = type.name.name
91
101
 
92
- if vmodl_data.nil?
93
- base_class = wsdl_types_by_name[type.complexcontent.extension.base.name]
94
- inherited_properties = base_class.elements.map { |element| element.name.name }
95
- properties = type.elements.reject { |e| inherited_properties.include?(e.name.name) }
96
-
97
- vmodl_data = {
98
- 'kind' => 'data',
99
- 'props' => properties.map do |element|
100
- {
101
- 'name' => element.name.name,
102
- 'is-optional' => element.minoccurs == 0,
103
- 'is-array' => element.maxoccurs != 1,
104
- 'version-id-ref' => nil,
105
- 'wsdl_type' => wsdl_to_vmodl_type(element.type)
106
- }
107
- end,
108
- 'wsdl_base' => type.complexcontent.extension.base.name
109
- }
110
-
111
- @vmodl[type_name] = vmodl_data
112
- @vmodl['_typenames']['_typenames'] << type_name
113
-
114
- puts "Adding #{type_name} to vmodl"
115
-
116
- wsdl_to_rbvmomi_namespace(type).loader.add_types type_name => vmodl_data
102
+ # Update the existing vmodl object if it exists otherwise instantiate a
103
+ # new one.
104
+ vmodl_data = @vmodl[type_name] || build_wsdl_class!(type)
105
+ props_by_name = vmodl_data['props'].index_by { |prop| prop['name'] }
106
+
107
+ vmodl_data['props'] = wsdl_properties(type).map do |element|
108
+ # NOTE we should prioritize the existing property hash over building a
109
+ # new one because the generic ManagedObjectReferences are manually
110
+ # replaced with their specific counterparts (e.g. Datastore) which
111
+ # cannot be computed programmatically.
112
+ props_by_name[element.name.name] || build_vmodl_property(element)
117
113
  end
114
+
115
+ # Some types (e.g. ManagedObjectReference) have extra properties which are
116
+ # not present in the WSDL but are required for proper function of RbVmomi.
117
+ vmodl_data['props'] += extra_props_for_type(type_name)
118
118
  end
119
119
 
120
- wsdl_types_by_name.each_value do |type|
120
+ wsdl_enums_by_name.each_value do |enum|
121
+ enum_name = enum.name.name
122
+
123
+ vmodl_data = @vmodl[enum_name] || build_wsdl_enum(enum)
124
+ vmodl_data['values'] = enum.restriction.enumeration
125
+ end
126
+
127
+ wsdl_classes_by_name.each_value do |type|
121
128
  type_name = type.name.name
122
129
  vmodl_data = @vmodl[type_name]
123
130
 
@@ -159,12 +166,77 @@ class VmodlHelper
159
166
 
160
167
  private
161
168
 
162
- def wsdl_types_by_name
163
- @wsdl_types_by_name ||= @wsdl.collect_complextypes
169
+ def build_wsdl_class!(type)
170
+ type_name = type.name.name
171
+
172
+ puts "Adding class #{type_name} to vmodl"
173
+
174
+ vmodl_obj = {'kind' => 'data', 'props' => [], 'wsdl_base' => type.complexcontent.extension.base.name}
175
+
176
+ @vmodl[type_name] = vmodl_obj
177
+ @vmodl['_typenames']['_typenames'] << type_name
178
+
179
+ wsdl_to_rbvmomi_namespace(type).loader.add_types(type_name => vmodl_obj)
180
+
181
+ vmodl_obj
182
+ end
183
+
184
+ def build_wsdl_enum(enum)
185
+ enum_name = enum.name.name
186
+
187
+ puts "Adding enum #{enum_name} to vmodl"
188
+
189
+ vmodl_obj = {'kind' => 'enum', 'values' => []}
190
+
191
+ @vmodl[enum_name] = vmodl_obj
192
+ @vmodl['_typenames']['_typenames'] << enum_name
193
+
194
+ wsdl_to_rbvmomi_namespace(enum).loader.add_types(enum_name => vmodl_obj)
195
+
196
+ vmodl_obj
197
+ end
198
+
199
+ def build_vmodl_property(element)
200
+ {
201
+ 'name' => element.name.name,
202
+ 'is-optional' => element.minoccurs == 0,
203
+ 'is-array' => element.maxoccurs != 1,
204
+ 'version-id-ref' => nil,
205
+ 'wsdl_type' => wsdl_to_vmodl_type(element.type)
206
+ }
207
+ end
208
+
209
+ def wsdl_properties(type)
210
+ base_class = wsdl_classes_by_name[type.complexcontent&.extension&.base&.name]
211
+ if base_class
212
+ inherited_properties = base_class.elements.map { |element| element.name.name }
213
+ type.elements.reject { |e| inherited_properties.include?(e.name.name) }
214
+ else
215
+ type.elements
216
+ end
217
+ end
218
+
219
+ def extra_props_for_type(type)
220
+ @extra_props_for_type ||= {
221
+ 'ManagedObjectReference' => [
222
+ {'name' => 'type', 'is-optional' => false, 'is-array' => false, 'version-id-ref' => nil, 'wsdl_type' => 'xsd:string'},
223
+ {'name' => 'value', 'is-optional' => false, 'is-array' => false, 'version-id-ref' => nil, 'wsdl_type' => 'xsd:string'}
224
+ ]
225
+ }
226
+
227
+ @extra_props_for_type[type] || []
228
+ end
229
+
230
+ def wsdl_classes_by_name
231
+ @wsdl_classes_by_name ||= @wsdl.collect_complextypes
164
232
  .reject { |type| type.name.name.match?(/^ArrayOf|RequestType$/) }
165
233
  .index_by { |type| type.name.name }
166
234
  end
167
235
 
236
+ def wsdl_enums_by_name
237
+ @wsdl_enums_by_name ||= @wsdl.collect_simpletypes.index_by { |type| type.name.name }
238
+ end
239
+
168
240
  def wsdl_to_vmodl_type(type)
169
241
  case type.source
170
242
  when /vim25:/, /pbm:/, /sms:/
@@ -180,7 +252,7 @@ class VmodlHelper
180
252
 
181
253
  def wsdl_to_rbvmomi_namespace(type)
182
254
  case type.targetnamespace
183
- when 'urb:vim25'
255
+ when 'urn:vim25'
184
256
  RbVmomi::VIM
185
257
  when 'urn:pbm'
186
258
  RbVmomi::PBM
@@ -201,6 +273,6 @@ class VmodlHelper
201
273
  type = 'ManagedObject' if type == 'ManagedObjectReference'
202
274
 
203
275
  type = type.camelcase
204
- type.safe_constantize || "RbVmomi::BasicTypes::#{type}".safe_constantize || "RbVmomi::VIM::#{type}".safe_constantize
276
+ type.safe_constantize || "RbVmomi::BasicTypes::#{type}".safe_constantize || "#{wsdl_to_rbvmomi_namespace(@wsdl)}::#{type}".safe_constantize
205
277
  end
206
278
  end
data/vmodl.db CHANGED
Binary file
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbvmomi2
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam Grare
8
8
  - Jason Frey
9
- autorequire:
9
+ autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2022-03-10 00:00:00.000000000 Z
12
+ date: 2022-09-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: builder
@@ -93,14 +93,14 @@ dependencies:
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.13.1
96
+ version: 0.14.1
97
97
  type: :development
98
98
  prerelease: false
99
99
  version_requirements: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.13.1
103
+ version: 0.14.1
104
104
  - !ruby/object:Gem::Dependency
105
105
  name: rake
106
106
  requirement: !ruby/object:Gem::Requirement
@@ -185,7 +185,7 @@ dependencies:
185
185
  - - "~>"
186
186
  - !ruby/object:Gem::Version
187
187
  version: 0.9.25
188
- description:
188
+ description:
189
189
  email:
190
190
  - adam@grare.com
191
191
  - fryguy9@gmail.com
@@ -245,7 +245,7 @@ homepage: https://github.com/ManageIQ/rbvmomi2
245
245
  licenses:
246
246
  - MIT
247
247
  metadata: {}
248
- post_install_message:
248
+ post_install_message:
249
249
  rdoc_options: []
250
250
  require_paths:
251
251
  - lib
@@ -260,8 +260,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
260
260
  - !ruby/object:Gem::Version
261
261
  version: '0'
262
262
  requirements: []
263
- rubygems_version: 3.3.5
264
- signing_key:
263
+ rubygems_version: 3.3.15
264
+ signing_key:
265
265
  specification_version: 4
266
266
  summary: Ruby interface to the VMware vSphere API
267
267
  test_files: []