I wrote a method a while back to allow me to upgrade VMware tools from within the CloudForms interface. I thought I would share it. I usually create a VM button to call the method, but it could probably be used elsewhere with some tweaking.
For the button, create it with System/Process/Request
, Message create
and Request upgrade_vmware_tools
.

Next, create an instance under /System/Process/Request called upgrade_vmware_tools
that has a relationship field pointing to the location of your method. In my case, I chose /Infrastructure/VM/Operations/Methods/upgrade_vmware_tools

Finally, you can create your instance and method.

Here’s the code for what I wrote:
###################################
#
# CFME Automate Method: upgrade_vmware_tools
#
# Inputs: $evm.root['vm']
#
###################################
begin
# Method for logging
def log(level, message)
@method = 'upgrade_vmware_tools'
$evm.log(level, "#{@method} - #{message}")
end
def dump_attributes(my_object, my_object_name)
$evm.log(:info, "Begin #{my_object_name}.attributes")
my_object.attributes.sort.each { |k, v| $evm.log(:info, "#{my_object_name} Attribute - #{k}: #{v}")}
$evm.log(:info, "End #{my_object_name}.attributes")
$evm.log(:info, "")
end
def dump_associations(my_object, my_object_name)
$evm.log(:info, "Begin #{my_object_name}.associations")
my_object.associations.sort.each { |a| $evm.log(:info, "#{my_object_name} Association - #{a}")}
$evm.log(:info, "End #{my_object_name}.associations")
$evm.log(:info, "")
end
def dump_virtual_columns(my_object, my_object_name)
$evm.log(:info, "Begin #{my_object_name}.virtual_columns")
my_object.virtual_column_names.sort.each { |vcn| $evm.log(:info, "#{my_object_name} Virtual Column - #{vcn}")}
$evm.log(:info, "End #{my_object_name}.virtual_columns")
$evm.log(:info, "")
end
log(:info, "CFME Automate Method Started")
# Log information
#dump_attributes($evm.root, "$evm.root")
#dump_associations($evm.root['vm'], "vm")
#dump_virtual_columns($evm.root, "$evm.root")
def find_vm(dc, name)
vm = {}
dc.datastoreFolder.childEntity.collect do |datastore|
vm[:instance] = datastore.vm.find { |x| x.name == name }
if vm[:instance]
vm[:datastore] = datastore.name
break
end
end
vm
end
def upg_tools(vm)
if vm[:instance][:guest][:guestFamily] == 'windowsGuest'
instopts = '/s /v "/qn REBOOT=ReallySuppress"'
else
instopts = nil
end
$evm.log(:info, "Upgrading VMware Tools on #{vm[:instance][:name]}")
upgtask = vm[:instance].UpgradeTools_Task(:installerOptions => instopts).wait_for_completion
end
require 'rbvmomi'
VIM = RbVmomi::VIM
rvm = $evm.root['vm']
ems = rvm.ext_management_system()
credentials = { :host => ems['hostname'], :user => ems.authentication_userid(), :password => ems.authentication_password(), :insecure => true }
vim = VIM.connect credentials
dc = vim.serviceInstance.find_datacenter
vm = find_vm(dc, rvm.name)
rc = upg_tools(vm)
# Exit method
log(:info, "CFME Automate Method Ended")
exit MIQ_OK
# Ruby rescue
rescue => err
log(:error, "[#{err}]\n#{err.backtrace.join("\n")}")
exit MIQ_ABORT
end |
###################################
#
# CFME Automate Method: upgrade_vmware_tools
#
# Inputs: $evm.root['vm']
#
###################################
begin
# Method for logging
def log(level, message)
@method = 'upgrade_vmware_tools'
$evm.log(level, "#{@method} - #{message}")
end
def dump_attributes(my_object, my_object_name)
$evm.log(:info, "Begin #{my_object_name}.attributes")
my_object.attributes.sort.each { |k, v| $evm.log(:info, "#{my_object_name} Attribute - #{k}: #{v}")}
$evm.log(:info, "End #{my_object_name}.attributes")
$evm.log(:info, "")
end
def dump_associations(my_object, my_object_name)
$evm.log(:info, "Begin #{my_object_name}.associations")
my_object.associations.sort.each { |a| $evm.log(:info, "#{my_object_name} Association - #{a}")}
$evm.log(:info, "End #{my_object_name}.associations")
$evm.log(:info, "")
end
def dump_virtual_columns(my_object, my_object_name)
$evm.log(:info, "Begin #{my_object_name}.virtual_columns")
my_object.virtual_column_names.sort.each { |vcn| $evm.log(:info, "#{my_object_name} Virtual Column - #{vcn}")}
$evm.log(:info, "End #{my_object_name}.virtual_columns")
$evm.log(:info, "")
end
log(:info, "CFME Automate Method Started")
# Log information
#dump_attributes($evm.root, "$evm.root")
#dump_associations($evm.root['vm'], "vm")
#dump_virtual_columns($evm.root, "$evm.root")
def find_vm(dc, name)
vm = {}
dc.datastoreFolder.childEntity.collect do |datastore|
vm[:instance] = datastore.vm.find { |x| x.name == name }
if vm[:instance]
vm[:datastore] = datastore.name
break
end
end
vm
end
def upg_tools(vm)
if vm[:instance][:guest][:guestFamily] == 'windowsGuest'
instopts = '/s /v "/qn REBOOT=ReallySuppress"'
else
instopts = nil
end
$evm.log(:info, "Upgrading VMware Tools on #{vm[:instance][:name]}")
upgtask = vm[:instance].UpgradeTools_Task(:installerOptions => instopts).wait_for_completion
end
require 'rbvmomi'
VIM = RbVmomi::VIM
rvm = $evm.root['vm']
ems = rvm.ext_management_system()
credentials = { :host => ems['hostname'], :user => ems.authentication_userid(), :password => ems.authentication_password(), :insecure => true }
vim = VIM.connect credentials
dc = vim.serviceInstance.find_datacenter
vm = find_vm(dc, rvm.name)
rc = upg_tools(vm)
# Exit method
log(:info, "CFME Automate Method Ended")
exit MIQ_OK
# Ruby rescue
rescue => err
log(:error, "[#{err}]\n#{err.backtrace.join("\n")}")
exit MIQ_ABORT
end
Recent Comments