diff --git a/share/vendor/ruby/gems/rbvmomi/README.rdoc b/share/vendor/ruby/gems/rbvmomi/README.rdoc
index b0cf54f8d1..dae624a242 100644
--- a/share/vendor/ruby/gems/rbvmomi/README.rdoc
+++ b/share/vendor/ruby/gems/rbvmomi/README.rdoc
@@ -1,17 +1,34 @@
= RbVmomi
+{
}[http://travis-ci.org/vmware/rbvmomi]
+
+This is an Open Source community supported project at VMware. It is built and maintained by programmers like you!
+
== Introduction
RbVmomi is a Ruby interface to the vSphere API. Like the Perl and Java SDKs,
you can use it to manage ESX and VirtualCenter servers. The current release
supports the vSphere 5.0 API. RbVmomi specific documentation is
online[http://rdoc.info/github/rlane/rbvmomi/master/frames] and is meant to
-be used alongside the official documentation[http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/index.html].
+be used alongside the official documentation[http://pubs.vmware.com/vsphere-60/topic/com.vmware.sdk.doc/GUID-19793BCA-9EAB-42E2-8B9F-F9F2129E7741.html].
== Installation
gem install rbvmomi
+=== Support for older Ruby versions
+
+RbVmomi supports Ruby 1.8.7 and higher, but certain dependencies may need
+pinning to older versions to get a compatible set of gems.
+
+On Ruby 1.8.7:
+
+* use +nokogiri+ 1.5.x (Gemfile: gem 'nokogiri', '< 1.6')
+
+On both Ruby 1.9 and 1.8.7:
+
+* use +json+ 1.x (Gemfile: gem 'json', '< 2')
+
== Usage
A simple example of turning on a VM:
@@ -56,7 +73,7 @@ in the first example uses the SearchIndex for fast lookups.
A few important points:
-* All class, method, parameter, and property names match the official documentation[http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/index.html].
+* All class, method, parameter, and property names match the official documentation[http://pubs.vmware.com/vsphere-60/topic/com.vmware.sdk.doc/GUID-19793BCA-9EAB-42E2-8B9F-F9F2129E7741.html].
* Properties are exposed as accessor methods.
* Data object types can usually be inferred from context, so you may use a hash instead.
* Enumeration values are simply strings.
diff --git a/share/vendor/ruby/gems/rbvmomi/Rakefile b/share/vendor/ruby/gems/rbvmomi/Rakefile
index 5638acf31a..d97eefcb66 100644
--- a/share/vendor/ruby/gems/rbvmomi/Rakefile
+++ b/share/vendor/ruby/gems/rbvmomi/Rakefile
@@ -1,26 +1,8 @@
+require 'bundler/gem_tasks'
require 'rake/testtask'
-require 'rdoc/task'
require 'yard'
-begin
- require 'jeweler'
- Jeweler::Tasks.new do |gem|
- gem.name = "rbvmomi"
- gem.summary = "Ruby interface to the VMware vSphere API"
- #gem.description = ""
- gem.email = "rlane@vmware.com"
- gem.homepage = "https://github.com/vmware/rbvmomi"
- gem.authors = ["Rich Lane", "Christian Dickmann"]
- gem.add_dependency 'nokogiri', '>= 1.4.1'
- gem.add_dependency 'builder'
- gem.add_dependency 'trollop'
- gem.required_ruby_version = '>= 1.8.7'
- gem.files.include 'vmodl.db'
- gem.files.include '.yardopts'
- end
-rescue LoadError
- puts "Jeweler not available. Install it with: gem install jeweler"
-end
+task(:default => :test)
Rake::TestTask.new do |t|
t.libs << "test"
@@ -29,17 +11,3 @@ Rake::TestTask.new do |t|
end
YARD::Rake::YardocTask.new
-
-begin
- require 'rcov/rcovtask'
- desc 'Measures test coverage using rcov'
- Rcov::RcovTask.new do |rcov|
- rcov.pattern = 'test/test_*.rb'
- rcov.output_dir = 'coverage'
- rcov.verbose = true
- rcov.libs << "test"
- rcov.rcov_opts << '--exclude "gems/*"'
- end
-rescue LoadError
- puts "Rcov not available. Install it with: gem install rcov"
-end
diff --git a/share/vendor/ruby/gems/rbvmomi/VERSION b/share/vendor/ruby/gems/rbvmomi/VERSION
index 53adb84c82..77fee73a8c 100644
--- a/share/vendor/ruby/gems/rbvmomi/VERSION
+++ b/share/vendor/ruby/gems/rbvmomi/VERSION
@@ -1 +1 @@
-1.8.2
+1.9.3
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/basic_types.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/basic_types.rb
index ac1a19b45c..be060d30aa 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/basic_types.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/basic_types.rb
@@ -158,6 +158,12 @@ class DataObject < ObjectWithProperties
q.text ')'
end
+ def to_json(*args)
+ h = self.props
+ m = h.merge({ JSON.create_id => self.class.name })
+ m.to_json(*args)
+ end
+
init
end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/trivial_soap.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/trivial_soap.rb
index 29e621350d..c508c522d9 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/trivial_soap.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/trivial_soap.rb
@@ -48,8 +48,8 @@ class RbVmomi::TrivialSoap
@http.key = OpenSSL::PKey::RSA.new(@opts[:key]) if @opts[:key]
end
@http.set_debug_output(STDERR) if $DEBUG
- @http.read_timeout = 1000000
- @http.open_timeout = 60
+ @http.read_timeout = @opts[:read_timeout] || 1000000
+ @http.open_timeout = @opts[:open_timeout] || 60
def @http.on_connect
@socket.io.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)
end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/admission_control.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/admission_control.rb
index 66fa74f79d..1a4e3b3d38 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/admission_control.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/admission_control.rb
@@ -77,11 +77,11 @@ class AdmissionControlledResourceScheduler
# Returns the used VM folder. If not set yet, uses the vm_folder_path to
# lookup the folder. If it doesn't exist, it is created. Collisions between
# multiple clients concurrently creating the same folder are handled.
- # @return [VIM::Folder] The VM folder
+ # @return [RbVmomi::VIM::Folder] The VM folder
def vm_folder
retries = 1
begin
- @vm_folder ||= datacenter.vmFolder.traverse!(@vm_folder_path, VIM::Folder)
+ @vm_folder ||= datacenter.vmFolder.traverse!(@vm_folder_path, RbVmomi::VIM::Folder)
if !@vm_folder
fail "VM folder #{@vm_folder_path} not found"
end
@@ -98,10 +98,10 @@ class AdmissionControlledResourceScheduler
# Returns the used Datacenter. If not set yet, uses the datacenter_path to
# lookup the datacenter.
- # @return [VIM::Datacenter] The datacenter
+ # @return [RbVmomi::VIM::Datacenter] The datacenter
def datacenter
if !@datacenter
- @datacenter = @root_folder.traverse(@datacenter_path, VIM::Datacenter)
+ @datacenter = @root_folder.traverse(@datacenter_path, RbVmomi::VIM::Datacenter)
if !@datacenter
fail "datacenter #{@datacenter_path} not found"
end
@@ -112,11 +112,11 @@ class AdmissionControlledResourceScheduler
# Returns the candidate datastores. If not set yet, uses the datastore_paths
# to lookup the datastores under the datacenter.
# As a side effect, also looks up properties about all the datastores
- # @return [Array] List of VIM::Datastore
+ # @return [Array] List of RbVmomi::VIM::Datastore
def datastores
if !@datastores
@datastores = @datastore_paths.map do |path|
- ds = datacenter.datastoreFolder.traverse(path, VIM::Datastore)
+ ds = datacenter.datastoreFolder.traverse(path, RbVmomi::VIM::Datastore)
if !ds
fail "datastore #{path} not found"
end
@@ -131,7 +131,7 @@ class AdmissionControlledResourceScheduler
# Returns the candidate computers (aka clusters). If not set yet, uses the
# computer_names to look them up.
- # @return [Array] List of [VIM::ClusterComputeResource, Hash] tuples, where
+ # @return [Array] List of [RbVmomi::VIM::ClusterComputeResource, Hash] tuples, where
# the Hash is a list of stats about the computer
def computers
if !@computers
@@ -145,7 +145,7 @@ class AdmissionControlledResourceScheduler
# Returns the candidate pods. If not set, automatically computes the pods
# based on the list of computers (aka clusters) and datastores.
- # @return [Array] List of pods, where a pod is a list of VIM::ClusterComputeResource
+ # @return [Array] List of pods, where a pod is a list of RbVmomi::VIM::ClusterComputeResource
def pods
if !@pods
# A pod is defined as a set of clusters (aka computers) that share the same
@@ -168,22 +168,22 @@ class AdmissionControlledResourceScheduler
# @return [Hash] Hash of VMs as keys and their properties as values.
def pod_vms pod
# This function retrieves all VMs residing inside a pod
- filterSpec = VIM.PropertyFilterSpec(
+ filterSpec = RbVmomi::VIM.PropertyFilterSpec(
objectSet: pod.map do |computer, stats|
{
obj: computer.resourcePool,
selectSet: [
- VIM.TraversalSpec(
+ RbVmomi::VIM.TraversalSpec(
name: 'tsFolder',
type: 'ResourcePool',
path: 'resourcePool',
skip: false,
selectSet: [
- VIM.SelectionSpec(name: 'tsFolder'),
- VIM.SelectionSpec(name: 'tsVM'),
+ RbVmomi::VIM.SelectionSpec(name: 'tsFolder'),
+ RbVmomi::VIM.SelectionSpec(name: 'tsVM'),
]
),
- VIM.TraversalSpec(
+ RbVmomi::VIM.TraversalSpec(
name: 'tsVM',
type: 'ResourcePool',
path: 'vm',
@@ -202,11 +202,11 @@ class AdmissionControlledResourceScheduler
result = @vim.propertyCollector.RetrieveProperties(specSet: [filterSpec])
out = result.map { |x| [x.obj, Hash[x.propSet.map { |y| [y.name, y.val] }]] }
- out.select{|obj, props| obj.is_a?(VIM::VirtualMachine)}
+ out.select{|obj, props| obj.is_a?(RbVmomi::VIM::VirtualMachine)}
end
# Returns all candidate datastores for a given pod.
- # @return [Array] List of VIM::Datastore
+ # @return [Array] List of RbVmomi::VIM::Datastore
def pod_datastores pod
pod.first.datastore & self.datastores
end
@@ -214,7 +214,7 @@ class AdmissionControlledResourceScheduler
# Returns the list of pods that pass admission control. If not set yet, performs
# admission control to compute the list. If no pods passed the admission
# control, an exception is thrown.
- # @return [Array] List of pods, where a pod is a list of VIM::ClusterComputeResource
+ # @return [Array] List of pods, where a pod is a list of RbVmomi::VIM::ClusterComputeResource
def filtered_pods
# This function applies admission control and returns those pods that have
# passed admission control. An exception is thrown if access was denied to
@@ -300,7 +300,7 @@ class AdmissionControlledResourceScheduler
# Returns the computer (aka cluster) to be used for placement. If not set yet,
# computs the least loaded cluster (using a metric that combines CPU and Memory
# load) that passes admission control.
- # @return [VIM::ClusterComputeResource] Chosen computer (aka cluster)
+ # @return [RbVmomi::VIM::ClusterComputeResource] Chosen computer (aka cluster)
def pick_computer placementhint = nil
if !@computer
# Out of the pods to which we have been granted access, pick the cluster
@@ -330,7 +330,7 @@ class AdmissionControlledResourceScheduler
# Returns the datastore to be used for placement. If not set yet, picks a
# datastore without much intelligence, as long as it passes admission control.
- # @return [VIM::Datastore] Chosen datastore
+ # @return [RbVmomi::VIM::Datastore] Chosen datastore
def datastore placementHint = nil
if @datastore
return @datastore
@@ -395,4 +395,4 @@ class AdmissionControlledResourceScheduler
datastore = self.datastore @placement_hint
log "Datastore: #{datastore.name}"
end
-end
\ No newline at end of file
+end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/perfdump.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/perfdump.rb
index a530efab44..c877f47604 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/perfdump.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/utils/perfdump.rb
@@ -336,7 +336,7 @@ class PerfAggregator
vms_props, inventory = all_inventory_flat root_folder, prop_names
vms = vms_props.keys
- hosts_props = inventory.select{|k, v| k.is_a?(VIM::HostSystem)}
+ hosts_props = inventory.select{|k, v| k.is_a?(RbVmomi::VIM::HostSystem)}
conn = root_folder._connection
sc = conn.serviceContent
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/version.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/version.rb
new file mode 100644
index 0000000000..bd171e13c2
--- /dev/null
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/version.rb
@@ -0,0 +1,3 @@
+module RbVmomi
+ VERSION = '1.9.3'.freeze
+end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim.rb
index 6d29989a5a..66626de873 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim.rb
@@ -1,6 +1,13 @@
# Copyright (c) 2011 VMware, Inc. All Rights Reserved.
require 'rbvmomi'
+# Win32::SSPI is part of core on Windows
+begin
+ require 'win32/sspi'
+rescue LoadError
+end
+WIN32 = (defined? Win32::SSPI)
+
module RbVmomi
# A connection to one vSphere SDK endpoint.
@@ -22,7 +29,7 @@ class VIM < Connection
fail unless opts.is_a? Hash
fail "host option required" unless opts[:host]
opts[:cookie] ||= nil
- opts[:user] ||= 'root'
+ opts[:user] ||= (WIN32 ? ENV['USERNAME'].dup : 'root')
opts[:password] ||= ''
opts[:ssl] = true unless opts.member? :ssl or opts[:"no-ssl"]
opts[:insecure] ||= false
@@ -30,16 +37,30 @@ class VIM < Connection
opts[:path] ||= '/sdk'
opts[:ns] ||= 'urn:vim25'
rev_given = opts[:rev] != nil
- opts[:rev] = '4.0' unless rev_given
+ opts[:rev] = '6.0' unless rev_given
opts[:debug] = (!ENV['RBVMOMI_DEBUG'].empty? rescue false) unless opts.member? :debug
new(opts).tap do |vim|
unless opts[:cookie]
- vim.serviceContent.sessionManager.Login :userName => opts[:user], :password => opts[:password]
+ if WIN32 && opts[:password] == ''
+ # Attempt login by SSPI if no password specified on Windows
+ negotiation = Win32::SSPI::NegotiateAuth.new opts[:user], ENV['USERDOMAIN'].dup
+ begin
+ vim.serviceContent.sessionManager.LoginBySSPI :base64Token => negotiation.get_initial_token
+ rescue RbVmomi::Fault => fault
+ if !fault.fault.is_a?(RbVmomi::VIM::SSPIChallenge)
+ raise
+ else
+ vim.serviceContent.sessionManager.LoginBySSPI :base64Token => negotiation.complete_authentication(fault.base64Token)
+ end
+ end
+ else
+ vim.serviceContent.sessionManager.Login :userName => opts[:user], :password => opts[:password]
+ end
end
unless rev_given
rev = vim.serviceContent.about.apiVersion
- vim.rev = [rev, '5.5'].min
+ vim.rev = [rev, '6.0'].min
end
end
end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datacenter.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datacenter.rb
index 5ff5b5bb65..68ad07fcb0 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datacenter.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datacenter.rb
@@ -13,5 +13,10 @@ class RbVmomi::VIM::Datacenter
def find_vm path
vmFolder.traverse path, RbVmomi::VIM::VirtualMachine
end
+
+ # Traverse the given inventory +path+ to find a Folder.
+ def find_folder path
+ vmFolder.traverse path, RbVmomi::VIM::Folder
+ end
end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datastore.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datastore.rb
index c5ebeda328..fd673abe47 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datastore.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/Datastore.rb
@@ -63,6 +63,7 @@ class RbVmomi::VIM::Datastore
end
def mkuripath path
- "/folder/#{URI.escape path}?dcPath=#{URI.escape datacenter.name}&dsName=#{URI.escape name}"
+ datacenter_path_str = datacenter.path[1..-1].map{|elem| elem[1]}.join('/')
+ "/folder/#{URI.escape path}?dcPath=#{URI.escape datacenter_path_str }&dsName=#{URI.escape name}"
end
end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb
index 5f5e689a53..d57e0933a5 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/DynamicTypeMgrManagedTypeInfo.rb
@@ -29,13 +29,18 @@ class RbVmomi::VIM::DynamicTypeMgrManagedTypeInfo
'version-id-ref' => param.version,
}
end,
- 'result' => {
- 'name' => result.name,
- 'type-id-ref' => result.type.gsub("[]", ""),
- 'is-array' => (result.type =~ /\[\]$/) ? true : false,
- 'is-optional' => result.annotation.find{|a| a.name == "optional"} ? true : false,
- 'version-id-ref' => result.version,
- }
+ 'result' => (
+ if result.nil? then
+ nil
+ else
+ {
+ 'name' => result.name,
+ 'type-id-ref' => result.type.gsub("[]", ""),
+ 'is-array' => (result.type =~ /\[\]$/) ? true : false,
+ 'is-optional' => result.annotation.find{|a| a.name == "optional"} ? true : false,
+ 'version-id-ref' => result.version,
+ }
+ end)
}
]
end
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/OvfManager.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/OvfManager.rb
index cebbbc4e14..8f0c29d4e5 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/OvfManager.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/OvfManager.rb
@@ -16,6 +16,7 @@ class RbVmomi::VIM::OvfManager
# @option opts [String] :diskProvisioning (thin) Disk provisioning mode.
# @option opts [Hash] :networkMappings Network mappings.
# @option opts [Hash] :propertyMappings Property mappings.
+ # @option opts [String] :deploymentOption Deployment option key.
def deployOVF opts
opts = { :networkMappings => {},
:propertyMappings => {},
@@ -29,7 +30,7 @@ class RbVmomi::VIM::OvfManager
:hostSystem => opts[:host],
:locale => "US",
:entityName => opts[:vmName],
- :deploymentOption => "",
+ :deploymentOption => opts[:deploymentOption] || "",
:networkMapping => opts[:networkMappings].map{|from, to| RbVmomi::VIM::OvfNetworkMapping(:name => from, :network => to)},
:propertyMapping => opts[:propertyMappings].to_a,
:diskProvisioning => opts[:diskProvisioning]
diff --git a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb
index f2ee6e7da9..52416e1a67 100644
--- a/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb
+++ b/share/vendor/ruby/gems/rbvmomi/lib/rbvmomi/vim/ReflectManagedMethodExecuter.rb
@@ -2,7 +2,7 @@ module RbVmomi
class VIM::ReflectManagedMethodExecuter
def fetch moid, prop
- result = FetchSoap(:moid => moid, :version => 'urn:vim25/5.0', :prop => prop)
+ result = FetchSoap(:moid => moid, :version => 'urn:vim25/6.0', :prop => prop)
xml = Nokogiri(result.response)
_connection.deserializer.deserialize xml.root, nil
end
@@ -16,7 +16,7 @@ class VIM::ReflectManagedMethodExecuter
soap_arg.val = xml.target!
end
end
- result = ExecuteSoap(:moid => moid, :version => 'urn:vim25/5.0',
+ result = ExecuteSoap(:moid => moid, :version => 'urn:vim25/6.0',
:method => method, :argument => soap_args)
if result
_connection.deserializer.deserialize Nokogiri(result.response).root, nil
diff --git a/share/vendor/ruby/gems/rbvmomi/vmodl.db b/share/vendor/ruby/gems/rbvmomi/vmodl.db
index 0e98dc715d..c332918483 100644
Binary files a/share/vendor/ruby/gems/rbvmomi/vmodl.db and b/share/vendor/ruby/gems/rbvmomi/vmodl.db differ
diff --git a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb
index 7989ae015a..86260ce2bd 100644
--- a/src/vmm_mad/remotes/vcenter/vcenter_driver.rb
+++ b/src/vmm_mad/remotes/vcenter/vcenter_driver.rb
@@ -2015,7 +2015,7 @@ private
########################################################################
# Returns the spec to reconfig a VM and add a NIC
########################################################################
- def self.calculate_addnic_spec(vm, mac, bridge, model)
+ def self.calculate_addnic_spec(vm, mac, bridge, model, limit=nil, rsrv=nil)
model = model.nil? ? nil : model.downcase
network = vm.runtime.host.network.select{|n| n.name==bridge}
backing = nil
@@ -2065,17 +2065,33 @@ private
:port => port)
end
- return {:operation => :add,
- :device => nic_card.new(
- :key => 0,
- :deviceInfo => {
- :label => "net" + card_num.to_s,
- :summary => bridge
- },
- :backing => backing,
- :addressType => mac ? 'manual' : 'generated',
- :macAddress => mac
- )
+ card_spec = {
+ :key => 0,
+ :deviceInfo => {
+ :label => "net" + card_num.to_s,
+ :summary => bridge
+ },
+ :backing => backing,
+ :addressType => mac ? 'manual' : 'generated',
+ :macAddress => mac
+ }
+
+ if (limit or rsrv) and (limit > 0)
+ ra_spec = Hash.new
+ rsrv = limit if rsrv > limit
+ ra_spec[:limit] = limit if limit
+ ra_spec[:reservation] = rsrv if rsrv
+ ra_spec[:share] = RbVmomi::VIM.SharesInfo({
+ :level => RbVmomi::VIM.SharesLevel("normal"),
+ :shares => 0
+ })
+ card_spec[:resourceAllocation] =
+ RbVmomi::VIM.VirtualEthernetCardResourceAllocation(ra_spec)
+ end
+
+ return {
+ :operation => :add,
+ :device => nic_card.new(card_spec)
}
end
@@ -2410,7 +2426,24 @@ private
mac = nic.elements["MAC"].text
bridge = nic.elements["BRIDGE"].text
model = nic.elements["MODEL"] ? nic.elements["MODEL"].text : nil
- nic_array << calculate_addnic_spec(vm, mac, bridge, model)
+ limit_in = nic.elements["INBOUND_PEAK_BW"] ? nic.elements["INBOUND_PEAK_BW"].text : ""
+ limit_out = nic.elements["OUTBOUND_PEAK_BW"] ? nic.elements["OUTBOUND_PEAK_BW"].text : ""
+ limit = nil
+ if !limit_in.empty? or !limit_out.empty?
+ limit=([limit_in.to_i, limit_out.to_i].min / 1024) * 8
+ end
+ rsrv_in = nic.elements["INBOUND_AVG_BW"] ? nic.elements["INBOUND_AVG_BW"].text : ""
+ rsrv_out = nic.elements["OUTBOUND_AVG_BW"] ? nic.elements["OUTBOUND_AVG_BW"].text : ""
+ rsrv = nil
+ if !rsrv_in.empty? or !rsrv_out.empty?
+ rsrv=([rsrv_in.to_i, rsrv_out.to_i].min / 1024) * 8
+ end
+ nic_array << calculate_addnic_spec(vm,
+ mac,
+ bridge,
+ model,
+ limit,
+ rsrv)
}
device_change += nic_array
@@ -2421,7 +2454,7 @@ private
disks = xml.root.get_elements("/VM/TEMPLATE/DISK")
disk_spec = {}
- # If the VM is not new, avoid readding DISKS
+ # If the VM is not new, avoid reading DISKS
if !newvm
vm.config.hardware.device.select { |d|
if is_disk?(d)