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:
linggao 2009-03-17 21:07:21 +00:00
parent ab1dd57f50
commit 1a4429e4ab
8 changed files with 879 additions and 875 deletions

View File

@ -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

View File

@ -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;

View File

@ -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 ";
}

View File

@ -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

View File

@ -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};
}

View File

@ -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();

View File

@ -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];