Add the plugin to handle the getpartition command comes from node to get the partition configuration file from linuximage.partitioinfile
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@14347 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
427b66827f
commit
7538f98837
156
xCAT-server/lib/xcat/plugins/getpartition.pm
Normal file
156
xCAT-server/lib/xcat/plugins/getpartition.pm
Normal file
@ -0,0 +1,156 @@
|
||||
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head1
|
||||
xCAT plugin package to handle getpartition command
|
||||
Generally, the getpartitioin command is called from the stateless
|
||||
node during the booting period to get the partition configureation
|
||||
infomation to part the hard disk on the stateless node and to
|
||||
manage the local disk space for statelite and swap space.
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
package xCAT_plugin::getpartition;
|
||||
use xCAT::Utils;
|
||||
use xCAT::MsgUtils;
|
||||
use xCAT::Table;
|
||||
use xCAT::NodeRange;
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 handled_commands
|
||||
|
||||
Return list of commands handled by this plugin
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
sub handled_commands
|
||||
{
|
||||
return {'getpartition' => "getpartition"};
|
||||
}
|
||||
|
||||
|
||||
#-------------------------------------------------------
|
||||
|
||||
=head3 process_request
|
||||
|
||||
Process the command
|
||||
|
||||
=cut
|
||||
|
||||
#-------------------------------------------------------
|
||||
sub process_request
|
||||
{
|
||||
my $request = shift;
|
||||
my $callback = shift;
|
||||
my $subreq = shift;
|
||||
|
||||
my $client;
|
||||
if ($request->{'_xcat_clienthost'}) {
|
||||
$client = $request->{'_xcat_clienthost'}->[0];
|
||||
}
|
||||
|
||||
if ($client) { ($client) = noderange($client) };
|
||||
unless ($client) { #Not able to do identify the host in question
|
||||
xCAT::MsgUtils->message("S","Received syncfiles from $client, which couldn't be correlated to a node (domain mismatch?)");
|
||||
return;
|
||||
}
|
||||
|
||||
parsepartition($client,$callback,$subreq);
|
||||
}
|
||||
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
|
||||
=head3
|
||||
|
||||
parseparition
|
||||
|
||||
Description: Read the partition configuration file from
|
||||
linuximage.partitionfile, parse the file and send back the partition
|
||||
parameters to the node.
|
||||
Arguments:
|
||||
Returns: 0 - failed; 1 - succeeded;
|
||||
=cut
|
||||
|
||||
#-----------------------------------------------------------------------------
|
||||
|
||||
sub parsepartition{
|
||||
my $node = shift;
|
||||
my $callback = shift;
|
||||
my $subreq = shift;
|
||||
|
||||
# get the partition file from linuximage.partitionfile
|
||||
my $partfile;
|
||||
my $rsp;
|
||||
|
||||
my $provmethod;
|
||||
my ($os, $arch, $profile);
|
||||
|
||||
my $nttab = xCAT::Table->new('nodetype', -create=>1);
|
||||
if ($nttab) {
|
||||
my $ntent = $nttab->getNodeAttribs($node, ['provmethod', 'os', 'arch', 'profile']);
|
||||
unless ($ntent) {
|
||||
push @{$rsp->{data}}, "Error: No entry in nodetype table";
|
||||
$callback->($rsp);
|
||||
return;
|
||||
}
|
||||
$provmethod = $ntent->{'provmethod'};
|
||||
$os = $ntent->{'os'};
|
||||
$arch = $ntent->{'arch'};
|
||||
$profile = $ntent->{'profile'};
|
||||
} else {
|
||||
push @{$rsp->{data}}, "Error: Could not open nodetype table";
|
||||
$callback->($rsp);
|
||||
return;
|
||||
}
|
||||
|
||||
my $imagename;
|
||||
if (($provmethod ne 'install') and ($provmethod ne 'netboot') and ($provmethod ne 'statelite')) {
|
||||
$imagename = $provmethod;
|
||||
} else {
|
||||
$imagename = "$os-$arch-$provmethod-$profile";
|
||||
}
|
||||
|
||||
my $linuximagetab = xCAT::Table->new('linuximage', -create=>1);
|
||||
if ($linuximagetab) {
|
||||
my $lient = $linuximagetab->getAttribs({imagename => $imagename}, ['partitionfile']);
|
||||
unless ($lient) {
|
||||
push @{$rsp->{data}}, "Error: No entry in linuximage table";
|
||||
$callback->($rsp);
|
||||
return;
|
||||
}
|
||||
$partfile = $lient->{'partitionfile'};
|
||||
} else {
|
||||
push @{$rsp->{data}}, "Error: Could not open linuximage table";
|
||||
$callback->($rsp);
|
||||
return;
|
||||
}
|
||||
|
||||
my $cfgfile;
|
||||
if ($partfile =~ /s:(.*)/) {
|
||||
# It's a script that could be run directly to do the partition configuring
|
||||
$cfgfile = $1;
|
||||
push @{$rsp->{data}}, "type=script";
|
||||
#push @{$rsp->{data}}, "enable=yes";
|
||||
} else {
|
||||
$cfgfile = $partfile;
|
||||
push @{$rsp->{data}}, "type=format";
|
||||
}
|
||||
|
||||
unless (-r $cfgfile) {
|
||||
push @{$rsp->{data}}, "Error: Could not read the file $1";
|
||||
$callback->($rsp);
|
||||
return;
|
||||
}
|
||||
open (FILE, "<$cfgfile");
|
||||
push @{$rsp->{data}}, <FILE>;
|
||||
$callback->($rsp);
|
||||
return;
|
||||
|
||||
|
||||
}
|
||||
|
||||
1;
|
Loading…
Reference in New Issue
Block a user