CloudForms VMware Tools Upgrade method
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 |