From 8f0e127d313316abd8f27875f0bd9f80f61464d2 Mon Sep 17 00:00:00 2001 From: sjing Date: Tue, 28 Feb 2012 08:44:13 +0000 Subject: [PATCH] rmnimimage: check nim resources(alloc_count) on sn when we want to remove it on mn. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@11703 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/aixinstall.pm | 100 ++++++++++++++++----- 1 file changed, 80 insertions(+), 20 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/aixinstall.pm b/xCAT-server/lib/xcat/plugins/aixinstall.pm index a10332dd3..5edffd07d 100644 --- a/xCAT-server/lib/xcat/plugins/aixinstall.pm +++ b/xCAT-server/lib/xcat/plugins/aixinstall.pm @@ -202,7 +202,7 @@ sub preprocess_request { # take care of -h etc. # also get osimage hash to pass on!! - my ($rc, $imagehash, $servers) = &prermnimimage($cb, $sub_req); + my ($rc, $imagehash, $servers, $mnsn) = &prermnimimage($cb, $sub_req); if ($rc) { # either error or -h was processed etc. my $rsp; @@ -218,11 +218,25 @@ sub preprocess_request # if something more than -h etc. then pass on the request if (defined($imagehash) && scalar(@{$servers})) { + my %allsn; + foreach my $sn (@{$mnsn}) # convert array to hash + { + $allsn{$sn} = 1; + } + foreach my $snkey (@{$servers}) { my $reqcopy = {%$req}; $reqcopy->{'_xcatdest'} = $snkey; + # put servicenode list in req, will use it in rmnimimage(). + if(%allsn) + { + # add tags to the hash keys that start with a number + xCAT::InstUtils->taghash(\%allsn); + $reqcopy->{'nodehash'} = \%allsn; + } + #$reqcopy->{_xcatpreprocessed}->[0] = 1; if ($imagehash) { @@ -513,7 +527,7 @@ sub process_request } elsif ($command eq "rmnimimage") { - ($ret, $msg) = &rmnimimage($callback, $imagehash, $sub_req); + ($ret, $msg) = &rmnimimage($callback, $imagehash, $nodehash, $sub_req); } elsif ($command eq "chkosimage") { @@ -5494,6 +5508,20 @@ sub prermnimimage my $nimprime = xCAT::InstUtils->getnimprime(); chomp $nimprime; + # by default, get MN and all servers + my @allsn = (); + my @nlist = xCAT::Utils->list_all_nodes; + my $sn; + my $service = "xcat"; + if (\@nlist) + { + $sn = xCAT::Utils->getSNformattedhash(\@nlist, $service, "MN"); + } + foreach my $snkey (keys %$sn) + { + push(@allsn, $snkey); + } + if ($::MN) { @@ -5506,20 +5534,8 @@ sub prermnimimage } else { - - # do MN and all servers - # get all the service nodes - my @nlist = xCAT::Utils->list_all_nodes; - my $sn; - my $service = "xcat"; - if (\@nlist) - { - $sn = xCAT::Utils->getSNformattedhash(\@nlist, $service, "MN"); - } - foreach my $snkey (keys %$sn) - { - push(@servicenodes, $snkey); - } + # do mn and all sn + @servicenodes = @allsn; } # @@ -5546,7 +5562,7 @@ sub prermnimimage } } - return (0, \%imagedef, \@servicenodes); + return (0, \%imagedef, \@servicenodes, \@allsn); } #---------------------------------------------------------------------------- @@ -5568,6 +5584,7 @@ sub rmnimimage { my $callback = shift; my $imaghash = shift; + my $nodehash = shift; # store all servicenodes. my $subreq = shift; my @servernodelist; @@ -5582,6 +5599,12 @@ sub rmnimimage return 0; } + my %allsn; + if ($nodehash) + { + %allsn = %{$nodehash}; + } + if (defined(@{$::args})) { @ARGV = @{$::args}; @@ -5698,6 +5721,11 @@ sub rmnimimage my $res_name = $imagedef{$image_name}{$attr}; chomp $res_name; + unless($res_name) + { + next; + } + if ($attr eq 'script') { foreach (split /,/, $res_name) @@ -5740,9 +5768,41 @@ sub rmnimimage } else { - $alloc_count = - xCAT::InstUtils->get_nim_attr_val($resname, "alloc_count", - $callback, "", $subreq); + if ($::MN) + { + # check nim resources on mn or nimprime + $alloc_count = + xCAT::InstUtils->get_nim_attr_val($resname, "alloc_count", + $callback, "", $subreq); + } + else + { + # get local hostname as target, since the req has been dispatched. + my $hn = `hostname`; + $alloc_count = + xCAT::InstUtils->get_nim_attr_val($resname, "alloc_count", + $callback, $hn, $subreq); + } + + # if this is mn, check the alloc_count on sn too. + if (xCAT::Utils->isMN()) + { + foreach my $sn (keys %allsn) + { + my $acount = + xCAT::InstUtils->get_nim_attr_val($resname, "alloc_count", + $callback, $sn, $subreq); + if ($acount != 0) + { + my $rsp; + push @{$rsp->{data}}, + "$Sname: The resource named \'$resname\' is currently allocated on $sn. It will not be removed.\n"; + xCAT::MsgUtils->message("I", $rsp, $callback); + + $alloc_count = $alloc_count + $acount; + } + } + } } if (defined($alloc_count) && ($alloc_count != 0))