Author: fapeeler
Date: Wed Jul 15 19:15:34 2009
New Revision: 794372

URL: http://svn.apache.org/viewvc?rev=794372&view=rev
Log:
VCL-169 

start of stage1 shutdown functionality, based on the machine type and
state
if machine is of blade type and state= available,failed,maintenance
healthcheck will proceed to shutdown blade using the xcat provisioning
module power_off routine


Modified:
    incubator/vcl/trunk/managementnode/bin/health_check.pl
    incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm

Modified: incubator/vcl/trunk/managementnode/bin/health_check.pl
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/bin/health_check.pl?rev=794372&r1=794371&r2=794372&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/bin/health_check.pl (original)
+++ incubator/vcl/trunk/managementnode/bin/health_check.pl Wed Jul 15 19:15:34 
2009
@@ -55,7 +55,41 @@
 
 use VCL::utils;
 use VCL::healthcheck;
+use Getopt::Long;
 
+#------- Subroutine declarations -------
+sub main();
+sub help();
+sub print_usage(); 
+
+#----------GLOBALS--------------
+# Store the command line options in this hash
+our %OPTIONS;
+
+our $STAGE = 0;
+our $HELP = 0;
+
+
+GetOptions(\%OPTIONS, 'help', 'powerdown=s');
+
+
+# Get the remaining command line parameters
+$HELP = $OPTIONS{help} if (defined($OPTIONS{help} && $OPTIONS{help}));
+$STAGE = $OPTIONS{powerdown} if (defined($OPTIONS{powerdown} && 
$OPTIONS{powerdown}));
+
+if($STAGE){
+
+       unless($STAGE =~ /available|all/){ 
+               print "\nInvalid powerdown option\n\n";
+               help();
+               exit;
+       }
+
+}
+if($HELP){
+       help();
+       exit;
+}
 ##############################################################################
 
 # now just do basic monitoring
@@ -68,21 +102,65 @@
     
 =cut
 
