more on node status update

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2267 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
linggao 2008-09-30 20:00:46 +00:00
parent d00f870c08
commit b5b49db02f
4 changed files with 100 additions and 38 deletions

View File

@ -34,20 +34,24 @@ $::STATUS_NETBOOTING="netbooting";
$::STATUS_BOOTED="booted";
$::STATUS_POWERING_OFF="powering-off";
$::STATUS_DISCOVERING="discovering";
$::STATUS_CONFIGURING="configuring";
$::STATUS_STANDING_BY="standingby";
$::STATUS_SHELL="shell";
$::STATUS_DEFINED="defined";
$::STATUS_UNKNOWN="unknown";
#defined->[discovering]->installing->installed->booting->alive, defined->netbooting->booted->alive, alive/unreachable->booting->alive, powering-off->unreachable, alive->unreachable
#defined->[discovering]->[configuring]->[standingby]->installing->[installed]->booting->alive, defined->[discovering]->[configuring]-[standingby]->netbooting->booted->alive, alive/unreachable->booting->alive, powering-off->unreachable, alive->unreachable
%::NEXT_NODESTAT_VAL=(
$::STATUS_DEFINED=>{$::STATUS_DISCOVERING=>1, $::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_POWERING_OFF=>1, $::STATUS_BOOTING=>1},
$::STATUS_DISCOVERING=>{$::STATUS_INSTALLING=>1, $::STATUS_BOOTING=>1},
$::STATUS_INSTALLING =>{$::STATUS_INSTALLED=>1, $::STATUS_DISCOVERING=>1},
$::STATUS_DEFINED=>{$::STATUS_DISCOVERING=>1, $::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_POWERING_OFF=>1, $::STATUS_BOOTING=>1, $::STATUS_CONFIGURING=>1},
$::STATUS_DISCOVERING=>{$::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_CONFIGURING=>1, $::STATUS_BOOTING=>1},
$::STATUS_CONFIGURING=>{$::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_STANDING_BY=>1},
$::STATUS_INSTALLING =>{$::STATUS_INSTALLED=>1, $::STATUS_BOOTING=>1},
$::STATUS_INSTALLED =>{$::STATUS_BOOTING=>1},
$::STATUS_BOOTING=>{$::STATUS_BOOTED=>1,$::STATUS_ACTIVE=>1, $::STATUS_INACTIVE=>1},
$::STATUS_BOOTING=>{$::STATUS_BOOTED=>1, $::STATUS_ACTIVE=>1, $::STATUS_INACTIVE=>1},
$::STATUS_NETBOOTING=>{$::STATUS_BOOTED=>1},
$::STATUS_BOOTED=>{$::STATUS_ACTIVE=>1, $::STATUS_INACTIVE=>1},
$::STATUS_ACTIVE=>{$::STATUS_INACTIVE=>1, $::STATUS_DISCOVERING=>1, $::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_POWERING_OFF=>1, $::STATUS_BOOTING=>1},
$::STATUS_INACTIVE=>{$::STATUS_ACTIVE=>1, $::STATUS_DISCOVERING=>1, $::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_POWERING_OFF=>1, $::STATUS_BOOTING=>1},
$::STATUS_ACTIVE=>{$::STATUS_INACTIVE=>1, $::STATUS_DISCOVERING=>1, $::STATUS_CONFIGURING=>1, $::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_POWERING_OFF=>1, $::STATUS_BOOTING=>1},
$::STATUS_INACTIVE=>{$::STATUS_ACTIVE=>1, $::STATUS_DISCOVERING=>1, $::STATUS_CONFIGURING=>1, $::STATUS_INSTALLING=>1, $::STATUS_NETBOOTING=>1, $::STATUS_POWERING_OFF=>1, $::STATUS_BOOTING=>1},
$::STATUS_POWERING_OFF=>{$::STATUS_INACTIVE=>1}
);

View File

