vcl-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From arku...@apache.org
Subject svn commit: r1778634 - /vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm
Date Fri, 13 Jan 2017 16:57:34 GMT
Author: arkurth
Date: Fri Jan 13 16:57:34 2017
New Revision: 1778634

URL: http://svn.apache.org/viewvc?rev=1778634&view=rev
Log:
VCL-1008
Added libvirt.pm::get_master_xml_device_info to handle the common error checking when parsing
the device section of the domain XML.

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=1778634&r1=1778633&r2=1778634&view=diff
==============================================================================
--- vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm (original)
+++ vcl/trunk/managementnode/lib/VCL/Module/Provisioning/libvirt.pm Fri Jan 13 16:57:34 2017
@@ -2736,7 +2736,7 @@ sub get_master_xml_info {
 	}
 	
 	# Save the domain XML definition to a file in the master image directory
-	my $master_xml_file_path = $self->get_master_xml_file_path();
+	my $master_xml_file_path = $self->get_master_xml_file_path() || return;
 	if (!$self->vmhost_os->file_exists($master_xml_file_path)) {
 		notify($ERRORS{'DEBUG'}, 0, "master XML file does not exist: $master_xml_file_path");
 		$self->{master_xml_info} = {};
@@ -2753,7 +2753,8 @@ sub get_master_xml_info {
 	my $master_xml_hashref = xml_string_to_hash($master_xml_file_contents);
 	if ($master_xml_hashref) {
 		$self->{master_xml_info} = $master_xml_hashref;
-		#notify($ERRORS{'DEBUG'}, 0, "retrieved master XML info:\n" . format_data($self->{master_xml_info}));
+		notify($ERRORS{'DEBUG'}, 0, "retrieved master XML info from $master_xml_file_path");
+		#notify($ERRORS{'DEBUG'}, 0, "retrieved master XML info from $master_xml_file_path:\n"
. format_data($self->{master_xml_info}));
 	}
 	else {
 		notify($ERRORS{'WARNING'}, 0, "retrieved master XML info could not be parsed");
@@ -2764,12 +2765,85 @@ sub get_master_xml_info {
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 get_master_xml_device_info
+
+ Parameters  : $device_name (optional)
+ Returns     : hash reference
+ Description : Retrieves the device portion of the XML definition from the file
+               saved when the image was captured.
+               
+               If $device_name is specified, an array reference containing info
+               for the specific device is returned.
+               
+               If $device_name is not specified, a hash reference is returned.
+               Each key represents a device name.
+
+=cut
+
+sub get_master_xml_device_info {
+	my $self = shift;
+	unless (ref($self) && $self->isa('VCL::Module')) {
+		notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called
as a class method");
+		return;
+	}
+	
+	my $device_name = shift;
+	
+	my $master_xml_file_path = $self->get_master_xml_file_path();
+	
+	if (!defined($self->{master_xml_device_info})) {
+		my $master_xml_info = $self->get_master_xml_info() || 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};
+		if (!$devices_array_ref) {
+			notify($ERRORS{'WARNING'}, 0, "failed to retrieve device info from master XML file: $master_xml_file_path,
'devices' key is missing:\n" . format_data($master_xml_info));
+			return;
+		}
+		elsif(!ref($devices_array_ref) || ref($devices_array_ref) ne 'ARRAY') {
+			notify($ERRORS{'WARNING'}, 0, "failed to retrieve device info from master XML file: $master_xml_file_path,
'devices' key is not an array reference:\n" . format_data($master_xml_info));
+			return;
+		}
+		elsif(scalar(@$devices_array_ref) == 0) {
+			notify($ERRORS{'WARNING'}, 0, "failed to retrieve device info from master XML file: $master_xml_file_path,
'devices' array reference is empty:\n" . format_data($master_xml_info));
+			return;
+		}
+		elsif(scalar(@$devices_array_ref) > 1) {
+			notify($ERRORS{'WARNING'}, 0, "retrieved device info from master XML file: $master_xml_file_path,
'devices' array reference contains multiple values:\n" . format_data($devices_array_ref));
+		}
+		
+		$self->{master_xml_device_info} = @$devices_array_ref[0];
+		notify($ERRORS{'DEBUG'}, 0, "retrieved device info from master XML file: $master_xml_file_path,
hash reference keys:\n" . format_hash_keys($self->{master_xml_device_info}));	
+	}
+	
+	if ($device_name) {
+		if (defined($self->{master_xml_device_info}{$device_name})) {
+			## Only display the info once to reduce vcld.log noise
+			#if (!defined($self->{master_xml_device_info_displayed}{$device_name})) {
+			#	notify($ERRORS{'DEBUG'}, 0, "retrieved '$device_name' device info from master XML file:
$master_xml_file_path:\n" . format_data($self->{master_xml_device_info}{$device_name}));
+			#	$self->{master_xml_device_info_displayed}{$device_name} = 1;
+			#}
+			return $self->{master_xml_device_info}{$device_name};
+		}
+		else {
+			notify($ERRORS{'WARNING'}, 0, "'$device_name' key does not exist in device info from master
XML file: $master_xml_file_path:\n" . format_hash_keys($self->{master_xml_device_info}));
+			return;
+		}
+	}
+	else {
+		return $self->{master_xml_device_info};
+	}
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 =head2 get_master_xml_disk_bus_type
 
  Parameters  : none
  Returns     : string
  Description : Retrieves the disk bus type from the master XML file saved when
-               the image was captured.
+               the image was captured. If unable to determine from master XML,
+               'ide' is returned.
 
 =cut
 
@@ -2783,17 +2857,28 @@ sub get_master_xml_disk_bus_type {
 	return $self->{master_xml_disk_bus_type} if defined($self->{master_xml_disk_bus_type});
 	
 	$self->{master_xml_disk_bus_type} = 'ide';
-	my $master_xml_info = $self->get_master_xml_info() || return $self->{master_xml_disk_bus_type};
 	
-	my $type = $master_xml_info->{devices}->[0]->{disk}->[0]->{target}->[0]->{bus};
-	if ($type) {
-		$self->{master_xml_disk_bus_type} = $type;
+	my $disk_array_ref = $self->get_master_xml_device_info('disk') || return $self->{master_xml_disk_bus_type};
+	
+	for my $disk (@$disk_array_ref) {
+		# Make sure the device type is 'disk', ignore others such as 'cdrom'
+		my $device_type = $disk->{device} || '<unknown>';
+		if ($device_type ne 'disk') {
+			notify($ERRORS{'DEBUG'}, 0, "ignoring disk, type is $device_type:\n" . format_data($disk));
+			next;
+		}
+		
+		unless (defined($disk->{target}) && defined($disk->{target}->[0]) &&
defined($disk->{target}->[0]->{bus})) {
+			notify($ERRORS{'DEBUG'}, 0, "ignoring disk, '->{target}->[0]->{bus}' value is
missing:\n" . format_data($disk));
+			next;
+		}
+		$self->{master_xml_disk_bus_type} = $disk->{target}->[0]->{bus};
 		notify($ERRORS{'DEBUG'}, 0, "retrieved disk bus type from master XML info: $self->{master_xml_disk_bus_type}");
+		return $self->{master_xml_disk_bus_type};
 	}
-	else {
-		notify($ERRORS{'WARNING'}, 0, "failed to retrieve disk bus type (->{devices}->[0]->{disk}->[0]->{target}->[0]->{bus})
from master XML info:\n" . format_data($master_xml_info));
-	}
-	return $self->{master_xml_disk_bus_type};
+	
+	notify($ERRORS{'DEBUG'}, 0, "unable to determine disk bus type from master XML info, returning
default value: $self->{master_xml_disk_bus_type}");
+	$self->{master_xml_disk_bus_type};
 }
 
 #/////////////////////////////////////////////////////////////////////////////
@@ -2803,7 +2888,8 @@ sub get_master_xml_disk_bus_type {
  Parameters  : none
  Returns     : string
  Description : Retrieves the interface model type from the master XML file saved
-               when the image was captured.
+               when the image was captured. If unable to determine from master
+               XML, 'rtl8139' is returned.
 
 =cut
 
@@ -2817,17 +2903,21 @@ sub get_master_xml_interface_model_type
 	return $self->{master_xml_interface_model_type} if defined($self->{master_xml_interface_model_type});
 	
 	$self->{master_xml_interface_model_type} = 'rtl8139';
-	my $master_xml_info = $self->get_master_xml_info() || return $self->{master_xml_interface_model_type};
 	
-	my $type = $master_xml_info->{devices}->[0]->{interface}->[0]->{model}->[0]->{type};
-	if ($type) {
-		$self->{master_xml_interface_model_type} = $type;
+	my $interface_array_ref = $self->get_master_xml_device_info('interface') || return $self->{master_xml_interface_model_type};
+	
+	for my $interface (@$interface_array_ref) {
+		unless (defined($interface->{model}) && defined($interface->{model}->[0])
&& defined($interface->{model}->[0]->{type})) {
+			notify($ERRORS{'DEBUG'}, 0, "ignoring interface, '->{model}->[0]->{type}' value
is missing:\n" . format_data($interface));
+			next;
+		}
+		$self->{master_xml_interface_model_type} = $interface->{model}->[0]->{type};
 		notify($ERRORS{'DEBUG'}, 0, "retrieved interface model type from master XML info: $self->{master_xml_interface_model_type}");
+		return $self->{master_xml_interface_model_type};
 	}
-	else {
-		notify($ERRORS{'WARNING'}, 0, "failed to retrieve interface model type () from master XML
info:\n" . format_data($master_xml_info));
-	}
-	return $self->{master_xml_interface_model_type};
+	
+	notify($ERRORS{'DEBUG'}, 0, "unable to determine interface model type from master XML info,
returning default value: $self->{master_xml_interface_model_type}");
+	$self->{master_xml_interface_model_type};
 }
 
 



Mime
View raw message