vcl-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From arku...@apache.org
Subject svn commit: r1793117 - in /vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware: VIM_SSH.pm VMware.pm vSphere_SDK.pm
Date Fri, 28 Apr 2017 16:58:08 GMT
Author: arkurth
Date: Fri Apr 28 16:58:08 2017
New Revision: 1793117

URL: http://svn.apache.org/viewvc?rev=1793117&view=rev
Log:
VCL-974
Added a is_nested_virtualization_supported subroutine to VIM_SSH.pm and vSphere_SDK.pm.

Added call to is_nested_virtualization_supported to VMware.pm::prepare_vmx. The .vmx parameters
required for nested VMs now only get added if it can be verified that the host supports it.

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

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm?rev=1793117&r1=1793116&r2=1793117&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VIM_SSH.pm Fri Apr 28 16:58:08
2017
@@ -3012,6 +3012,138 @@ sub _print_compatible_guest_os_hardware_
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 get_host_capability_info
+
+ Parameters  : none
+ Returns     : hash reference
+ Description : Retrieves information about the capabilities of the VMware host.
+               A hash reference is returned similar to:
+                  {
+                    "bootOptionsSupported" => "true",
+                    "bootRetryOptionsSupported" => "true",
+                    "canConnectUSBDevices" => "<unset>",
+                    "changeTrackingSupported" => "false",
+                    "consolePreferencesSupported" => "true",
+                    "cpuFeatureMaskSupported" => "true",
+                    "disableSnapshotsSupported" => "false",
+                    "diskSharesSupported" => "true",
+                    "featureRequirementSupported" => "true",
+                    "guestAutoLockSupported" => "true",
+                    "hostBasedReplicationSupported" => "true",
+                    "lockSnapshotsSupported" => "false",
+                    "memoryReservationLockSupported" => "true",
+                    "memorySnapshotsSupported" => "true",
+                    "messageBusSupported" => "true",
+                    "multipleCoresPerSocketSupported" => "true",
+                    "multipleSnapshotsSupported" => "true",
+                    "nestedHVSupported" => "true",
+                    "npivWwnOnNonRdmVmSupported" => "true",
+                    "perVmEvcSupported" => "<unset>",
+                    "poweredOffSnapshotsSupported" => "true",
+                    "poweredOnMonitorTypeChangeSupported" => "true",
+                    "quiescedSnapshotsSupported" => "true",
+                    "recordReplaySupported" => "true",
+                    "revertToSnapshotSupported" => "true",
+                    "s1AcpiManagementSupported" => "true",
+                    "seSparseDiskSupported" => "true",
+                    "secureBootSupported" => "<unset>",
+                    "settingDisplayTopologyModesSupported" => "true",
+                    "settingDisplayTopologySupported" => "false",
+                    "settingScreenResolutionSupported" => "true",
+                    "settingVideoRamSizeSupported" => "true",
+                    "snapshotConfigSupported" => "true",
+                    "snapshotOperationsSupported" => "true",
+                    "swapPlacementSupported" => "true",
+                    "toolsAutoUpdateSupported" => "false",
+                    "toolsRebootPredictSupported" => "<unset>",
+                    "toolsSyncTimeSupported" => "true",
+                    "vPMCSupported" => "true",
+                    "virtualMmuUsageSupported" => "true",
+                    "vmNpivWwnDisableSupported" => "true",
+                    "vmNpivWwnSupported" => "true",
+                    "vmNpivWwnUpdateSupported" => "true",
+                    "vmfsNativeSnapshotSupported" => "false"
+                  }
+
+=cut
+
+sub get_host_capability_info {
+	my $self = shift;
+	if (ref($self) !~ /VCL::Module/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called
as a class method");
+		return;
+	}
+	
+	if (defined($self->{host_capability_info})) {
+		return $self->{host_capability_info};
+	}
+	
+	my $vmhost_computer_name = $self->data->get_vmhost_short_name();
+	
+	my $version_key = $self->get_highest_vm_hardware_version_key();
+	if (!$version_key) {
+		notify($ERRORS{'WARNING'}, 0, "unable to retrieve host capability info from $vmhost_computer_name,
failed to retrieve highest supported virtual machine hardware");
+		return;
+	}
+	
+	my $config_option_info = $self->get_config_option_info($version_key);
+	if (!$config_option_info) {
+		notify($ERRORS{'WARNING'}, 0, "unable to retrieve host capability info from $vmhost_computer_name,
failed to retrieve host config option info");
+		return;
+	}
+	
+	if ($config_option_info->{capabilities}) {
+		$self->{host_capability_info} = $config_option_info->{capabilities};
+		return $self->{host_capability_info};
+	}
+	else {
+		notify($ERRORS{'WARNING'}, 0, "failed to retrieve host capability info from $vmhost_computer_name,
config option info does not contain a 'capabilities' key:\n" . format_hash_keys($config_option_info));
+		return;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 is_nested_virtualization_supported
+
+ Parameters  : none
+ Returns     : boolean
+ Description : Determines whether or not the VMware host supports nested
+               hardware-assisted virtualization.
+
+=cut
+
+sub is_nested_virtualization_supported {
+	my $self = shift;
+	if (ref($self) !~ /VCL::Module/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called
as a class method");
+		return;
+	}
+	
+	my $vmhost_computer_name = $self->data->get_vmhost_short_name();
+	
+	my $host_capability_info = $self->get_host_capability_info();
+	if (!$host_capability_info) {
+		notify($ERRORS{'WARNING'}, 0, "unable to determine if nested virtualization is supported
on $vmhost_computer_name, failed to retrieve host capability info");
+		return;
+	}
+	
+	if (!defined($host_capability_info->{nestedHVSupported})) {
+		notify($ERRORS{'DEBUG'}, 0, "nested virtualization is NOT supported on $vmhost_computer_name,
host capability info does not contain a 'nestedHVSupported' key:\n" . format_hash_keys($host_capability_info));
+		return 0;
+	}
+	elsif ($host_capability_info->{nestedHVSupported} !~ /true/i) {
+		notify($ERRORS{'DEBUG'}, 0, "nested virtualization is NOT supported on $vmhost_computer_name,
nestedHVSupported value: $host_capability_info->{nestedHVSupported}");
+		return 0;
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "nested virtualization is supported on $vmhost_computer_name,
nestedHVSupported value: $host_capability_info->{nestedHVSupported}");
+		return 1;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 _parse_vim_cmd_output
 
  Parameters  : $vim_cmd_output

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=1793117&r1=1793116&r2=1793117&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm Fri Apr 28 16:58:08
2017
@@ -1747,17 +1747,12 @@ sub prepare_vmx {
 		".encoding" => "UTF-8",
 		#"bios.bootDelay" => "1000",
 		"config.version" => "8",
-		"cpuid.1.ecx" => "--------------------------H-----",
 		"cpuid.coresPerSocket" => "$vm_cores_per_socket",
 		"displayName" => "$display_name",
-		"featMask.vm.hv.capable" => "Min:1",
 		"floppy0.present" => "FALSE",
 		"guestOS" => "$guest_os",
 		"gui.exitOnCLIHLT" => "TRUE",	# causes the virtual machine to power off automatically
when you choose Start > Shut Down from the Windows guest
-		"hypervisor.cpuid.v0" => "FALSE",
 		"memsize" => "$vm_ram",
-		"monitor.virtual_mmu" => "hardware",
-		"monitor.virtual_exec" => "hardware",
 		"mem.hotadd" => "TRUE",
 		"msg.autoAnswer" => "TRUE",	# tries to automatically answer all questions that may occur
at boot-time.
 		#"mks.enable3d" => "TRUE",
@@ -1781,11 +1776,21 @@ sub prepare_vmx {
 		"usb.present" => "TRUE",
 		"uuid.action" => "keep",	# Keep the VM's uuid, keeps existing MAC
 		"vcpu.hotadd" => "TRUE",
-		"vhv.enable" => "TRUE",
 		"virtualHW.version" => "$vm_hardware_version",
 		"workingDir" => "$vmx_directory_path",
 	);
 	
+	if ($self->api->is_nested_virtualization_supported()) {
+		%vmx_parameters = (%vmx_parameters, (
+			"cpuid.1.ecx" => "--------------------------H-----",
+			"featMask.vm.hv.capable" => "Min:1",
+			"hypervisor.cpuid.v0" => "FALSE",
+			"monitor.virtual_mmu" => "hardware",
+			"monitor.virtual_exec" => "hardware",
+			"vhv.enable" => "TRUE",
+		));
+	}
+	
 	#>>>>>>>>>>
 	## Experimental - Support for VMware ESXi's built in VNC server functionality
 	#my $reservation_id = $self->data->get_reservation_id();

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm?rev=1793117&r1=1793116&r2=1793117&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/vSphere_SDK.pm Fri Apr 28
16:58:08 2017
@@ -4338,6 +4338,50 @@ sub get_vm_virtual_disk_file_paths {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 is_nested_virtualization_supported
+
+ Parameters  : none
+ Returns     : boolean
+ Description : Determines whether or not the VMware host supports nested
+               hardware-assisted virtualization.
+
+=cut
+
+sub is_nested_virtualization_supported {
+	my $self = shift;
+	if (ref($self) !~ /module/i) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called
as a class method");
+		return;
+	}
+	
+	my $vmhost_computer_name = $self->data->get_vmhost_short_name();
+	
+	my $host_system_view = $self->_get_host_system_view() || return;
+	
+	if (!$host_system_view) {
+		notify($ERRORS{'WARNING'}, 0, "unable to determine if nested virtualization is supported
on $vmhost_computer_name, failed to retrieve host system view");
+		return;
+	}
+	elsif (!defined($host_system_view->{capability})) {
+		notify($ERRORS{'DEBUG'}, 0, "nested virtualization is NOT supported on $vmhost_computer_name,
host system view does NOT contain a 'capability' key:\n" . format_hash_keys($host_system_view));
+		return 0;
+	}
+	elsif (!defined($host_system_view->{capability}{nestedHVSupported})) {
+		notify($ERRORS{'DEBUG'}, 0, "nested virtualization is NOT supported on $vmhost_computer_name,
host system view capability info does NOT contain a 'nestedHVSupported' key:\n" . format_hash_keys($host_system_view->{capability}));
+		return 0;
+	}
+	elsif ($host_system_view->{capability}{nestedHVSupported} != 1) {
+		notify($ERRORS{'DEBUG'}, 0, "nested virtualization is NOT supported on $vmhost_computer_name,
nestedHVSupported value: $host_system_view->{capability}{nestedHVSupported}");
+		return 0;
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "nested virtualization is supported on $vmhost_computer_name,
nestedHVSupported value: $host_system_view->{capability}{nestedHVSupported}");
+		return 1;
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 DESTROY
 
  Parameters  : none



Mime
View raw message