diff --git a/lib/fog/vsphere/compute.rb b/lib/fog/vsphere/compute.rb index 214e04b0a..55acba26d 100644 --- a/lib/fog/vsphere/compute.rb +++ b/lib/fog/vsphere/compute.rb @@ -39,7 +39,7 @@ module Fog :ipaddress => 'guest.ipAddress', :power_state => 'runtime.powerState', :connection_state => 'runtime.connectionState', - :host => 'runtime.host', + :hypervisor => 'runtime.host', :tools_state => 'guest.toolsStatus', :tools_version => 'guest.toolsVersionStatus', :is_a_template => 'config.template', @@ -53,11 +53,26 @@ module Fog return nil unless vm_mob_ref props = vm_mob_ref.collect! *ATTR_TO_PROP.values.uniq + # NOTE: Object.tap is in 1.8.7 and later. + # Here we create the hash object that this method returns, but first we need + # to add a few more attributes that require additional calls to the vSphere + # API. The hypervisor name and mac_addresses attributes may not be available + # so we need catch any exceptions thrown during lookup and set them to nil. + # + # The use of the "tap" method here is a convience, it allows us to update the + # hash object without expliclty returning the hash at the end of the method. Hash[ATTR_TO_PROP.map { |k,v| [k.to_s, props[v]] }].tap do |attrs| attrs['id'] ||= vm_mob_ref._ref attrs['mo_ref'] = vm_mob_ref._ref - attrs['hypervisor'] = attrs['host'].name - attrs['mac_addresses'] = vm_mob_ref.macs + # The name method "magically" appears after a VM is ready and + # finished cloning. + if attrs['hypervisor'].kind_of?(RbVmomi::VIM::HostSystem) then + # If it's not ready, set the hypervisor to nil + attrs['hypervisor'] = attrs['hypervisor'].name rescue nil + end + # This inline rescue catches any standard error. While a VM is + # cloning, a call to the macs method will throw and NoMethodError + attrs['mac_addresses'] = vm_mob_ref.macs rescue nil attrs['path'] = get_folder_path(vm_mob_ref.parent) end end