-#----------GLOBALS--------------
-
-#------- Subroutine declarations -------
-sub main();
 
 main();
 
 sub main() {
 
        my $check = new VCL::healthcheck();
-       $check->process;
+       $check->process($STAGE);
        #$check->send_report;
 
 }
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 print_usage
+
+ Parameters  : 
+ Returns     : 
+ Description :
+
+=cut
+
+sub print_usage() {
+
+       my $text = sprintf("    %s \n", "Usage: healthcheck.pl  [options]" );
+       $text .= sprintf("    %s \n"," ");
+       $text .= sprintf("    %s \n", "healthcheck.pl  : without options scans 
nodes and" );
+       $text .= sprintf("             %s \n", "resets data in database if 
needed" );
+       $text .= sprintf("    %s \n"," ");
+       $text .= sprintf("    %s \n","Valid options:");
+       $text .= sprintf("    %s \n"," ");
+       $text .= sprintf("    %s \n","-powerdown=ARG  : A power down argument 
can be one of");
+       $text .= sprintf("           %s \n","available  shutdown available or 
idle blades");
+       $text .= sprintf("           %s \n","all                shutdown all 
nodes, notify users of pending shutdown");
+
+       print "$text\n";
+
+} ## end sub help
+
+#/////////////////////////////////////////////////////////////////////////////
+
+=head2 help
+
+ Parameters  : 
+ Returns     : 
+ Description :
+
+=cut
 
+sub help() {
+       my $message = <<"END";
+--------------------------------------------
+
+health_check.pl is intented to as a cmdline script or via cron
+
+END
+
+       print $message;
+       print_usage();
+       exit;
+} ## end sub help
 #/////////////////////////////////////////////////////////////////////////////
 
 1;

Modified: incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm?rev=794372&r1=794371&r2=794372&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/healthcheck.pm Wed Jul 15 
19:15:34 2009
@@ -148,10 +148,21 @@
 =cut
 
 sub process {
-       my ($info) = @_;
+       my ($info, $powerdownstage) = @_;
        notify($ERRORS{'OK'}, $LOG, "in processing routine");
        $info->{"globalmsg"}->{"body"} = "Summary of VCL node monitoring 
system:\n\n";
 
+       if($powerdownstage =~ /^(available|all)$/){
+               my $mn_hostname = $info->{managementnode}->{hostname};
+               notify($ERRORS{'OK'}, $LOG, "ALERT: powerdown stage 
triggered,placing MN $mn_hostname in maintenance");
+               if (set_managementnode_state($info->{managementnode}, 
"maintenance")) {
+                       notify($ERRORS{'OK'}, $LOG, "Successfully set 
$mn_hostname into maintenance");
+               }
+               else{
+                       notify($ERRORS{'WARNING'}, $LOG, "Failed to set 
$mn_hostname into maintenance");
+               }
+       }
+
        foreach my $cid (keys %{$info->{computertable}}) {
                #set some local variables
                my $comp_hostname             = 
$info->{computertable}->{$cid}->{computer}->{hostname};
@@ -180,6 +191,7 @@
 
                # Collect current state of node - it could have changed since 
we started
                if (my $comp_current_state = 
get_computer_current_state_name($cid)) {
+                       
$info->{computertable}->{$cid}->{computer}->{state}->{name} = 
$comp_current_state;
                        $comp_state = $comp_current_state;
                }
                else {
@@ -187,6 +199,21 @@
                        notify($ERRORS{'OK'}, $LOG, "could not retrieve current 
computer state cid= $cid, using old data");
                }
 
+               #check for powerdownstages
+               if($powerdownstage =~ /^(available|all)$/){
+                       $info->{computertable}->{$cid}->{"powerdownstage"} = 
$powerdownstage;
+                       if(powerdown_event($info->{computertable}->{$cid})){
+                               notify($ERRORS{'OK'}, $LOG, "Successfully 
powered down $comp_hostname");
+                       }
+                       else {
+                               #notify($ERRORS{'OK'}, $LOG, "Could not 
powerdown $comp_hostname");
+                       }
+                       next;
+               }
+               else {
+                #proceed as normal
+               }
+
                #Only preform actions on these available or failed computer 
states
                #skip if is inuse, maintenance, tovmhost, etc.
                if ($comp_state !~ /available|failed/) {
@@ -358,6 +385,63 @@
 
 
#////////////////////////////////////////////////////////////////////////////////
 
+=head2 powerdown_event 
+
+  Parameters  : hash
+  Returns     : 1,0 
+  Description : 
+
+=cut
+
+sub powerdown_event {
+       my ($self) = @_;
+
+       my $management_node_keys    = $self->{managementnode}->{keys};
+       my $computer_host_name      = $self->{computer}->{hostname};
+       my $computer_short_name     = 0;
+       my $computer_ip_address     = $self->{computer}->{IPaddress};
+       my $image_os_name           = $self->{image}->{OS}->{name};
+       my $image_name              = $self->{imagerevision}->{imagename};
+       my $image_os_type           = $self->{image}->{OS}->{type};
+       my $provisioning_perl_package = 
$self->{computer}->{provisioning}->{module}->{perlpackage};
+       my $comp_type                 = $self->{computer}->{type};
+       my $comp_state                                          = 
$self->{computer}->{state}->{name};
+       my $computer_node_name                  = $self->{computer}->{hostname};
+       my $power_down_stage                            = 
$self->{powerdownstage};
+
+       $computer_short_name = $1 if ($computer_node_name =~ 
/([-_a-zA-Z0-9]*)(\.?)/);
+
+       #If blade or vm and available|failed|maintenance - simply power-off
+       #If blade and vmhostinuse - check vms, if available power-down all
+
+       if(($comp_type =~ /blade/) && ($comp_state =~ 
/^(available|failed|maintenance)/)){
+               notify($ERRORS{'OK'}, $LOG, "calling provision module 
$provisioning_perl_package power_off routine $computer_short_name");
+               
+               eval "use $provisioning_perl_package";
+               if ($EVAL_ERROR) {
+                       notify($ERRORS{'WARNING'}, $LOG, 
"$provisioning_perl_package module could not be loaded");
+                       notify($ERRORS{'OK'},      $LOG, "returning 0");
+                       return 0;
+               }
+               my $power_off_status = eval "&$provisioning_perl_package" . 
'::power_off($computer_short_name);';
+               notify($ERRORS{'OK'}, $LOG, "$power_off_status ");
+               if($power_off_status){
+                       notify($ERRORS{'OK'}, $LOG, "SUCCESS powered_off 
$computer_short_name");
+                       return 1;
+               }
+               return 0;
+       }
+       else{
+                notify($ERRORS{'OK'}, $LOG, "SKIPPING $computer_short_name 
comp_type= $comp_type in   comp_state= $comp_state");
+                return 0;
+       }
+
+       
+
+}
+
+#////////////////////////////////////////////////////////////////////////////////
+
 =head2  virtualmachine_investigator
 
   Parameters  : hash


Reply via email to