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 2017/05/02 21:34:15 UTC

svn commit: r1793589 - /vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm

Author: arkurth
Date: Tue May  2 21:34:15 2017
New Revision: 1793589

URL: http://svn.apache.org/viewvc?rev=1793589&view=rev
Log:
VCL-913
Added logic to libvirt.pm::get_domain_name to limit the maximum length to 48 characters.

Other
Extended libvirt.pm::generate_domain_xml to include some potentially useful information in the domain/VM's description including the load time, management node, request and reservation IDs. It previously only included the image display name.

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

Modified: vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm
URL: http://svn.apache.org/viewvc/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm?rev=1793589&r1=1793588&r2=1793589&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm Tue May  2 21:34:15 2017
@@ -938,8 +938,17 @@ sub get_driver_name {
                will vary based on the base image used.
                
                If the request state is anything other than 'image', the domain
-               name is constructed from the computer and image names, example:
-               'vclv99-197:vmwarewin7-Windows764bit1846-v3'
+               name is constructed from the computer name, image display name
+               pruned of non-alphanumeric characters, image ID, and revision
+               number:
+               <computer name>_<image display name>_<image ID>-v<revision number>'
+               
+               Example:
+               'vm4-22_CentOS7Base64bitVM_3081-v5'
+               
+               Parts of the name may be omitted if the overall length exceeds
+               the maximum domain name length on some early versions of
+               libvirt/KVM - 48 characters.
 
 =cut
 
@@ -950,11 +959,19 @@ sub get_domain_name {
 		return;
 	}
 	
-	return $self->{domain_name} if defined $self->{domain_name};
+	# Only use argument for testing different lengths
+	my $max_length = shift;
+	if (!$max_length) {
+		return $self->{domain_name} if defined $self->{domain_name};
+		$max_length = 48;
+	}
 	
-	my $node_name = $self->data->get_vmhost_short_name();
 	my $request_state_name = $self->data->get_request_state_name();
-	my $computer_short_name = $self->data->get_computer_short_name();
+	my $computer_id = $self->data->get_computer_id();
+	my $computer_name = $self->data->get_computer_short_name();
+	my $image_id = $self->data->get_image_id();
+	my $image_pretty_name = $self->data->get_image_prettyname();
+	my $revision_number = $self->data->get_imagerevision_revision();
 	
 	# If request state is image the domain name will be that of the image used as the base image, not the image being created
 	# Must find existing loaded domain on node in order to determine name
@@ -971,10 +988,62 @@ sub get_domain_name {
 	}
 	
 	# Request state is not image, construct the domain name
-	my $image_name = $self->data->get_image_name();
+	# Make sure the computer name by itself isn't too long
+	# This shouldn't ever happen unless very long computer names are used
+	my $computer_name_length = length($computer_name);
+	if ($computer_name_length > $max_length) {
+		$self->{domain_name} = $computer_id;
+		notify($ERRORS{'WARNING'}, 0, "computer name '$computer_name' is longer ($computer_name_length characters) than the maximum domain name length ($max_length characters), domain name will be the computer ID: '$self->{domain_name}'");
+		return $self->{domain_name};
+	}
+	
+	my $prefix = "$computer_name\_";
+	my $prefix_length = length($prefix);
 	
-	$self->{domain_name} = $computer_short_name . '_' . $image_name;
-	notify($ERRORS{'DEBUG'}, 0, "constructed domain name: '$self->{domain_name}'");
+	my $suffix = "$image_id-v$revision_number";
+	my $suffix_length = length($suffix);
+	
+	my $prefix_suffix_length = ($prefix_length + $suffix_length);
+	
+	# Make sure computer name prefix + revision suffix don't exceed the maximum length
+	# If so, just use the computer name
+	if ($prefix_suffix_length > $max_length) {
+		$self->{domain_name} = $computer_name;
+		notify($ERRORS{'DEBUG'}, 0, "length of domain name prefix '$prefix' and suffix '$suffix' ($prefix_suffix_length characters) exceeds the maximum domain name length ($max_length characters), domain name will only contain the computer name: '$self->{domain_name}'");
+		return $self->{domain_name};
+	}
+	elsif ($prefix_suffix_length == $max_length) {
+		$self->{domain_name} = $prefix . $suffix;
+		notify($ERRORS{'DEBUG'}, 0, "length of domain name prefix '$prefix' and suffix '$suffix' ($prefix_suffix_length characters) equals the maximum domain name length ($max_length characters), domain name will only contain these components: '$self->{domain_name}'");
+		return $self->{domain_name};
+	}
+	
+	# Figure out the maximum number of characters to include in the middle section
+	# Subtract 1 for the separator character
+	my $max_middle_length = ($max_length - $prefix_suffix_length - 1);
+	if ($max_middle_length < 5) {
+		# Don't bother adding if middle section would be less than 5 characters
+		$self->{domain_name} = $prefix . $suffix;
+		notify($ERRORS{'DEBUG'}, 0, "length of domain name prefix '$prefix' and suffix '$suffix' ($prefix_suffix_length characters) is close to the maximum domain name length ($max_length characters), domain name will only contain these components: '$self->{domain_name}'");
+		return$self->{domain_name};
+	}
+	
+	my $middle_section = '';
+	
+	# Remove all characters except letters and numbers
+	(my $image_pretty_name_reduced = $image_pretty_name) =~ s/[^a-z0-9]+//ig;
+	my $image_pretty_name_reduced_length = length($image_pretty_name_reduced);
+	if (length($image_pretty_name_reduced) <= $max_middle_length) {
+		$middle_section = $image_pretty_name_reduced;
+	}
+	else {
+		$middle_section = substr($image_pretty_name_reduced, 0, $max_middle_length);
+		notify($ERRORS{'DEBUG'}, 0, "truncating middle section of domain name so overall length is $max_length characters: '$image_pretty_name_reduced' --> '$middle_section'");
+	}
+	
+	$self->{domain_name} = $prefix . $middle_section . '_' . $suffix;
+	my $domain_name_length = length($self->{domain_name});
+	notify($ERRORS{'DEBUG'}, 0, "constructed domain name: '$self->{domain_name}', length: $domain_name_length characters");
 	return $self->{domain_name};
 }
 
