mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-11-03 21:02:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			251 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
 | 
						|
 | 
						|
package xCAT_plugin::00kitnodebase;
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
use Data::Dumper;
 | 
						|
require xCAT::Utils;
 | 
						|
require xCAT::Table;
 | 
						|
require xCAT::ProfiledNodeUtils;
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head1
 | 
						|
 | 
						|
    xCAT plugin, which is also the default kit plugin.
 | 
						|
    These commands are called by node management commands, 
 | 
						|
    should not be called directly by external.
 | 
						|
 | 
						|
    The kit plugin framework is creating a common framework for kits' extension. The major feature of this framework is to update kits' related configuration files/services automatically while add/remove/update nodes.
 | 
						|
    
 | 
						|
    According to design, if a kit wants have such a auto configure feature, it should create a xCAT plugin which implement commands "kitcmd_nodemgmt_add", "kitcmd_nodemgmt_remove"..., just like plugin "00kitnodebase".
 | 
						|
 | 
						|
    For example, we create a kit for LSF, and want to update LSF's configuration file automatically updated while add/remove/update xCAT nodes, then we should create a xCAT plugin. This plugin will update LSF's configuration file and may also reconfigure/restart LSF service while these change happens.
 | 
						|
 | 
						|
    If we have multi kits, and all these kits have such a plugin, then all these plugins will be called while we add/remove/update xCAT nodes. To configure these kits in one go by auto.
 | 
						|
 | 
						|
    This plugin is a kit plugin, just for configure nodes' related configurations automatically. So that we do not need to run these make* commands manually after creating them.    
 | 
						|
 | 
						|
    About kit plugin naming:  naming this plugin starts with "00" is a way for specifying plugin calling orders, we want to call the default kit plugin in front of other kit plugins.
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head3  handled_commands
 | 
						|
 | 
						|
    Return list of commands handled by this plugin
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
sub handled_commands {
 | 
						|
    return {
 | 
						|
        kitnodeadd     => '00kitnodebase',
 | 
						|
        kitnoderemove  => '00kitnodebase',
 | 
						|
        kitnodeupdate  => '00kitnodebase',
 | 
						|
        kitnoderefresh => '00kitnodebase',
 | 
						|
    };
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head3  process_request
 | 
						|
 | 
						|
    Process the command.  This is the main call.
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
sub process_request {
 | 
						|
    my $request         = shift;
 | 
						|
    my $callback        = shift;
 | 
						|
    my $request_command = shift;
 | 
						|
    my $command         = $request->{command}->[0];
 | 
						|
    my $argsref         = $request->{arg};
 | 
						|
    my $macflag         = 1;
 | 
						|
    if (exists($request->{macflag}))
 | 
						|
    {
 | 
						|
        $macflag = $request->{macflag}->[0];
 | 
						|
    }
 | 
						|
    my $nodelist = $request->{node};
 | 
						|
    my $retref;
 | 
						|
    my $rsp;
 | 
						|
 | 
						|
    # Get nodes profile
 | 
						|
    my $profileref  = xCAT::ProfiledNodeUtils->get_nodes_profiles($nodelist);
 | 
						|
    my %profilehash = %$profileref;
 | 
						|
 | 
						|
    # Check whetehr we need to run makeconservercf
 | 
						|
    # If one node has hardwareprofile, we need to run makeconservercf
 | 
						|
    my $runconservercmd = 0;
 | 
						|
    foreach (keys %profilehash) {
 | 
						|
        if (exists $profilehash{$_}{'HardwareProfile'}) {
 | 
						|
            $runconservercmd = 1;
 | 
						|
            last;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    my @commandslist;
 | 
						|
    my %argslist;
 | 
						|
    my $noupdate_flag = 0;
 | 
						|
    my %msghash = ("makehosts" => "Updating hosts entries",
 | 
						|
        "makedns"         => "Updating DNS entries",
 | 
						|
        "makedhcp"        => "Update DHCP entries",
 | 
						|
        "makeknownhosts"  => "Update known hosts",
 | 
						|
        "makeconservercf" => "Updating conserver configuration files",
 | 
						|
"kitnoderemove" => "Remove nodes entries from system configuration files first.",
 | 
						|
        "nodeset"   => "Update nodes' boot settings",
 | 
						|
        "rspconfig" => "Updating FSP's IP address",
 | 
						|
        "rscan"     => "Update node's some attributes through 'rscan -u'",
 | 
						|
        "mkhwconn"  => "Sets up connections for nodes to FSP",
 | 
						|
    );
 | 
						|
 | 
						|
    # Stage1:  pre-run
 | 
						|
    if ($command eq 'kitnoderefresh') {
 | 
						|
 | 
						|
        # This is due to once update nicips table, we need remove node's records first and then re-create by run make* commands. If not, old records can't be removed.
 | 
						|
        push @commandslist, [ 'makedns',   '-d' ];
 | 
						|
        push @commandslist, [ 'makehosts', '-d' ];
 | 
						|
    }
 | 
						|
 | 
						|
    # Stage2: run xcat commands
 | 
						|
    if ($command eq 'kitnodeadd' or $command eq 'kitnodeupdate' or $command eq 'kitnoderefresh') {
 | 
						|
        push @commandslist, [ 'makehosts', '' ];
 | 
						|
        push @commandslist, [ 'makedns',   '' ];
 | 
						|
 | 
						|
        # Remove 'makedhcp' command, nodeset will update dhcp lease file
 | 
						|
        #if ($macflag) {
 | 
						|
        #    push @commandslist, ['makedhcp', ''];
 | 
						|
        #}
 | 
						|
        push @commandslist, [ 'makeknownhosts', '' ];
 | 
						|
        if ($runconservercmd) {
 | 
						|
            push @commandslist, [ 'makeconservercf', '' ];
 | 
						|
        }
 | 
						|
    } elsif ($command eq 'kitnoderemove') {
 | 
						|
        if ($runconservercmd) {
 | 
						|
            push @commandslist, [ 'makeconservercf', '-d' ];
 | 
						|
        }
 | 
						|
        push @commandslist, [ 'makeknownhosts', '-d' ];
 | 
						|
        if ($macflag) {
 | 
						|
            push @commandslist, [ 'makedhcp', '-d' ];
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    # Stage3: post-run
 | 
						|
    if ($command eq 'kitnodeadd') {
 | 
						|
        my $firstnode  = (@$nodelist)[0];
 | 
						|
        my $chaintab   = xCAT::Table->new("chain");
 | 
						|
        my $chainref   = $chaintab->getNodeAttribs($firstnode, ['chain']);
 | 
						|
        my $chainstr   = $chainref->{'chain'};
 | 
						|
        my @chainarray = split(",", $chainstr);
 | 
						|
 | 
						|
        if ($macflag)
 | 
						|
        {
 | 
						|
            if ($chainarray[0]) {
 | 
						|
                if ($chainarray[0] =~ m/^osimage=/)
 | 
						|
                {
 | 
						|
                    $noupdate_flag = 1;
 | 
						|
                }
 | 
						|
                push @commandslist, [ 'nodeset', $chainarray[0] ];
 | 
						|
            }
 | 
						|
        }
 | 
						|
        my $isfsp = xCAT::ProfiledNodeUtils->is_fsp_node([$firstnode]);
 | 
						|
        if ($isfsp) {
 | 
						|
            my $cmmref     = xCAT::ProfiledNodeUtils->get_nodes_cmm($nodelist);
 | 
						|
            my @cmmchassis = keys %$cmmref;
 | 
						|
 | 
						|
            push @commandslist, [ 'rspconfig', 'network=*' ];
 | 
						|
            push @commandslist, [ 'rscan',     '-u' ];
 | 
						|
            push @commandslist, [ 'mkhwconn',  '-t' ];
 | 
						|
        }
 | 
						|
    } elsif ($command eq 'kitnoderemove') {
 | 
						|
        push @commandslist, [ 'nodeset', 'offline' ];
 | 
						|
    } elsif ($command eq 'kitnodeupdate') {
 | 
						|
        my $firstnode = (@$nodelist)[0];
 | 
						|
        if (exists $profilehash{$firstnode}{"ImageProfile"}) {
 | 
						|
            my $osimage = 'osimage=' . $profilehash{$firstnode}{"ImageProfile"};
 | 
						|
            $noupdate_flag = 1;
 | 
						|
            push @commandslist, [ 'nodeset', $osimage ];
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    # Run commands
 | 
						|
    foreach (@commandslist) {
 | 
						|
        my $current_cmd  = $_->[0];
 | 
						|
        my $current_args = $_->[1];
 | 
						|
        setrsp_progress($msghash{$current_cmd});
 | 
						|
        $retref = "";
 | 
						|
        if (($current_cmd eq "nodeset") && $noupdate_flag)
 | 
						|
        {
 | 
						|
            $retref = xCAT::Utils->runxcmd({ command => [$current_cmd], node => $nodelist, arg => [ $current_args, "--noupdateinitrd" ] }, $request_command, -1, 1);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
            $retref = xCAT::Utils->runxcmd({ command => [$current_cmd], node => $nodelist, arg => [$current_args] }, $request_command, -1, 1);
 | 
						|
        }
 | 
						|
        log_cmd_return($current_cmd, $retref, $callback);
 | 
						|
    }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head3  setrsp_progress
 | 
						|
 | 
						|
       Description:  generate progresss info and return to client.
 | 
						|
       Args: $msg - The progress message.
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
sub setrsp_progress
 | 
						|
{
 | 
						|
    my $msg = shift;
 | 
						|
    xCAT::MsgUtils->message('S', "$msg");
 | 
						|
}
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
 | 
						|
=head3  log_cmd_return
 | 
						|
 | 
						|
       Description:  Log commands return ref into log files.
 | 
						|
       Args:   $command - current command name
 | 
						|
               $return  - command return ref.
 | 
						|
 | 
						|
=cut
 | 
						|
 | 
						|
#-------------------------------------------------------
 | 
						|
sub log_cmd_return
 | 
						|
{
 | 
						|
    my $command  = shift;
 | 
						|
    my $res      = shift;
 | 
						|
    my $callback = shift;
 | 
						|
    my $errmsg   = undef;
 | 
						|
 | 
						|
    if ($::RUNCMD_RC) {
 | 
						|
        $errmsg = "Command '$command' failed, " . join(',', @$res);
 | 
						|
    } elsif ($command eq 'nodeset') {  # Only check output for 'nodeset' command
 | 
						|
        foreach my $line (@$res) {
 | 
						|
            if (($line =~ /kernel cannot be found/) or ($line =~ /stop configuration/) or ($line =~ /failed to set up install resources/)) {
 | 
						|
                $errmsg = "Command '$command' failed, $line.";
 | 
						|
                last;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if ($errmsg)
 | 
						|
    {
 | 
						|
        $callback->({
 | 
						|
                error     => [$errmsg],
 | 
						|
                errorcode => [1]
 | 
						|
        });
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
1;
 |