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:
		
							
								
								
									
										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; | ||||
		Reference in New Issue
	
	Block a user