rbvmomi 1.4.0 → 1.5.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.
@@ -6,7 +6,19 @@ class VIM::HostSystem
6
6
  end
7
7
 
8
8
  def dtm
9
- @cached_dtm ||= RetrieveDynamicTypeManager()
9
+ @cached_dtm ||= begin
10
+ RetrieveDynamicTypeManager()
11
+ rescue VIM::MethodNotFound
12
+ if summary.config.product.version >= '4.1.0'
13
+ if summary.config.product.version < '5.0.0' and direct?
14
+ VIM::InternalDynamicTypeManager(_connection, 'ha-dynamic-type-manager')
15
+ else
16
+ raise "esxcli not supported through VC before 5.0.0"
17
+ end
18
+ else
19
+ raise "esxcli not supported before 4.1.0"
20
+ end
21
+ end
10
22
  end
11
23
 
12
24
  def dti
@@ -2,39 +2,50 @@ class RbVmomi::VIM::ManagedEntity
2
2
  # Retrieve the ancestors of the entity.
3
3
  # @return [Array] Ancestors of this entity, starting with the root.
4
4
  def path
5
+ self.class.paths([self])[self]
6
+ end
7
+
8
+ # Retrieve the ancestors of a list of entries.
9
+ # @return [Hash] Object-indexed hash of ancestors of entities, starting with the root.
10
+ def self.paths objs
5
11
  filterSpec = RbVmomi::VIM.PropertyFilterSpec(
6
- :objectSet => [{
7
- :obj => self,
8
- :selectSet => [
9
- RbVmomi::VIM.TraversalSpec(
10
- :name => 'tsME',
11
- :type => 'ManagedEntity',
12
- :path => 'parent',
13
- :skip => false,
14
- :selectSet => [
15
- RbVmomi::VIM.SelectionSpec(:name => 'tsME')
16
- ]
17
- )
18
- ]
19
- }],
12
+ :objectSet => objs.map do |obj|
13
+ RbVmomi::VIM.ObjectSpec(
14
+ :obj => obj,
15
+ :selectSet => [
16
+ RbVmomi::VIM.TraversalSpec(
17
+ :name => "tsME",
18
+ :type => 'ManagedEntity',
19
+ :path => 'parent',
20
+ :skip => false,
21
+ :selectSet => [
22
+ RbVmomi::VIM.SelectionSpec(:name => "tsME")
23
+ ]
24
+ )
25
+ ]
26
+ )
27
+ end,
20
28
  :propSet => [{
21
29
  :pathSet => %w(name parent),
22
30
  :type => 'ManagedEntity'
23
31
  }]
24
32
  )
25
33
 
26
- result = @soap.propertyCollector.RetrieveProperties(:specSet => [filterSpec])
34
+ propCollector = objs.first._connection.propertyCollector
35
+ result = propCollector.RetrieveProperties(:specSet => [filterSpec])
27
36
 
28
- tree = {}
29
- result.each { |x| tree[x.obj] = [x['parent'], x['name']] }
30
- a = []
31
- cur = self
32
- while cur
33
- parent, name = *tree[cur]
34
- a << [cur, name]
35
- cur = parent
36
- end
37
- a.reverse
37
+ Hash[objs.map do |obj|
38
+ tree = {}
39
+ result.each { |x| tree[x.obj] = [x['parent'], x['name']] }
40
+ a = []
41
+ cur = obj
42
+ while cur
43
+ parent, name = *tree[cur]
44
+ a << [cur, name]
45
+ cur = parent
46
+ end
47
+ [obj, a.reverse]
48
+ end]
38
49
  end
39
50
 
40
51
  # Return a string representation of +path+ suitable for display.
@@ -8,13 +8,13 @@ class RbVmomi::VIM::ManagedObject
8
8
  # @todo Pass the current property values to the block.
9
9
  def wait_until *pathSet, &b
10
10
  all = pathSet.empty?
11
- filter = @soap.propertyCollector.CreateFilter :spec => {
11
+ filter = _connection.propertyCollector.CreateFilter :spec => {
12
12
  :propSet => [{ :type => self.class.wsdl_name, :all => all, :pathSet => pathSet }],
13
13
  :objectSet => [{ :obj => self }],
14
14
  }, :partialUpdates => false
15
15
  ver = ''
16
16
  loop do
17
- result = @soap.propertyCollector.WaitForUpdates(:version => ver)
17
+ result = _connection.propertyCollector.WaitForUpdates(:version => ver)
18
18
  ver = result.version
19
19
  if x = b.call
20
20
  return x
@@ -35,7 +35,7 @@ class RbVmomi::VIM::ManagedObject
35
35
  :type => self.class.wsdl_name
36
36
  }]
37
37
  }
