added supported in monitoring plug-in to allow customize the plug-ins. settings column is added to the monitoring table. now xcatmon ping interval can be adjusted by command 'startmon xcatmon -n -s ping-interval=2'

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@552 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
linggao 2008-02-23 01:01:49 +00:00
parent c7e87717d7
commit 3a0682d5bc
8 changed files with 52 additions and 19 deletions

View File

@ -93,15 +93,16 @@ mac => {
},
},
monitoring => {
cols => [qw(name nodestatmon comments disable)],
cols => [qw(name nodestatmon settings comments disable)],
keys => [qw(name)],
required => [qw(name)],
table_desc => 'Controls what external monitoring tools xCAT sets up and uses. Entries should be added and removed from this table using the provided xCAT commands startmon and stopmon.',
descriptions => {
name => "The name of the mornitoring plug-in module. The plug-in must be put in $ENV{XCATROOT}/lib/perl/xCAT_monitoring/. See the man page for startmon for details.",
nodestatmon => 'Specifies if the monitoring plug-in is used to feed the node status to the xCAT cluster. Any one of the following values indicates "yes": y, Y, yes, Yes, YES, 1. Any other value or blank (default), indicates "no".',
comments => 'Any user-written notes.',
disable => "Set to 'yes' or '1' to comment out this row.",
settings => 'Specifies the plug-in specific settings. These setting will be used by the plug-in to customize certain entities for the plug-in or the third party monitoring software. e.g. mon_interval=10,toggle=1',
comments => 'Any user-written notes.',
disable => "Set to 'yes' or '1' to comment out this row.",
},
},
mp => {
@ -1152,6 +1153,10 @@ push(@{$defspec{group}->{'attrs'}}, @nodeattrs);
tabentry => 'monitoring.nodestatmon',
access_tabentry => 'monitoring.name=attr:name',
},
{attr_name => 'settings',
tabentry => 'monitoring.settings',
access_tabentry => 'monitoring.name=attr:name',
},
{attr_name => 'comments',
tabentry => 'monitoring.comments',
access_tabentry => 'monitoring.name=attr:name',

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -18,7 +18,7 @@ use xCAT_monitoring::montbhandler;
#the list store the names of the monitoring plug-in and the file name and module names.
#the names are stored in the "name" column of the monitoring table.
#the format is: (name=>[filename, modulename], ...)
#the format is: (name=>[filename, modulename, settings], ...)
%PRODUCT_LIST;
#stores the module name and the method that is used for the node status monitoring
@ -343,10 +343,11 @@ sub startMonitoring {
my $aRef=$PRODUCT_LIST{$_};
if ($aRef) {
my $module_name=$aRef->[1];
my $settings=$aRef->[2];
undef $SIG{CHLD};
#initialize and start monitoring
my @ret1 = ${$module_name."::"}{start}->($monservers);
my @ret1 = ${$module_name."::"}{start}->($monservers, $settings);
$ret{$_}=\@ret1;
} else {
$ret{$_}=[1, "Monitoring plug-in module $_ is not registered."];
@ -383,12 +384,13 @@ sub startNodeStatusMonitoring {
my $aRef=$PRODUCT_LIST{$pname};
if ($aRef) {
my $module_name=$aRef->[1];
my $settings=$aRef->[2];
undef $SIG{CHLD};
my $method = ${$module_name."::"}{supportNodeStatusMon}->();
# return value 0 means not support. 1 means yes.
if ($method > 0) {
#start nodes tatus monitoring
my @ret2 = ${$module_name."::"}{startNodeStatusMon}->(getMonHierarchy());
my @ret2 = ${$module_name."::"}{startNodeStatusMon}->(getMonHierarchy(), $settings);
return @ret2;
}
else {
@ -772,7 +774,7 @@ sub refreshProductList {
#get the monitoring plug-in list from the monitoring table
my $table=xCAT::Table->new("monitoring", -create =>1);
if ($table) {
my @tmp1=$table->getAllAttribs(('name','nodestatmon'));
my @tmp1=$table->getAllAttribs(('name','nodestatmon', 'settings'));
if (defined(@tmp1) && (@tmp1 > 0)) {
foreach(@tmp1) {
my $pname=$_->{name};
@ -784,15 +786,16 @@ sub refreshProductList {
}
#find out the monitoring plugin file and module name for the product
$file_name="$::XCATROOT/lib/perl/xCAT_monitoring/$pname.pm";
$module_name="xCAT_monitoring::$pname";
my $file_name="$::XCATROOT/lib/perl/xCAT_monitoring/$pname.pm";
my $module_name="xCAT_monitoring::$pname";
my $settings=$_->{settings};
#load the module in memory
eval {require($file_name)};
if ($@) {
print "The file $file_name cannot be located or has compiling errors.\n";
}
else {
my @a=($file_name, $module_name);
my @a=($file_name, $module_name, $settings);
$PRODUCT_LIST{$pname}=\@a;
}
}

View File

@ -36,6 +36,7 @@ package xCAT_monitoring::templatemon;
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', 'active'], ['node2', 'switch', 'booting']...], ...}
settings -- ping-interval=x, x is in number of minutes
Returns:
(return code, message)
=cut
@ -45,6 +46,7 @@ sub start {
if ($monservers =~ /xCAT_monitoring::templatemon/) {
$monservers=shift;
}
my $setting=shift;
#demo how you can parse the input. you may commnet it out.
my $monservers=shift;
@ -114,6 +116,7 @@ sub supportNodeStatusMon {
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', 'active'], ['node2', 'switch', 'booting']...], ...}
settings -- ping-interval=x, x is in number of minutes
Returns:
(return code, message)
@ -124,6 +127,7 @@ sub startNodeStatusMon {
if ($monservers =~ /xCAT_monitoring::templatemon/) {
$monservers=shift;
}
my $setting=shift;
#demo how you can parse the input. you may commnet it out.
my $monservers=shift;

View File

@ -30,7 +30,8 @@ use Sys::Hostname;
monservers --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', 'active'], ['node2', 'switch', 'booting']...], ...}
{monserver1=>[['node1', 'osi', 'active'], ['node2', 'switch', 'booting']...], ...}
settings -- ping-interval=x, x is in number of minutes
Returns:
(return code, message)
=cut
@ -89,26 +90,40 @@ sub supportNodeStatusMon {
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', 'active'], ['node2', 'switch', 'booting']...], ...}
settings -- ping-interval=x, x is in number of minutes
Returns:
(return code, message)
=cut
#--------------------------------------------------------------------------------
sub startNodeStatusMon {
my $temp=shift;
if ($temp =~ /xCAT_plugin::xcatmon/) {
$temp=shift;
}
my $setting=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";
#$output=`$cmd 2>&1`;
#if ($?) {
# print "xcatmon: $output\n";
#}
#figure out the ping-intercal setting
my $value=3;
if ($setting) {
if ($setting =~ /ping-interval=(\d+)/) { $value= ($1>0) ? $1 : 3; }
}
#create the cron job, it will run the command every 3 minutes.
my $newentry="*/3 * * * * XCATROOT=$::XCATROOT $cmd";
my $newentry="*/$value * * * * XCATROOT=$::XCATROOT $cmd";
my ($code, $msg)=xCAT::Utils::add_cron_job($newentry);
if ($code==0) { return (0, "started"); }
else { return ($code, $msg); }
else { return ($code, $msg); }
}

View File

@ -127,19 +127,21 @@ sub startmon {
{
my %rsp;
$rsp->{data}->[0]= "Usage:";
$rsp->{data}->[1]= " startmon name [-n|--nodestatmon]";
$rsp->{data}->[1]= " startmon name [-n|--nodestatmon] [-s|--settings]";
$rsp->{data}->[2]= " startmon [-h|--help|-v|--version]";
$rsp->{data}->[3]= " name is the name of the monitoring plug-in to be registered and invoked.";
$callback->($rsp);
}
@ARGV=@{$args};
my $settings;
# parse the options
if(!GetOptions(
'h|help' => \$::HELP,
'v|version' => \$::VERSION,
'n|nodestatmon' => \$::NODESTATMON))
'n|nodestatmon' => \$::NODESTATMON,
's|settings=s' => \$settings))
{
&startmon_usage;
return;
@ -223,8 +225,12 @@ sub startmon {
$nstat='Y';
}
my %tb_cols=(nodestatmon=>$nstat);
if ($settings) {
$tb_cols{settings}=$settings;
}
$table->setAttribs(\%key_col, \%tb_cols);
}
}
$table->close();
}
my %rsp1;