added support for setting up master for monitoring during nodeset time

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@1759 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
linggao 2008-06-25 14:50:11 +00:00
parent f422276ae9
commit dd9946b05b
6 changed files with 274 additions and 4 deletions

View File

@ -274,7 +274,7 @@ sub startNodeStatusMon {
foreach my $key (keys (%$noderef)) {
my @key_a=split(',', $key);
if (! $iphash{$key_a[0]}) { push @servicenodes, $key_a[0]; }
my $mon_nodes=$monservers->{$key};
my $mon_nodes=$noderef->{$key};
foreach(@$mon_nodes) {
my $node_info=$_;
$status_hash{$node_info->[0]}=$node_info->[2];
@ -519,7 +519,11 @@ sub addNodes_noChecking {
my $ms_node_id;
my $mn_node_id;
my $ms_name,$ms_aliases,$ms_addrtype,$ms_length,@ms_addrs;
my $ms_name;
my $ms_aliases;
my $ms_addrtype;
my $ms_length;
my @ms_addrs;
my $ms_ipaddresses;
my $first_time=1;
@ -760,3 +764,78 @@ sub getNodeConfData {
return;
}
#--------------------------------------------------------------------------------
=head3 configMaster4Nodes
This function configures the current the localhost to accept the given nodes
into the monitoring domain.
Arguments:
noderef a pointer to an array of nodes.
Returns:
(code, message)
=cut
#--------------------------------------------------------------------------------
sub configMaster4Nodes {
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::rmcmon/) {
$noderef=shift;
}
if (!$noderef) { return (0, "");}
#check if rsct is installed or not
if (! -e "/usr/bin/lsrsrc") {
return (0, "");
}
#restart rmc daemon if it is not active
chomp(my $pid= `/bin/ps -ef | /bin/grep rmcd | /bin/grep -v grep | /bin/awk '{print \$2}'`);
unless($pid){
#restart rmc daemon
$result=`startsrc -s ctrmc`;
if ($?) {
return (1, "RMC deamon cannot be started\n");
}
}
my $message;
my $ret=0;
my $table3=xCAT::Table->new("nodetype", -create =>0);
foreach(@$noderef) {
my $node=$_;
#check if the node is OSI, akip if not
my $tmp3=$table3->getNodeAttribs($node, ['nodetype']);
my $nodetype=$::NODETYPE_OSI; #default
if (defined($tmp3) && ($tmp3)) {
if ($tmp3->{nodetype}) { $nodetype=$tmp3->{nodetype}; }
}
if ($nodetype !~ /$::NODETYPE_OSI/) { next; }
#check if the node is already defined, skip if it is
$result=`/usr/bin/lsrsrc-api -s IBM.MngNode::"Name==\'$node\'"::Name 2>&1`;
if ($?==0) { next;}
#get info for the node
my $mn_node_id=getNodeID($node);
my ($mn_name,$mn_aliases,$mn_addrtype,$mn_length,@mn_addrs) = gethostbyname($node);
chomp($mn_name);
my $mn_ipaddresses="{";
foreach (@mn_addrs) {
$mn_ipaddresses .= '"'.inet_ntoa($_) . '",';
}
chop($mn_ipaddresses);
$mn_ipaddresses .= "}";
# print " mn_name=$mn_name, mn_aliases=$mn_aliases, mn_ipaddr=$mn_ipaddresses, mn_node_id=$mn_node_id\n";
# define resource in IBM.MngNode class on server
$result=`mkrsrc-api IBM.MngNode::Name::"$node"::KeyToken::"$node"::IPAddresses::"$mn_ipaddresses"::NodeID::0x$mn_node_id 2>&1`;
if ($?) {
$ret=$?;
$message .= "define resource in IBM.MngNode class result=$result\n";
xCAT::MsgUtils->message('S', "[mon]: $message");
next;
}
}
if ( $table3) { $table3->close(); }
return ($ret, $message);
}

View File

@ -12,7 +12,11 @@
# To remove node to the cluster
# NODE=nodename configrmcnode -1
##########################################################################################
ADD=$1;
if [ -n "$1" ]; then
ADD=$1
else
ADD=1
fi
logger xCAT "configrmcnode: ADD=$ADD, NODE=$NODE, NODEID=$NODEID MONSERVER=$MONSERVER,MS_NODEID=$MS_NODEID"

View File

@ -908,7 +908,7 @@ sub getNodeMonServerPair {
my $table2=xCAT::Table->new("noderes", -create =>0);
my $pairs;
my $tmp2=$table2->getNodeAttribs($node, ['monserver', 'servicenode', 'xcatmaster']);
if (defined($tmp2) && ($tmp2)) {
if ($tmp2) {
if ($tmp2->{monserver}) {
$pairs=$tmp2->{monserver};
#when there is only one hostname specified in noderes.monserver,
@ -1280,6 +1280,73 @@ sub getNodeConfData {
return %ret;
}
#--------------------------------------------------------------------------------
=head3 configMaster4Nodes
This function goes to every monitoring plug-in module and configures the current
the localhost to accept the given nodes into the monitoring domain.
Arguments:
noderef a pointer to an array of nodes.
Returns:
(code, message)
=cut
#--------------------------------------------------------------------------------
sub configMaster4Nodes {
my $noderef=shift;
if ($noderef =~ /xCAT_monitoring::monitorctrl/) {
$noderef=shift;
}
#get all the module names from /opt/xcat/lib/perl/XCAT_monitoring directory
my %names=();
my @plugins=glob("$::XCATROOT/lib/perl/xCAT_monitoring/*.pm");
foreach (@plugins) {
/.*\/([^\/]*).pm$/;
$names{$1}=1;
}
# remove 2 files that are not plug-ins
delete($names{monitorctrl});
delete($names{montbhandler});
#get node conf data from each plug-in module
my $message;
my $retcode=0;
foreach my $pname (keys(%names)) {
my $file_name="$::XCATROOT/lib/perl/xCAT_monitoring/$pname.pm";
my $module_name="xCAT_monitoring::$pname";
#load the module in memory
eval {require($file_name)};
if (!$@) {
if (defined(${$module_name."::"}{configMaster4Nodes})) {
my ($c, $m)=${$module_name."::"}{configMaster4Nodes}->($noderef);
if ($c) {$retcode=$c; $message .= "$pname: $m\n";}
}
}
}
return ($retcode, $message);
}

View File

@ -45,9 +45,66 @@ sub handled_commands {
monls => "monctrlcmds",
monaddnode => "monctrlcmds",
monrmnode => "monctrlcmds",
moncfgmaster => "monctrlcmds",
}
}
#-------------------------------------------------------
=head3 preprocess_request
Check and setup for hierarchy
=cut
#-------------------------------------------------------
sub preprocess_request
{
my $req = shift;
my $cb = shift;
my $command = $req->{command}->[0];
if ($req->{_xcatdest}) { return [$req]; } #exit if preprocessed
my @requests=();
if ($command ne "moncfgmaster") {
my $reqcopy = {%$req};
push @requests, $reqcopy;
} else {
my $nodes = $req->{node};
my $noderef=xCAT_monitoring::monitorctrl->getMonServer($nodes);
#the identification of this node
my @hostinfo=xCAT::Utils->determinehostname();
my $isSV=xCAT::Utils->isServiceNode();
%iphash=();
foreach(@hostinfo) {$iphash{$_}=1;}
if (!$isSV) { $iphash{'noservicenode'}=1;}
foreach my $key (keys (%$noderef)) {
my @key_a=split(',', $key);
my $mon_nodes=$noderef->{$key};
@nodes_to_add=();
if ($mon_nodes) {
foreach(@$mon_nodes) {
my $node=$_->[0];
push(@nodes_to_add, $node);
}
}
if ($iphash{$key_a[0]}) { #current node is the master for the nodes
my $reqcopy = {%$req};
$reqcopy->{node}=\@nodes_to_add;
push @requests, $reqcopy;
} else { #push the request to the monitoring server
my $reqcopy = {%$req};
$reqcopy->{node}=\@nodes_to_add;
$reqcopy->{'_xcatdest'} = $key_a[0];
push @requests, $reqcopy;
}
}
}
return \@requests;
}
#--------------------------------------------------------------------------------
=head3 process_request
It processes the monitoring control commands.
@ -120,6 +177,23 @@ sub process_request {
}
return $ret;
}
elsif ($command eq "moncfgmaster") {
my $nodes = $request->{node};
if ($nodes) {
my ($ret, $msg) = moncfgmaster($nodes, $callback);
if ($msg) {
my %rsp=();
$rsp->{data}->[0]= $msg;
$callback->($rsp);
}
return $ret;
} else {
my %rsp=();
$rsp->{data}->[0]= "This command requires noderange.";
$callback->($rsp);
return 1;
}
}
else {
my %rsp=();
$rsp->{data}->[0]= "unsupported command: $command.";
@ -821,6 +895,32 @@ sub monrmnode {
#--------------------------------------------------------------------------------
=head3 moncfgmaster
This function goes asks the monitoring plug-ins to configure the local host
to include the given nodes into the monitoring domain. (The nodes configuration
is done via post installation scripts during deployment process).
Arguments:
nodes - a pointer to a array of nodes.
callback - the pointer to the callback function.
Returns:
0 for success. The output is returned through the callback pointer.
1. for unsuccess. The error messages are returns through the callback pointer.
=cut
#--------------------------------------------------------------------------------
sub moncfgmaster {
my $noderef=shift;
my $callback=shift;
my ($ret, $msg) = xCAT_monitoring::monitorctrl->configMaster4Nodes($noderef);
if ($ret) {
my %rsp1;
$rsp1->{data}->[0]="$msg";
$callback->($rsp1);
}
return $ret;
}

View File

@ -232,6 +232,15 @@ sub process_request {
}
return;
}
#give monitoring code a chance to prepare the master for the node deployment
my %new_request = (
command => ['moncfgmaster'],
node => \@rnodes
);
$sub_req->(\%new_request, \&pass_along);
#back to normal business
#if not shared, then help sync up
if ($req->{_disparatetftp}) { #reading hint from preprocess_command
@nodes = ();

View File

@ -160,6 +160,7 @@ sub preprocess_request {
#they specify no sharedtftp in site table
my $stab = xCAT::Table->new('site');
my $req = shift;
my $sent = $stab->getAttribs({key=>'sharedtftp'},'value');
if ($sent and ($sent->{value} == 0 or $ent->{value} =~ /no/i)) {
$req->{'_disparatetftp'}=[1];
@ -207,6 +208,7 @@ sub process_request {
$request = shift;
$callback = shift;
$sub_req = shift;
my @args;
my @nodes;
my @rnodes;
@ -221,6 +223,15 @@ sub process_request {
}
return;
}
#give monitoring code a chance to prepare the master for the node deployment
my %new_request = (
command => ['moncfgmaster'],
node => \@rnodes
);
$sub_req->(\%new_request, \&pass_along);
#back to normal business
#if not shared tftpdir, then filter, otherwise, set up everything
if ($req->{_disparatetftp}) { #reading hint from preprocess_command
@nodes = ();