Author: arkurth Date: Wed Jun 10 18:51:43 2009 New Revision: 783449 URL: http://svn.apache.org/viewvc?rev=783449&view=rev Log: VCL-153 Updated xCAT21.pm to more closely match xCAT.pm. Renamed capture_prepare() to capture(), and changed calls to OS pre_capture() subroutines. Also changed xCAT.pm's parent module to xCAT.pm so common subroutines can be shared.
Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT21.pm Modified: incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT21.pm URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT21.pm?rev=783449&r1=783448&r2=783449&view=diff ============================================================================== --- incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT21.pm (original) +++ incubator/vcl/trunk/managementnode/lib/VCL/Module/Provisioning/xCAT21.pm Wed Jun 10 18:51:43 2009 @@ -44,7 +44,7 @@ use lib "$FindBin::Bin/../../.."; # Configure inheritance -use base qw(VCL::Module::Provisioning); +use base qw(VCL::Module::Provisioning::xCAT); # Specify the version of this module our $VERSION = '1.00'; @@ -231,7 +231,7 @@ } # Insert a computerloadlog record and edit nodelist table - insertloadlog($reservation_id, $computer_id, "editnodelist", "updating nodelist table"); + insertloadlog($reservation_id, $computer_id, "info", "updating nodelist table"); if ($self->_edit_nodelist($computer_node_name, 0)) { notify($ERRORS{'OK'}, 0, "nodelist updated for $computer_node_name"); } @@ -349,7 +349,7 @@ } if ($_ =~ /nodeset failure/) { my $success = 0; - notify($ERRORS{'WARNING'}, 0, "rinstall's nodeset failed - trying nodeset directly: ($_)"); + notify($ERRORS{'OK'}, 0, "rinstall's nodeset failed - trying nodeset directly: ($_)"); if (open(NODESET, "$XCAT_ROOT/sbin/nodeset $computer_node_name install 2>&1 |")) { while (<NODESET>) { chomp($_); @@ -1033,10 +1033,10 @@ # Perform post load tasks # Windows specific routines - if ($image_os_name =~ /winvista/) { - # If Vista, don't perform post-load tasks here - # new.pm calls the Vista module's post_load() subroutine to perform the same tasks as below - notify($ERRORS{'OK'}, 0, "vista image, skipping OS preparation tasks in xCAT.pm, returning 1"); + if ($self->os->can('post_load')) { + # If post-load has been implemented by the OS module, don't perform these tasks here + # new.pm calls the Windows module's post_load() subroutine to perform the same tasks as below + notify($ERRORS{'OK'}, 0, "post_load() has been implemented by the OS module, skipping these tasks in xCAT.pm, returning 1"); return 1; } elsif ($image_os_name =~ /winxp|wxp|win2003|winvista/) { @@ -1301,7 +1301,7 @@ #///////////////////////////////////////////////////////////////////////////// -=head2 capture_prepare +=head2 capture Parameters : Returns : 1 if sucessful, 0 if failed @@ -1309,7 +1309,7 @@ =cut -sub capture_prepare { +sub capture { my $self = shift; if (ref($self) !~ /xCAT/i) { notify($ERRORS{'CRITICAL'}, 0, "subroutine was called as a function, it must be called as a class method"); @@ -1331,6 +1331,46 @@ else { notify($ERRORS{'WARNING'}, 0, "unable to update currentimage.txt on $computer_short_name"); } + + # Check if pre_capture() subroutine has been implemented by the OS module + if ($self->os->can("pre_capture")) { + # Call OS pre_capture() - it should perform all OS steps necessary to capture an image + # pre_capture() should shut down the computer when it is done + notify($ERRORS{'OK'}, 0, "calling OS module's pre_capture() subroutine"); + if (!$self->os->pre_capture({end_state => 'off'})) { + notify($ERRORS{'WARNING'}, 0, "OS module pre_capture() failed"); + return 0; + } + + # The OS module should turn the computer power off + # Wait up to 2 minutes for the computer's power status to be off + if ($self->wait_for_off(2)) { + notify($ERRORS{'OK'}, 0, "computer $computer_node_name power is off"); + } + else { + notify($ERRORS{'WARNING'}, 0, "$computer_node_name power is still on, turning computer off"); + + # Attempt to power off computer + if ($self->power_off()) { + notify($ERRORS{'OK'}, 0, "$computer_node_name was powered off"); + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to power off $computer_node_name"); + return 0; + } + } + } ## end if ($self->os->can("pre_capture")) + elsif ($self->os->can("capture_prepare")) { + notify($ERRORS{'OK'}, 0, "calling OS module's capture_prepare() subroutine"); + if (!$self->os->capture_prepare()) { + notify($ERRORS{'WARNING'}, 0, "OS module capture_prepare() failed"); + return 0; + } + } + else { + notify($ERRORS{'WARNING'}, 0, "OS module does not have either a pre_capture() or capture_prepare() subroutine"); + return 0; + } if ($self->_edit_nodetype($computer_node_name, $image_name, 1)) { notify($ERRORS{'OK'}, 0, "nodetype modified, node $computer_node_name, image name $image_name"); @@ -1348,16 +1388,6 @@ notify($ERRORS{'CRITICAL'}, 0, "could not edit nodelist for $computer_node_name"); } - my @Images; - my ($i, $imagefile); - - # Get the image repository path - my $image_repository_path = $self->_get_image_repository_path(); - if (!$image_repository_path) { - notify($ERRORS{'CRITICAL'}, 0, "xCAT image repository information could not be determined"); - return 0; - } - # Call xCAT's nodeset, configure xCAT to save image on next reboot if (_nodeset_option($computer_node_name, "image")) { notify($ERRORS{'OK'}, 0, "$computer_node_name set to image state"); @@ -1366,6 +1396,41 @@ notify($ERRORS{'CRITICAL'}, 0, "failed $computer_node_name set to image state"); return 0; } + + # Check if pre_capture() subroutine has been implemented by the OS module + # If so, all that needs to happen is for the computer to be powered on + if ($self->os->can("pre_capture")) { + # Turn the computer on + if ($self->power_on()) { + notify($ERRORS{'OK'}, 0, "$computer_node_name was powered on"); + } + else { + notify($ERRORS{'WARNING'}, 0, "failed to turn computer on before monitoring image capture"); + return 0; + } + } ## end if ($self->os->can("pre_capture")) + # If capture_start() is implemented, call it, it will initiate a reboot + elsif ($self->os->can("capture_start")) { + notify($ERRORS{'OK'}, 0, "calling OS module's capture_start() subroutine"); + if (!$self->os->capture_start()) { + notify($ERRORS{'WARNING'}, 0, "OS module capture_start() failed"); + return 0; + } + } + else { + notify($ERRORS{'WARNING'}, 0, "OS module does not have either a pre_capture() or capture_start() subroutine"); + return 0; + } + + + # Monitor the image capture + if ($self->capture_monitor()) { + notify($ERRORS{'OK'}, 0, "image capture monitoring is complete"); + } + else { + notify($ERRORS{'WARNING'}, 0, "problem occurred while monitoring image capture"); + return 0; + } notify($ERRORS{'OK'}, 0, "returning 1"); return 1; @@ -1414,7 +1479,7 @@ # check /var/log/messages file for node entries or # or check nodestat for boot flag - if ($fullloopcnt > 10) { + if ($fullloopcnt > 30) { # looped 10 times without seeing a change in file size or # change in output of nodestat, must have failed notify($ERRORS{'CRITICAL'}, 0, "reached max loop cnt with no change in image file size and no change in output from nodestat, failing"); @@ -1465,24 +1530,29 @@ $status =~ s/$computer_node_name: //; } ## end foreach my $l (@file) } ## end if (open(NODESTAT, "$XCAT_ROOT/bin/nodestat $computer_node_name stat 2>&1 |"... - else { + #else { # could not run nodestat command, fall back to watching image size # Check the image size to see if it's growing notify($ERRORS{'OK'}, 0, "checking size of image"); my $size = $self->get_image_size($image_name); + notify($ERRORS{'OK'}, 0, "retrieved size of image: $size"); + if ($size > $filesize) { notify($ERRORS{'OK'}, 0, "image size has changed: $size, still copying"); $filesize = $size; $fullloopcnt = 0; } elsif ($size == $filesize) { + notify($ERRORS{'OK'}, 0, "image size has NOT changed"); if ($filewatchcnt > 5) { notify($ERRORS{'CRITICAL'}, 0, "waited too long for file size to change for $image_name from $computer_node_name, failing"); return 0; } $filewatchcnt++; } - } ## end else [ if (open(NODESTAT, "$XCAT_ROOT/bin/nodestat $computer_node_name stat 2>&1 |"... + + #} ## end else [ if (open(NODESTAT, "$XCAT_ROOT/bin/nodestat $computer_node_name stat 2>&1 |"... + if ($status =~ /partimage-ng: partition/) { if ($status eq $laststatus) { notify($ERRORS{'DEBUG'}, 0, "nodestat status did not change from last iteration ($status)"); @@ -1499,6 +1569,7 @@ # report status notify($ERRORS{'OK'}, 0, "partimage-ng running on $computer_node_name: $status"); } ## end if ($status =~ /partimage-ng: partition/) + $fullloopcnt++; goto CIWAITIMAGE; } ## end sub capture_monitor @@ -2087,6 +2158,7 @@ my $computer_ip_address = 0; my $image_os_name = 0; my $image_name = 0; + my $image_os_type = 0; # Check if subroutine was called as a class method if (ref($self) !~ /xcat/i) { @@ -2489,7 +2561,7 @@ return; } - # Make sure imag library functions are enabled + # Make sure image library functions are enabled my $image_lib_enable = $self->data->get_management_node_image_lib_enable(); if (!$image_lib_enable) { notify($ERRORS{'OK'}, 0, "image library functions are disabled"); @@ -2514,7 +2586,7 @@ notify($ERRORS{'WARNING'}, 0, "image library configuration data is missing: user=$image_lib_user, key=$image_lib_key, partners=$image_lib_partners"); return; } - + # Get the image repository path my $image_repository_path = $self->_get_image_repository_path(); my $image_repository_path_source = $image_repository_path;