@ -263,7 +263,7 @@ nodelist => {
descriptions => {
node => 'The hostname of a node in the cluster.',
groups => "A comma-delimited list of groups this node is a member of. Group names are arbitrary, except all nodes should be part of the 'all' group.",
status => 'The current status of this node. This attribute will be set by xCAT software. Valid values: defined, booting, netbooting, booted, discovering, installing, alive, powering-off, unreachable. The default value is defined. The possible status change sequenses are: defined->[discovering]->installing->installed->booting->alive, defined->netbooting->booted->alive, alive/unreachable->booting->alive, alive->powering-off->unreachable, alive->unreachable',
status => 'The current status of this node. This attribute will be set by xCAT software. Valid values: defined, booting, netbooting, booted, discovering, configuring, installing, alive, standingby, powering-off, unreachable. The default value is defined. The possible status change sequenses are: defined->[discovering]->[configuring]->[standingby]->installing->[installed]->booting->alive, defined->[discovering]->[configuring]->[standingby]->netbooting->booted->alive, alive/unreachable->booting->alive, alive->powering-off->unreachable, alive->unreachable',
appstatus => "A comma-delimited list monitored applications that are active on the node. For example 'sshd,rmcd,gmond",
comments => 'Any user-written notes.',
disable => "Set to 'yes' or '1' to comment out this row.",
@ -554,6 +554,17 @@ nimimage => {
disable => "Set to 'yes' or '1' to comment out this row.",
},
},
performance => {
cols => [qw(timestamp node attrname attrvalue)],
keys => [qw(timestamp node attrname)],
table_desc => 'Describes the system performance every interval unit of time.',
descriptions => {
timestamp => 'The time at which the metric was captured.',
node => 'The node name.',
attrname => 'The metric name.',
attrvalue => 'The metric value.'
},
},
); # end of tabspec definition
@ -1381,6 +1392,29 @@ push(@{$defspec{group}->{'attrs'}}, @nodeattrs);
},
);
#########################
# performance table #
#########################
@{$defspec{performance}->{'attrs'}} = (
{attr_name => 'timestamp',
tabentry => 'performance.timestamp',
access_tabentry => 'performance.timestamp=attr:timestamp',
},
{attr_name => 'node',
tabentry => 'performance.node',
access_tabentry => 'performance.timestamp=attr:timestamp',
},
{attr_name => 'attrname',
tabentry => 'performance.netname',
access_tabentry => 'performance.timestamp=attr:timestamp',
},
{attr_name => 'attrvalue',
tabentry => 'performance.attrvalue',
access_tabentry => 'performance.timestamp=attr:timestamp',
},
);
# Build a corresponding hash for the attribute names to make
# definition access easier
foreach (keys %xCAT::Schema::defspec) {

View File

@ -540,11 +540,13 @@ sub getNodeStatusFromNodesetState {
}
my $action=shift;
my $status=$::STATUS_BOOTING;
my $status=$::STATUS_BOOTING; #boot, reboot, runimage
if ($nodeset =~ /^install/) { $status=$::STATUS_INSTALLING; } #linux
elsif ($nodeset =~ /^netboot/) { $status=$::STATUS_NETBOOTING;} #linux
elsif ($nodeset =~ /^boot/) { $status=$::STATUS_BOOTING;} #linux
elsif ($nodeset =~ /^discover/) { $status=$::STATUS_DISCOVERING;} #linux
elsif ($nodeset =~ /^runcmd/) { $status=$::STATUS_CONFIGURING;} #linux
elsif ($nodeset =~ /^standby/) { $status=$::STATUS_STANDING_BY;} #linux
elsif ($nodeset =~ /^shell/) { $status=$::STATUS_SHELL;} #linux
elsif (($nodeset =~ /^diskless/) || ($nodeset =~ /^dataless/)) { $status=$::STATUS_NETBOOTING;} #aix
elsif ($nodeset =~ /^standalone/) { #aix
if ($action eq "rnetboot") { $status=$::STATUS_INSTALLING; }

View File

@ -34,13 +34,13 @@ sub process_request {
$callback = shift;
$subreq = shift;
if ($request->{command}->[0] eq 'getdestiny') {
getdestiny();
getdestiny(0);
}
if ($request->{command}->[0] eq 'nextdestiny') {
nextdestiny($request);
nextdestiny(0); #it is called within dodestiny
}
if ($request->{command}->[0] eq 'setdestiny') {
setdestiny($request);
setdestiny($request, 0);
}
}
@ -59,12 +59,14 @@ sub relay_response {
sub setdestiny {
my $req=shift;
my $flag=shift;
$chaintab = xCAT::Table->new('chain',-create=>1);
my @nodes=@{$req->{node}};
my $state = $req->{arg}->[0];
my %nstates;
if ($state eq "next") {
return nextdestiny();
return nextdestiny($flag + 1); #this is special case where updateflag is called
} elsif ($state eq "iscsiboot") {
my $iscsitab=xCAT::Table->new('iscsi');
unless ($iscsitab) {
@ -172,11 +174,12 @@ sub setdestiny {
}
$chaintab->setNodeAttribs($_,{currstate=>$lstate});
}
return getdestiny();
return getdestiny($flag + 1);
}
sub nextdestiny {
my $flag=shift;
my $callnodeset=0;
if (scalar(@_)) {
$callnodeset=1;
@ -207,7 +210,6 @@ sub nextdestiny {
my $node;
$chaintab = xCAT::Table->new('chain');
my $chainents = $chaintab->getNodesAttribs(\@nodes,[qw(currstate currchain chain)]);
my %node_status=();
foreach $node (@nodes) {
unless($chaintab) {
syslog("local1|err","ERROR: $node requested destiny update, no chain table");
@ -230,32 +232,12 @@ sub nextdestiny {
}
$chaintab->setNodeAttribs($node,$ref); #$ref is in a state to commit back to db
#collect node status for certain states
my $stat;
if ($ref->{currstate} =~ /^boot/) { $stat=$::STATUS_BOOTING; }
elsif ($ref->{currstate} =~ /^discover/) { $stat=$::STATUS_DISCOVERING; }
if ($stat) {
if (exists($node_status{$stat})) {
my $pa=$node_status{$stat};
push(@$pa, $node);
}
else {
$node_status{$stat}=[$node];
}
}
my %requ;
$requ{node}=[$node];
$requ{arg}=[$ref->{currstate}];
setdestiny(\%requ);
setdestiny(\%requ, $flag+1);
}
#setup the nodelist.status
if (keys(%node_status) > 0) {
xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%node_status, 1);
}
if ($callnodeset) {
$subreq->({command=>['nodeset'],
node=> \@nodes,
@ -266,6 +248,12 @@ sub nextdestiny {
sub getdestiny {
my $flag=shift;
# flag value:
# 0--getdestiny is called by dodestiny
# 1--called by nextdestiny in dodestiny. The node calls nextdestiny before boot and runcmd.
# 2--called by nodeset command
# 3--called by updateflag after the node finished installation and before booting
my @args;
my @nodes;
if ($request->{node}) {
@ -295,6 +283,8 @@ sub getdestiny {
my $bpents = $bptab->getNodesAttribs(\@nodes,[qw(kernel initrd kcmdline xcatmaster)]);
my $sitetab= xCAT::Table->new('site');
(my $sent) = $sitetab->getAttribs({key=>'master'},'value');
my %node_status=();
foreach $node (@nodes) {
unless ($chaintab) { #Without destiny, have the node wait with ssh hopefully open at least
$callback->({node=>[{name=>[$node],data=>['standby'],destiny=>[ 'standby' ]}]});
@ -302,8 +292,21 @@ sub getdestiny {
}
my $ref = $chainents->{$node}->[0]; #$chaintab->getNodeAttribs($node,[qw(currstate chain)]);
unless ($ref) {
#collect node status for certain states
if (($flag==0) || ($flag==3)) {
my $stat=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState("standby", "getdestiny");
#print "node=$node, stat=$stat\n";
if ($stat) {
if (exists($node_status{$stat})) {
my $pa=$node_status{$stat};
push(@$pa, $node);
}
else { $node_status{$stat}=[$node]; }
}
}
$callback->({node=>[{name=>[$node],data=>['standby'],destiny=>[ 'standby' ]}]});
return;
next;
}
unless ($ref->{currstate}) { #Has a record, but not yet in a state...
my @chain = split /,/,$ref->{chain};
@ -335,8 +338,27 @@ sub getdestiny {
$response{imgserver} = xCAT::Utils->my_ip_facing($node);
}
#collect node status for certain states
if (($flag==0) || ($flag==3)) {
my $stat=xCAT_monitoring::monitorctrl->getNodeStatusFromNodesetState($response{destiny}->[0], "getdestiny");
#print "node=$node, stat=$stat\n";
if ($stat) {
if (exists($node_status{$stat})) {
my $pa=$node_status{$stat};
push(@$pa, $node);
}
else { $node_status{$stat}=[$node]; }
}
}
$callback->({node=>[\%response]});
}
#setup the nodelist.status
if (($flag==0) || ($flag==3)) {
#print "save status\n";
if (keys(%node_status) > 0) { xCAT_monitoring::monitorctrl::setNodeStatusAttributes(\%node_status, 1); }
}
}