vcl-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From arku...@apache.org
Subject svn commit: r1056343 - in /incubator/vcl/trunk/managementnode/lib/VCL/Module: OS/Linux.pm OS/Linux/ManagementNode.pm Provisioning.pm Provisioning/VMware/VMware.pm
Date Fri, 07 Jan 2011 15:16:42 GMT
Author: arkurth
Date: Fri Jan  7 15:16:40 2011
New Revision: 1056343

URL: http://svn.apache.org/viewvc?rev=1056343&view=rev
Log:
VCL-394
Moved code in VMware.pm::capture() which sets permissions on the image files after they have
been copied to the image repository to a separate subroutine named set_image_repository_permissions.
 Added additional methods to attempt to locate the image repository files in this subroutine.

Updated VMware.pm::initialize to make 3 attempts to check if the VM host is responding to
SSH.  The first attempt may occasionally fail.

Other
Fixed bug in Linux.pm::set_file_permissions.  It was displaying an uninitialized string warning
if the argument passed was a single file.

Updated ManagementNode.pm::execute to correctly handle the optional $display_output argument.

Updated Provisioning.pm::retrieve_image.  It was passing a full /tmp/... file path to Semaphore.pm::get_semaphore.
 This isn't necessary and the temp file created had an unexpected name.  Changed to pass only
the image name.

Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm
    incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm?rev=1056343&r1=1056342&r2=1056343&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux.pm Fri Jan  7 15:16:40 2011
@@ -2106,7 +2106,7 @@ sub set_file_permissions {
 	}
 	
 	my $recursive = shift;
-	my $recursive_string;
+	my $recursive_string = '';
 	$recursive_string = "recursively " if $recursive;
 	
 	# Get the computer short and hostname
