rbvmomi 1.1.0 → 1.1.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.
- data/.yardopts +1 -0
- data/README.rdoc +5 -2
- data/Rakefile +2 -1
- data/VERSION +1 -1
- data/devel/analyze-vim-declarations.rb +1 -1
- data/examples/create_vm.rb +35 -36
- data/examples/extraConfig.rb +2 -2
- data/examples/power.rb +3 -1
- data/examples/readme-2.rb +5 -5
- data/examples/run.sh +39 -0
- data/lib/rbvmomi/trollop.rb +13 -12
- data/lib/rbvmomi/vim/ComputeResource.rb +18 -18
- data/lib/rbvmomi/vim/Datastore.rb +2 -2
- data/lib/rbvmomi/vim/Folder.rb +16 -16
- data/lib/rbvmomi/vim/ManagedEntity.rb +13 -13
- data/lib/rbvmomi/vim/ManagedObject.rb +6 -6
- data/lib/rbvmomi/vim/OvfManager.rb +20 -20
- data/lib/rbvmomi/vim/ResourcePool.rb +1 -1
- data/lib/rbvmomi/vim/ServiceInstance.rb +1 -1
- data/test/test_deserialization.rb +73 -73
- data/test/test_emit_request.rb +4 -4
- data/test/test_exceptions.rb +2 -2
- data/test/test_parse_response.rb +2 -2
- data/test/test_serialization.rb +37 -37
- metadata +14 -6
data/.yardopts
CHANGED
data/README.rdoc
CHANGED
@@ -8,6 +8,10 @@ supports the vSphere 4.1 API. RbVmomi specific documentation is
|
|
8
8
|
online[http://rdoc.info/github/rlane/rbvmomi/master/frames] and is meant to
|
9
9
|
be used alongside the official documentation[http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/index.html].
|
10
10
|
|
11
|
+
== Installation
|
12
|
+
|
13
|
+
gem install rbvmomi
|
14
|
+
|
11
15
|
== Usage
|
12
16
|
|
13
17
|
A simple example of turning on a VM:
|
@@ -52,9 +56,8 @@ in the first example uses the SearchIndex for fast lookups.
|
|
52
56
|
|
53
57
|
A few important points:
|
54
58
|
|
55
|
-
* Ruby 1.9 is required.
|
56
|
-
* Properties are exposed as accessor methods.
|
57
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.
|
58
61
|
* Data object types can usually be inferred from context, so you may use a hash instead.
|
59
62
|
* Enumeration values are simply strings.
|
60
63
|
* Example code is included in the examples/ directory.
|
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ begin
|
|
6
6
|
require 'jeweler'
|
7
7
|
Jeweler::Tasks.new do |gem|
|
8
8
|
gem.name = "rbvmomi"
|
9
|
-
gem.summary = "Ruby interface to the
|
9
|
+
gem.summary = "Ruby interface to the VMware vSphere API"
|
10
10
|
#gem.description = ""
|
11
11
|
gem.email = "rlane@vmware.com"
|
12
12
|
gem.homepage = "https://github.com/rlane/rbvmomi"
|
@@ -17,6 +17,7 @@ begin
|
|
17
17
|
gem.add_dependency 'cdb-full'
|
18
18
|
gem.required_ruby_version = '>= 1.9.1'
|
19
19
|
gem.files.include 'vmodl.cdb'
|
20
|
+
gem.files.include '.yardopts'
|
20
21
|
end
|
21
22
|
rescue LoadError
|
22
23
|
puts "Jeweler not available. Install it with: gem install jeweler"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.1
|
@@ -2,7 +2,7 @@
|
|
2
2
|
require 'nokogiri'
|
3
3
|
require 'cdb'
|
4
4
|
|
5
|
-
# usage
|
5
|
+
# :usage => analyze-vim-declarations.rb vim-declarations.xml foo-declarations.xml vmodl.db
|
6
6
|
|
7
7
|
XML_FNS = ARGV[0...-1]
|
8
8
|
abort "must specify path to vim-declarations.xml" if XML_FNS.empty?
|
data/examples/create_vm.rb
CHANGED
@@ -4,11 +4,10 @@ require 'rbvmomi'
|
|
4
4
|
require 'rbvmomi/trollop'
|
5
5
|
|
6
6
|
VIM = RbVmomi::VIM
|
7
|
-
N = 2
|
8
7
|
|
9
8
|
opts = Trollop.options do
|
10
9
|
banner <<-EOS
|
11
|
-
Create
|
10
|
+
Create a VM.
|
12
11
|
|
13
12
|
Usage:
|
14
13
|
create_vm.rb [options]
|
@@ -41,52 +40,52 @@ hosts = dc.hostFolder.children
|
|
41
40
|
rp = hosts.first.resourcePool
|
42
41
|
|
43
42
|
vm_cfg = {
|
44
|
-
name
|
45
|
-
guestId
|
46
|
-
files
|
47
|
-
numCPUs
|
48
|
-
memoryMB
|
49
|
-
deviceChange
|
43
|
+
:name => vm_name,
|
44
|
+
:guestId => 'otherGuest',
|
45
|
+
:files => { :vmPathName => '[datastore1]' },
|
46
|
+
:numCPUs => 1,
|
47
|
+
:memoryMB => 128,
|
48
|
+
:deviceChange => [
|
50
49
|
{
|
51
|
-
operation
|
52
|
-
device
|
53
|
-
key
|
54
|
-
busNumber
|
55
|
-
sharedBus
|
50
|
+
:operation => :add,
|
51
|
+
:device => VIM.VirtualLsiLogicController(
|
52
|
+
:key => 1000,
|
53
|
+
:busNumber => 0,
|
54
|
+
:sharedBus => :noSharing
|
56
55
|
)
|
57
56
|
}, {
|
58
|
-
operation
|
59
|
-
fileOperation
|
60
|
-
device
|
61
|
-
key
|
62
|
-
backing
|
63
|
-
fileName
|
64
|
-
diskMode
|
65
|
-
thinProvisioned
|
57
|
+
:operation => :add,
|
58
|
+
:fileOperation => :create,
|
59
|
+
:device => VIM.VirtualDisk(
|
60
|
+
:key => 0,
|
61
|
+
:backing => VIM.VirtualDiskFlatVer2BackingInfo(
|
62
|
+
:fileName => '[datastore1]',
|
63
|
+
:diskMode => :persistent,
|
64
|
+
:thinProvisioned => true
|
66
65
|
),
|
67
|
-
controllerKey
|
68
|
-
unitNumber
|
69
|
-
capacityInKB
|
66
|
+
:controllerKey => 1000,
|
67
|
+
:unitNumber => 0,
|
68
|
+
:capacityInKB => 4000000
|
70
69
|
)
|
71
70
|
}, {
|
72
|
-
operation
|
73
|
-
device
|
74
|
-
key
|
75
|
-
deviceInfo
|
76
|
-
label
|
77
|
-
summary
|
71
|
+
:operation => :add,
|
72
|
+
:device => VIM.VirtualE1000(
|
73
|
+
:key => 0,
|
74
|
+
:deviceInfo => {
|
75
|
+
:label => 'Network Adapter 1',
|
76
|
+
:summary => 'VM Network'
|
78
77
|
},
|
79
|
-
backing
|
80
|
-
deviceName
|
78
|
+
:backing => VIM.VirtualEthernetCardNetworkBackingInfo(
|
79
|
+
:deviceName => 'VM Network'
|
81
80
|
),
|
82
|
-
addressType
|
81
|
+
:addressType => 'generated'
|
83
82
|
)
|
84
83
|
}
|
85
84
|
],
|
86
|
-
extraConfig
|
85
|
+
:extraConfig => [
|
87
86
|
{
|
88
|
-
key
|
89
|
-
value
|
87
|
+
:key => 'bios.bootOrder',
|
88
|
+
:value => 'ethernet0'
|
90
89
|
}
|
91
90
|
]
|
92
91
|
}
|
data/examples/extraConfig.rb
CHANGED
@@ -49,6 +49,6 @@ case cmd
|
|
49
49
|
when 'list'
|
50
50
|
vm.config.extraConfig.each { |x| puts "#{x.key}: #{x.value}" }
|
51
51
|
when 'set'
|
52
|
-
extraConfig = ARGV.map { |x| x.split("=", 2) }.map { |k,v| { key
|
53
|
-
vm.ReconfigVM_Task(spec
|
52
|
+
extraConfig = ARGV.map { |x| x.split("=", 2) }.map { |k,v| { :key => k, :value => v } }
|
53
|
+
vm.ReconfigVM_Task(:spec => VIM.VirtualMachineConfigSpec(:extraConfig => extraConfig)).wait_for_completion
|
54
54
|
end
|
data/examples/power.rb
CHANGED
@@ -3,7 +3,7 @@ require 'rbvmomi'
|
|
3
3
|
require 'rbvmomi/trollop'
|
4
4
|
|
5
5
|
VIM = RbVmomi::VIM
|
6
|
-
CMDS = %w(on off reset suspend)
|
6
|
+
CMDS = %w(on off reset suspend destroy)
|
7
7
|
|
8
8
|
opts = Trollop.options do
|
9
9
|
banner <<-EOS
|
@@ -52,6 +52,8 @@ when 'reset'
|
|
52
52
|
vm.ResetVM_Task.wait_for_completion
|
53
53
|
when 'suspend'
|
54
54
|
vm.SuspendVM_Task.wait_for_completion
|
55
|
+
when 'destroy'
|
56
|
+
vm.Destroy_Task.wait_for_completion
|
55
57
|
else
|
56
58
|
abort "invalid command"
|
57
59
|
end
|
data/examples/readme-2.rb
CHANGED
@@ -35,15 +35,15 @@ dc = rootFolder.childEntity.grep(RbVmomi::VIM::Datacenter).find { |x| x.name ==
|
|
35
35
|
vm = dc.vmFolder.childEntity.grep(RbVmomi::VIM::VirtualMachine).find { |x| x.name == vm_name } or fail "VM not found"
|
36
36
|
task = vm.PowerOnVM_Task
|
37
37
|
filter = vim.propertyCollector.CreateFilter(
|
38
|
-
spec
|
39
|
-
propSet
|
40
|
-
objectSet
|
38
|
+
:spec => {
|
39
|
+
:propSet => [{ :type => 'Task', :all => false, :pathSet => ['info.state']}],
|
40
|
+
:objectSet => [{ :obj => task }]
|
41
41
|
},
|
42
|
-
partialUpdates
|
42
|
+
:partialUpdates => false
|
43
43
|
)
|
44
44
|
ver = ''
|
45
45
|
while true
|
46
|
-
result = vim.propertyCollector.WaitForUpdates(version
|
46
|
+
result = vim.propertyCollector.WaitForUpdates(:version => ver)
|
47
47
|
ver = result.version
|
48
48
|
break if ['success', 'error'].member? task.info.state
|
49
49
|
end
|
data/examples/run.sh
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
set -e
|
3
|
+
|
4
|
+
if [ -z "$RBVMOMI_HOST" ]
|
5
|
+
then
|
6
|
+
echo "export at least RBVMOMI_HOST"
|
7
|
+
exit 1
|
8
|
+
fi
|
9
|
+
|
10
|
+
EXAMPLES="$(dirname $(which $0))"
|
11
|
+
export RUBYOPT="-I$EXAMPLES/../lib -rubygems"
|
12
|
+
|
13
|
+
source "$HOME/.rvm/scripts/rvm"
|
14
|
+
rvm use 1.8.7
|
15
|
+
ruby -v
|
16
|
+
RUBY=ruby
|
17
|
+
|
18
|
+
echo Creating VM
|
19
|
+
$RUBY $EXAMPLES/create_vm.rb foo
|
20
|
+
echo Powering on VM
|
21
|
+
$RUBY $EXAMPLES/power.rb on foo
|
22
|
+
echo Resetting VM
|
23
|
+
$RUBY $EXAMPLES/power.rb reset foo
|
24
|
+
echo Powering off VM
|
25
|
+
$RUBY $EXAMPLES/power.rb off foo
|
26
|
+
echo "Powering on VM (1)"
|
27
|
+
$RUBY $EXAMPLES/readme-1.rb foo
|
28
|
+
echo Powering off VM
|
29
|
+
$RUBY $EXAMPLES/power.rb off foo
|
30
|
+
echo "Powering on VM (2)"
|
31
|
+
$RUBY $EXAMPLES/readme-2.rb foo
|
32
|
+
echo "Setting extraConfig"
|
33
|
+
$RUBY $EXAMPLES/extraConfig.rb foo set guestinfo.bar=baz
|
34
|
+
echo "Listing extraConfig"
|
35
|
+
$RUBY $EXAMPLES/extraConfig.rb foo list | grep guestinfo.bar
|
36
|
+
echo Powering off VM
|
37
|
+
$RUBY $EXAMPLES/power.rb off foo
|
38
|
+
echo Destroying VM
|
39
|
+
$RUBY $EXAMPLES/power.rb destroy foo
|
data/lib/rbvmomi/trollop.rb
CHANGED
@@ -1,33 +1,34 @@
|
|
1
1
|
# Copyright (c) 2011 VMware, Inc. All Rights Reserved.
|
2
2
|
require 'trollop'
|
3
3
|
|
4
|
+
# @todo Document
|
4
5
|
module Trollop
|
5
6
|
class Parser
|
6
7
|
def rbvmomi_connection_opts
|
7
|
-
opt :host, "host", type
|
8
|
-
opt :port, "port", type
|
9
|
-
opt :"no-ssl", "don't use ssl", short
|
10
|
-
opt :insecure, "don't verify ssl certificate", short
|
11
|
-
opt :user, "username", short
|
12
|
-
opt :password, "password", short
|
13
|
-
opt :path, "SOAP endpoint path", short
|
14
|
-
opt :debug, "Log SOAP messages", short
|
8
|
+
opt :host, "host", :type => :string, :short => 'o', :default => ENV['RBVMOMI_HOST']
|
9
|
+
opt :port, "port", :type => :int, :short => :none, :default => (ENV.member?('RBVMOMI_PORT') ? ENV['RBVMOMI_PORT'].to_i : 443)
|
10
|
+
opt :"no-ssl", "don't use ssl", :short => :none, :default => (ENV['RBVMOMI_SSL'] == '0')
|
11
|
+
opt :insecure, "don't verify ssl certificate", :short => 'k', :default => (ENV['RBVMOMI_INSECURE'] == '1')
|
12
|
+
opt :user, "username", :short => 'u', :default => (ENV['RBVMOMI_USER'] || 'root')
|
13
|
+
opt :password, "password", :short => 'p', :default => (ENV['RBVMOMI_PASSWORD'] || '')
|
14
|
+
opt :path, "SOAP endpoint path", :short => :none, :default => (ENV['RBVMOMI_PATH'] || '/sdk')
|
15
|
+
opt :debug, "Log SOAP messages", :short => 'd'
|
15
16
|
end
|
16
17
|
|
17
18
|
def rbvmomi_datacenter_opt
|
18
|
-
opt :datacenter, "datacenter", type
|
19
|
+
opt :datacenter, "datacenter", :type => :string, :short => "D", :default => (ENV['RBVMOMI_DATACENTER'] || 'ha-datacenter')
|
19
20
|
end
|
20
21
|
|
21
22
|
def rbvmomi_folder_opt
|
22
|
-
opt :folder, "VM folder", type
|
23
|
+
opt :folder, "VM folder", :type => :string, :short => "F", :default => (ENV['RBVMOMI_FOLDER'] || '')
|
23
24
|
end
|
24
25
|
|
25
26
|
def rbvmomi_computer_opt
|
26
|
-
opt :computer, "Compute resource", type
|
27
|
+
opt :computer, "Compute resource", :type => :string, :short => "R", :default => ENV['RBVMOMI_COMPUTER']
|
27
28
|
end
|
28
29
|
|
29
30
|
def rbvmomi_datastore_opt
|
30
|
-
opt :datastore, "Datastore", short
|
31
|
+
opt :datastore, "Datastore", :short => 's', :default => (ENV['RBVMOMI_DATASTORE'] || 'datastore1')
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
@@ -4,38 +4,38 @@ class RbVmomi::VIM::ComputeResource
|
|
4
4
|
# @note Values are returned in a hash.
|
5
5
|
#
|
6
6
|
# @return [Mhz] totalCPU: Sum of the frequencies of each CPU in the cluster.
|
7
|
-
# @return [Mhz] usedCPU:
|
8
|
-
# @return [MB]
|
9
|
-
# @return [MB]
|
7
|
+
# @return [Mhz] usedCPU: CPU cycles used across the cluster.
|
8
|
+
# @return [MB] totalMem: Total RAM.
|
9
|
+
# @return [MB] usedMem: Used RAM.
|
10
10
|
def stats
|
11
11
|
filterSpec = RbVmomi::VIM.PropertyFilterSpec(
|
12
|
-
objectSet
|
13
|
-
obj
|
14
|
-
selectSet
|
12
|
+
:objectSet => [{
|
13
|
+
:obj => self,
|
14
|
+
:selectSet => [
|
15
15
|
RbVmomi::VIM.TraversalSpec(
|
16
|
-
name
|
17
|
-
type
|
18
|
-
path
|
19
|
-
skip
|
16
|
+
:name => 'tsHosts',
|
17
|
+
:type => 'ComputeResource',
|
18
|
+
:path => 'host',
|
19
|
+
:skip => false
|
20
20
|
)
|
21
21
|
]
|
22
22
|
}],
|
23
|
-
propSet
|
24
|
-
pathSet
|
23
|
+
:propSet => [{
|
24
|
+
:pathSet => %w(name overallStatus summary.hardware.cpuMhz
|
25
25
|
summary.hardware.numCpuCores summary.hardware.memorySize
|
26
26
|
summary.quickStats.overallCpuUsage
|
27
27
|
summary.quickStats.overallMemoryUsage),
|
28
|
-
type
|
28
|
+
:type => 'HostSystem'
|
29
29
|
}]
|
30
30
|
)
|
31
31
|
|
32
|
-
result = @soap.propertyCollector.RetrieveProperties(specSet
|
32
|
+
result = @soap.propertyCollector.RetrieveProperties(:specSet => [filterSpec])
|
33
33
|
|
34
34
|
stats = {
|
35
|
-
totalCPU
|
36
|
-
totalMem
|
37
|
-
usedCPU
|
38
|
-
usedMem
|
35
|
+
:totalCPU => 0,
|
36
|
+
:totalMem => 0,
|
37
|
+
:usedCPU => 0,
|
38
|
+
:usedMem => 0,
|
39
39
|
}
|
40
40
|
|
41
41
|
result.each do |x|
|
@@ -30,7 +30,7 @@ class RbVmomi::VIM::Datastore
|
|
30
30
|
"-o", local_path,
|
31
31
|
"-b", @soap.cookie,
|
32
32
|
url,
|
33
|
-
out
|
33
|
+
:out => '/dev/null'
|
34
34
|
Process.waitpid(pid, 0)
|
35
35
|
fail "download failed" unless $?.success?
|
36
36
|
end
|
@@ -45,7 +45,7 @@ class RbVmomi::VIM::Datastore
|
|
45
45
|
"-T", local_path,
|
46
46
|
"-b", @soap.cookie,
|
47
47
|
url,
|
48
|
-
out
|
48
|
+
:out => '/dev/null'
|
49
49
|
Process.waitpid(pid, 0)
|
50
50
|
fail "upload failed" unless $?.success?
|
51
51
|
end
|
data/lib/rbvmomi/vim/Folder.rb
CHANGED
@@ -4,7 +4,7 @@ class RbVmomi::VIM::Folder
|
|
4
4
|
# @param type [Class] Return nil unless the found entity <tt>is_a? type</tt>.
|
5
5
|
# @return [VIM::ManagedEntity]
|
6
6
|
def find name, type=Object
|
7
|
-
x = @soap.searchIndex.FindChild(entity
|
7
|
+
x = @soap.searchIndex.FindChild(:entity => self, :name => name)
|
8
8
|
x if x.is_a? type
|
9
9
|
end
|
10
10
|
|
@@ -26,13 +26,13 @@ class RbVmomi::VIM::Folder
|
|
26
26
|
final = es.pop
|
27
27
|
|
28
28
|
p = es.inject(self) do |f,e|
|
29
|
-
f.find(e, Folder) || (create && f.CreateFolder(name
|
29
|
+
f.find(e, Folder) || (create && f.CreateFolder(:name => e)) || return
|
30
30
|
end
|
31
31
|
|
32
32
|
if x = p.find(final, type)
|
33
33
|
x
|
34
34
|
elsif create and type == Folder
|
35
|
-
p.CreateFolder(name
|
35
|
+
p.CreateFolder(:name => final)
|
36
36
|
else
|
37
37
|
nil
|
38
38
|
end
|
@@ -57,7 +57,7 @@ class RbVmomi::VIM::Folder
|
|
57
57
|
#
|
58
58
|
# @todo Return ObjectContent instead of the leaf hash.
|
59
59
|
def inventory propSpecs={}
|
60
|
-
propSet = [{ type
|
60
|
+
propSet = [{ :type => 'Folder', :pathSet => ['name', 'parent'] }]
|
61
61
|
propSpecs.each do |k,v|
|
62
62
|
case k
|
63
63
|
when RbVmomi::VIM::ManagedEntity
|
@@ -68,7 +68,7 @@ class RbVmomi::VIM::Folder
|
|
68
68
|
fail "key must be a ManagedEntity"
|
69
69
|
end
|
70
70
|
|
71
|
-
h = { type
|
71
|
+
h = { :type => k }
|
72
72
|
if v == :all
|
73
73
|
h[:all] = true
|
74
74
|
elsif v.is_a? Array
|
@@ -80,24 +80,24 @@ class RbVmomi::VIM::Folder
|
|
80
80
|
end
|
81
81
|
|
82
82
|
filterSpec = RbVmomi::VIM.PropertyFilterSpec(
|
83
|
-
objectSet
|
84
|
-
obj
|
85
|
-
selectSet
|
83
|
+
:objectSet => [
|
84
|
+
:obj => self,
|
85
|
+
:selectSet => [
|
86
86
|
RbVmomi::VIM.TraversalSpec(
|
87
|
-
name
|
88
|
-
type
|
89
|
-
path
|
90
|
-
skip
|
91
|
-
selectSet
|
92
|
-
RbVmomi::VIM.SelectionSpec(name
|
87
|
+
:name => 'tsFolder',
|
88
|
+
:type => 'Folder',
|
89
|
+
:path => 'childEntity',
|
90
|
+
:skip => false,
|
91
|
+
:selectSet => [
|
92
|
+
RbVmomi::VIM.SelectionSpec(:name => 'tsFolder')
|
93
93
|
]
|
94
94
|
)
|
95
95
|
]
|
96
96
|
],
|
97
|
-
propSet
|
97
|
+
:propSet => propSet
|
98
98
|
)
|
99
99
|
|
100
|
-
result = @soap.propertyCollector.RetrieveProperties(specSet
|
100
|
+
result = @soap.propertyCollector.RetrieveProperties(:specSet => [filterSpec])
|
101
101
|
|
102
102
|
tree = { self => {} }
|
103
103
|
result.each do |x|
|
@@ -3,27 +3,27 @@ class RbVmomi::VIM::ManagedEntity
|
|
3
3
|
# @return [Array] Ancestors of this entity, starting with the root.
|
4
4
|
def path
|
5
5
|
filterSpec = RbVmomi::VIM.PropertyFilterSpec(
|
6
|
-
objectSet
|
7
|
-
obj
|
8
|
-
selectSet
|
6
|
+
:objectSet => [{
|
7
|
+
:obj => self,
|
8
|
+
:selectSet => [
|
9
9
|
RbVmomi::VIM.TraversalSpec(
|
10
|
-
name
|
11
|
-
type
|
12
|
-
path
|
13
|
-
skip
|
14
|
-
selectSet
|
15
|
-
RbVmomi::VIM.SelectionSpec(name
|
10
|
+
:name => 'tsME',
|
11
|
+
:type => 'ManagedEntity',
|
12
|
+
:path => 'parent',
|
13
|
+
:skip => false,
|
14
|
+
:selectSet => [
|
15
|
+
RbVmomi::VIM.SelectionSpec(:name => 'tsME')
|
16
16
|
]
|
17
17
|
)
|
18
18
|
]
|
19
19
|
}],
|
20
|
-
propSet
|
21
|
-
pathSet
|
22
|
-
type
|
20
|
+
:propSet => [{
|
21
|
+
:pathSet => %w(name parent),
|
22
|
+
:type => 'ManagedEntity'
|
23
23
|
}]
|
24
24
|
)
|
25
25
|
|
26
|
-
result = @soap.propertyCollector.RetrieveProperties(specSet
|
26
|
+
result = @soap.propertyCollector.RetrieveProperties(:specSet => [filterSpec])
|
27
27
|
|
28
28
|
tree = {}
|
29
29
|
result.each { |x| tree[x.obj] = [x['parent'], x['name']] }
|
@@ -14,7 +14,7 @@ class RbVmomi::VIM::ManagedObject
|
|
14
14
|
}, :partialUpdates => false
|
15
15
|
ver = ''
|
16
16
|
loop do
|
17
|
-
result = @soap.propertyCollector.WaitForUpdates(version
|
17
|
+
result = @soap.propertyCollector.WaitForUpdates(:version => ver)
|
18
18
|
ver = result.version
|
19
19
|
if x = b.call
|
20
20
|
return x
|
@@ -29,13 +29,13 @@ class RbVmomi::VIM::ManagedObject
|
|
29
29
|
# @return [Hash] Hash from property paths to values.
|
30
30
|
def collect! *pathSet
|
31
31
|
spec = {
|
32
|
-
objectSet
|
33
|
-
propSet
|
34
|
-
pathSet
|
35
|
-
type
|
32
|
+
:objectSet => [{ :obj => self }],
|
33
|
+
:propSet => [{
|
34
|
+
:pathSet => pathSet,
|
35
|
+
:type => self.class.wsdl_name
|
36
36
|
}]
|
37
37
|
}
|
38
|
-
@soap.propertyCollector.RetrieveProperties(specSet
|
38
|
+
@soap.propertyCollector.RetrieveProperties(:specSet => [spec])[0].to_hash
|
39
39
|
end
|
40
40
|
|
41
41
|
# Efficiently retrieve multiple properties from an object.
|
@@ -17,29 +17,29 @@ class RbVmomi::VIM::OvfManager
|
|
17
17
|
# @option opts [Hash] :networkMappings Network mappings.
|
18
18
|
# @option opts [Hash] :propertyMappings Property mappings.
|
19
19
|
def deployOVF opts
|
20
|
-
opts = { networkMappings
|
21
|
-
propertyMappings
|
22
|
-
diskProvisioning
|
20
|
+
opts = { :networkMappings => {},
|
21
|
+
:propertyMappings => {},
|
22
|
+
:diskProvisioning => :thin }.merge opts
|
23
23
|
|
24
24
|
%w(uri vmName vmFolder host resourcePool datastore).each do |k|
|
25
25
|
fail "parameter #{k} required" unless opts[k.to_sym]
|
26
26
|
end
|
27
27
|
|
28
28
|
ovfImportSpec = RbVmomi::VIM::OvfCreateImportSpecParams(
|
29
|
-
hostSystem
|
30
|
-
locale
|
31
|
-
entityName
|
32
|
-
deploymentOption
|
33
|
-
networkMapping
|
34
|
-
propertyMapping
|
35
|
-
diskProvisioning
|
29
|
+
:hostSystem => opts[:host],
|
30
|
+
:locale => "US",
|
31
|
+
:entityName => opts[:vmName],
|
32
|
+
:deploymentOption => "",
|
33
|
+
:networkMapping => opts[:networkMappings].map{|from, to| RbVmomi::VIM::OvfNetworkMapping(:name => from, :network => to)},
|
34
|
+
:propertyMapping => opts[:propertyMappings].map{|key, value| RbVmomi::VIM::KeyValue(:key => key, :value => value)},
|
35
|
+
:diskProvisioning => opts[:diskProvisioning]
|
36
36
|
)
|
37
37
|
|
38
38
|
result = CreateImportSpec(
|
39
|
-
ovfDescriptor
|
40
|
-
resourcePool
|
41
|
-
datastore
|
42
|
-
cisp
|
39
|
+
:ovfDescriptor => open(opts[:uri]).read,
|
40
|
+
:resourcePool => opts[:resourcePool],
|
41
|
+
:datastore => opts[:datastore],
|
42
|
+
:cisp => ovfImportSpec
|
43
43
|
)
|
44
44
|
|
45
45
|
raise result.error[0].localizedMessage if result.error && !result.error.empty?
|
@@ -48,15 +48,15 @@ class RbVmomi::VIM::OvfManager
|
|
48
48
|
result.warning.each{|x| puts "OVF Warning: #{x.localizedMessage.chomp}" }
|
49
49
|
end
|
50
50
|
|
51
|
-
nfcLease = opts[:resourcePool].ImportVApp(spec
|
52
|
-
folder
|
53
|
-
host
|
51
|
+
nfcLease = opts[:resourcePool].ImportVApp(:spec => result.importSpec,
|
52
|
+
:folder => opts[:vmFolder],
|
53
|
+
:host => opts[:host])
|
54
54
|
|
55
55
|
nfcLease.wait_until(:state) { nfcLease.state != "initializing" }
|
56
56
|
raise nfcLease.error if nfcLease.state == "error"
|
57
57
|
|
58
58
|
begin
|
59
|
-
nfcLease.HttpNfcLeaseProgress(percent
|
59
|
+
nfcLease.HttpNfcLeaseProgress(:percent => 5)
|
60
60
|
progress = 0.0
|
61
61
|
result.fileItem.each do |fileItem|
|
62
62
|
deviceUrl = nfcLease.info.deviceUrl.find{|x| x.importKey == fileItem.deviceId}
|
@@ -78,10 +78,10 @@ class RbVmomi::VIM::OvfManager
|
|
78
78
|
uploadCmd = "#{CURLBIN} -X #{method} --insecure -T - -H 'Content-Type: application/x-vnd.vmware-streamVmdk' -H 'Content-Length: #{fileItem.size}' '#{href}'"
|
79
79
|
system("#{downloadCmd} | #{uploadCmd}")
|
80
80
|
progress += (95.0 / result.fileItem.length)
|
81
|
-
nfcLease.HttpNfcLeaseProgress(percent
|
81
|
+
nfcLease.HttpNfcLeaseProgress(:percent => progress.to_i)
|
82
82
|
end
|
83
83
|
|
84
|
-
nfcLease.HttpNfcLeaseProgress(percent
|
84
|
+
nfcLease.HttpNfcLeaseProgress(:percent => 100)
|
85
85
|
vm = nfcLease.info.entity
|
86
86
|
nfcLease.HttpNfcLeaseComplete
|
87
87
|
vm
|
@@ -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
|
6
|
+
@soap.searchIndex.FindChild(:entity => self, :name => name)
|
7
7
|
end
|
8
8
|
|
9
9
|
# Retrieve a descendant of this ResourcePool.
|
@@ -30,7 +30,7 @@ class RbVmomi::VIM::ServiceInstance
|
|
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
|
33
|
+
result = @soap.propertyCollector.WaitForUpdates(:version => version)
|
34
34
|
version = result.version
|
35
35
|
os = result.filterSet[0].objectSet
|
36
36
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rbvmomi'
|
3
|
-
VIM
|
3
|
+
VIM = RbVmomi::VIM unless Object.const_defined? :VIM
|
4
4
|
|
5
5
|
class DeserializationTest < Test::Unit::TestCase
|
6
6
|
def setup
|
7
|
-
@soap = VIM.new(ns
|
7
|
+
@soap = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
|
8
8
|
end
|
9
9
|
|
10
10
|
def check str, expected, type
|
@@ -24,15 +24,15 @@ class DeserializationTest < Test::Unit::TestCase
|
|
24
24
|
|
25
25
|
def test_dataobject
|
26
26
|
obj = VIM.DatastoreSummary(
|
27
|
-
capacity
|
28
|
-
accessible
|
29
|
-
datastore
|
30
|
-
freeSpace
|
31
|
-
multipleHostAccess
|
32
|
-
name
|
33
|
-
type
|
34
|
-
url
|
35
|
-
dynamicProperty
|
27
|
+
:capacity => 1000,
|
28
|
+
:accessible => true,
|
29
|
+
:datastore => VIM.Datastore(nil, "foo"),
|
30
|
+
:freeSpace => 31,
|
31
|
+
:multipleHostAccess => false,
|
32
|
+
:name => "baz",
|
33
|
+
:type => "VMFS",
|
34
|
+
:url => "http://foo/",
|
35
|
+
:dynamicProperty => []
|
36
36
|
)
|
37
37
|
|
38
38
|
check <<-EOS, obj, 'DatastoreSummary'
|
@@ -57,13 +57,13 @@ class DeserializationTest < Test::Unit::TestCase
|
|
57
57
|
|
58
58
|
def test_array
|
59
59
|
obj = VIM.ObjectContent(
|
60
|
-
obj
|
61
|
-
dynamicProperty
|
62
|
-
missingSet
|
63
|
-
propSet
|
60
|
+
:obj => VIM.Folder(nil, 'ha-folder-root'),
|
61
|
+
:dynamicProperty => [],
|
62
|
+
:missingSet => [],
|
63
|
+
:propSet => [
|
64
64
|
VIM.DynamicProperty(
|
65
|
-
name
|
66
|
-
val
|
65
|
+
:name => 'childEntity',
|
66
|
+
:val => [
|
67
67
|
VIM.Datacenter(nil, 'ha-datacenter')
|
68
68
|
]
|
69
69
|
)
|
@@ -85,12 +85,12 @@ class DeserializationTest < Test::Unit::TestCase
|
|
85
85
|
|
86
86
|
def test_array2
|
87
87
|
obj = VIM.DVPortStatus(
|
88
|
-
dynamicProperty
|
89
|
-
linkUp
|
90
|
-
blocked
|
91
|
-
vlanIds
|
92
|
-
VIM::NumericRange(dynamicProperty
|
93
|
-
VIM::NumericRange(dynamicProperty
|
88
|
+
:dynamicProperty => [],
|
89
|
+
:linkUp => true,
|
90
|
+
:blocked => false,
|
91
|
+
:vlanIds => [
|
92
|
+
VIM::NumericRange(:dynamicProperty => [], :start => 5, :end => 7),
|
93
|
+
VIM::NumericRange(:dynamicProperty => [], :start => 10, :end => 20),
|
94
94
|
]
|
95
95
|
)
|
96
96
|
|
@@ -112,10 +112,10 @@ end
|
|
112
112
|
|
113
113
|
def test_empty_array
|
114
114
|
obj = VIM.DVPortStatus(
|
115
|
-
dynamicProperty
|
116
|
-
linkUp
|
117
|
-
blocked
|
118
|
-
vlanIds
|
115
|
+
:dynamicProperty => [],
|
116
|
+
:linkUp => true,
|
117
|
+
:blocked => false,
|
118
|
+
:vlanIds => []
|
119
119
|
)
|
120
120
|
|
121
121
|
check <<-EOS, obj, 'DVPortStatus'
|
@@ -128,11 +128,11 @@ end
|
|
128
128
|
|
129
129
|
def test_fault
|
130
130
|
obj = VIM.LocalizedMethodFault(
|
131
|
-
localizedMessage
|
132
|
-
fault
|
133
|
-
requestedState
|
134
|
-
existingState
|
135
|
-
faultMessage
|
131
|
+
:localizedMessage => "The attempted operation cannot be performed in the current state (Powered off).",
|
132
|
+
:fault => VIM.InvalidPowerState(
|
133
|
+
:requestedState => 'poweredOn',
|
134
|
+
:existingState => 'poweredOff',
|
135
|
+
:faultMessage => []
|
136
136
|
)
|
137
137
|
)
|
138
138
|
|
@@ -149,25 +149,25 @@ end
|
|
149
149
|
|
150
150
|
def test_wait_for_updates
|
151
151
|
obj = VIM.UpdateSet(
|
152
|
-
version
|
153
|
-
dynamicProperty
|
154
|
-
filterSet
|
152
|
+
:version => '7',
|
153
|
+
:dynamicProperty => [],
|
154
|
+
:filterSet => [
|
155
155
|
VIM.PropertyFilterUpdate(
|
156
|
-
dynamicProperty
|
157
|
-
filter
|
158
|
-
missingSet
|
159
|
-
objectSet
|
156
|
+
:dynamicProperty => [],
|
157
|
+
:filter => VIM.PropertyFilter(nil, "session[528BA5EB-335B-4AF6-B49C-6160CF5E8D5B]71E3AC7E-7927-4D9E-8BC3-522769F22DAF"),
|
158
|
+
:missingSet => [],
|
159
|
+
:objectSet => [
|
160
160
|
VIM.ObjectUpdate(
|
161
|
-
dynamicProperty
|
162
|
-
kind
|
163
|
-
obj
|
164
|
-
missingSet
|
165
|
-
changeSet
|
161
|
+
:dynamicProperty => [],
|
162
|
+
:kind => 'enter',
|
163
|
+
:obj => VIM.VirtualMachine(nil, 'vm-1106'),
|
164
|
+
:missingSet => [],
|
165
|
+
:changeSet => [
|
166
166
|
VIM.PropertyChange(
|
167
|
-
dynamicProperty
|
168
|
-
name
|
169
|
-
op
|
170
|
-
val
|
167
|
+
:dynamicProperty => [],
|
168
|
+
:name => 'runtime.powerState',
|
169
|
+
:op => 'assign',
|
170
|
+
:val => 'poweredOn'
|
171
171
|
)
|
172
172
|
]
|
173
173
|
)
|
@@ -204,14 +204,14 @@ end
|
|
204
204
|
|
205
205
|
def test_hba
|
206
206
|
obj = VIM::HostBlockHba(
|
207
|
-
dynamicProperty
|
208
|
-
key
|
209
|
-
device
|
210
|
-
bus
|
211
|
-
status
|
212
|
-
model
|
213
|
-
driver
|
214
|
-
pci
|
207
|
+
:dynamicProperty => [],
|
208
|
+
:key => 'key-vim.host.BlockHba-vmhba0',
|
209
|
+
:device => 'vmhba0',
|
210
|
+
:bus => 0,
|
211
|
+
:status => 'unknown',
|
212
|
+
:model => 'Virtual Machine Chipset',
|
213
|
+
:driver => 'ata_piix',
|
214
|
+
:pci => '00:07.1')
|
215
215
|
|
216
216
|
check <<-EOS, obj, "HostBlockHba"
|
217
217
|
<hostBusAdapter xsi:type="HostBlockHba">
|
@@ -229,10 +229,10 @@ end
|
|
229
229
|
=begin
|
230
230
|
def test_runtime_state
|
231
231
|
obj = VIM::VirtualMachineDeviceRuntimeInfoVirtualEthernetCardRuntimeState(
|
232
|
-
dynamicProperty
|
233
|
-
|
234
|
-
|
235
|
-
|
232
|
+
:dynamicProperty => [],
|
233
|
+
vmDirectPathGen2:Active => false,
|
234
|
+
vmDirectPathGen2:InactiveReasonOther => ["vmNptIncompatibleHost"],
|
235
|
+
vmDirectPathGen2:InactiveReasonVm => []
|
236
236
|
)
|
237
237
|
check <<-EOS, obj, 'VirtualMachineDeviceRuntimeInfoDeviceRuntimeState'
|
238
238
|
<runtimeState xsi:type="VirtualMachineDeviceRuntimeInfoVirtualEthernetCardRuntimeState" xmlns:xsi="#{VIM::NS_XSI}">
|
@@ -245,19 +245,19 @@ end
|
|
245
245
|
|
246
246
|
def test_runtime_info
|
247
247
|
obj = VIM::VirtualMachineRuntimeInfo(
|
248
|
-
bootTime
|
249
|
-
connectionState
|
250
|
-
dynamicProperty
|
251
|
-
faultToleranceState
|
252
|
-
host
|
253
|
-
maxCpuUsage
|
254
|
-
maxMemoryUsage
|
255
|
-
memoryOverhead
|
256
|
-
numMksConnections
|
257
|
-
powerState
|
258
|
-
recordReplayState
|
259
|
-
suspendInterval
|
260
|
-
toolsInstallerMounted
|
248
|
+
:bootTime => Time.parse('2010-08-20 05:44:35 UTC'),
|
249
|
+
:connectionState => "connected",
|
250
|
+
:dynamicProperty => [],
|
251
|
+
:faultToleranceState => "notConfigured",
|
252
|
+
:host => VIM::HostSystem(nil, "host-32"),
|
253
|
+
:maxCpuUsage => 5612,
|
254
|
+
:maxMemoryUsage => 3072,
|
255
|
+
:memoryOverhead => 128671744,
|
256
|
+
:numMksConnections => 1,
|
257
|
+
:powerState => "poweredOn",
|
258
|
+
:recordReplayState => "inactive",
|
259
|
+
:suspendInterval => 0,
|
260
|
+
:toolsInstallerMounted => false
|
261
261
|
)
|
262
262
|
|
263
263
|
check <<-EOS, obj, 'VirtualMachineRuntimeInfo'
|
data/test/test_emit_request.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rbvmomi'
|
3
|
-
VIM
|
3
|
+
VIM = RbVmomi::VIM unless Object.const_defined? :VIM
|
4
4
|
|
5
5
|
class EmitRequestTest < Test::Unit::TestCase
|
6
6
|
MO = VIM::VirtualMachine(nil, "foo")
|
7
7
|
|
8
8
|
def check desc, str, this, params
|
9
|
-
soap = VIM.new(ns
|
9
|
+
soap = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
|
10
10
|
xml = Builder::XmlMarkup.new :indent => 2
|
11
11
|
soap.emit_request xml, 'root', desc, this, params
|
12
12
|
|
@@ -33,7 +33,7 @@ class EmitRequestTest < Test::Unit::TestCase
|
|
33
33
|
}
|
34
34
|
]
|
35
35
|
|
36
|
-
check desc, <<-EOS, MO, blah
|
36
|
+
check desc, <<-EOS, MO, :blah => ['a', 'b', 'c']
|
37
37
|
<root xmlns="urn:vim25">
|
38
38
|
<_this type="VirtualMachine">foo</_this>
|
39
39
|
<blah>a</blah>
|
@@ -53,7 +53,7 @@ class EmitRequestTest < Test::Unit::TestCase
|
|
53
53
|
}
|
54
54
|
]
|
55
55
|
|
56
|
-
check desc, <<-EOS, MO, blah
|
56
|
+
check desc, <<-EOS, MO, :blah => 'a'
|
57
57
|
<root xmlns="urn:vim25">
|
58
58
|
<_this type="VirtualMachine">foo</_this>
|
59
59
|
<blah>a</blah>
|
data/test/test_exceptions.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rbvmomi'
|
3
|
-
VIM
|
3
|
+
VIM = RbVmomi::VIM unless Object.const_defined? :VIM
|
4
4
|
|
5
5
|
class ExceptionTest < Test::Unit::TestCase
|
6
6
|
def test_fault
|
7
7
|
begin
|
8
|
-
fault = VIM::InvalidArgument.new invalidProperty
|
8
|
+
fault = VIM::InvalidArgument.new :invalidProperty => 'foo'
|
9
9
|
assert_raises RbVmomi::Fault do
|
10
10
|
raise RbVmomi::Fault.new('A specified parameter was not correct.', fault)
|
11
11
|
end
|
data/test/test_parse_response.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rbvmomi'
|
3
|
-
VIM
|
3
|
+
VIM = RbVmomi::VIM unless Object.const_defined? :VIM
|
4
4
|
|
5
5
|
class ParseResponseTest < Test::Unit::TestCase
|
6
6
|
def check desc, str, expected
|
7
|
-
soap = VIM.new(ns
|
7
|
+
soap = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
|
8
8
|
got = soap.parse_response Nokogiri(str).root, desc
|
9
9
|
assert_equal expected, got
|
10
10
|
end
|
data/test/test_serialization.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rbvmomi'
|
3
|
-
VIM
|
3
|
+
VIM = RbVmomi::VIM unless Object.const_defined? :VIM
|
4
4
|
|
5
5
|
class SerializationTest < Test::Unit::TestCase
|
6
6
|
def check str, obj, type, array=false
|
7
|
-
@soap = VIM.new(ns
|
7
|
+
@soap = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
|
8
8
|
xml = Builder::XmlMarkup.new :indent => 2
|
9
9
|
@soap.obj2xml(xml, 'root', type, array, obj)
|
10
10
|
|
@@ -29,52 +29,52 @@ class SerializationTest < Test::Unit::TestCase
|
|
29
29
|
|
30
30
|
def test_config
|
31
31
|
cfg = VIM.VirtualMachineConfigSpec(
|
32
|
-
name
|
33
|
-
files
|
34
|
-
guestId
|
35
|
-
numCPUs
|
36
|
-
memoryMB
|
37
|
-
deviceChange
|
32
|
+
:name => 'vm',
|
33
|
+
:files => { :vmPathName => '[datastore1]' },
|
34
|
+
:guestId => 'otherGuest64',
|
35
|
+
:numCPUs => 2,
|
36
|
+
:memoryMB => 3072,
|
37
|
+
:deviceChange => [
|
38
38
|
{
|
39
|
-
operation
|
40
|
-
device
|
41
|
-
key
|
42
|
-
busNumber
|
43
|
-
sharedBus
|
39
|
+
:operation => :add,
|
40
|
+
:device => VIM.VirtualLsiLogicController(
|
41
|
+
:key => 1000,
|
42
|
+
:busNumber => 0,
|
43
|
+
:sharedBus => :noSharing
|
44
44
|
)
|
45
45
|
}, VIM.VirtualDeviceConfigSpec(
|
46
|
-
operation
|
47
|
-
fileOperation
|
48
|
-
device
|
49
|
-
key
|
50
|
-
backing
|
51
|
-
fileName
|
52
|
-
diskMode
|
53
|
-
thinProvisioned
|
46
|
+
:operation => VIM.VirtualDeviceConfigSpecOperation(:add),
|
47
|
+
:fileOperation => VIM.VirtualDeviceConfigSpecFileOperation(:create),
|
48
|
+
:device => VIM.VirtualDisk(
|
49
|
+
:key => 0,
|
50
|
+
:backing => VIM.VirtualDiskFlatVer2BackingInfo(
|
51
|
+
:fileName => '[datastore1]',
|
52
|
+
:diskMode => :persistent,
|
53
|
+
:thinProvisioned => true
|
54
54
|
),
|
55
|
-
controllerKey
|
56
|
-
unitNumber
|
57
|
-
capacityInKB
|
55
|
+
:controllerKey => 1000,
|
56
|
+
:unitNumber => 0,
|
57
|
+
:capacityInKB => 4000000
|
58
58
|
)
|
59
59
|
), {
|
60
|
-
operation
|
61
|
-
device
|
62
|
-
key
|
63
|
-
deviceInfo
|
64
|
-
label
|
65
|
-
summary
|
60
|
+
:operation => :add,
|
61
|
+
:device => VIM.VirtualE1000(
|
62
|
+
:key => 0,
|
63
|
+
:deviceInfo => {
|
64
|
+
:label => 'Network Adapter 1',
|
65
|
+
:summary => 'VM Network'
|
66
66
|
},
|
67
|
-
backing
|
68
|
-
deviceName
|
67
|
+
:backing => VIM.VirtualEthernetCardNetworkBackingInfo(
|
68
|
+
:deviceName => 'VM Network'
|
69
69
|
),
|
70
|
-
addressType
|
70
|
+
:addressType => 'generated'
|
71
71
|
)
|
72
72
|
}
|
73
73
|
],
|
74
|
-
extraConfig
|
74
|
+
:extraConfig => [
|
75
75
|
{
|
76
|
-
key
|
77
|
-
value
|
76
|
+
:key => 'bios.bootOrder',
|
77
|
+
:value => 'ethernet0'
|
78
78
|
}
|
79
79
|
]
|
80
80
|
)
|
@@ -133,7 +133,7 @@ class SerializationTest < Test::Unit::TestCase
|
|
133
133
|
end
|
134
134
|
|
135
135
|
def test_nil_field
|
136
|
-
obj = VIM.OptionValue(key
|
136
|
+
obj = VIM.OptionValue(:key => 'foo', :value => nil)
|
137
137
|
check <<-EOS, obj, "OptionValue"
|
138
138
|
<root xsi:type="OptionValue">
|
139
139
|
<key>foo</key>
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbvmomi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 17
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 1
|
7
8
|
- 1
|
8
|
-
-
|
9
|
-
version: 1.1.
|
9
|
+
- 1
|
10
|
+
version: 1.1.1
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Rich Lane
|
@@ -14,7 +15,7 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2011-02-
|
18
|
+
date: 2011-02-21 00:00:00 -08:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
@@ -25,6 +26,7 @@ dependencies:
|
|
25
26
|
requirements:
|
26
27
|
- - ">="
|
27
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 5
|
28
30
|
segments:
|
29
31
|
- 1
|
30
32
|
- 4
|
@@ -40,6 +42,7 @@ dependencies:
|
|
40
42
|
requirements:
|
41
43
|
- - ">="
|
42
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
43
46
|
segments:
|
44
47
|
- 0
|
45
48
|
version: "0"
|
@@ -53,6 +56,7 @@ dependencies:
|
|
53
56
|
requirements:
|
54
57
|
- - ">="
|
55
58
|
- !ruby/object:Gem::Version
|
59
|
+
hash: 3
|
56
60
|
segments:
|
57
61
|
- 0
|
58
62
|
version: "0"
|
@@ -66,6 +70,7 @@ dependencies:
|
|
66
70
|
requirements:
|
67
71
|
- - ">="
|
68
72
|
- !ruby/object:Gem::Version
|
73
|
+
hash: 3
|
69
74
|
segments:
|
70
75
|
- 0
|
71
76
|
version: "0"
|
@@ -93,6 +98,7 @@ files:
|
|
93
98
|
- examples/power.rb
|
94
99
|
- examples/readme-1.rb
|
95
100
|
- examples/readme-2.rb
|
101
|
+
- examples/run.sh
|
96
102
|
- lib/rbvmomi.rb
|
97
103
|
- lib/rbvmomi/basic_types.rb
|
98
104
|
- lib/rbvmomi/connection.rb
|
@@ -134,6 +140,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
134
140
|
requirements:
|
135
141
|
- - ">="
|
136
142
|
- !ruby/object:Gem::Version
|
143
|
+
hash: 49
|
137
144
|
segments:
|
138
145
|
- 1
|
139
146
|
- 9
|
@@ -144,16 +151,17 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
144
151
|
requirements:
|
145
152
|
- - ">="
|
146
153
|
- !ruby/object:Gem::Version
|
154
|
+
hash: 3
|
147
155
|
segments:
|
148
156
|
- 0
|
149
157
|
version: "0"
|
150
158
|
requirements: []
|
151
159
|
|
152
160
|
rubyforge_project:
|
153
|
-
rubygems_version: 1.
|
161
|
+
rubygems_version: 1.4.2
|
154
162
|
signing_key:
|
155
163
|
specification_version: 3
|
156
|
-
summary: Ruby interface to the
|
164
|
+
summary: Ruby interface to the VMware vSphere API
|
157
165
|
test_files:
|
158
166
|
- examples/create_vm.rb
|
159
167
|
- examples/extraConfig.rb
|