xcat-core/xCAT-server/lib/xcat/monitoring/xcatmon.pm
2008-06-13 15:10:08 +00:00

321 lines
9.9 KiB
Perl

#!/usr/bin/env perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
package xCAT_monitoring::xcatmon;
BEGIN
{
$::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : '/opt/xcat';
}
use lib "$::XCATROOT/lib/perl";
use xCAT::Utils;
use xCAT::GlobalDef;
use xCAT_monitoring::monitorctrl;
1;
#-------------------------------------------------------------------------------
=head1 xCAT_monitoring:xcatmon
=head2 Package Description
This is a xCAT monitoring plugin. The only thing that this plug-in does is
the node monitoring. To activate it simply do the following command:
chtab pname=xCAT monitoring.nodestatmon=Y
=cut
#-------------------------------------------------------------------------------
#--------------------------------------------------------------------------------
=head3 start
This function gets called by the monitorctrl module
when xcatd starts.
Arguments:
None.
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub start {
#print "xcatmon.start\n";
return (0, "started");
}
#--------------------------------------------------------------------------------
=head3 stop
This function gets called by the monitorctrl module when
xcatd stops.
Arguments:
none
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub stop {
return (0, "stopped");
}
#--------------------------------------------------------------------------------
=head3 supportNodeStatusMon
This function is called by the monitorctrl module to check
if this product can help monitoring and returning the node status.
Arguments:
none
Returns:
1
=cut
#--------------------------------------------------------------------------------
sub supportNodeStatusMon {
return 1;
}
#--------------------------------------------------------------------------------
=head3 startNodeStatusMon
This function is called by the monitorctrl module to tell
the product to start monitoring the node status and feed them back
to xCAT.
Arguments:
None.
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub startNodeStatusMon {
my $temp=shift;
if ($temp =~ /xCAT_monitoring::xcatmon/) {
$temp=shift;
}
#print "xcatmon.startNodeStatusMon\n";
#run the command first to update the status,
my $cmd="$::XCATROOT/sbin/xcatnodemon";
#$output=`$cmd 2>&1`;
#if ($?) {
# print "xcatmon: $output\n";
#}
#figure out the ping-intercal setting
my $value=3; #default
my %settings=xCAT_monitoring::monitorctrl->getPluginSettings("xcatmon");
#print "settings for xcatmon:\n";
#foreach (keys(%settings)) {
# print "key=$_, value=$settings{$_}\n";
#}
my $reading=$settings{'ping-interval'};
if ($reading>0) { $value=$reading;}
#create the cron job, it will run the command every 3 minutes.
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);
if ($code==0) { return (0, "started"); }
else { return ($code, $msg); }
}
#--------------------------------------------------------------------------------
=head3 stopNodeStatusMon
This function is called by the monitorctrl module to tell
the product to stop feeding the node status info back to xCAT.
Arguments:
none
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub stopNodeStatusMon {
#TODO: turn off the node status monitoring.
my $job="$::XCATROOT/sbin/xcatnodemon";
my ($code, $msg)=xCAT::Utils::remove_cron_job($job);
if ($code==0) { return (0, "stopped"); }
else { return ($code, $msg); }
}
#--------------------------------------------------------------------------------
=head3 addNodes
This function is called by the monitorctrl module when new nodes are added
to the xCAT cluster. It should add the nodes into the product for monitoring.
Arguments:
nodes --nodes to be added. It is a pointer to an array. If the next argument is
1, each element is a ref to an array of [nodes, status]. For example:
[['node1', 'active'], ['node2', 'booting']..].
if the next argument is 0, each element is a node name to be added.
boolean -- 1, or 0.
Returns:
(error code, error message)
=cut
#--------------------------------------------------------------------------------
sub addNodes {
#print "xcatmon:addNodes called\n";
return (0, "ok");
}
#--------------------------------------------------------------------------------
=head3 removeNodes
This function is called by the monitorctrl module when nodes are removed
from the xCAT cluster. It should remove the nodes from the product for monitoring.
Arguments:
nodes --nodes to be added. It is a pointer to an array. If the next argument is
1, each element is a ref to an array of [nodes, status]. For example:
[['node1', 'active'], ['node2', 'booting']..].
if the next argument is 0, each element is a node name to be added.
boolean -- 1, or 0.
Returns:
(error code, error message)
=cut
#--------------------------------------------------------------------------------
sub removeNodes {
#print "xcatmon:removeNodes called\n";
return (0, "ok");
}
#--------------------------------------------------------------------------------
=head3 getMonNodesStatus
This function goes to the xCAT nodelist table to retrieve the saved node status
for all the node that are managed by local nodes.
Arguments:
none.
Returns:
a hash that has the node status. The format is:
{active=>[node1, node3,...], unreachable=>[node4, node2...], unknown=>[node8, node101...]}
=cut
#--------------------------------------------------------------------------------
sub getMonNodesStatus {
%status=();
my @inactive_nodes=();
my @active_nodes=();
my @unknown_nodes=();
my $hierachy=xCAT_monitoring::monitorctrl->getMonHierarchy();
my @mon_servers=keys(%$hierachy);
my $isSV=xCAT::Utils->isServiceNode();
#on a service node or on ms, get the nodes that has local host as the server node
my $monnodes;
my @hostinfo=xCAT::Utils->determinehostname();
my %iphash=();
foreach(@hostinfo) {$iphash{$_}=1;}
#if this is mn, include the ones that has no service nodes
if (!$isSV) { $iphash{'noservicenode'}=1;}
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 $sv=$server_pair[0];
if ($iphash{$sv}) {
$monnodes=$hierachy->{$_};
}
}
foreach(@$monnodes) {
my $node=$_->[0];
my $status=$_->[2];
if ($status eq $::STATUS_ACTIVE) { push(@active_nodes, $node);}
elsif ($status eq $::STATUS_INACTIVE) { push(@inactive_nodes, $node);}
else { push(@unknown_nodes, $node);}
}
$status{$::STATUS_ACTIVE}=\@active_nodes;
$status{$::STATUS_INACTIVE}=\@inactive_nodes;
$status{unknown}=\@unknown_nodes;
return %status;
}
#--------------------------------------------------------------------------------
=head3 processNodeStatusChanges
This function will update the status column of the
nodelist table with the new node status.
Arguments:
status -- a hash pointer of the node status. A key is a status string. The value is
an array pointer of nodes that have the same status.
for example: {active=>["node1", "node1"], inactive=>["node5","node100"]}
Returns:
0 for successful.
non-0 for not successful.
=cut
#--------------------------------------------------------------------------------
sub processNodeStatusChanges {
my $temp=shift;
if ($temp =~ /xCAT_monitoring::xcatmon/) {
$temp=shift;
}
return xCAT_monitoring::monitorctrl->processNodeStatusChanges($temp);
}
#--------------------------------------------------------------------------------
=head3 processSettingChanges
This function gets called when the setting for this monitoring plugin
has been changed in the monsetting table.
Arguments:
none.
Returns:
0 for successful.
non-0 for not successful.
=cut
#--------------------------------------------------------------------------------
sub processSettingChanges {
#restart the cron job
xCAT_monitoring::xcatmon->stopNodeStatusMon();
xCAT_monitoring::xcatmon->startNodeStatusMon();
}
#--------------------------------------------------------------------------------
=head3 getDiscription
This function returns the detailed description of the plugin inluding the
valid values for its settings in the mon setting tabel.
Arguments:
none
Returns:
The description.
=cut
#--------------------------------------------------------------------------------
sub getDescription {
return
" Description:
xcatmon uses fping to report the node liveness status and update the
nodelist.status column. Use command 'monstart xcatmon -n' to start
monitoring.
Settings:
ping-interval: the number of minutes between each fping operation.
The default value is 3.";
}