@@ -2117,7 +2117,7 @@ sub set_file_permissions {
 	$command .= "-R " if $recursive;
 	$command .= "$chmod_mode \"$path\"";
 	
-	my ($exit_status, $output) = $self->execute($command);
+	my ($exit_status, $output) = $self->execute($command, 0);
 	if (!defined($output)) {
 		notify($ERRORS{'WARNING'}, 0, "failed to run command to " . $recursive_string . "set file
permissions on $computer_node_name: '$command'");
 		return;

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm?rev=1056343&r1=1056342&r2=1056343&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/OS/Linux/ManagementNode.pm Fri Jan 
7 15:16:40 2011
@@ -118,12 +118,11 @@ sub execute {
 	# Get 2nd display output argument if supplied, or set default value
 	my $display_output = shift || '0';
 	
-	
 	# Run the command
-	my ($exit_status, $output) = run_command($command, $display_output);
+	my ($exit_status, $output) = run_command($command, !$display_output);
 	if (defined($exit_status) && defined($output)) {
 		if ($display_output) {
-			notify($ERRORS{'OK'}, 0, "executed command: '$command', exit status: $exit_status, output:\n"
. join("\n", @$output));
+			notify($ERRORS{'OK'}, 0, "executed command: '$command', exit status: $exit_status, output:\n"
. join("\n", @$output)) if $display_output;
 		}
 		return ($exit_status, $output);
 	}

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm?rev=1056343&r1=1056342&r2=1056343&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning.pm Fri Jan  7 15:16:40
2011
@@ -141,7 +141,7 @@ sub retrieve_image {
 	
 	# Get a semaphore so only 1 process is able to retrieve the image at a time
 	# Do this before checking if the image exists in case another process is retrieving the
image
-	my $semaphore = $self->get_semaphore("/tmp/retrieve_$image_name.lock", (60 * 15)) ||
return;
+	my $semaphore = $self->get_semaphore("retrieve_$image_name", (60 * 15)) || return;
 	
 	# Make sure image does not already exist on this management node
 	if ($self->does_image_exist($image_name)) {

Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm?rev=1056343&r1=1056342&r2=1056343&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/VMware/VMware.pm Fri Jan
 7 15:16:40 2011
@@ -249,7 +249,7 @@ sub initialize {
 	notify($ERRORS{'DEBUG'}, 0, "attempting to create OS object for the image currently loaded
on the VM host: $vmhost_computer_name\nimage name: $vmhost_image_name\nOS module: $vmhost_os_module_package");
 	if (my $vmhost_os = $self->get_vmhost_os_object($vmhost_os_module_package)) {
 		# Check if SSH is responding
-		if ($vmhost_os->is_ssh_responding()) {
+		if ($vmhost_os->is_ssh_responding(3)) {
 			$self->{vmhost_os} = $vmhost_os;
 			notify($ERRORS{'OK'}, 0, "OS on VM host $vmhost_computer_name will be controlled using
a " . ref($self->{vmhost_os}) . " OS object");
 		}
@@ -666,26 +666,8 @@ sub capture {
 		}
 		
 		# Attempt to set permissions on the image repository directory
-		# VMware's methods to copy the files will set the permissions to 0700
-		# This prevents image retrieval from working when other management nodes attempt to retrieve
the image
-		# Attempt to call the VM host OS's set_file_permissions subroutine if the repository is
mounted on the VM host
-		if ($repository_mounted_on_vmhost && $self->vmhost_os->can('set_file_permissions')
&& $self->vmhost_os->set_file_permissions($repository_directory_path, '0755',
1)) {
-			notify($ERRORS{'OK'}, 0, "set file permissions on the image repository directory mounted
on the VM host: $repository_directory_path");
-		}
-		elsif (-d $repository_directory_path) {
-			# Set the permissions locally on the management node if the directory exists
-			notify($ERRORS{'DEBUG'}, 0, "image repository directory exists on the management node:
$repository_directory_path, attempting to set permissions to 0644");
-			
-			if ($self->mn_os->set_file_permissions($repository_directory_path, '0644', 1)) {
-				notify($ERRORS{'OK'}, 0, "set permissions for image repository directory on the management
node: $repository_directory_path");
-			}
-			else {
-				notify($ERRORS{'WARNING'}, 0, "failed to set permissions for image repository directory
on the management node: $repository_directory_path");
-			}
-		}
-		else {
-			notify($ERRORS{'WARNING'}, 0, "unable to set permissions on image repository directory:
$repository_directory_path");
-		}
+		# Don't fail the capture if this fails, it only affects image retrieval from another managment
node
+		$self->set_image_repository_permissions();
 	}
 	else {
 		# The repository path isn't set in the VM profile
@@ -3509,8 +3491,8 @@ sub get_image_repository_search_paths {
 	
 	my @repository_search_paths;
 	
-	if (my $repository_vmdk_file_path = $self->get_repository_vmdk_file_path()) {
-		push @repository_search_paths, $repository_vmdk_file_path;
+	if (my $repository_vmdk_directory_path = $self->get_repository_vmdk_directory_path())
{
+		push @repository_search_paths, "$repository_vmdk_directory_path/$image_name*.vmdk";
 	}
 	
 	if (my $management_node_install_path = $self->data->get_management_node_install_path($management_node_identifier))
{
@@ -6198,6 +6180,101 @@ sub configure_vmhost_persistent_ssh_key 
 
 #/////////////////////////////////////////////////////////////////////////////
 
+=head2 set_image_repository_permissions
+
+ Parameters  : none
+ Returns     : boolean
+ Description : Sets file permissions to 0755 on the image repository directory
+               and files for the reservation image. The directory may either be
+               mounted on the VM host or management node.
+
+=cut
+
+sub set_image_repository_permissions {
+	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 $image_name = $self->data->get_image_name();
+	my $repository_directory_path = $self->get_repository_vmdk_directory_path();
+	my $repository_mounted_on_vmhost = $self->is_repository_mounted_on_vmhost();
+	
+	my $mode = '0755';
+	
+	# Attempt to set permissions on the image repository directory
+	# VMware's methods to copy the files will set the permissions to 0700
+	# This prevents image retrieval from working when other management nodes attempt to retrieve
the image
+	# The directory and all vmdk files must have r & x permissions or else image retrieval
from another managment node will fail
+	
+	# Attempt to call the VM host OS's set_file_permissions subroutine if the repository is
mounted on the VM host
+	if ($repository_mounted_on_vmhost && $self->vmhost_os->can('set_file_permissions'))
{
+		if ($self->vmhost_os->set_file_permissions($repository_directory_path, '0755', 1))
{
+			notify($ERRORS{'OK'}, 0, "set file permissions on image repository directory mounted on
the VM host: $repository_directory_path");
+			return 1;
+		}
+		else {
+			notify($ERRORS{'DEBUG'}, 0, "failed to set file permissions on the image repository directory
mounted on the VM host: $repository_directory_path");
+		}
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "repository is either not mounted on the VM host or the VM
host OS is unable to set file permissions: $repository_directory_path");
+	}
+	
+	# Attempt to find image files on the management node by searching all paths returned by
get_image_repository_search_paths()
+	my %repository_image_file_path_hash;
+	my @image_repository_search_paths = $self->get_image_repository_search_paths();
+	for my $search_path (@image_repository_search_paths) {
+		my ($exit_status, $output) = $self->mn_os->execute("ls -1 $search_path", 0);
+		
+		my @file_paths_found = grep(/^\//, @$output);
+		notify($ERRORS{'DEBUG'}, 0, "search path: $search_path, file paths found: " . scalar(@file_paths_found));
+		
+		for my $file_path (@file_paths_found) {
+			$repository_image_file_path_hash{$file_path} = 1;
+		}
+	}
+	if (!%repository_image_file_path_hash) {
+		notify($ERRORS{'WARNING'}, 0, "failed to find image files in repository on the management
node");
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "found image files in repository on the management node:\n"
. join("\n", sort keys(%repository_image_file_path_hash)));
+		my $error_occurred = 0;
+		for my $file_path (sort keys(%repository_image_file_path_hash)) {
+			if (!$self->mn_os->set_file_permissions($file_path, $mode)) {
+				notify($ERRORS{'WARNING'}, 0, "failed to set permissions to $mode on $file_path on management
node");
+				$error_occurred = 1;
+			}
+		}
+		if (!$error_occurred) {
+			notify($ERRORS{'OK'}, 0, "set permissions on files in image repository for image $image_name
to $mode");
+			return 1;
+		}
+	}
+	
+	# Check if the repository directory path exists on the management node
+	if (-d $repository_directory_path) {
+		notify($ERRORS{'DEBUG'}, 0, "repository directory exists on the management node: $repository_directory_path");
+		
+		if ($self->mn_os->set_file_permissions($repository_directory_path, $mode, 1)) {
+			notify($ERRORS{'OK'}, 0, "set permissions for image repository directory on the management
node: $repository_directory_path");
+			return 1;
+		}
+		else {
+			notify($ERRORS{'WARNING'}, 0, "failed to set permissions for image repository directory
on the management node: $repository_directory_path");
+		}
+	}
+	else {
+		notify($ERRORS{'DEBUG'}, 0, "repository directory does NOT exist on the management node:
$repository_directory_path");
+	}
+	
+	notify($ERRORS{'WARNING'}, 0, "failed to set permissions on files in image repository for
image $image_name to $mode");
+	return 0;
+}
+
+#/////////////////////////////////////////////////////////////////////////////
+
 1;
 __END__
 



Mime
View raw message