Check for service node pools for monitoring
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2927 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
		| @@ -300,6 +300,11 @@ sub stop { | ||||
|  | ||||
|   if ($scope) { | ||||
|     my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|     if (ref($pPairHash) eq 'ARRAY') { | ||||
| 	reportError($pPairHash->[1], $callback); | ||||
| 	return (1, "");	 | ||||
|     } | ||||
|  | ||||
|   | ||||
|     #the identification of this node | ||||
|     my @hostinfo=xCAT::Utils->determinehostname(); | ||||
| @@ -309,10 +314,10 @@ sub stop { | ||||
|     if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|  | ||||
|     foreach my $key (keys (%$pPairHash)) { | ||||
|       my @key_a=split(',', $key); | ||||
|       if (! $iphash{$key_a[0]}) { next;}    | ||||
|       my @key_a=split(':', $key); | ||||
|       if (! $iphash{$key_a[0]}) { next;}   | ||||
|       my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|        | ||||
|       #figure out what nodes to stop | ||||
|       my @nodes_to_stop=(); | ||||
|       if ($mon_nodes) { | ||||
| @@ -398,6 +403,11 @@ sub config { | ||||
|   `/usr/bin/rmcctrl -p`; | ||||
|    | ||||
|   my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|   if (ref($pPairHash) eq 'ARRAY') { | ||||
|       reportError($pPairHash->[1], $callback); | ||||
|       return (1, "");	 | ||||
|   } | ||||
|  | ||||
|   | ||||
|   #the identification of this node | ||||
|   my @hostinfo=xCAT::Utils->determinehostname(); | ||||
| @@ -407,9 +417,10 @@ sub config { | ||||
|   if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|  | ||||
|   foreach my $key (keys (%$pPairHash)) { | ||||
|     my @key_a=split(',', $key); | ||||
|     if (! $iphash{$key_a[0]}) { next;}    | ||||
|     my @key_a=split(':', $key); | ||||
|     if (! $iphash{$key_a[0]}) { next;}  | ||||
|     my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|     my $master=$key_a[1]; | ||||
|  | ||||
|     #figure out what nodes to add | ||||
| @@ -491,6 +502,10 @@ sub deconfig { | ||||
|   my $callback=shift; | ||||
|   my $localhostname=hostname(); | ||||
|   my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|   if (ref($pPairHash) eq 'ARRAY') { | ||||
|       reportError($pPairHash->[1], $callback); | ||||
|       return (1, "");	 | ||||
|   } | ||||
|   | ||||
|   #the identification of this node | ||||
|   my @hostinfo=xCAT::Utils->determinehostname(); | ||||
| @@ -500,9 +515,10 @@ sub deconfig { | ||||
|   if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|  | ||||
|   foreach my $key (keys (%$pPairHash)) { | ||||
|     my @key_a=split(',', $key); | ||||
|     if (! $iphash{$key_a[0]}) { next;}    | ||||
|     my @key_a=split(':', $key); | ||||
|     if (! $iphash{$key_a[0]}) { next;}   | ||||
|     my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|     my $master=$key_a[1]; | ||||
|  | ||||
|     #figure out what nodes to remove | ||||
| @@ -585,6 +601,10 @@ sub startNodeStatusMon { | ||||
|   #get all the nodes status from IBM.MngNode class of local host and  | ||||
|   #the identification of this node | ||||
|   my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|   if (ref($pPairHash) eq 'ARRAY') { | ||||
|       reportError($pPairHash->[1], $callback); | ||||
|       return (1, "");	 | ||||
|   } | ||||
|  | ||||
|   my @hostinfo=xCAT::Utils->determinehostname(); | ||||
|   my %iphash=(); | ||||
| @@ -594,9 +614,10 @@ sub startNodeStatusMon { | ||||
|   my @servicenodes=(); | ||||
|   my %status_hash=(); | ||||
|   foreach my $key (keys (%$pPairHash)) { | ||||
|     my @key_a=split(',', $key); | ||||
|     if (! $iphash{$key_a[0]}) { next; }  | ||||
|     my @key_a=split(':', $key); | ||||
|     if (! $iphash{$key_a[0]}) { next;} | ||||
|     my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|     foreach(@$mon_nodes) { | ||||
|       my $nodetype=$_->[1]; | ||||
|       if ($nodetype) { | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -789,14 +789,16 @@ sub getPluginSettings { | ||||
| sub isMonServer { | ||||
|   my $pHash=getNodeMonServerPair([], 1); | ||||
|  | ||||
|   if (ref($pHash) eq 'ARRAY') { return 0; } | ||||
|  | ||||
|   my @hostinfo=xCAT::Utils->determinehostname(); | ||||
|   my $isSV=xCAT::Utils->isServiceNode(); | ||||
|   my  %iphash=(); | ||||
|   foreach(@hostinfo) {$iphash{$_}=1;} | ||||
|   if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|    | ||||
|   | ||||
|   foreach my $pair (keys(%$pHash)) { | ||||
|     my @a=split(',', $pair); | ||||
|     my @a=split(':', $pair); | ||||
|     if ($iphash{$a[0]} || $iphash{$a[1]}) { return 1;} | ||||
|   } | ||||
|    | ||||
| @@ -810,10 +812,10 @@ sub isMonServer { | ||||
|             nodelist table will be used. | ||||
|        retfromat 0-- A pointer to a hash table with node as the key and a the monserver pairs | ||||
|                      string as the value.   | ||||
|                      For example: { node1=>"sv1,ma1", node2=>"sv1,ma1", node3=>"sv2,ma2"...} | ||||
|                      For example: { node1=>"sv1:ma1", node2=>"sv2:ma2", node3=>"sv2:ma2"...} | ||||
|                  1-- A pointer to a hash table with monserver pairs as the key and an array | ||||
|                      pointer of nodes as the value.  | ||||
|                      For example: { "sv1,ma1"=>[node1,node2], "sv2,ma2"=>node3...} | ||||
|                      For example: { "sv1:ma1"=>[node1,node2], "sv2:ma2"=>node3...} | ||||
|                     | ||||
|          The pair is in the format of "monserver,monmaser". First one is the monitoring service  | ||||
|       node ip/hostname that faces the mn and the second one is the monitoring service  | ||||
| @@ -822,6 +824,7 @@ sub isMonServer { | ||||
|       for that node. In this case the second one is the site master.  | ||||
|    Returns:  | ||||
|       An pointer to a hash. | ||||
|       It retuens a pointer to an array if there is an error. Format is [code, message]. | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getNodeMonServerPair { | ||||
| @@ -852,9 +855,10 @@ sub getNodeMonServerPair { | ||||
|     my $tmp2 = $tabdata->{$node}->[0]; | ||||
|     if ($tmp2 && $tmp2->{monserver}) { | ||||
|         $pairs=$tmp2->{monserver};  | ||||
|         $pairs =~ s/,/:/;  #for backward conmpatibility. used to be aa,bb not the format is aa:bb | ||||
|         #when there is only one hostname specified in noderes.monserver,  | ||||
|         #both monserver and monmaster take the same hostname. | ||||
|         if ($pairs !~ /,/) { $pairs=$tmp2->{monserver}.','.$tmp2->{monserver}; }  | ||||
|         if ($pairs !~ /:/) { $pairs=$tmp2->{monserver}.':'.$tmp2->{monserver}; }  | ||||
|     } | ||||
|  | ||||
|     if (!$pairs) { | ||||
| @@ -862,10 +866,14 @@ sub getNodeMonServerPair { | ||||
|       if ($tmp2->{xcatmaster})  {  $monmaster=$tmp2->{xcatmaster}; }  | ||||
|       if (!$monserver) { $monserver="noservicenode"; } | ||||
|       if (!$monmaster) { $monmaster=xCAT::Utils->get_site_attribute('master'); } | ||||
|       $pairs="$monserver,$monmaster"; | ||||
|       $pairs="$monserver:$monmaster"; | ||||
|     }  | ||||
|     #print "node=$node, pairs=$pairs\n"; | ||||
|  | ||||
|     if ($monserver =~ /,/) { #monserver in noderes table must be defined in the service node pool case | ||||
| 	return [1, "Please specify 'monserver' on the noderes table for the node $node because the service node pools are used."];  | ||||
|     } | ||||
|  | ||||
|     if ($retformat) { | ||||
|       if (exists($ret->{$pairs})) { | ||||
|         my $pa=$ret->{$pairs}; | ||||
| @@ -896,6 +904,7 @@ sub getNodeMonServerPair { | ||||
|       that faces the mn and the second one being the service node ip/hostname that faces the cn.  | ||||
|       The value of the first one can be "noservicenode" meaning that there is no service node  | ||||
|       for that node. In this case the second one is the site master.   | ||||
|       It returns a pointer to an array if there is an error. Format is [code, message]. | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getMonHierarchy { | ||||
| @@ -938,9 +947,10 @@ sub getMonHierarchy { | ||||
|       if (defined($row2) && ($row2)) { | ||||
| 	if ($row2->{monserver}) { | ||||
|           $pairs=$row2->{monserver};  | ||||
| 	  $pairs =~ s/,/:/;  #for backward conmpatibility. used to be aa,bb not the format is aa:bb | ||||
|           #when there is only one hostname specified in noderes.monserver,  | ||||
|           #both monserver and monmaster take the same hostname. | ||||
|           if ($pairs !~ /,/) { $pairs=$row2->{monserver}.','.$row2->{monserver}; }  | ||||
|           if ($pairs !~ /:/) { $pairs=$row2->{monserver}.':'.$row2->{monserver}; }  | ||||
|         } | ||||
|       } | ||||
|        | ||||
| @@ -948,8 +958,12 @@ sub getMonHierarchy { | ||||
|         if ($row2->{servicenode}) {  $monserver=$row2->{servicenode}; } | ||||
|         if ($row2->{xcatmaster})  {  $monmaster=$row2->{xcatmaster}; }  | ||||
|         if (!$monserver) { $monserver="noservicenode"; } | ||||
|         if (!$monmaster) { $monmaster=$sitemaster; } | ||||
|         $pairs="$monserver,$monmaster"; | ||||
| 	if(!$monmaster) { $monmaster=$sitemaster; } | ||||
|         $pairs="$monserver:$monmaster"; | ||||
|       } | ||||
|  | ||||
|       if ($monserver =~ /,/) { #monserver in noderes table must be defined in the service node pool case | ||||
| 	  return [1, "Please specify 'monserver' on the noderes table for the node $node because the service node pools are used."];  | ||||
|       } | ||||
|  | ||||
|       #print "node=$node, pairs=$pairs\n"; | ||||
| @@ -984,10 +998,12 @@ sub getMonHierarchy { | ||||
|       A hash reference keyed by the monitoring server nodes and each value is a ref to | ||||
|       an array of [nodes, nodetype, status] arrays  monitored by the server. So the format is: | ||||
|       {monserver1=>[['node1', 'osi', 'alive'], ['node2', 'switch', 'booting']...], ...}  | ||||
|       A key is a pair of hostnames with the first one being the service node ip/hostname  | ||||
|       A key is pair of hostnames with the first one being the service node ip/hostname  | ||||
|       that faces the mn and the second one being the service node ip/hostname that faces the cn.  | ||||
|       The value of the first one can be "noservicenode" meaning that there is no service node  | ||||
|       for that node. In this case the second one is the site master.   | ||||
|       It retuens a pointer to an array if there is an error. Format is [code, message]. | ||||
|  | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getMonServerWithInfo { | ||||
| @@ -1009,6 +1025,8 @@ sub getMonServerWithInfo { | ||||
|   my $tabdata=$table3->getNodesAttribs(\@allnodes,['nodetype']); | ||||
|   my $pPairHash=getNodeMonServerPair(\@allnodes, 0); | ||||
|  | ||||
|   if (ref($pPairHash) eq 'ARRAY') { return $pPairHash; }  | ||||
|  | ||||
|   foreach (@in_nodes) { | ||||
|     my $node=$_->[0]; | ||||
|     my $status=$_->[2]; | ||||
| @@ -1051,6 +1069,7 @@ sub getMonServerWithInfo { | ||||
|       that faces the mn and the second one being the service node ip/hostname that faces the cn.  | ||||
|       The value of the first one can be "noservicenode" meaning that there is no service node  | ||||
|       for that node. In this case the second one is the site master.   | ||||
|       It retuens a pointer to an array if there is an error. Format is [code, message]. | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getMonServer { | ||||
| @@ -1061,6 +1080,10 @@ sub getMonServer { | ||||
|  | ||||
|   my @allnodes=@$p_input; | ||||
|   my $pPairHash=getNodeMonServerPair(\@allnodes, 0); | ||||
|  | ||||
|   if (ref($pPairHash) eq 'ARRAY') { return $pPairHash; }  | ||||
|  | ||||
|  | ||||
|   if (@allnodes==0) { | ||||
|     @allnodes= keys(%$pPairHash); | ||||
|   } | ||||
| @@ -1302,7 +1325,7 @@ sub  getNodeConfData { | ||||
|   my %ret=(); | ||||
|   #get monitoring server | ||||
|   my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$node], 0); | ||||
|   my @pair_array=split(',', $pHash->{$node}); | ||||
|   my @pair_array=split(':', $pHash->{$node}); | ||||
|   my $monserver=$pair_array[0]; | ||||
|   if ($monserver eq 'noservicenode') { $monserver=hostname(); } | ||||
|   $ret{MONSERVER}=$monserver; | ||||
|   | ||||
| @@ -1,437 +1,422 @@ | ||||
| #!/usr/bin/env perl  | ||||
| # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html | ||||
| package xCAT_monitoring::pcpmon; | ||||
| BEGIN | ||||
| { | ||||
|   $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; | ||||
| } | ||||
| use lib "$::XCATROOT/lib/perl"; | ||||
| use xCAT::NodeRange; | ||||
| use Sys::Hostname; | ||||
| use Socket; | ||||
| use xCAT::Utils; | ||||
| use xCAT::GlobalDef; | ||||
| use xCAT_monitoring::monitorctrl; | ||||
| use xCAT::MsgUtils; | ||||
| use strict; | ||||
| use warnings; | ||||
| 1; | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
| =head1  xCAT_monitoring:pcpmon   | ||||
| =head2    Package Description | ||||
|   xCAT monitoring plugin package to handle PCP monitoring. | ||||
| =cut | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    start | ||||
|       This function gets called by the monitorctrl module when xcatd starts and  | ||||
|       when monstart command is issued by the user. It starts the daemons and  | ||||
|       does necessary startup process for the PCP monitoring.  | ||||
|        p_nodes -- a pointer to an arrays of nodes to be monitored. null means all. | ||||
|        scope -- the action scope, it indicates the node type the action will take place. | ||||
|                 0 means localhost only. | ||||
|                 2 means both localhost and nodes, | ||||
|        callback -- the callback pointer for error and status displaying. It can be null. | ||||
|     Returns: | ||||
|       (return code, message) | ||||
|       if the callback is set, use callback to display the status and error. | ||||
| =cut | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub start  | ||||
|     { # starting sub routine | ||||
|       print "pcp::start called\n"; | ||||
|       my $noderef=shift; | ||||
|       if ($noderef =~ /xCAT_monitoring::pcpmon/) | ||||
|         { | ||||
|          $noderef=shift; | ||||
|         } | ||||
|       my $scope=shift; | ||||
|       print "scope is: $scope \n"; | ||||
|       my $callback=shift; | ||||
|        | ||||
| 	    my $cmd="$::XCATROOT/sbin/pcp_collect"; | ||||
|   #figure out the ping-intercal setting | ||||
|   my $value=5; #default | ||||
|   my %settings=xCAT_monitoring::monitorctrl->getPluginSettings("pcpmon"); | ||||
|  | ||||
|   my $reading=$settings{'ping-interval'}; | ||||
|   print "reading is $reading \n"; | ||||
|   if ($reading>0) { $value=$reading;} | ||||
|     | ||||
|   #create the cron job, it will run the command every 5 minutes(default and can be changed). | ||||
|   my $newentry; | ||||
|   if (xCAT::Utils->isAIX()) { | ||||
|     #AIX does not support */value format, have to list them all. | ||||
|     my $minutes; | ||||
|     if ($value==1) { $minutes='*';} | ||||
|     elsif ($value<=30) { | ||||
|       my @temp_a=(0..59); | ||||
|       foreach (@temp_a) { | ||||
|         if (($_ % $value) == 0) { $minutes .= "$_,";} | ||||
|       } | ||||
|       chop($minutes); | ||||
|     } else { | ||||
|       $minutes="0"; | ||||
|     } | ||||
|     $newentry="$minutes * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd"; | ||||
|   } else { | ||||
|     $newentry="*/$value * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd"; | ||||
|   } | ||||
|   my ($code, $msg)=xCAT::Utils::add_cron_job($newentry); | ||||
|   my $localhostname=hostname();  | ||||
|   if ($code==0) {  | ||||
|     if ($callback) { | ||||
|       my $rsp={}; | ||||
|       $rsp->{data}->[0]="$localhostname: started. Refresh interval is $value minute(s)"; | ||||
|       $callback->($rsp); | ||||
|     } | ||||
|     #return (0, "started");  | ||||
| 	} | ||||
|   else { | ||||
|     if ($callback) { | ||||
|       my $rsp={}; | ||||
|       $rsp->{data}->[0]="$localhostname: $code  $msg"; | ||||
|       $callback->($rsp); | ||||
|     } | ||||
|  | ||||
| 	 #return ($code, $msg); | ||||
|   } | ||||
|  | ||||
| 	  my $localhost=hostname(); | ||||
|       print "local host is $localhost \n"; | ||||
|       print "starting pcp locally \n"; | ||||
|       my $res_pcp = `/etc/init.d/pcp restart 2>&1`; | ||||
|       print "res_pcp=$res_pcp\n"; | ||||
|       print "the result cp before  is $? \n"; | ||||
|       if ($?) | ||||
|        { | ||||
|          print "pcp result after is $? \n"; | ||||
|          if ($callback) | ||||
|             { | ||||
|              my $resp={}; | ||||
|              $resp->{data}->[0]="$localhost: PCP not started successfully: $res_pcp \n"; | ||||
|              $callback->($resp); | ||||
|             }   | ||||
|           else | ||||
|            { | ||||
|             xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n"); | ||||
|            } | ||||
|   | ||||
|            return(1,"PCP not started successfully. \n"); | ||||
|         } | ||||
|   | ||||
|         if ($scope) | ||||
|          { #opening if scope | ||||
|            print "opening scope \n"; | ||||
|            print "inside scope is:$scope"; | ||||
|            print "noderef is: @$noderef \n";  | ||||
|            my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|   	   print "pairhash: $pPairHash\n"; | ||||
| 	   #identification of this node | ||||
| 	   my @hostinfo=xCAT::Utils->determinehostname(); | ||||
| 	   print "host:@hostinfo\n"; | ||||
| 	   my $isSV=xCAT::Utils->isServiceNode(); | ||||
| 	   print "is sv is:$isSV \n"; | ||||
|            my %iphash=();	 | ||||
| 	   foreach(@hostinfo) {$iphash{$_}=1;} | ||||
| 	   if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|          | ||||
|            my @children; | ||||
| 	   foreach my $key (keys (%$pPairHash)) | ||||
|             { #opening foreach1 | ||||
|               print "opening foreach1 \n"; | ||||
|               print "key is: $key \n"; | ||||
|               my @key_a=split(',', $key); | ||||
|               print "a[0] is: $key_a[0] \n"; | ||||
|               print "a[1] is: $key_a[1] \n"; | ||||
|               if (! $iphash{$key_a[0]}) { next;}    | ||||
| 	      my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
| 	      foreach(@$mon_nodes) | ||||
| 	        { #opening foreach2 | ||||
| 	          my $node=$_->[0]; | ||||
| 	          my $nodetype=$_->[1]; | ||||
|                   print "node=$node, nodetype=$nodetype\n"; | ||||
| 	          if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/)) | ||||
| 	           {  | ||||
|                     push(@children,$node); | ||||
| 	           } | ||||
|   	        } #closing foreach2 | ||||
|             }  #closing foreach1 | ||||
|           print "children:@children\n"; | ||||
|           my $rec = join(',',@children); | ||||
|           print "the string is $rec"; | ||||
|      print "XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp restart 2>& \n";  | ||||
|       my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp restart 2>&1`; | ||||
|        if ($result) | ||||
|         { | ||||
|          if ($callback) | ||||
|            { | ||||
|             my $resp={}; | ||||
|             $resp->{data}->[0]="$localhost: $result\n"; | ||||
|             $callback->($resp); | ||||
|            } | ||||
|         else  | ||||
|            { | ||||
|             xCAT::MsgUtils->message('S', "[mon]: $result\n"); | ||||
|            } | ||||
|         } | ||||
|  | ||||
|       } #closing if scope | ||||
|  | ||||
|    if ($callback) | ||||
|     { | ||||
|      my $resp={}; | ||||
|      $resp->{data}->[0]="$localhost: started. \n"; | ||||
|      $callback->($resp); | ||||
|     } | ||||
|  | ||||
|   return (0, "started"); | ||||
|  | ||||
|  } # closing sub routine | ||||
| #-------------------------------------------------------------- | ||||
| =head3    config | ||||
|       This function configures the cluster for the given nodes. This function is called  | ||||
|       when moncfg command is issued or when xcatd starts on the service node.  | ||||
|        Returns: 1 | ||||
| =cut  | ||||
| #-------------------------------------------------------------- | ||||
| sub config | ||||
|    { | ||||
|     return 1; | ||||
|    } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------- | ||||
| =head3    deconfig | ||||
|       	This function de-configures the cluster for the given nodes. This function is called  | ||||
| 	when mondecfg command is issued by the user.  | ||||
|       Returns: 1 | ||||
| =cut  | ||||
| #-------------------------------------------------------------- | ||||
| sub deconfig | ||||
|    { | ||||
|      return 1; | ||||
|    } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    stop | ||||
|       This function gets called by the monitorctrl module when | ||||
|       xcatd stops or when monstop command is issued by the user. | ||||
|       It stops the monitoring on all nodes, stops | ||||
|       the daemons and does necessary cleanup process for the | ||||
|       PCP monitoring. | ||||
|     Arguments: | ||||
|        p_nodes -- a pointer to an arrays of nodes to be stoped for monitoring. null means all. | ||||
|        scope -- the action scope, it indicates the node type the action will take place. | ||||
|                 0 means localhost only. | ||||
|                 2 means both monservers and nodes, | ||||
|        callback -- the callback pointer for error and status displaying. It can be null. | ||||
|     Returns: | ||||
|       (return code, message) | ||||
|       if the callback is set, use callback to display the status and error. | ||||
| =cut | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub stop | ||||
|     { # starting sub routine | ||||
|             print "pcpmon::stop called\n"; | ||||
|       my $noderef=shift; | ||||
|       if ($noderef =~ /xCAT_monitoring::pcpmon/) | ||||
|         { | ||||
|          $noderef=shift; | ||||
|         } | ||||
|       my $scope=shift; | ||||
|       my $callback=shift; | ||||
|  | ||||
|         my $job="$::XCATROOT/sbin/pcp_collect"; | ||||
|   my ($code, $msg)=xCAT::Utils::remove_cron_job($job); | ||||
|   my $localhostname=hostname();  | ||||
|   if ($code==0) {  | ||||
|     if ($callback) { | ||||
|       my $rsp={}; | ||||
|       $rsp->{data}->[0]="$localhostname: stopped."; | ||||
|       $callback->($rsp); | ||||
|     } | ||||
|     #return (0, "stopped");  | ||||
| 	} | ||||
|   else { | ||||
|     if ($callback) { | ||||
|       my $rsp={}; | ||||
|       $rsp->{data}->[0]="$localhostname: $code  $msg"; | ||||
|       $callback->($rsp); | ||||
|     } | ||||
|     #return ($code, $msg);  | ||||
|   }  | ||||
|  | ||||
|  | ||||
|       my $localhost=hostname(); | ||||
|       print "local host is $localhost \n"; | ||||
|       print "stopping pcp locally \n"; | ||||
|       my $res_pcp = `/etc/init.d/pcp stop 2>&1`; | ||||
|       print "res_pcp=$res_pcp\n"; | ||||
|       print "the result pcp before  is $? \n"; | ||||
|       if ($?) | ||||
|        { | ||||
|          print "pcp result after is $? \n"; | ||||
|          if ($callback) | ||||
|             { | ||||
|              my $resp={}; | ||||
|              $resp->{data}->[0]="$localhost: PCP not stopped successfully: $res_pcp \n"; | ||||
|              $callback->($resp); | ||||
|             } | ||||
|           else | ||||
|            { | ||||
|             xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n"); | ||||
|            } | ||||
|  | ||||
|            return(1,"PCP not stopped successfully. \n"); | ||||
|         } | ||||
|  | ||||
|          | ||||
|         if ($scope) | ||||
|          { #opening if scope | ||||
|            print "opening scope \n"; | ||||
|            print "noderef is: @$noderef \n"; | ||||
|            my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|            print "pairhash: $pPairHash\n"; | ||||
|            #identification of this node | ||||
|            my @hostinfo=xCAT::Utils->determinehostname(); | ||||
|            print "host:@hostinfo\n"; | ||||
|            my $isSV=xCAT::Utils->isServiceNode(); | ||||
|            print "is sv is:$isSV \n"; | ||||
|            my %iphash=(); | ||||
|            foreach(@hostinfo) {$iphash{$_}=1;} | ||||
|            if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|  | ||||
|            my @children; | ||||
|            foreach my $key (keys (%$pPairHash)) | ||||
|             { #opening foreach1 | ||||
|               print "opening foreach1 \n"; | ||||
|               print "key is: $key \n"; | ||||
|               my @key_a=split(',', $key); | ||||
|               print "a[1] is: $key_a[1] \n"; | ||||
|               if (! $iphash{$key_a[0]}) { next;} | ||||
|               my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|               foreach(@$mon_nodes) | ||||
|                 { #opening foreach2 | ||||
|                   my $node=$_->[0]; | ||||
|                   my $nodetype=$_->[1]; | ||||
|                   print "node=$node, nodetype=$nodetype\n"; | ||||
|                   if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/)) | ||||
|                    { | ||||
|                     push(@children,$node); | ||||
|                    } | ||||
|                 } #closing foreach2 | ||||
|             }  #closing foreach1 | ||||
|           print "children:@children\n"; | ||||
|           my $rec = join(',',@children); | ||||
|           print "the string is $rec"; | ||||
|      print "XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp stop 2>& \n"; | ||||
|        my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp stop 2>&1`; | ||||
|        if ($result) | ||||
|         { | ||||
|          if ($callback) | ||||
|            { | ||||
|             my $resp={}; | ||||
|             $resp->{data}->[0]="$localhost: $result\n"; | ||||
|             $callback->($resp); | ||||
|            } | ||||
|         else | ||||
|            { | ||||
|             xCAT::MsgUtils->message('S', "[mon]: $result\n"); | ||||
|            } | ||||
|         } | ||||
|  | ||||
|       } #closing if scope | ||||
|  | ||||
|    if ($callback) | ||||
|     { | ||||
|      my $resp={}; | ||||
|      $resp->{data}->[0]="$localhost: stopped. \n"; | ||||
|      $callback->($resp); | ||||
|     } | ||||
|  | ||||
|  return (0, "stopped"); | ||||
|  } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    supportNodeStatusMon | ||||
|     This function is called by the monitorctrl module to check | ||||
|     if PCP can help monitoring and returning the node status. | ||||
|      | ||||
|     Arguments: | ||||
|         none | ||||
|     Returns: | ||||
|          1   | ||||
| =cut | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub supportNodeStatusMon { | ||||
|   #print "pcpmon::supportNodeStatusMon called\n"; | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3   startNodeStatusMon | ||||
|     This function is called by the monitorctrl module to tell | ||||
|     PCP to start monitoring the node status and feed them back | ||||
|     to xCAT. PCP will start setting up the condition/response  | ||||
|     to monitor the node status changes.   | ||||
|  | ||||
|     Arguments: | ||||
|        None. | ||||
|     Returns: | ||||
|         (return code, message) | ||||
|  | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub startNodeStatusMon { | ||||
|   #print "pcpmon::startNodeStatusMon called\n"; | ||||
|   return (0, "started"); | ||||
| } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3   stopNodeStatusMon | ||||
|     This function is called by the monitorctrl module to tell | ||||
|     PCP to stop feeding the node status info back to xCAT. It will | ||||
|     stop the condition/response that is monitoring the node status. | ||||
|  | ||||
|     Arguments: | ||||
|         none | ||||
|     Returns: | ||||
|         (return code, message) | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub stopNodeStatusMon { | ||||
|   #print "pcpmon::stopNodeStatusMon called\n"; | ||||
|   return (0, "stopped"); | ||||
| } | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    getDiscription | ||||
|       This function returns the detailed description of the plugin inluding the | ||||
|      valid values for its settings in the monsetting tabel.  | ||||
|      Arguments: | ||||
|         none | ||||
|     Returns: | ||||
|         The description. | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getDescription  | ||||
| { | ||||
|   return "Description: This plugin will help interface the xCAT cluster with PCP monitoring software  | ||||
|        ping-interval:  the number of minutes between  the metric collection operation.  | ||||
|         The default value is 5 \n "; | ||||
| } | ||||
| #!/usr/bin/env perl  | ||||
| # IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html | ||||
| package xCAT_monitoring::pcpmon; | ||||
| BEGIN | ||||
| { | ||||
|   $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat'; | ||||
| } | ||||
| use lib "$::XCATROOT/lib/perl"; | ||||
| use xCAT::NodeRange; | ||||
| use Sys::Hostname; | ||||
| use Socket; | ||||
| use xCAT::Utils; | ||||
| use xCAT::GlobalDef; | ||||
| use xCAT_monitoring::monitorctrl; | ||||
| use xCAT::MsgUtils; | ||||
| use strict; | ||||
| use warnings; | ||||
| 1; | ||||
|  | ||||
| #------------------------------------------------------------------------------- | ||||
| =head1  xCAT_monitoring:pcpmon   | ||||
| =head2    Package Description | ||||
|   xCAT monitoring plugin package to handle PCP monitoring. | ||||
| =cut | ||||
| #------------------------------------------------------------------------------- | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    start | ||||
|       This function gets called by the monitorctrl module when xcatd starts and  | ||||
|       when monstart command is issued by the user. It starts the daemons and  | ||||
|       does necessary startup process for the PCP monitoring.  | ||||
|        p_nodes -- a pointer to an arrays of nodes to be monitored. null means all. | ||||
|        scope -- the action scope, it indicates the node type the action will take place. | ||||
|                 0 means localhost only. | ||||
|                 2 means both localhost and nodes, | ||||
|        callback -- the callback pointer for error and status displaying. It can be null. | ||||
|     Returns: | ||||
|       (return code, message) | ||||
|       if the callback is set, use callback to display the status and error. | ||||
| =cut | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub start  | ||||
| { # starting sub routine | ||||
|     print "pcp::start called\n"; | ||||
|     my $noderef=shift; | ||||
|     if ($noderef =~ /xCAT_monitoring::pcpmon/) | ||||
|     { | ||||
| 	$noderef=shift; | ||||
|     } | ||||
|     my $scope=shift; | ||||
|     my $callback=shift; | ||||
|      | ||||
|     my $cmd="$::XCATROOT/sbin/pcp_collect"; | ||||
|     #figure out the ping-intercal setting | ||||
|     my $value=5; #default | ||||
|     my %settings=xCAT_monitoring::monitorctrl->getPluginSettings("pcpmon"); | ||||
|      | ||||
|     my $reading=$settings{'ping-interval'}; | ||||
|     if ($reading>0) { $value=$reading;} | ||||
|      | ||||
|     #create the cron job, it will run the command every 5 minutes(default and can be changed). | ||||
|     my $newentry; | ||||
|     if (xCAT::Utils->isAIX()) { | ||||
| 	#AIX does not support */value format, have to list them all. | ||||
| 	my $minutes; | ||||
| 	if ($value==1) { $minutes='*';} | ||||
| 	elsif ($value<=30) { | ||||
| 	    my @temp_a=(0..59); | ||||
| 	    foreach (@temp_a) { | ||||
| 		if (($_ % $value) == 0) { $minutes .= "$_,";} | ||||
| 	    } | ||||
| 	    chop($minutes); | ||||
| 	} else { | ||||
| 	    $minutes="0"; | ||||
| 	} | ||||
| 	$newentry="$minutes * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd"; | ||||
|     } else { | ||||
| 	$newentry="*/$value * * * * XCATROOT=$::XCATROOT PATH=$ENV{'PATH'} XCATCFG='$ENV{'XCATCFG'}' $cmd"; | ||||
|     } | ||||
|     my ($code, $msg)=xCAT::Utils::add_cron_job($newentry); | ||||
|     my $localhostname=hostname();  | ||||
|     if ($code==0) {  | ||||
| 	if ($callback) { | ||||
| 	    my $rsp={}; | ||||
| 	    $rsp->{data}->[0]="$localhostname: started. Refresh interval is $value minute(s)"; | ||||
| 	    $callback->($rsp); | ||||
| 	} | ||||
| 	#return (0, "started");  | ||||
|     } | ||||
|     else { | ||||
| 	if ($callback) { | ||||
| 	    my $rsp={}; | ||||
| 	    $rsp->{data}->[0]="$localhostname: $code  $msg"; | ||||
| 	    $callback->($rsp); | ||||
| 	} | ||||
| 	 | ||||
| 	#return ($code, $msg); | ||||
|     } | ||||
|      | ||||
|     my $localhost=hostname(); | ||||
|     my $res_pcp = `/etc/init.d/pcp restart 2>&1`; | ||||
|     if ($?) | ||||
|     { | ||||
| 	if ($callback) | ||||
| 	{ | ||||
| 	    my $resp={}; | ||||
| 	    $resp->{data}->[0]="$localhost: PCP not started successfully: $res_pcp \n"; | ||||
| 	    $callback->($resp); | ||||
| 	}   | ||||
| 	else | ||||
| 	{ | ||||
|             xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n"); | ||||
| 	} | ||||
| 	 | ||||
| 	return(1,"PCP not started successfully. \n"); | ||||
|     } | ||||
|      | ||||
|     if ($scope) | ||||
|     { #opening if scope | ||||
| 	my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|         if (ref($pPairHash) eq 'ARRAY') { | ||||
| 	    if ($callback) { | ||||
| 		my $resp={}; | ||||
| 		$resp->{data}->[0]=$pPairHash->[1]; | ||||
| 		$callback->($resp); | ||||
| 	    } else { | ||||
| 		xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]); | ||||
| 	    } | ||||
| 	    return (1, "");	 | ||||
| 	} | ||||
|  | ||||
| 	#identification of this node | ||||
| 	my @hostinfo=xCAT::Utils->determinehostname(); | ||||
| 	my $isSV=xCAT::Utils->isServiceNode(); | ||||
| 	my %iphash=();	 | ||||
| 	foreach(@hostinfo) {$iphash{$_}=1;} | ||||
| 	if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|          | ||||
| 	my @children; | ||||
| 	foreach my $key (keys (%$pPairHash)) | ||||
| 	{ #opening foreach1 | ||||
| 	    my @key_a=split(':', $key); | ||||
| 	    if (! $iphash{$key_a[0]}) {  next; } | ||||
| 	    my $mon_nodes=$pPairHash->{$key}; | ||||
|      | ||||
| 	    foreach(@$mon_nodes) | ||||
| 	    { #opening foreach2 | ||||
| 		my $node=$_->[0]; | ||||
| 		my $nodetype=$_->[1]; | ||||
| 		if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/)) | ||||
| 		{  | ||||
|                     push(@children,$node); | ||||
| 		} | ||||
| 	    } #closing foreach2 | ||||
| 	}  #closing foreach1 | ||||
| 	my $rec = join(',',@children); | ||||
| 	my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp restart 2>&1`; | ||||
| 	if ($result) | ||||
|         { | ||||
| 	    if ($callback) | ||||
| 	    { | ||||
| 		my $resp={}; | ||||
| 		$resp->{data}->[0]="$localhost: $result\n"; | ||||
| 		$callback->($resp); | ||||
| 	    } | ||||
| 	    else  | ||||
| 	    { | ||||
| 		xCAT::MsgUtils->message('S', "[mon]: $result\n"); | ||||
| 	    } | ||||
|         } | ||||
| 	 | ||||
|     } #closing if scope | ||||
|      | ||||
|     if ($callback) | ||||
|     { | ||||
| 	my $resp={}; | ||||
| 	$resp->{data}->[0]="$localhost: started. \n"; | ||||
| 	$callback->($resp); | ||||
|     } | ||||
|      | ||||
|     return (0, "started"); | ||||
|      | ||||
| } # closing sub routine | ||||
| #-------------------------------------------------------------- | ||||
| =head3    config | ||||
|       This function configures the cluster for the given nodes. This function is called  | ||||
|       when moncfg command is issued or when xcatd starts on the service node.  | ||||
|        Returns: 1 | ||||
| =cut  | ||||
| #-------------------------------------------------------------- | ||||
| sub config | ||||
|    { | ||||
|     return 1; | ||||
|    } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------- | ||||
| =head3    deconfig | ||||
|       	This function de-configures the cluster for the given nodes. This function is called  | ||||
| 	when mondecfg command is issued by the user.  | ||||
|       Returns: 1 | ||||
| =cut  | ||||
| #-------------------------------------------------------------- | ||||
| sub deconfig | ||||
|    { | ||||
|      return 1; | ||||
|    } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    stop | ||||
|       This function gets called by the monitorctrl module when | ||||
|       xcatd stops or when monstop command is issued by the user. | ||||
|       It stops the monitoring on all nodes, stops | ||||
|       the daemons and does necessary cleanup process for the | ||||
|       PCP monitoring. | ||||
|     Arguments: | ||||
|        p_nodes -- a pointer to an arrays of nodes to be stoped for monitoring. null means all. | ||||
|        scope -- the action scope, it indicates the node type the action will take place. | ||||
|                 0 means localhost only. | ||||
|                 2 means both monservers and nodes, | ||||
|        callback -- the callback pointer for error and status displaying. It can be null. | ||||
|     Returns: | ||||
|       (return code, message) | ||||
|       if the callback is set, use callback to display the status and error. | ||||
| =cut | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub stop | ||||
|     { # starting sub routine | ||||
|             print "pcpmon::stop called\n"; | ||||
|       my $noderef=shift; | ||||
|       if ($noderef =~ /xCAT_monitoring::pcpmon/) | ||||
|         { | ||||
|          $noderef=shift; | ||||
|         } | ||||
|       my $scope=shift; | ||||
|       my $callback=shift; | ||||
|  | ||||
|         my $job="$::XCATROOT/sbin/pcp_collect"; | ||||
|   my ($code, $msg)=xCAT::Utils::remove_cron_job($job); | ||||
|   my $localhostname=hostname();  | ||||
|   if ($code==0) {  | ||||
|     if ($callback) { | ||||
|       my $rsp={}; | ||||
|       $rsp->{data}->[0]="$localhostname: stopped."; | ||||
|       $callback->($rsp); | ||||
|     } | ||||
|     #return (0, "stopped");  | ||||
| 	} | ||||
|   else { | ||||
|     if ($callback) { | ||||
|       my $rsp={}; | ||||
|       $rsp->{data}->[0]="$localhostname: $code  $msg"; | ||||
|       $callback->($rsp); | ||||
|     } | ||||
|     #return ($code, $msg);  | ||||
|   }  | ||||
|  | ||||
|  | ||||
|       my $localhost=hostname(); | ||||
|       my $res_pcp = `/etc/init.d/pcp stop 2>&1`; | ||||
|       if ($?) | ||||
|        { | ||||
|          if ($callback) | ||||
|             { | ||||
|              my $resp={}; | ||||
|              $resp->{data}->[0]="$localhost: PCP not stopped successfully: $res_pcp \n"; | ||||
|              $callback->($resp); | ||||
|             } | ||||
|           else | ||||
|            { | ||||
|             xCAT::MsgUtils->message('S', "[mon]: $res_pcp \n"); | ||||
|            } | ||||
|  | ||||
|            return(1,"PCP not stopped successfully. \n"); | ||||
|         } | ||||
|  | ||||
|          | ||||
|         if ($scope) | ||||
|          { #opening if scope | ||||
|            my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
| 	   if (ref($pPairHash) eq 'ARRAY') { | ||||
| 	       if ($callback) { | ||||
| 		   my $resp={}; | ||||
| 		   $resp->{data}->[0]=$pPairHash->[1]; | ||||
| 		   $callback->($resp); | ||||
| 	       } else { | ||||
| 		   xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]); | ||||
| 	       } | ||||
| 	       return (1, "");	 | ||||
| 	   } | ||||
|  | ||||
|  | ||||
|            #identification of this node | ||||
|            my @hostinfo=xCAT::Utils->determinehostname(); | ||||
|            my $isSV=xCAT::Utils->isServiceNode(); | ||||
|            my %iphash=(); | ||||
|            foreach(@hostinfo) {$iphash{$_}=1;} | ||||
|            if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|  | ||||
|            my @children; | ||||
|            foreach my $key (keys (%$pPairHash)) | ||||
|             { #opening foreach1 | ||||
|               my @key_a=split(':', $key); | ||||
| 	      if (! $iphash{$key_a[0]}) {  next; } | ||||
|               my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|               foreach(@$mon_nodes) | ||||
|                 { #opening foreach2 | ||||
|                   my $node=$_->[0]; | ||||
|                   my $nodetype=$_->[1]; | ||||
|                   if (($nodetype) && ($nodetype =~ /$::NODETYPE_OSI/)) | ||||
|                    { | ||||
|                     push(@children,$node); | ||||
|                    } | ||||
|                 } #closing foreach2 | ||||
|             }  #closing foreach1 | ||||
|           my $rec = join(',',@children); | ||||
|        my $result=`XCATBYPASS=Y $::XCATROOT/bin/xdsh  $rec /etc/init.d/pcp stop 2>&1`; | ||||
|        if ($result) | ||||
|         { | ||||
|          if ($callback) | ||||
|            { | ||||
|             my $resp={}; | ||||
|             $resp->{data}->[0]="$localhost: $result\n"; | ||||
|             $callback->($resp); | ||||
|            } | ||||
|         else | ||||
|            { | ||||
|             xCAT::MsgUtils->message('S', "[mon]: $result\n"); | ||||
|            } | ||||
|         } | ||||
|  | ||||
|       } #closing if scope | ||||
|  | ||||
|    if ($callback) | ||||
|     { | ||||
|      my $resp={}; | ||||
|      $resp->{data}->[0]="$localhost: stopped. \n"; | ||||
|      $callback->($resp); | ||||
|     } | ||||
|  | ||||
|  return (0, "stopped"); | ||||
|  } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    supportNodeStatusMon | ||||
|     This function is called by the monitorctrl module to check | ||||
|     if PCP can help monitoring and returning the node status. | ||||
|      | ||||
|     Arguments: | ||||
|         none | ||||
|     Returns: | ||||
|          1   | ||||
| =cut | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub supportNodeStatusMon { | ||||
|   #print "pcpmon::supportNodeStatusMon called\n"; | ||||
|   return 1; | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3   startNodeStatusMon | ||||
|     This function is called by the monitorctrl module to tell | ||||
|     PCP to start monitoring the node status and feed them back | ||||
|     to xCAT. PCP will start setting up the condition/response  | ||||
|     to monitor the node status changes.   | ||||
|  | ||||
|     Arguments: | ||||
|        None. | ||||
|     Returns: | ||||
|         (return code, message) | ||||
|  | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub startNodeStatusMon { | ||||
|   #print "pcpmon::startNodeStatusMon called\n"; | ||||
|   return (0, "started"); | ||||
| } | ||||
|  | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3   stopNodeStatusMon | ||||
|     This function is called by the monitorctrl module to tell | ||||
|     PCP to stop feeding the node status info back to xCAT. It will | ||||
|     stop the condition/response that is monitoring the node status. | ||||
|  | ||||
|     Arguments: | ||||
|         none | ||||
|     Returns: | ||||
|         (return code, message) | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub stopNodeStatusMon { | ||||
|   #print "pcpmon::stopNodeStatusMon called\n"; | ||||
|   return (0, "stopped"); | ||||
| } | ||||
|  | ||||
| #-------------------------------------------------------------------------------- | ||||
| =head3    getDiscription | ||||
|       This function returns the detailed description of the plugin inluding the | ||||
|      valid values for its settings in the monsetting tabel.  | ||||
|      Arguments: | ||||
|         none | ||||
|     Returns: | ||||
|         The description. | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getDescription  | ||||
| { | ||||
|   return "Description: This plugin will help interface the xCAT cluster with PCP monitoring software  | ||||
|        ping-interval:  the number of minutes between  the metric collection operation.  | ||||
|         The default value is 5 \n "; | ||||
| } | ||||
|   | ||||
| @@ -9,6 +9,7 @@ BEGIN | ||||
| use lib "$::XCATROOT/lib/perl"; | ||||
| use strict; | ||||
| use xCAT_monitoring::monitorctrl; | ||||
| use xCAT::Utils; | ||||
|  | ||||
| 1; | ||||
| #------------------------------------------------------------------------------- | ||||
| @@ -101,12 +102,22 @@ sub start { | ||||
|     foreach(@hostinfo) {$iphash{$_}=1;} | ||||
|     if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|     my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|     if (ref($pPairHash) eq 'ARRAY') { | ||||
| 	if ($callback) { | ||||
| 	    my $resp={}; | ||||
| 	    $resp->{data}->[0]=$pPairHash->[1]; | ||||
| 	    $callback->($resp); | ||||
| 	} else { | ||||
| 	    xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]); | ||||
| 	} | ||||
| 	return (1, "");	 | ||||
|     } | ||||
|  | ||||
|     foreach my $key (keys(%$pPairHash)) { | ||||
|       my @key_a=split(',', $key); | ||||
|       if (! $iphash{$key_a[0]}) { next;}  | ||||
|    | ||||
|       my @key_a=split(':', $key); | ||||
|       if (! $iphash{$key_a[0]}) {  next; } | ||||
|       my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|       foreach(@$mon_nodes) { | ||||
|         my $node_info=$_; | ||||
|         print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n"; | ||||
| @@ -159,12 +170,22 @@ sub stop { | ||||
|     foreach(@hostinfo) {$iphash{$_}=1;} | ||||
|     if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|     my $pPairHash=xCAT_monitoring::monitorctrl->getMonServer($noderef); | ||||
|     if (ref($pPairHash) eq 'ARRAY') { | ||||
| 	if ($callback) { | ||||
| 	    my $resp={}; | ||||
| 	    $resp->{data}->[0]=$pPairHash->[1]; | ||||
| 	    $callback->($resp); | ||||
| 	} else { | ||||
| 	    xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]); | ||||
| 	} | ||||
| 	return (1, "");	 | ||||
|     } | ||||
|  | ||||
|     foreach my $key (keys(%$pPairHash)) { | ||||
|       my @key_a=split(',', $key); | ||||
|       if (! $iphash{$key_a[0]}) { next;}  | ||||
|    | ||||
|       my @key_a=split(':', $key);  | ||||
|       if (! $iphash{$key_a[0]}) {  next; } | ||||
|       my $mon_nodes=$pPairHash->{$key}; | ||||
|  | ||||
|       foreach(@$mon_nodes) { | ||||
|         my $node_info=$_; | ||||
|         print "    node=$node_info->[0], nodetype=$node_info->[1], status=$node_info->[2]\n"; | ||||
| @@ -373,6 +394,7 @@ sub getDescription { | ||||
|       node ip/hostname that faces the cn.  | ||||
|       The value of the first one can be "noservicenode" meaning that there is no service node  | ||||
|       for that node. In this case the second one is the site master.  | ||||
|       It returns a pointer to an array if there is an error. Format is [code, message]. | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getNodesMonServers | ||||
|   | ||||
| @@ -368,6 +368,19 @@ sub configBMC { | ||||
|   if (!$isSV) { $iphash{'noservicenode'}=1;} | ||||
|   | ||||
|   my $pPairHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair($noderef, 0); | ||||
|   if (ref($pPairHash) eq 'ARRAY') {  | ||||
|       if ($callback) { | ||||
| 	  my $rsp={}; | ||||
| 	  if ($ret_val) { | ||||
| 	      $rsp->{data}->[0]=$pPairHash->[1]; | ||||
| 	  }  | ||||
| 	  $callback->($rsp); | ||||
|       } else { | ||||
| 	  xCAT::MsgUtils->message('S', "[mon]: " . $pPairHash->[1]); | ||||
|       }  | ||||
|       return (0, ""); | ||||
|   } | ||||
|  | ||||
|      | ||||
|   my %masterhash=(); | ||||
|   my @node_a=(); | ||||
| @@ -381,7 +394,7 @@ sub configBMC { | ||||
|         if (! exists($pPairHash->{$node})) {next;} | ||||
|          | ||||
|         my $pairs=$pPairHash->{$node}; | ||||
|         my @a_temp=split(',',$pairs);  | ||||
|         my @a_temp=split(':',$pairs);  | ||||
|         my $monserver=$a_temp[0]; | ||||
|         my $master=$a_temp[1]; | ||||
|  | ||||
| @@ -510,8 +523,21 @@ sub configMPA { | ||||
|         $mpa_hash{$mpa}=1; | ||||
|          | ||||
|         my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$mpa], 0); | ||||
| 	if (ref($pHash) eq 'ARRAY') {  | ||||
| 	    if ($callback) { | ||||
| 		my $rsp={}; | ||||
| 		if ($ret_val) { | ||||
| 		    $rsp->{data}->[0]=$pHash->[1]; | ||||
| 		}  | ||||
| 		$callback->($rsp); | ||||
| 	    } else { | ||||
| 		xCAT::MsgUtils->message('S', "[mon]: " . $pHash->[1]); | ||||
| 	    }  | ||||
| 	    return (0, ""); | ||||
| 	} | ||||
|  | ||||
|         my $pairs=$pHash->{$mpa};  | ||||
|         my @a_temp=split(',',$pairs);  | ||||
|         my @a_temp=split(':',$pairs);  | ||||
|         my $monserver=$a_temp[0]; | ||||
|         my $master=$a_temp[1]; | ||||
|  | ||||
| @@ -791,6 +817,7 @@ sub getDescription { | ||||
|       node ip/hostname that faces the cn.  | ||||
|       The value of the first one can be "noservicenode" meaning that there is no service node  | ||||
|       for that node. In this case the second one is the site master.  | ||||
|       It retuens a pointer to an array if there is an error. Format is [code, message]. | ||||
| =cut | ||||
| #-------------------------------------------------------------------------------- | ||||
| sub getNodesMonServers | ||||
| @@ -806,6 +833,11 @@ sub getNodesMonServers | ||||
|   my $localhostname=hostname(); | ||||
|   my $pPairHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair($noderef, 0); | ||||
|  | ||||
|   if (ref($pPairHash) eq 'ARRAY') {  | ||||
|       return $pPairHash;                | ||||
|   }  | ||||
|  | ||||
|  | ||||
|   #check for blades, only returns the MPAs and their monservers | ||||
|   my %mpa_hash=(); | ||||
|   my $table=xCAT::Table->new("mp"); | ||||
| @@ -827,6 +859,10 @@ sub getNodesMonServers | ||||
|           $pairs=$pPairHash->{$mpa};  | ||||
|         } else { | ||||
|           my $pHash=xCAT_monitoring::monitorctrl->getNodeMonServerPair([$mpa], 0); | ||||
| 	  if (ref($pHash) eq 'ARRAY') {  | ||||
| 	      return $pHash;                | ||||
| 	  }  | ||||
|  | ||||
|           $pairs=$pHash->{$mpa}; | ||||
|         } | ||||
|  | ||||
|   | ||||
| @@ -283,6 +283,12 @@ sub getMonNodesStatus { | ||||
|   my @unknown_nodes=(); | ||||
|  | ||||
|   my $hierachy=xCAT_monitoring::monitorctrl->getMonHierarchy(); | ||||
|   if (ref($hierachy) eq 'ARRAY') { | ||||
|       xCAT::MsgUtils->message('S', "[mon]: " . $hierachy->[1]); | ||||
|       return %status;	 | ||||
|   } | ||||
|   | ||||
|  | ||||
|   my @mon_servers=keys(%$hierachy);  | ||||
|   my $isSV=xCAT::Utils->isServiceNode();  | ||||
|    | ||||
|   | ||||
| @@ -97,7 +97,16 @@ sub preprocess_request | ||||
|       } else { | ||||
|         $mon_hierachy=xCAT_monitoring::monitorctrl->getNodeMonServerPair($allnodes, 1); | ||||
|       } | ||||
|        | ||||
|       if (ref($mon_hierachy) eq 'ARRAY') {  | ||||
|           my $rsp2={}; | ||||
|           $rsp2->{data}->[0]=$mon_hierachy->[1]; | ||||
|           $callback->($rsp2); | ||||
| 	  $req = {}; | ||||
| 	  return;                | ||||
|       }  | ||||
|  | ||||
|       | ||||
|       my @mon_servers=keys(%$mon_hierachy);  | ||||
|       my @hostinfo=xCAT::Utils->determinehostname(); | ||||
|       #print "hostinfo=@hostinfo\n"; | ||||
| @@ -109,7 +118,7 @@ sub preprocess_request | ||||
|       foreach (@mon_servers) { | ||||
|         #service node come in pairs, the first one is the monserver adapter that facing the mn, | ||||
|         # the second one is facing the cn. we use the first one here | ||||
|         my @server_pair=split(',', $_);  | ||||
|         my @server_pair=split(':', $_);  | ||||
|         my $sv=$server_pair[0]; | ||||
|         my $mon_nodes=$mon_hierachy->{$_}; | ||||
|         if ((!$mon_nodes) || (@$mon_nodes ==0)) { next; } | ||||
| @@ -117,12 +126,11 @@ sub preprocess_request | ||||
|  | ||||
|         my $reqcopy = {%$req}; | ||||
| 	if (! $iphash{$sv}) { | ||||
| 	  if ($isSV) { next; } #if the command is issued on the monserver,  | ||||
|                               # only handle its children. | ||||
|           $reqcopy->{'_xcatdest'}=$sv; | ||||
|           my $rsp2={}; | ||||
|           $rsp2->{data}->[0]="sending request to $sv..."; | ||||
|           $callback->($rsp2); | ||||
| 	  if ($isSV) { next; } #if the command is issued on the monserver, only handle its children. | ||||
| 	  $reqcopy->{'_xcatdest'}=$sv; | ||||
| 	  my $rsp2={}; | ||||
| 	  $rsp2->{data}->[0]="sending request to $sv..."; | ||||
| 	  $callback->($rsp2); | ||||
|         }  | ||||
|  | ||||
|         push @{$reqcopy->{module}}, $a_ret[1]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user