You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by ar...@apache.org on 2014/10/23 17:53:17 UTC

svn commit: r1633848 - /vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm

Author: arkurth
Date: Thu Oct 23 15:53:16 2014
New Revision: 1633848

URL: http://svn.apache.org/r1633848
Log:
VCL-685
Updated VMware.pm::get_vm_virtual_hardware_version to check if the version of VMware on the host supports the hardware version of the image. If not supported, hardware version is overridden to the maximum version the host supports.

Modified:
    vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm?rev=1633848&r1=1633847&r2=1633848&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm Thu Oct 23 15:53:16 2014
@@ -4584,19 +4584,36 @@ sub get_vm_virtual_hardware_version {
 				notify($ERRORS{'DEBUG'}, 0, "retrieved VM virtual hardware version from reference vmx file: $hardware_version");
 			}
 		}
-		notify($ERRORS{'DEBUG'}, 0, "unable to retrieve VM virtual hardware version from reference vmx file, 'virtualHW.version' key does not exist");
+		if (!defined($hardware_version)) {
+			notify($ERRORS{'DEBUG'}, 0, "unable to retrieve VM virtual hardware version from reference vmx file, 'virtualHW.version' key does not exist");
+		}
 	}
 	
-	
-	if (!$hardware_version && $self->api->can("get_virtual_disk_hardware_version") && ($hardware_version = $self->api->get_virtual_disk_hardware_version($self->get_vmdk_file_path()))) {
-		notify($ERRORS{'DEBUG'}, 0, "retrieved hardware version from api object: $hardware_version");
+	# If hardware version could not be retrieved from reference vmx file, try to retrieve it from the vmdk file via the API object
+	if (!$hardware_version) {
+		if ($self->api->can("get_virtual_disk_hardware_version")) {
+			if ($hardware_version = $self->api->get_virtual_disk_hardware_version($self->get_vmdk_file_path())) {
+				notify($ERRORS{'DEBUG'}, 0, "retrieved virtual disk hardware version from api object: $hardware_version");
+			}
+			else {
+				notify($ERRORS{'DEBUG'}, 0, "unable to retrieve virtual disk hardware version from api object");
+			}
+		}
 	}
-	elsif (!$hardware_version && ($hardware_version = $self->get_vmdk_parameter_value('virtualHWVersion'))) {
-		notify($ERRORS{'DEBUG'}, 0, "retrieved hardware version stored in the vmdk file: $hardware_version") if $hardware_version;
+	
+	# Next, try to retrieve it directly from the vmdk file
+	if (!$hardware_version) {
+		if ($hardware_version = $self->get_vmdk_parameter_value('virtualHWVersion')) {
+			notify($ERRORS{'DEBUG'}, 0, "retrieved hardware version stored in the vmdk file: $hardware_version");
+		}
+		else {
+			notify($ERRORS{'DEBUG'}, 0, "unable to retrieve hardware version stored in the vmdk file");
+		}
 	}
-	elsif (!$hardware_version) {
-		notify($ERRORS{'WARNING'}, 0, "unable to determine hardware version of vmdk file, returning 7");
-		return 7;
+	
+	if (!$hardware_version) {
+		notify($ERRORS{'DEBUG'}, 0, "unable to determine hardware version from the reference vmx file or vmdk file, assuming 7");
+		$hardware_version = 7;
 	}
 	
 	# Get the VMware product name
@@ -4609,29 +4626,44 @@ sub get_vm_virtual_hardware_version {
 	# Override the hardware version retrieved from the vmdk file if:
 	# -VMware product = ESX
 	# -Adapter type = IDE
-	# -Hardware version = 4
-	if ($hardware_version < 7) {
-		if ($vmware_product_name =~ /esx/i) {
-			my $adapter_type = $self->get_vm_disk_adapter_type();
-			if (!$adapter_type) {
-				notify($ERRORS{'WARNING'}, 0, "unable to determine disk adapter type in order to tell if hardware version should be overridden, returning $hardware_version");
-				return $hardware_version;
-			}
-			elsif ($adapter_type =~ /ide/i) {
-				notify($ERRORS{'OK'}, 0, "overriding hardware version $hardware_version --> 7, IDE adapters cannot be used on ESX unless the hardware version is 7 or higher, VMware product: '$vmware_product_name', vmdk adapter type: $adapter_type, vmdk hardware version: $hardware_version");
-				return 7;
-			}
+	# -Hardware version < 7
+	if ($hardware_version < 7 && $vmware_product_name =~ /esx/i) {
+		my $adapter_type = $self->get_vm_disk_adapter_type();
+		if (!$adapter_type) {
+			notify($ERRORS{'WARNING'}, 0, "unable to determine disk adapter type in order to tell if hardware version should be overridden");
+		}
+		elsif ($adapter_type =~ /ide/i) {
+			notify($ERRORS{'OK'}, 0, "overriding hardware version $hardware_version --> 7, IDE adapters cannot be used on ESX unless the hardware version is 7 or higher, VMware product: '$vmware_product_name', vmdk adapter type: $adapter_type, vmdk hardware version: $hardware_version");
+			return 7;
 		}
 	}
-	else {
-		# Hardware version >= 7, check if VMware Server 1.x
-		if ($vmware_product_name =~ /VMware Server 1/i) {
-			notify($ERRORS{'OK'}, 0, "VMware product is '$vmware_product_name', overriding hardware version $hardware_version --> 4");
-				return 4;
+	
+	# Maximum hardware version by VMware version:
+	my $vmware_max_hardware_versions = {
+		'Server 1'  => 4,
+		'Server 2'  => 7,
+		'ESX 3'     => 4,
+		'ESXi? 4'   => 7,
+		'ESXi 5\.0' => 8,
+		'ESXi 5\.1' => 9,
+		'ESXi 5\.5' => 10,
+	};
+	
+	for my $vmware_version (keys %$vmware_max_hardware_versions) {
+		if ($vmware_product_name =~ /$vmware_version/i) {
+			my $vmware_max_hardware_version = $vmware_max_hardware_versions->{$vmware_version};
+			if ($hardware_version > $vmware_max_hardware_version) {
+				notify($ERRORS{'OK'}, 0, "$vmware_product_name does not support hardware version $hardware_version, returning $vmware_max_hardware_version");
+				return $vmware_max_hardware_version;
+			}
+			else {
+				notify($ERRORS{'DEBUG'}, 0, "$vmware_product_name supports hardware version $hardware_version");
+				return $hardware_version;
+			}
 		}
 	}
 	
-	notify($ERRORS{'DEBUG'}, 0, "returning hardware version: $hardware_version");
+	notify($ERRORS{'OK'}, 0, "returning hardware version $hardware_version");
 	return $hardware_version;
 }