38
- @soap.propertyCollector.RetrieveProperties(:specSet => [spec])[0].to_hash
38
+ _connection.propertyCollector.RetrieveProperties(:specSet => [spec])[0].to_hash
39
39
  end
40
40
 
41
41
  # Efficiently retrieve multiple properties from an object.
@@ -1,5 +1,7 @@
1
1
  class RbVmomi::VIM::PropertyCollector
2
2
  def collectMultiple objs, *pathSet
3
+ return {} if objs.empty?
4
+
3
5
  klasses = objs.map{|x| x.class}.uniq
4
6
  klass = if klasses.length > 1
5
7
  # common superclass
@@ -7,7 +9,7 @@ class RbVmomi::VIM::PropertyCollector
7
9
  else
8
10
  klasses.first
9
11
  end
10
-
12
+
11
13
  spec = {
12
14
  :objectSet => objs.map{|x| { :obj => x }},
13
15
  :propSet => [{
@@ -20,4 +22,4 @@ class RbVmomi::VIM::PropertyCollector
20
22
  [x.obj, x.to_hash]
21
23
  end]
22
24
  end
23
- end
25
+ end
@@ -4,7 +4,7 @@ class VIM::ReflectManagedMethodExecuter
4
4
  def fetch moid, prop
5
5
  result = FetchSoap(:moid => moid, :version => 'urn:vim25/5.0', :prop => prop)
6
6
  xml = Nokogiri(result.response)
7
- _connection.xml2obj xml.root, nil
7
+ _connection.deserializer.deserialize xml.root, nil
8
8
  end
9
9
 
10
10
  def execute moid, method, args
@@ -18,7 +18,7 @@ class VIM::ReflectManagedMethodExecuter
18
18
  end
19
19
  result = ExecuteSoap(:moid => moid, :version => 'urn:vim25/5.0',
20
20
  :method => method, :argument => soap_args)
21
- _connection.xml2obj Nokogiri(result.response).root, nil
21
+ _connection.deserializer.deserialize Nokogiri(result.response).root, nil
22
22
  end
23
23
  end
24
24
 
@@ -3,7 +3,7 @@ class RbVmomi::VIM::ResourcePool
3
3
  # @param name [String] Name of the child.
4
4
  # @return [VIM::ResourcePool]
5
5
  def find name
6
- @soap.searchIndex.FindChild(:entity => self, :name => name)
6
+ _connection.searchIndex.FindChild(:entity => self, :name => name)
7
7
  end
8
8
 
9
9
  # Retrieve a descendant of this ResourcePool.
@@ -15,4 +15,41 @@ class RbVmomi::VIM::ResourcePool
15
15
  f.find(e) || return
16
16
  end
17
17
  end
18
+
19
+ def resourcePoolSubTree fields = []
20
+ self.class.resourcePoolSubTree [self], fields
21
+ end
22
+
23
+ def self.resourcePoolSubTree objs, fields = []
24
+ fields = (fields + ['name', 'resourcePool']).uniq
25
+ filterSpec = RbVmomi::VIM.PropertyFilterSpec(
26
+ :objectSet => objs.map do |obj|
27
+ RbVmomi::VIM.ObjectSpec(
28
+ :obj => obj,
29
+ :selectSet => [
30
+ RbVmomi::VIM.TraversalSpec(
31
+ :name => "tsRP",
32
+ :type => 'ResourcePool',
33
+ :path => 'resourcePool',
34
+ :skip => false,
35
+ :selectSet => [
36
+ RbVmomi::VIM.SelectionSpec(:name => "tsRP")
37
+ ]
38
+ )
39
+ ]
40
+ )
41
+ end,
42
+ :propSet => [{
43
+ :pathSet => fields,
44
+ :type => 'ResourcePool'
45
+ }]
46
+ )
47
+
48
+ propCollector = objs.first._connection.propertyCollector
49
+ result = propCollector.RetrieveProperties(:specSet => [filterSpec])
50
+
51
+ Hash[result.map do |x|
52
+ [x.obj, x.to_hash]
53
+ end]
54
+ end
18
55
  end
@@ -23,14 +23,14 @@ class RbVmomi::VIM::ServiceInstance
23
23
  interested = (interested + ['info.state']).uniq
24
24
  task_props = Hash.new { |h,k| h[k] = {} }
25
25
 
26
- filter = @soap.propertyCollector.CreateFilter :spec => {
26
+ filter = _connection.propertyCollector.CreateFilter :spec => {
27
27
  :propSet => [{ :type => 'Task', :all => false, :pathSet => interested }],
28
28
  :objectSet => tasks.map { |x| { :obj => x } },
29
29
  }, :partialUpdates => false
30
30
 
31
31
  begin
32
32
  until task_props.size == tasks.size and task_props.all? { |k,h| %w(success error).member? h['info.state'] }
33
- result = @soap.propertyCollector.WaitForUpdates(:version => version)
33
+ result = _connection.propertyCollector.WaitForUpdates(:version => version)
34
34
  version = result.version
35
35
  os = result.filterSet[0].objectSet
36
36
 
@@ -46,7 +46,7 @@ class RbVmomi::VIM::ServiceInstance
46
46
  yield task_props if block_given?
47
47
  end
48
48
  ensure
49
- @soap.propertyCollector.CancelWaitForUpdates
49
+ _connection.propertyCollector.CancelWaitForUpdates
50
50
  filter.DestroyPropertyFilter
51
51
  end
52
52
 
@@ -1,14 +1,13 @@
1
- require 'test/unit'
2
- require 'rbvmomi'
3
- VIM = RbVmomi::VIM unless Object.const_defined? :VIM
1
+ require 'test_helper'
4
2
 
5
3
  class DeserializationTest < Test::Unit::TestCase
6
4
  def setup
7
- @soap = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
5
+ conn = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
6
+ @deserializer = RbVmomi::Deserializer.new conn
8
7
  end
9
8
 
10
9
  def check str, expected, type
11
- got = @soap.xml2obj Nokogiri(str).root, type
10
+ got = @deserializer.deserialize Nokogiri(str).root, type
12
11
  assert_equal expected, got
13
12
  end
14
13
 
@@ -37,14 +36,14 @@ class DeserializationTest < Test::Unit::TestCase
37
36
 
38
37
  check <<-EOS, obj, 'DatastoreSummary'
39
38
  <root>
40
- <capacity>1000</capacity>
41
- <accessible>1</accessible>
42
39
  <datastore type="Datastore">foo</datastore>
40
+ <name>baz</name>
41
+ <url>http://foo/</url>
42
+ <capacity>1000</capacity>
43
43
  <freeSpace>31</freeSpace>
44
+ <accessible>1</accessible>
44
45
  <multipleHostAccess>false</multipleHostAccess>
45
- <name>baz</name>
46
46
  <type>VMFS</type>
47
- <url>http://foo/</url>
48
47
  </root>
49
48
  EOS
50
49
  end
@@ -292,4 +291,90 @@ end
292
291
  </root>
293
292
  EOS
294
293
  end
294
+
295
+ def test_boolean
296
+ check "<root>1</root>", true, 'xsd:boolean'
297
+ check "<root>true</root>", true, 'xsd:boolean'
298
+ check "<root>0</root>", false, 'xsd:boolean'
299
+ check "<root>false</root>", false, 'xsd:boolean'
300
+ end
301
+
302
+ def test_int
303
+ check "<root>5</root>", 5, 'xsd:byte'
304
+ check "<root>5</root>", 5, 'xsd:short'
305
+ check "<root>5</root>", 5, 'xsd:int'
306
+ check "<root>5</root>", 5, 'xsd:long'
307
+ end
308
+
309
+ def test_float
310
+ obj = 1.2
311
+ check <<-EOS, obj, 'xsd:float'
312
+ <root>1.2</root>
313
+ EOS
314
+ end
315
+
316
+ def test_date
317
+ time_str = '2010-08-20T05:44:35.0Z'
318
+ obj = Time.parse(time_str)
319
+ check <<-EOS, obj, 'xsd:dateTime'
320
+ <root>#{time_str}</root>
321
+ EOS
322
+ end
323
+
324
+ def test_array_mangling
325
+ obj = ["foo"]
326
+ check <<-EOS, obj, 'ArrayOfString'
327
+ <root><e>foo</e></root>
328
+ EOS
329
+
330
+ time_str = '2010-08-20T05:44:35.0Z'
331
+ obj = [Time.parse(time_str)]
332
+ check <<-EOS, obj, 'ArrayOfDateTime'
333
+ <root><e>#{time_str}</e></root>
334
+ EOS
335
+
336
+ obj = [1]
337
+ check <<-EOS, obj, 'ArrayOfAnyType'
338
+ <root xmlns:xsi="#{VIM::NS_XSI}">
339
+ <e xsi:type="xsd:int">1</e>
340
+ </root>
341
+ EOS
342
+ end
343
+
344
+ def test_propertypath
345
+ check "<root>foo</root>", "foo", 'PropertyPath'
346
+ end
347
+
348
+ def test_methodname
349
+ check "<root>foo</root>", "foo", 'MethodName'
350
+ end
351
+
352
+ def test_typename
353
+ check "<root>foo</root>", "foo", 'TypeName'
354
+ end
355
+
356
+ def test_new_fields
357
+ obj = VIM::HostBlockHba(
358
+ :dynamicProperty => [],
359
+ :key => 'key-vim.host.BlockHba-vmhba0',
360
+ :device => 'vmhba0',
361
+ :bus => 0,
362
+ :status => 'unknown',
363
+ :model => 'Virtual Machine Chipset',
364
+ :driver => 'ata_piix',
365
+ :pci => '00:07.1')
366
+
367
+ check <<-EOS, obj, "HostBlockHba"
368
+ <hostBusAdapter xsi:type="HostBlockHba">
369
+ <key>key-vim.host.BlockHba-vmhba0</key>
370
+ <device>vmhba0</device>
371
+ <bus>0</bus>
372
+ <status>unknown</status>
373
+ <foo>bar</foo>
374
+ <model>Virtual Machine Chipset</model>
375
+ <driver>ata_piix</driver>
376
+ <pci>00:07.1</pci>
377
+ </hostBusAdapter>
378
+ EOS
379
+ end
295
380
  end
@@ -1,6 +1,4 @@
1
- require 'test/unit'
2
- require 'rbvmomi'
3
- VIM = RbVmomi::VIM unless Object.const_defined? :VIM
1
+ require 'test_helper'
4
2
 
5
3
  class EmitRequestTest < Test::Unit::TestCase
6
4
  MO = VIM::VirtualMachine(nil, "foo")
@@ -1,6 +1,4 @@
1
- require 'test/unit'
2
- require 'rbvmomi'
3
- VIM = RbVmomi::VIM unless Object.const_defined? :VIM
1
+ require 'test_helper'
4
2
 
5
3
  class ExceptionTest < Test::Unit::TestCase
6
4
  def test_fault
@@ -0,0 +1,14 @@
1
+ coverage_tool = :simplecov if ENV['RBVMOMI_COVERAGE']
2
+
3
+ case coverage_tool
4
+ when :simplecov
5
+ require 'simplecov'
6
+ SimpleCov.start
7
+ when :cover_me
8
+ require 'cover_me'
9
+ end
10
+
11
+ require 'rbvmomi'
12
+ VIM = RbVmomi::VIM
13
+
14
+ require 'test/unit'
@@ -1,6 +1,4 @@
1
- require 'test/unit'
2
- require 'rbvmomi'
3
- VIM = RbVmomi::VIM unless Object.const_defined? :VIM
1
+ require 'test_helper'
4
2
 
5
3
  class MiscTest < Test::Unit::TestCase
6
4
  def test_overridden_const
@@ -16,5 +14,11 @@ class MiscTest < Test::Unit::TestCase
16
14
  assert(VIM::ClusterAttemptedVmInfo < RbVmomi::BasicTypes::Base)
17
15
  assert_equal 'ClusterAttemptedVmInfo', VIM::ClusterAttemptedVmInfo.wsdl_name
18
16
  end
17
+
18
+ def test_loader
19
+ klass = VIM.loader.get('HostSystem')
20
+ klass2 = VIM::HostSystem
21
+ assert_equal klass, klass2
22
+ end
19
23
  end
20
24
 
@@ -1,6 +1,4 @@
1
- require 'test/unit'
2
- require 'rbvmomi'
3
- VIM = RbVmomi::VIM unless Object.const_defined? :VIM
1
+ require 'test_helper'
4
2
 
5
3
  class ParseResponseTest < Test::Unit::TestCase
6
4
  def check desc, str, expected
@@ -1,12 +1,10 @@
1
- require 'test/unit'
2
- require 'rbvmomi'
3
- VIM = RbVmomi::VIM unless Object.const_defined? :VIM
1
+ require 'test_helper'
4
2
 
5
3
  class SerializationTest < Test::Unit::TestCase
6
4
  def check str, obj, type, array=false
7
- @soap = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
5
+ conn = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
8
6
  xml = Builder::XmlMarkup.new :indent => 2
9
- @soap.obj2xml(xml, 'root', type, array, obj)
7
+ conn.obj2xml(xml, 'root', type, array, obj)
10
8
 
11
9
  begin
12
10
  assert_equal str, xml.target!
@@ -226,4 +224,18 @@ class SerializationTest < Test::Unit::TestCase
226
224
  </root>
227
225
  EOS
228
226
  end
227
+
228
+ def test_datetime
229
+ obj = DateTime.new(2011, 11, 16, 13, 36, 8, Rational(-8,24))
230
+ check <<-EOS, obj, 'xsd:dateTime', false
231
+ <root>2011-11-16T13:36:08-08:00</root>
232
+ EOS
233
+ end
234
+
235
+ def test_time
236
+ obj = Time.at DateTime.new(2011, 11, 16, 13, 36, 8, Rational(-8,24)).strftime("%s").to_i
237
+ check <<-EOS, obj, 'xsd:dateTime', false
238
+ <root>2011-11-16T13:36:08-08:00</root>
239
+ EOS
240
+ end
229
241
  end