@@ -1652,10 +1721,15 @@ sub generate_domain_xml {
 		return;
 	}
 	
+	my $request_id = $self->data->get_request_id();
+	my $reservation_id = $self->data->get_reservation_id();
 	my $image_name = $self->data->get_image_name();
 	my $image_display_name = $self->data->get_image_prettyname();
 	my $image_os_type = $self->data->get_image_os_type();
 	my $computer_name = $self->data->get_computer_short_name();
+	my $management_node_name = $self->data->get_management_node_short_name();
+	
+	my $timestamp = makedatestring();
 	
 	my $domain_name = $self->get_domain_name();
 	my $domain_type = $self->driver->get_domain_type();
@@ -1710,6 +1784,15 @@ sub generate_domain_xml {
 	}
 	my $memory_kb = ($memory_mb * 1024);
 	
+	my $description = <<EOF;
+image: $image_display_name
+revision: $image_name
+load time: $timestamp
+management node: $management_node_name
+request ID: $request_id
+reservation ID: $reservation_id
+EOF
+
 	# Per libvirt documentation:
 	#   "The guest clock is typically initialized from the host clock.
 	#    Most operating systems expect the hardware clock to be kept in UTC, and this is the default.
@@ -1718,7 +1801,7 @@ sub generate_domain_xml {
 	
 	my $xml_hashref = {
 		'type' => $domain_type,
-		'description' => [$image_display_name],
+		'description' => [$description],
 		'name' => [$domain_name],
 		'on_poweroff' => ['preserve'],
 		'on_reboot' => ['restart'],
@@ -2792,6 +2875,9 @@ sub get_master_xml_device_info {
 	
 	if (!defined($self->{master_xml_device_info})) {
 		my $master_xml_info = $self->get_master_xml_info() || return;
+		if(scalar(keys %$master_xml_info) == 0) {
+			return;
+		}
 		
 		# Should always be a 'devices' key which contains an array ref with a single array value: $master_xml_info->{devices}->[0]
 		my $devices_array_ref = $master_xml_info->{devices};