mirror of
				https://github.com/xcat2/xcat-core.git
				synced 2025-10-31 19:32:31 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1580 lines
		
	
	
		
			63 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1580 lines
		
	
	
		
			63 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env perl
 | |
| # IBM(c) 2010 EPL license http://www.eclipse.org/legal/epl-v10.html
 | |
| #
 | |
| #############################################################################################################################################
 | |
| #
 | |
| #   This script will be used to run xCAT daily regression
 | |
| #
 | |
| #   Usage:xCATreg - Run xCAT daily regression
 | |
| #   xCATreg [-?|-h]
 | |
| #   xCATreg [-b branch][-m MN][-f configure file][-a][-V]
 | |
| #
 | |
| #   -?/-h:  help information for the xCATreg usage.
 | |
| #   -b: when -b is specified, the regression will be done against the specified branch. You can use 2.7, 2.8,master.The default value is master.
 | |
| #   -m: when -m is specified, the regression will be done the specified mn. The default value is all the mn in configuration file.
 | |
| #   -f :specify the configuration file,default value is /xCATreg/regresson.conf
 | |
| #   -a: when -a is specified, run the regression even there is no code updates
 | |
| #   -V: log and message in verbose mode
 | |
| #
 | |
| #   Example usage:
 | |
| #   ./xCATreg   Run regressoins on master branch and on all platforms in configuration file
 | |
| #   ./xCATreg -b 2.8 -m slesmn -f /root/regressoin.conf -a    Run regression on 2.8 branch on slesmn even when there is no code updates.
 | |
| #
 | |
| #############################################################################################################################################
 | |
| 
 | |
| $ENV{PATH} = "/opt/xcat/bin:/opt/xcat/sbin:/opt/xcat/share/xcat/tools:/usr/sbin:/usr/bin:/sbin:/bin"; 
 | |
| 
 | |
| use strict;
 | |
| use warnings;
 | |
| use Getopt::Long;
 | |
| use Data::Dumper;
 | |
| use Term::ANSIColor;
 | |
| use Time::Local;
 | |
| use IO::Select;
 | |
| 
 | |
| BEGIN
 | |
| {
 | |
|     $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr';
 | |
| }
 | |
| use lib "$::XCATROOT/lib/perl";
 | |
| 
 | |
| my $date;
 | |
| my $regrootdir="/home/autotest_code";
 | |
| my $mailtitle="PPC64LE Cluster";
 | |
| #my $regrootdir="/xCATreg";
 | |
| #my $mailtitle="X Cluster";
 | |
| my $logfiledir = "$regrootdir/log";
 | |
| my $logfile="";
 | |
| my $configfiledir = "$regrootdir/conf";
 | |
| my $configfile = "$regrootdir/conf/xCATreg.conf";
 | |
| my $xcatcoredowndir = "$regrootdir/xcatsource/xcat-core-build-down";
 | |
| my $xcatcoredir = "$regrootdir/xcatsource/xcat-core";
 | |
| my $xcatdepdir = "$regrootdir/xcatsource/xcat-dep";
 | |
| my $osisodir = "$regrootdir/iso";
 | |
| my $regresultdir = "$regrootdir/regresult";
 | |
| my $todayregresultdir="";
 | |
| my $maildir="$regrootdir/mail";
 | |
| my $mailfile="";
 | |
| my $rootdir = "$::XCATROOT/share/xcat/tools/autotest"; 
 | |
| my %confkeys; 
 | |
| my $mail_list = 0;
 | |
| my $needhelp  = 0;
 | |
| my $branch = "master";
 | |
| my $management_node = undef;
 | |
| #my $verbose_mode = 0;
 | |
| my $updates_regression = 0;
 | |
| my %mns;
 | |
| my %pidrecord;
 | |
| my %piderrrecord;
 | |
| my %consumptionrecord;
 | |
| my $commitinfofile="/tmp/commitinfo";
 | |
| my $gitupdateflag = 0;
 | |
| my $forceregwithoutupdate=0;
 | |
| my $depupdateflag = 0;
 | |
| 
 | |
| #######################################
 | |
| # runcmd
 | |
| #######################################
 | |
| sub runcmd {
 | |
|     my ($cmd) = @_;
 | |
|     my $rc = 0;
 | |
|     $::RUNCMD_RC = 0;
 | |
|     my $outref = [];
 | |
|     @$outref = `$cmd 2>&1`;
 | |
|     if ($?)
 | |
|     {
 | |
|         $rc = $? ;
 | |
|     $::RUNCMD_RC = $rc;
 | |
|     }
 | |
|     chomp(@$outref);
 | |
|     return @$outref;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # clean_outdated_file
 | |
| #######################################
 | |
| sub is5daysago{
 | |
|     my $targetdate= shift;
 | |
|     my $targetdatey="";
 | |
|     my $targetdatem="";
 | |
|     my $targetdated="";
 | |
|     my $datey="";
 | |
|     my $datem="";
 | |
|     my $dated="";
 | |
|     if($targetdate =~ /(\d{4})(\d{2})(\d{2})/){
 | |
|         $targetdatey=$1;
 | |
|         $targetdatem=$2-1;
 | |
|         $targetdated=$3;
 | |
|     }
 | |
|     if($date =~ /(\d{4})(\d{2})(\d{2})/){
 | |
|         $datey=$1;
 | |
|         $datem=$2-1;
 | |
|         $dated=$3;
 | |
|     }
 | |
|     my $todays=timelocal(0,0,0,$dated,$datem,$datey);
 | |
|     my $targets=timelocal(0,0,0,$targetdated,$targetdatem,$targetdatey);
 | |
|     if($todays - $targets > 432000){
 | |
|         return 1;
 | |
|     }
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # clean_outdated_file
 | |
| #######################################
 | |
| sub clean_outdated_file{
 | |
|     opendir(DIR, "$logfiledir");
 | |
|     foreach my $file (readdir DIR){
 | |
|         if($file =~ /xCATreg(\d+).log/){
 | |
|             my $res = is5daysago($1);
 | |
|             if($res){
 | |
|                 &runcmd("rm -f $logfiledir/$file");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     closedir(DIR);
 | |
| 	
 | |
|     opendir(DIR, "$maildir");
 | |
|     foreach my $file (readdir DIR){
 | |
|         if($file =~ /mailreport.(\d+)/){
 | |
|             my $res = is5daysago($1);
 | |
|             if($res){
 | |
|                 &runcmd("rm -f $maildir/$file");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     closedir(DIR);
 | |
| 
 | |
|     opendir(DIR, "$regresultdir");
 | |
|     foreach my $file (readdir DIR){
 | |
|         if($file =~ /(\d+)/){
 | |
|             my $res = is5daysago($1);
 | |
|             if($res){
 | |
|                 &runcmd("rm -rf $regresultdir/$file");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     closedir(DIR);
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # xCATreg_init
 | |
| #######################################
 | |
| sub xCATreg_init{
 | |
| 
 | |
|     #init important attributes
 | |
|     
 | |
|     $date = `date  +"%Y%m%d%H%M%S"`; 
 | |
|     chomp($date);
 | |
| 
 | |
|     &runcmd("mkdir -p $logfiledir") if(! -e $logfiledir);
 | |
|     &runcmd("mkdir -p $maildir") if(! -e $maildir);
 | |
|     &runcmd("mkdir -p $regresultdir") if(! -e $regresultdir);
 | |
|     &runcmd("mkdir -p $xcatcoredir") if(! -e $xcatcoredir);
 | |
| 	
 | |
|     $logfile="xCATreg".$date.".log";
 | |
|     $todayregresultdir=$regresultdir."/".$date;
 | |
|     &runcmd("mkdir -p $todayregresultdir");
 | |
|     $mailfile=$maildir."/mailreport.".$date;
 | |
| 	
 | |
| 	my $cnt=`ps aux|grep xCATreg |grep -v grep|awk '{print \$2}'|wc -l`;
 | |
| 	my $out=`ps aux|grep xCATreg |grep -v grep|awk '{print \$2}'`;
 | |
| 	for(my $i=1;$i<$cnt+1;$i++){
 | |
|         my $pid=`echo "$out"|sed -n ${i}p`;
 | |
| 		chomp($pid);
 | |
| 		next if($pid == $$);
 | |
| 		&runcmd("kill $pid");
 | |
| 	}
 | |
| 	
 | |
| 	clean_outdated_file();
 | |
| 	return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # usage for arguments
 | |
| #######################################
 | |
| sub usage{
 | |
|     print "Usage:xCATreg - Run xcat autotest  test cases.\n
 | |
|   Explanation for the options:
 | |
|     -b: when -b is specified, the regression will be done against the specified branch. The default value is master.\n
 | |
|     -m: when -m is specified, run regression on the specified mn. The default value is all the mn in configuration file.\n
 | |
|     -f: specify the configuration file location.\n
 | |
|     -a: when -a is specified, run the regression even there is no code updates.\n
 | |
|     -e: <email_addr> send the test result to email_addr\n\n";
 | |
|     print "  xCATreg [-?|-h]\n";
 | |
|     print "  xCATreg [-f configure file] [-b branch] [-m mangement node] [-e mail list] [-a] Even code not updates, there will be regression.\n";
 | |
|     print "  xCATreg [-f configure file] [-b branch] [-m mangement node] [-e mail list] if code updates there will be regression.\n";
 | |
|     print "\n";
 | |
|     return;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # send messages
 | |
| #######################################
 | |
| sub send_msg {
 | |
|     my $num = shift;
 | |
|     my $msg = shift;
 | |
|     my $content;
 | |
|     if ($num == 0) {
 | |
|         $content = "Fatal error:";
 | |
|     } elsif($num == 1) {
 | |
|         $content = "Warning:";
 | |
|     } elsif($num == 2) {
 | |
|         $content = "Notice:";
 | |
|     }
 | |
|     my $timestamp = `date +"%Y%m%d%H%M%S"`;
 | |
|     chomp($timestamp);
 | |
|     if ( !open (LOGFILE, ">> $logfiledir/$logfile") ) {
 | |
|        return 1;
 | |
|     }
 | |
|     print LOGFILE "$content $timestamp $$: $msg.\n";
 | |
|     close LOGFILE;
 | |
| }
 | |
| 
 | |
| 
 | |
| #######################################
 | |
| # read_conf
 | |
| #######################################
 | |
| sub read_conf{
 | |
|     my $myfile=undef;
 | |
| 	my $line=undef;
 | |
|    
 | |
| 	if (!open($myfile, "$configfile")) {
 | |
|         send_msg(0, "Open $configfile failed");
 | |
|         return 1;
 | |
|     }
 | |
|     while ($line = <$myfile>) {
 | |
| 	    $line =~ s/\s//g;
 | |
| 		next if($line =~ /^#/);
 | |
| 		next if($line eq "");
 | |
| 		my @attr=split(/=/,$line);  
 | |
|         $confkeys{$attr[0]} = $attr[1];
 | |
| 	}
 | |
| 	close($myfile); 
 | |
|     return 0;	
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # mn_install to install all mn
 | |
| #######################################
 | |
| sub mn_install {
 | |
|     my $mn=shift;
 | |
| 	
 | |
| 	&runcmd("lsdef|grep $confkeys{$mn}");
 | |
| 	if($?){
 | |
| 	    send_msg(0, "[$mn->$confkeys{$mn}][mn_install] Didn't defined $confkeys{$mn} in current control node");
 | |
| 	    return 1;
 | |
| 	}
 | |
| 
 | |
| 	my $os = $confkeys{$mn."os"};
 | |
| 	my $arch = "ppc64";
 | |
|         if($mn !~ /aix/ && $mn =~ /x/){
 | |
|             $arch="x86_64";
 | |
|         }elsif($mn !~ /aix/ && $mn =~ /LE/){
 | |
|             $arch="ppc64le";
 | |
|         } elsif($mn !~ /aix/ && $mn =~ /EL/){
 | |
|             $arch="ppc64el";
 | |
|         }
 | |
|     my $osimage="";
 | |
| 	
 | |
| 	if($mn !~ /aix/){
 | |
| 	    $osimage=$os."-".$arch."-install-compute";
 | |
| 	}else{
 | |
| 	    $osimage="aix";     #????????need to test for aix
 | |
| 	}
 | |
| 
 | |
| 	#print "[$mn] : os= $os arch=$arch osimage=$osimage\n";
 | |
| 	
 | |
| 	&runcmd("lsdef -t osimage|grep $osimage");
 | |
| 	if($?){
 | |
| 	    send_msg(0, "[$mn->$confkeys{$mn}][mn_install] Didn't defined $osimage in current control node");
 | |
| 	    return 1;
 | |
| 	}
 | |
| 	
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][mn_install] installing $osimage for node $confkeys{$mn}................");
 | |
|         
 | |
|         if( $arch =~ /x86_64/ || $arch =~ /ppc64le/ || $arch =~ /ppc64el/){
 | |
|             &runcmd("rmvm $confkeys{$mn} -f -p ");
 | |
|             &runcmd("chdef $confkeys{$mn} mac= ");
 | |
|             &runcmd("mkvm $confkeys{$mn} -s 40G");
 | |
|             }
 | |
| 
 | |
|         &runcmd("makedhcp -n");
 | |
|         &runcmd("makedns -n");
 | |
|         &runcmd("chdef $confkeys{$mn} status=");
 | |
|         if($?){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][mn_install] Failed to change MN status in current control node");
 | |
|             return 1;
 | |
|         }
 | |
| 
 | |
| 
 | |
| 	&runcmd("nodeset $confkeys{$mn} osimage=$osimage");
 | |
| 	if( $arch =~ /x86_64/ || $arch =~ /ppc64le/ || $arch =~ /ppc64el/){
 | |
| 		&runcmd("rpower $confkeys{$mn} boot");
 | |
| 	}else{
 | |
| 	    &runcmd("rnetboot $confkeys{$mn}");
 | |
| 	}
 | |
| 	
 | |
|          &runcmd("sleep 600");
 | |
|          &runcmd("a=0;while ! `lsdef -l $confkeys{$mn}|grep status|grep booted >/dev/null`; do sleep 30;((a++));if [ \$a -gt 100 ];then break;fi done");
 | |
| 
 | |
| #	if($mn !~ /ubuntu/){
 | |
| #	    &runcmd("sleep 300");
 | |
| #	    &runcmd("a=0;while ! `lsdef -l $confkeys{$mn}|grep status|grep booted >/dev/null`; do sleep 10;((a++));if [ \$a -gt 200 ];then break;fi done");}
 | |
| #	else{
 | |
| #	    &runcmd("sleep 1800");	
 | |
| #	}
 | |
| 	
 | |
| 	&runcmd("lsdef -l $confkeys{$mn}|grep status|grep booted >/dev/null");
 | |
| 	if($?){
 | |
|         send_msg(0, "[$mn->$confkeys{$mn}][mn_install] install $osimage for node $confkeys{$mn} failed");
 | |
|         return 1;
 | |
| 	}
 | |
|         
 | |
|         if($mn =~ /ubuntu/){
 | |
|             system("xdsh $confkeys{$mn} \"rm -rf /bin/sh\" >/dev/null 2>&1");
 | |
|             system("xdsh $confkeys{$mn} \"ln -s /bin/bash /bin/sh\"");
 | |
|         }
 | |
| #	if($mn =~ /ubuntu/){
 | |
| #	    system("updatenode $confkeys{$mn} -P \"confignics -s\" >/dev/null 2>&1");  
 | |
| #	    system("xdsh $confkeys{$mn} \"iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE\" >/dev/null 2>&1");   
 | |
| #		system("xdsh $confkeys{$mn} \"iptables -A FORWARD -i eth1 -j ACCEPT\" >/dev/null 2>&1");     
 | |
| #       system("xdsh $confkeys{$mn} \"iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT\" >/dev/null 2>&1");
 | |
| #	}
 | |
|        if($os =~ /rhels7/){
 | |
|        system("xdsh $confkeys{$mn} \"yum -y install bzip2 > /var/log/xcat/install_xcat.log 2>&1\" >/dev/null 2>&1");
 | |
|        system("xdsh $confkeys{$mn} \"yum -y install createrepo > /var/log/xcat/install_xcat.log 2>&1\" >/dev/null 2>&1");
 | |
|        }
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # down dep
 | |
| #######################################
 | |
| sub down_dep{
 | |
|     my $mn=shift;
 | |
|     send_msg(2, "[$mn->$confkeys{$mn}][down xcatdep] starting to down the latest xcat dep");
 | |
|     my $downxcatdepdir="$regrootdir/curl/$mn";
 | |
|     `mkdir -p $downxcatdepdir`;
 | |
|     my $curllink = $confkeys{$mn."curllink"};
 | |
|     my $deplink;
 | |
|     if (! -f "$downxcatdepdir/curlhtml1"){
 | |
|        send_msg(2, "it is first time to down xcatdep");
 | |
|        ` curl  "$curllink/"  |grep "xcat-dep-"  > "$downxcatdepdir/curlhtml1" `;
 | |
|        ` tail -1  "$downxcatdepdir/curlhtml1" >  "$downxcatdepdir/curlfile"`;
 | |
|        $deplink = `cat "$downxcatdepdir"/"curlfile" |awk '{print \$6}' |sed 's/"/ /g' |awk '{print \$2}'  `;    
 | |
|        `mkdir -p $xcatdepdir/$mn`;
 | |
|        ` wget  -P "$xcatdepdir/$mn" -c $curllink/$deplink `;
 | |
|           if($?){
 | |
|               send_msg(0, "download xcatdep failed");
 | |
|               return 1;
 | |
|            }
 | |
|        $depupdateflag=1;
 | |
|     }else{
 | |
|        `curl  "$curllink/"  |grep "xcat-dep-"  > "$downxcatdepdir/curlhtml2" `;
 | |
|        ` diff  "$downxcatdepdir"/"curlhtml1"  "$downxcatdepdir"/"curlhtml2"`;
 | |
|        if ($?==0) {
 | |
|           send_msg(2, "no update for  xcatdep ");
 | |
|           $depupdateflag=0;
 | |
|        }else{
 | |
|           ` tail -1  "$downxcatdepdir"/"curlhtml2"> "$downxcatdepdir"/"curlfile"`;
 | |
|           $deplink = `cat "$downxcatdepdir"/"curlfile" |awk '{print \$6}' |sed 's/"/ /g' |awk '{print \$2}'  `;
 | |
|           ` rm -rf  $xcatdepdir/$mn`;
 | |
|           `mkdir -p $xcatdepdir/$mn`;
 | |
|           ` wget  -P "$xcatdepdir/$mn" -c $curllink/$deplink `;
 | |
|           if($?){
 | |
|              send_msg(2, "download xcatdep failed");
 | |
|              return 1;
 | |
|           }
 | |
|    `mv  "$downxcatdepdir"/"curlhtml2"    "$downxcatdepdir"/"curlhtml1" -f `;
 | |
|     $depupdateflag=2;
 | |
|       }
 | |
|    }
 | |
|     return ($depupdateflag);
 | |
| }
 | |
| 
 | |
| #########################################
 | |
| # down xcat-core build
 | |
| ###########################################
 | |
| sub down_xcat_core_build {
 | |
|     my $mn=shift;
 | |
|     send_msg(2, "[$mn->$confkeys{$mn}][down xcatcore] starting to down the latest xcat core");
 | |
|     my $downxcatcoredowndir="$xcatcoredowndir/$mn";
 | |
|     if (! -f "$xcatcoredowndir/$mn"){
 | |
|     `mkdir -p $xcatcoredowndir/$mn`;
 | |
|     }
 | |
|     my $downxcatcoreip = $confkeys{$mn."downxcatcoreip"};
 | |
|     my $downxcatcoredir  = $confkeys{$mn."downxcatcoredir"};
 | |
|     my $latestxcatcoredir =  `ssh  $downxcatcoreip ls -rt $downxcatcoredir / |tail -1  |awk '{printf \$0}'`;
 | |
|     my $xcatcorename = $confkeys{$mn."xcatcorename"};
 | |
|     `scp -r $downxcatcoreip\:$downxcatcoredir/$latestxcatcoredir/$xcatcorename  $downxcatcoredowndir `;
 | |
|     if($? != 0){
 | |
|     send_msg(0,"[$mn->$confkeys{$mn}][down_xcat_core_build]  failed");
 | |
|     return 1;
 | |
|     }
 | |
|  }
 | |
| 
 | |
| #######################################
 | |
| # copy code
 | |
| #######################################
 | |
| sub copy_code {
 | |
|     my $mn=shift;
 | |
| 	
 | |
|     send_msg(2, "[$mn->$confkeys{$mn}][copy_code] starting to copy the latest xcat code and dep");
 | |
|     my $dnsserver=`cat /etc/hosts |grep $confkeys{$mn}|awk '{print \$1}'|head -n 1`;
 | |
|     chomp($dnsserver);
 | |
|     my $res = system("xdsh $confkeys{$mn} \"sed -i 's:nameserver .*:nameserver $dnsserver:g' /etc/resolv.conf\" >/dev/null 2>&1");
 | |
|     if($res != 0){
 | |
|         send_msg(0, "[$mn->$confkeys{$mn}][install_xcat] modify resolv.conf in $mn failed");
 | |
|         return 1;
 | |
|         }
 | |
| 
 | |
| 	#copy xcat-dep tarball to MN:/
 | |
| 	my $depball="";
 | |
| 	if($mn =~ /aix/){
 | |
| 	    $depball = `ls -l $xcatdepdir/$mn|awk '{print \$9}'|grep aix|tail -n 1`;
 | |
| 	}elsif($mn =~ /ubuntu/){
 | |
| 	    $depball = `ls -l $xcatdepdir/$mn|awk '{print \$9}'|grep ubuntu|tail -n 1`;
 | |
| 	}else{
 | |
| 	    $depball = `ls -l $xcatdepdir/$mn|awk '{print \$9}'|grep 'xcat-dep'|tail -n 1`;
 | |
| 	}
 | |
| 	chomp($depball);
 | |
|         print "depball is $depball\n";
 | |
|         my $coreball = `ls -l $xcatcoredowndir/$mn|awk '{print \$9}'|tail -n 1`;
 | |
|         chomp($coreball);
 | |
| 	if ($depball eq ""){
 | |
| 	    send_msg(0, "[$mn->$confkeys{$mn}][copy_code] can't find dep tarball for $mn under dir $xcatdepdir");
 | |
| 	    return 1;
 | |
| 	}
 | |
|         send_msg(2, "[$mn->$confkeys{$mn}][copy_code] find dep tarball $depball for $mn");
 | |
|         if ($coreball eq ""){
 | |
|              send_msg(0, "[$mn->$confkeys{$mn}][copy_code] can't find core tarball for $mn under dir $coreball");
 | |
|              return 1;
 | |
|         }
 | |
| 
 | |
|         send_msg(2, "[$mn->$confkeys{$mn}][copy_code] find core tarball $coreball for $mn");
 | |
| 
 | |
|     $res = system("scp $xcatdepdir/$mn/$depball root\@$confkeys{$mn}:/  >/dev/null");
 | |
|     if ($res){
 | |
|         send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy $depball to $mn failed");
 | |
|         return 1;
 | |
|     }
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy $depball to $mn successfully");
 | |
|     
 | |
|      $res = system("scp $xcatcoredowndir/$mn/$coreball root\@$confkeys{$mn}:/  >/dev/null");
 | |
|      if ($res){
 | |
|          send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy $coreball to $mn failed");
 | |
|          return 1;
 | |
|      }
 | |
|      send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy $coreball to $mn successfully");
 | |
| 	
 | |
| 	$res = system("xdsh $confkeys{$mn} 'cd / && tar xvf /$depball' >/dev/null 2>&1");
 | |
|     if ($?){
 | |
|         send_msg(0, "[$mn->$confkeys{$mn}][copy_code] untar $depball in $mn failed");
 | |
|         return 1;
 | |
|     }
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][copy_code] untar $depball in $mn successfully");
 | |
|     $res = system("xdsh $confkeys{$mn} 'cd / && tar xvf /$coreball' >/dev/null 2>&1");	
 | |
|     if ($?){
 | |
|         send_msg(0, "[$mn->$confkeys{$mn}][copy_code] untar $coreball in $mn failed");
 | |
|         return 1;
 | |
|     }
 | |
|         send_msg(2, "[$mn->$confkeys{$mn}][copy_code] untar $coreball in $mn successfully");
 | |
|  
 | |
|     #copy xcat-core source code to MN:/
 | |
| 	if($mn =~ /ubuntux/){
 | |
|         #defect 107 Automation ENV replaces the link file to real file before running xcat build
 | |
|         $res = system("xdsh $confkeys{$mn} 'mkdir -p /xcatbuild' && rsync -avz $xcatcoredir root\@$confkeys{$mn}:/xcatbuild/  >/dev/null"); 
 | |
| 	}else{
 | |
| 	#defect 107 Automation ENV replaces the link file to real file before running xcat build
 | |
|         $res = system("rsync -avz $xcatcoredir root\@$confkeys{$mn}:/  >/dev/null");
 | |
|         }
 | |
|     if ($res){
 | |
|         send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy the latest xcat code to $mn failed");
 | |
|         return 1;
 | |
|     }
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy the latest xcat code to $mn successfully");
 | |
| 
 | |
|     #copy /etc/hosts file to MN
 | |
| 	$res = system("scp /etc/hosts root\@$confkeys{$mn}:/etc  >/dev/null");
 | |
| 	if ($?){
 | |
|         send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy /etc/hosts to $mn failed");
 | |
|         return 1;
 | |
|     }
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy /etc/hosts  to $mn successfully");
 | |
| 
 | |
| 	my $os = $confkeys{$mn."os"};
 | |
| 	my $regconf=$mn.".conf";
 | |
| 	system("sed -i 's|os=\\S*|os=$os|g' $configfiledir/$regconf");
 | |
| 	
 | |
| 	my $arch = "ppc64";
 | |
| 	if($mn !~ /aix/ && $mn =~ /x/){
 | |
|             $arch="x86_64";
 | |
|         }elsif($mn !~ /aix/ && $mn =~ /LE/){
 | |
|             $arch="ppc64le";
 | |
|         }elsif($mn !~ /aix/ && $mn =~ /EL/){
 | |
|            $arch="ppc64el";
 | |
|         }
 | |
| 	my $iso;
 | |
| 	
 | |
| 	#copy specific files to MN for each platform
 | |
| 	if($mn =~ /rh/){
 | |
|         $res = system("scp /install/$os/$arch/RPM-GPG-KEY-redhat-release root\@$confkeys{$mn}:/  >/dev/null");
 | |
|         if ($?){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy RPM-GPG-KEY-redhat-release to $mn failed");
 | |
|             return 1;
 | |
|         }
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy RPM-GPG-KEY-redhat-release to $mn successfully");
 | |
| 		
 | |
| 		$os =~ /(\D+)(\d+\.\d+)/;
 | |
| 		$iso=`ls -l $osisodir|awk '{print \$9}'|grep RHEL`;
 | |
| 		chomp($iso);
 | |
| 		#print "[$mn->$confkeys{$mn}][copy_code] iso=$iso\n";
 | |
| 		if ($iso eq ""){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][copy_code] can't find iso for $os and $arch under dir $osisodir");
 | |
|             return 1;
 | |
| 		}
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][copy_code] find $iso for os=$os and arch=$arch");
 | |
| 
 | |
|         $res = system("scp $osisodir/$iso root\@$confkeys{$mn}:/  >/dev/null");
 | |
|         if ($?){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy ISO $iso to $mn failed");
 | |
|             return 1;
 | |
|         }
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy ISO $iso to $mn successfully");
 | |
| 		system ("sed -i 's|^ISO=/\\S*|ISO=/$iso|g' $configfiledir/$regconf");
 | |
| 	}
 | |
| 	
 | |
| 	if($mn =~ /sles/){
 | |
|         $os =~ /(\D+)(\d+)\.?(\d?)/;
 | |
|         if($3){
 | |
|             $iso=`ls -l $osisodir| awk '{print \$9}'|grep SLE|grep $arch |grep -- "-$2-SP$3-" |tail -n 1`;
 | |
|         }else{
 | |
|             $iso=`ls -l $osisodir| awk '{print \$9}'|grep SLE|grep $arch |grep -v "SP"|grep -- "-$2-"|tail -n 1`;
 | |
|         }
 | |
|         chomp($iso);
 | |
| 		#print "[$mn->$confkeys{$mn}][copy_code] iso=$iso\n";
 | |
|         if ($iso eq ""){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][copy_code] can't find ISO for os=$os and arch=$arch under dir $osisodir");
 | |
|             return 1;
 | |
| 		}
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][copy_code] find $iso for os=$os and arch=$arch");
 | |
| 		
 | |
|         $res = system("scp $osisodir/$iso root\@$confkeys{$mn}:/  >/dev/null");
 | |
|         if ($?){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy ISO $iso to $mn failed");
 | |
|             return 1;
 | |
|         }
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy ISO $iso to $mn successfully");	
 | |
|         system ("sed -i 's|^ISO=/\\S*|ISO=/$iso|g' $configfiledir/$regconf");	
 | |
| 
 | |
|         if($os =~ /sles11/){
 | |
|             $res = system("xdsh $confkeys{$mn}  \"mv /usr/lib/rpm/find-requires /usr/lib/rpm/find-requires.org\" && scp $osisodir/find-requires $confkeys{$mn}:/usr/lib/rpm/ > /dev/null");
 | |
|             if ($?){
 | |
|                 send_msg(0, "[$mn->$confkeys{$mn}][copy_code] For sles11, copy find-requires to $mn failed");
 | |
|                 return 1;
 | |
|             }
 | |
|             send_msg(2, "[$mn->$confkeys{$mn}][copy_code] For sles11, copy find-requires to $mn successfully");	
 | |
|         }		
 | |
| 	}
 | |
| 	if($mn =~ /ubuntu/){
 | |
|         $os =~ /(\D+)(\d+\.\d+\.?\d?)/;
 | |
| 		my $osversion = $2;
 | |
|         if ($mn =~ /ubuntux/){
 | |
|             $iso=`ls -l $osisodir| awk '{print \$9}'|grep ubuntu|grep amd64 |grep $osversion |tail -n 1`;
 | |
|         }elsif($mn =~ /ubuntuEL/){
 | |
|             $iso=`ls -l $osisodir| awk '{print \$9}'|grep ubuntu|grep ppc64el |grep $osversion |tail -n 1`;
 | |
| 		}
 | |
| 		chomp($iso);
 | |
| 		#print "[$mn->$confkeys{$mn}][copy_code] iso=$iso\n";
 | |
|         if ($iso eq ""){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][copy_code] can't find ISO for os=$os and arch=$arch under dir $osisodir");
 | |
|             return 1;
 | |
| 		}
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][copy_code] find $iso for os=$os and arch=$arch");
 | |
| 		
 | |
| 		$res = system("scp $osisodir/$iso root\@$confkeys{$mn}:/  >/dev/null");
 | |
|         if ($?){
 | |
|             send_msg(0, "[$mn->$confkeys{$mn}][copy_code] copy ISO $iso to $mn failed");
 | |
|             return 1;
 | |
|         }
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][copy_code] copy ISO $iso to $mn successfully");	
 | |
|         system ("sed -i 's|^ISO=/\\S*|ISO=/$iso|g' $configfiledir/$regconf");	
 | |
| 	}
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # config mn
 | |
| #######################################
 | |
| sub install_xcat {
 | |
|     my $mn = shift;
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][install_xcat] starting to install xcat in $confkeys{$mn}");
 | |
| 	
 | |
| 	my $os = $confkeys{$mn."os"};
 | |
| 	my $arch = "ppc64";
 | |
|         if($mn !~ /aix/ && $mn =~ /x/){
 | |
|             $arch="x86_64";
 | |
|         }elsif($mn !~ /aix/ && $mn =~ /LE/){
 | |
|             $arch="ppc64le";
 | |
|         }elsif($mn !~ /aix/ && $mn =~ /EL/){
 | |
|             $arch="ppc64el";
 | |
|         }
 | |
|         if($mn =~ /ubuntu/){
 | |
|             system("xdsh $confkeys{$mn} \"echo \"nameserver 9.0.2.1\" >> /etc/resolv.conf\" >/dev/null 2>&1");
 | |
|             system("xdsh $confkeys{$mn} 'apt-get -y install software-properties-common' >/dev/null 2>&1");
 | |
|                 if($mn =~ /ubuntux/){
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://archive.ubuntu.com/ubuntu \$(lsb_release -sc) main\"' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://archive.ubuntu.com/ubuntu \$(lsb_release -sc)-updates main\"' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://archive.ubuntu.com/ubuntu \$(lsb_release -sc) universe\"' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://archive.ubuntu.com/ubuntu \$(lsb_release -sc)-updates universe\"' >/dev/null 2>&1");
 | |
|                 }elsif($mn =~ /ubuntuEL/){
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://ports.ubuntu.com/ubuntu-ports \$(lsb_release -sc) main\"' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://ports.ubuntu.com/ubuntu-ports \$(lsb_release -sc)-updates main\"' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://ports.ubuntu.com/ubuntu-ports \$(lsb_release -sc) universe\"' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'add-apt-repository \"deb http://ports.ubuntu.com/ubuntu-ports \$(lsb_release -sc)-updates universe\"' >/dev/null 2>&1");
 | |
|                 }
 | |
| 
 | |
|                 system("xdsh $confkeys{$mn} \"wget -O - \"http://sourceforge.net/projects/xcat/files/ubuntu/apt.key/download\" | apt-key add -\" >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'apt-get clean all' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'apt-get update' >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} 'apt-get -y install build-essential dpkg-dev dh-make debhelper fakeroot gnupg lintian pbuilder quilt reprepro libsoap-lite-perl libdbi-perl' >/dev/null 2>&1");
 | |
|     }
 | |
| 	
 | |
| 	if($mn =~ /rh/){
 | |
|                 $os =~ /(\D+)(\d+)\.?(\d?)/;
 | |
|                 system("xdsh $confkeys{$mn} \"cd /xcat-core && ./mklocalrepo.sh\" >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} \"cd /xcat-dep/rh$2/$arch && ./mklocalrepo.sh\" >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} \"rpm --import /RPM-GPG-KEY-redhat-release\" >/dev/null 2>&1");
 | |
|                 system("xdsh $confkeys{$mn} \"yum -y install xCAT xCAT-test > /var/log/xcat/install_xcat.log 2>&1\" >/dev/null 2>&1");
 | |
|            if($os =~ /rhels7/){
 | |
|                 system("xdsh $confkeys{$mn} \"yum -y install mariadb-devel  mariadb-libs  mariadb-server mariadb-bench mariadb  perl-DBD-MySQL  mysql-connector-odbc unixODBC\" >/dev/null 2>&1");
 | |
|                 }elsif($os =~ /rhels6/){
 | |
| 		system("xdsh $confkeys{$mn} \"yum -y install mysql-server mysql mysql-bench mysql-devel mysql-connector-odbc\" >/dev/null 2>&1");
 | |
|                 }
 | |
|                 system("xdsh $confkeys{$mn} \"source /etc/profile.d/xcat.sh\" >/dev/null 2>&1");
 | |
| 		if($mn =~ /rhx/){
 | |
|                     system("xdsh $confkeys{$mn} \"yum install -y perl-Sys-Virt\" >/dev/null 2>&1");
 | |
| 		}
 | |
| 	}elsif($mn =~ /sles/){
 | |
| 	    $os =~ /(\D+)(\d+)\.?(\d?)/;
 | |
| 		system("xdsh $confkeys{$mn} \"zypper ar file:///xcat-dep/sles$2/$arch xCAT-dep\" >/dev/null 2>&1");  
 | |
|                 system("xdsh $confkeys{$mn} \"zypper ar file:///xcat-core xCAT-core\" >/dev/null 2>&1"); 
 | |
| 		system("xdsh $confkeys{$mn} \"zypper sl -U\" >/dev/null 2>&1"); 
 | |
| 		system("xdsh $confkeys{$mn} \"zypper --gpg-auto-import-keys search --match-exact -s screen\" >/dev/null 2>&1");   
 | |
| 		system("xdsh $confkeys{$mn} \"zypper -n install xCAT xCAT-test > /var/log/xcat/install_xcat.log 2>&1\" >/dev/null 2>&1"); 
 | |
| 		system("xdsh $confkeys{$mn} \"zypper -n install createrepo\" >/dev/null 2>&1"); 
 | |
| 		system("xdsh $confkeys{$mn} \"zypper -n install mysql-client libmysqlclient_r15  libqt4-sql-mysql libmysqlclient15 perl-DBD-mysql mysql unixODBC\" >/dev/null 2>&1"); 
 | |
| 		system("xdsh $confkeys{$mn} \"source /etc/profile.d/xcat.sh\" >/dev/null 2>&1");
 | |
| 	        if($mn =~ /slesLE/){
 | |
|                     system ("xdsh  $confkeys{$mn} \"zypper -n install perl-Net-DNS-0.80-1.ppc64le\">/dev/null 2>&1");
 | |
|                 }
 | |
|          	if($mn =~ /slesx/){
 | |
| 		    system("xdsh $confkeys{$mn} \"zypper -n install perl-Sys-Virt\" >/dev/null 2>&1");
 | |
| 		}
 | |
| 	}elsif($mn =~ /ubuntux/){
 | |
|         system("xdsh $confkeys{$mn} \"/xcat-core/mklocalrepo.sh\" >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} \"/xcat-dep/mklocalrepo.sh\" >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} 'apt-get clean all' >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} 'apt-get update' >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} 'apt-get -y install xcat xCAT-test  > /var/log/xcat/install_xcat.log 2>&1' >/dev/null 2>&1");
 | |
| 	}elsif($mn =~ /ubuntuEL/){
 | |
|         system("xdsh $confkeys{$mn} \"/xcat-core/mklocalrepo.sh\" >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} \"/xcat-dep/mklocalrepo.sh\" >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} 'apt-get clean all' >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} 'apt-get update' >/dev/null 2>&1");
 | |
|         system("xdsh $confkeys{$mn} 'apt-get -y install xcat xCAT-test  > /var/log/xcat/install_xcat.log 2>&1' >/dev/null 2>&1");
 | |
|         system("scp $osisodir/mini.iso  $confkeys{$mn}:/  ");        
 | |
|         }    
 | |
| 
 | |
| 	#check if MN is installed successful 
 | |
|         my $lsdefout = `xdsh $confkeys{$mn} '/opt/xcat/bin/lsdef -v'`;    
 | |
|         chomp($lsdefout);
 | |
| 	if($lsdefout !~ /lsdef - Version/ ){
 | |
| 	    send_msg(0, "[$mn->$confkeys{$mn}][install_xcat] install xcat in $mn failed");
 | |
| 	    return 1;
 | |
|     }
 | |
| 	
 | |
|     send_msg(2, "[$mn->$confkeys{$mn}][install_xcat] install xcat in $mn successfully");
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # do test
 | |
| #######################################
 | |
| sub do_test {
 | |
|     my $mn = shift;
 | |
|     my $os = $confkeys{$mn."os"};
 | |
|     my $casestop=1;
 | |
| 
 | |
|     send_msg(2, "[$mn->$confkeys{$mn}][do_test] starting to run regression test in $confkeys{$mn}");  
 | |
| 	
 | |
| 	my $regconf=$mn.".conf";
 | |
| 	my $res = system("scp $configfiledir/$regconf root\@$confkeys{$mn}:/opt/xcat/share/xcat/tools/autotest/default.conf  >/dev/null");
 | |
| 	if ($res != 0){
 | |
| 	    send_msg(0, "[$mn->$confkeys{$mn}][do_test] copy $configfiledir/$regconf to $mn failed");
 | |
| 	    return 1;
 | |
| 	}
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][do_test] copy $configfiledir/$regconf to $mn successfully");
 | |
|    if($os =~ /rhels7/){
 | |
|          system("scp  /opt/xcat/share/xcat/install/rh/service.rhels7.ppc64.otherpkgs.pkglist root\@$confkeys{$mn}:/opt/xcat/share/xcat/install/rh  >/dev/null");
 | |
|     }	
 | |
|         my $diskfull_installation_flat_testcase="";
 | |
| 	my $diskless_installation_flat_testcase="";
 | |
| 	my $statelite_installation_flat_testcase="";
 | |
| 	my $sn_installation_hierarchy_testcase="";
 | |
| 	my $diskfull_installation_hierarchy_testcase="";
 | |
| 	my $diskless_installation_hierarchy_testcase="";
 | |
| 	my $statelite_installation_hierarchy_by_ramdisk_testcase="";
 | |
|         my $statelite_installation_hierarchy_by_nfs_testcase="";
 | |
|         my $setup_dockerhost_testcase="";
 | |
| 	my $batbundle="";
 | |
| 	if((($mn =~ /sles/) || ($mn =~ /rh/)) && ($mn !~ /E/)){
 | |
|         $diskfull_installation_flat_testcase="reg_linux_diskfull_installation_flat";
 | |
|         $diskless_installation_flat_testcase="reg_linux_diskless_installation_flat";
 | |
|         $statelite_installation_flat_testcase="reg_linux_statelite_installation_flat";
 | |
|         $sn_installation_hierarchy_testcase="reg_linux_SN_installation_hierarchy";
 | |
|         $diskfull_installation_hierarchy_testcase="reg_linux_diskfull_installation_hierarchy";
 | |
|         $diskless_installation_hierarchy_testcase="reg_linux_diskless_installation_hierarchy";
 | |
|         $statelite_installation_hierarchy_by_ramdisk_testcase="reg_linux_statelite_installation_hierarchy_by_ramdisk";
 | |
|         $statelite_installation_hierarchy_by_nfs_testcase="reg_linux_statelite_installation_hierarchy_by_nfs";
 | |
| 		$batbundle="p_rhels_cmd.bundle" if($mn =~ /rhp/);
 | |
| 		$batbundle="x_rhels_cmd.bundle" if($mn =~ /rhx/);
 | |
| 		$batbundle="p_sles_cmd.bundle" if($mn =~ /slesp/);
 | |
| 		$batbundle="x_sles_cmd.bundle" if($mn =~ /slesx/);
 | |
|         }elsif($mn =~ /ubuntux/){
 | |
| 		$diskfull_installation_flat_testcase="Ubuntu_full_installation_flat_x86_vm";
 | |
| 		$diskless_installation_flat_testcase="Ubuntu_diskless_installation_flat_x86_vm";
 | |
|                 $setup_dockerhost_testcase="Full_installation_flat_docker";
 | |
| 		$batbundle="x_ubuntu_cmd.bundle";
 | |
|         }elsif($mn =~ /E/){
 | |
|                 $diskfull_installation_flat_testcase="Full_installation_flat_p8_le";
 | |
|                 $diskless_installation_flat_testcase="Diskless_installation_flat_p8_le";
 | |
|                 $batbundle="le_rhels_cmd.bundle" if($mn =~ /rhLE/);
 | |
|                 $batbundle="le_sles_cmd.bundle" if($mn =~ /slesLE/);
 | |
|                 $batbundle="le_ubuntu_cmd.bundle" if($mn =~ /ubuntuEL/);
 | |
|         }	
 | |
|         if(($mn !~ /ubuntu/) && ($mn !~ /E/)){
 | |
|             {
 | |
|                 my $rc;
 | |
| 
 | |
| 		#diskfull installation in flat mode test
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing diskfull installation test in flat mode in $mn.....");
 | |
| 		$rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $diskfull_installation_flat_testcase\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do diskfull installation test in flat mode in $mn.....[done]");
 | |
|                 last if($rc != 0);
 | |
| 
 | |
| 		#commands bundle in flat mode test
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing all commands test in flat mode in $mn.....");
 | |
|                 $rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -b $batbundle\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do all commands test in flat mode in $mn.....[done]");
 | |
|                 last if($rc != 0);
 | |
| 
 | |
| 		#diskless installation in flat mode test		
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing diskless installation test in flat mode in $mn.....");
 | |
| 		$rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $diskless_installation_flat_testcase\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do diskless installation test in flat mode in $mn.....[done]");	
 | |
|                 last if($rc != 0);
 | |
| 	
 | |
| 		#statelite installation in flat mode test
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing statelite installation test in flat mode in $mn.....");
 | |
| 		$rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $statelite_installation_flat_testcase\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do statelite installation test in flat mode in $mn.....[done]");
 | |
|                 last if($rc != 0);
 | |
| 
 | |
| 		#deploy SN
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] setting up mysql for installing SN in $mn.....");
 | |
|                 $res = system("ssh -t $confkeys{$mn} 'exec bash -l -i -c \"XCATMYSQLADMIN_PW=12345 XCATMYSQLROOT_PW=12345 /opt/xcat/bin/mysqlsetup -i\"' >/dev/null 2>&1");
 | |
| 		if ($res != 0){
 | |
| 			send_msg(0, "[$mn->$confkeys{$mn}][do_test] set up mysql for installing SN in $mn failed");
 | |
| 			return 1;
 | |
| 		}
 | |
| 		$res =  system ("xdsh $confkeys{$mn} \"echo \\\"GRANT ALL on xcatdb.* TO xcatadmin@\'%\'  IDENTIFIED BY \'12345\'\;\\\" | mysql -u root -p12345\" >/dev/null 2>&1");
 | |
| 		if ($res != 0){
 | |
| 			send_msg(0, "[$mn->$confkeys{$mn}][do_test] grant right to mysql for installing SN in $mn failed");
 | |
| 			return 1;
 | |
| 		}
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] set up mysql for installing SN in $mn.....[done]");
 | |
| 		
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] preparing xcat ball for installing SN in $mn.....");
 | |
| 		my $os = $confkeys{$mn."os"};
 | |
| 		my $arch = "ppc64";
 | |
| 	        if(($mn !~ /aix/) && ($mn =~ /x/)){
 | |
|                     $arch="x86_64";
 | |
|                 }elsif($mn !~ /aix/ && $mn =~ /LE/){
 | |
|                     $arch="ppc64le";
 | |
|                 }elsif($mn !~ /aix/ && $mn =~ /EL/){
 | |
|                     $arch="ppc64el";
 | |
|                 }
 | |
| 		my $xcatballpath = "/install/post/otherpkgs/$os/$arch/xcat";
 | |
|                 $res = system("xdsh $confkeys{$mn} \"mkdir -p $xcatballpath/xcat-core && cp -r /xcat-core/* $xcatballpath/xcat-core && cp -r /xcat-dep $xcatballpath\"");		
 | |
|                 if ($res != 0){
 | |
| 			send_msg(0, "[$mn->$confkeys{$mn}][do_test] prepare xcat ball for installing SN in $mn failed");
 | |
| 			return 1;
 | |
| 		}
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] prepare xcat ball for installing SN in $mn.....[done]");
 | |
| 		
 | |
| 		if($mn =~ /rhp/){
 | |
| 		    my $ping_sn_on_rhp_pid = fork();
 | |
| 		    if( !defined($ping_sn_on_rhp_pid)){
 | |
| 		        send_msg(0, "fork process for trigger random number generator on redhat+ppc environment to install SN error");
 | |
| 		        exit;
 | |
| 		    }elsif($ping_sn_on_rhp_pid ==0){
 | |
| 		        send_msg(2, "....fork 1 process[pid=$$] for trigger random number generator on redhat+ppc environment to install SN..........");
 | |
| 		        my $snnodename = `cat $configfiledir/$regconf |grep SN|grep =|awk -F'=' '{print \$2}'`;
 | |
| 		        chomp($snnodename);
 | |
| 		        &runcmd("sleep 900");
 | |
| 		        my $timecnt=0;
 | |
| 		        while($timecnt < 180){
 | |
| 		            my $booted = system("xdsh $confkeys{$mn} \"lsdef -l $snnodename|grep status|grep booted\"");
 | |
| 		            last if($booted==0);
 | |
| 					
 | |
| 		            my $booting = system("xdsh $confkeys{$mn} \"lsdef -l $snnodename|grep status|grep booting\"");
 | |
| 		            system("xdsh $confkeys{$mn} \"xdsh $snnodename \"echo 1\"\"")  if($booting==0);
 | |
| 		
 | |
| 		            &runcmd("sleep 10");
 | |
| 		            $timecnt++;
 | |
| 			    }
 | |
| 			    send_msg(2, "....process[pid=$$] for trigger random number generator on redhat+ppc environment to install SN....[exit]");
 | |
| 			    exit 0;
 | |
| 		    }
 | |
| 		}
 | |
| 		
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] installing SN.....");
 | |
| 		$rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $sn_installation_hierarchy_testcase\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] install SN.....[done]");
 | |
|                 last if($rc != 0);
 | |
| 		
 | |
| 		#diskfull installation in hierarchy mode test
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing diskfull installation test in hierarchy mode in $mn.....");
 | |
| 		$rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $diskfull_installation_hierarchy_testcase\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do diskfull installation test in hierarchy mode in $mn.....[done]");
 | |
|                 last if($rc != 0);
 | |
| 
 | |
| 		#diskless installation in hierarchy mode test
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing diskless installation test in hierarchy mode in $mn.....");
 | |
| 		$rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $diskless_installation_hierarchy_testcase\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do diskless installation test in hierarchy mode in $mn.....[done]");
 | |
|                 last if($rc != 0);
 | |
| 
 | |
| 		#statelite installation by ramdisk in hierarchy mode test
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing statelite installation by ramdisk test in hierarchy mode in $mn.....");
 | |
| 		$rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $statelite_installation_hierarchy_by_ramdisk_testcase\" >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do statelite installation by ramdisk test in hierarchy mode in $mn.....[done]");	
 | |
|                 last if($rc != 0);
 | |
| 
 | |
|                 #statelite installation by nfs in hierarchy mode test
 | |
|                 send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing statelite installation by nfs test in hierarchy mode in $mn.....");
 | |
|                 $rc=system("xdsh $confkeys{$mn} \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $statelite_installation_hierarchy_by_nfs_testcase\" >/dev/null 2>&1");
 | |
|                 send_msg(2, "[$mn->$confkeys{$mn}][do_test] do statelite installation by nfs test in hierarchy mode in $mn.....[done]"); 
 | |
|                 last if($rc != 0);
 | |
| 
 | |
|                 $casestop=0;
 | |
|         }		
 | |
|     }else{
 | |
|         {
 | |
|                 my $rc=0;
 | |
| 
 | |
| 		#diskless installation in flat mode test		
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing diskless installation test in flat mode in $mn.....");
 | |
| 		$rc=system("ssh -t $confkeys{$mn} 'exec bash -l -i -c \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $diskless_installation_flat_testcase\"' >/dev/null 2>&1");
 | |
| 		send_msg(2, "[$mn->$confkeys{$mn}][do_test] do diskless installation test in flat mode in $mn.....[done]");
 | |
|                 last if($rc != 0);
 | |
| 
 | |
|                 #diskfull installation in flat mode test
 | |
|                 send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing diskfull installation test in flat mode in $mn.....");
 | |
|                 $rc=system("ssh -t $confkeys{$mn} 'exec bash -l -i -c \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $diskfull_installation_flat_testcase\"' >/dev/null 2>&1");
 | |
|                 send_msg(2, "[$mn->$confkeys{$mn}][do_test] do diskfull installation test in flat mode in $mn.....[done]");
 | |
|                 last if($rc != 0);
 | |
|                 
 | |
|                 if($mn =~ /ubuntux/){
 | |
|                     #set up dockerhosts
 | |
|                     send_msg(2, "[$mn->$confkeys{$mn}][do_test] setupdockerhost $mn.....");
 | |
|                     $rc=system("ssh -t $confkeys{$mn} 'exec bash -l -i -c \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -t $setup_dockerhost_testcase\"' >/dev/null 2>&1");
 | |
|                     send_msg(2, "[$mn->$confkeys{$mn}][do_test] setup dockerhosts $mn.....[done]");
 | |
|                     last if($rc != 0);
 | |
|                     }
 | |
| 	
 | |
|                 #commands bundle in flat mode test
 | |
|                 send_msg(2, "[$mn->$confkeys{$mn}][do_test] doing all commands test in flat mode in $mn.....");
 | |
|                 $rc=system("ssh -t $confkeys{$mn} 'exec bash -l -i -c \"xcattest -f /opt/xcat/share/xcat/tools/autotest/default.conf  -b $batbundle\"' >/dev/null 2>&1");
 | |
|                 send_msg(2, "[$mn->$confkeys{$mn}][do_test] do all commands test in flat mode in $mn.....[done]");
 | |
|                 $casestop=0;
 | |
| 	}
 | |
|     }
 | |
| 
 | |
|     if($casestop){
 | |
|         send_msg(2, "[$mn->$confkeys{$mn}][do_test] the regression job in $mn was broken by one case.");
 | |
|     }else{
 | |
|         send_msg(2, "[$mn->$confkeys{$mn}][do_test] run the whole regression test in $mn finished");
 | |
|     }
 | |
| 	
 | |
|     send_msg(2, "[$mn->$confkeys{$mn}][install_xcat] run regression test in $mn finished");
 | |
| 	
 | |
| 	$res = system("scp -r $confkeys{$mn}:/opt/xcat/share/xcat/tools/autotest/result/* $todayregresultdir/$mn/ >/dev/null 2>&1");
 | |
| 	if ($res != 0){
 | |
| 	    send_msg(0, "[$mn->$confkeys{$mn}][do_test] copy regression result to $todayregresultdir/$mn/ failed");
 | |
| 	    return 1;
 | |
| 	}
 | |
| 	send_msg(2, "[$mn->$confkeys{$mn}][do_test] copy regression result to $todayregresultdir/$mn/ successfully");
 | |
| 
 | |
|     return 0;
 | |
| 
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # creat report
 | |
| #######################################
 | |
| sub creat_report{
 | |
| 
 | |
|     my $mailreport .= "======================================\n";
 | |
|     $mailreport .= "       Regression Result Summary\n";
 | |
|     $mailreport .= "======================================\n\n";
 | |
| 	# $gitupdateflag = 0 git update out of time
 | |
| 	# $gitupdateflag = 1 there isn't new code checkin in last one day
 | |
| 	# $gitupdateflag = 2 git update failed
 | |
| 	if($gitupdateflag==0){
 | |
| 	    $mailreport .= "Get the latest xcat code from git out of time, stop regression test today!!!\n\n\n";
 | |
| 		&runcmd("touch $mailfile && echo \"$mailreport\" > $mailfile");
 | |
| 		&runcmd("mv $commitinfofile $commitinfofile.old && echo \"\" > $commitinfofile");  		
 | |
| 		return 0;
 | |
| 	}elsif($gitupdateflag==1 && ! $forceregwithoutupdate){
 | |
| 	    $mailreport .= "There isn't new code checkin last one day, stop regression test today!!!\n\n\n";
 | |
| 		&runcmd("touch $mailfile && echo \"$mailreport\" > $mailfile"); 
 | |
| 		&runcmd("mv $commitinfofile $commitinfofile.old && echo \"\" > $commitinfofile");  
 | |
| 		return 0;
 | |
| 	}elsif($gitupdateflag==1 && $forceregwithoutupdate){
 | |
| 	    $mailreport .= "There isn't new code checkin last one day, But force to run regresson today!!!\n\n\n";
 | |
| 		&runcmd("mv $commitinfofile $commitinfofile.old && echo \"\" > $commitinfofile");  
 | |
| 	}elsif($gitupdateflag==2){
 | |
| 	    $mailreport .= "Get the latest xcat source code from git error, stop regression test today!!!\n\n\n";
 | |
| 		&runcmd("touch $mailfile && echo \"$mailreport\" > $mailfile"); 
 | |
| 		&runcmd("mv $commitinfofile $commitinfofile.old && echo \"\" > $commitinfofile");   
 | |
| 		return 0;	
 | |
| 	}
 | |
|  
 | |
|     while(my($k,$v) = each %pidrecord){
 | |
|         my $scenario="[".$confkeys{$k."os"};
 | |
|         if($k=~/p/){
 | |
|             $scenario.="+PPC64] ";
 | |
|             }elsif($k=~ /E/){
 | |
|             $scenario.="+PPC64LE] ";
 | |
|             }elsif($k=~/x/){
 | |
|             $scenario.="+x86_64] ";
 | |
|             }
 | |
|         $mailreport .= "$scenario\n";
 | |
|         my $batbundle="";
 | |
|         my $totalcase=0;
 | |
| 
 | |
|  if($k=~ /slesp/ || $k =~ /rhx/ || $k=~ /slesx/ || $k =~ /rhp/){
 | |
|                 $batbundle="$xcatcoredir/xCAT-test/autotest/bundle/p_rhels_cmd.bundle" if($k =~ /rhp/);
 | |
|                 $batbundle="$xcatcoredir/xCAT-test/autotest/bundle/x_rhels_cmd.bundle" if($k =~ /rhx/);
 | |
|                 $batbundle="$xcatcoredir/xCAT-test/autotest/bundle/p_sles_cmd.bundle" if($k =~ /slesp/);
 | |
|                 $batbundle="$xcatcoredir/xCAT-test/autotest/bundle/x_sles_cmd.bundle" if($k =~ /slesx/);
 | |
|                 $totalcase=`cat $batbundle|wc -l`;
 | |
|                 $totalcase+=8;
 | |
|                 }elsif($k =~ /ubuntux/){
 | |
|                 $batbundle="/$xcatcoredir/xCAT-test/autotest/bundle/x_ubuntu_cmd.bundle";
 | |
|                 $totalcase=`cat $batbundle|wc -l`;
 | |
|                 $totalcase+=3;
 | |
|                 }elsif($k =~ /E/){
 | |
|                 $batbundle="$xcatcoredir/xCAT-test/autotest/bundle/le_rhels_cmd.bundle" if($k =~ /rhLE/);
 | |
|                 $batbundle="$xcatcoredir/xCAT-test/autotest/bundle/le_sles_cmd.bundle" if($k =~ /slesLE/);
 | |
|                 $batbundle="$xcatcoredir/xCAT-test/autotest/bundle/le_ubuntu_cmd.bundle" if($k =~ /ubuntuEL/);
 | |
|                 $totalcase=`cat $batbundle|wc -l`;
 | |
|                 $totalcase+=2;
 | |
|                 }
 | |
| 
 | |
| 
 | |
|         if ($v == 0){ # whole regression test finished 
 | |
|             my $h=int($consumptionrecord{$k}/3600);
 | |
| 			my $m=int(($consumptionrecord{$k} - $h*3600)/60);
 | |
| 			my $s=($consumptionrecord{$k} - $h*3600)%60;
 | |
| 			my $consumption="$h hours $m minutes $s seconds";
 | |
| 			$mailreport .= "\tTime consumption: $consumption\n";
 | |
| 			
 | |
| 			if($piderrrecord{$k} ne ""){
 | |
| 			    $mailreport .= "\tDeploy MN result: $piderrrecord{$k}\n";
 | |
|                             $mailreport .= "\tTotalCase $totalcase TotalRun 0 Failed 0\n";
 | |
| 			    next;
 | |
| 			}
 | |
| 		
 | |
| 			my $totalcnt=0;
 | |
| 			my $failcnt=0;
 | |
| 			my $faillist="";
 | |
| 			opendir(DIR, "$todayregresultdir/$k");
 | |
| 			foreach my $file (readdir DIR)
 | |
| 			{
 | |
| 			    next if($file !~ /xcattest.log/);
 | |
| 			    my $cnt = `cat $todayregresultdir/$k/$file |grep -- "------END::"|wc -l`;
 | |
| 				$totalcnt+=int($cnt);
 | |
| 			    for(my $i=1;$i<$cnt+1;$i++){
 | |
| 			        my $line=`cat $todayregresultdir/$k/$file |grep -- "------END::"|sed -n ${i}p`;
 | |
| 					chomp($line);
 | |
| 					if($line =~ /------END::([a-zA-Z0-9_-]+)::([a-zA-Z0-9_-]+)::Time.+/){
 | |
| 					    my $failedcase=$1;
 | |
| 					    if($2 =~ /Failed/){
 | |
| 					        $failcnt++;
 | |
| 							$faillist.=$failedcase.", ";
 | |
| 						}
 | |
| 					}
 | |
| 			    }
 | |
| 			}
 | |
| 
 | |
| 			closedir(DIR);
 | |
| 
 | |
|                         my $lastfile = `ls -lrt $todayregresultdir/$k|grep "xcattest.log"|tail -1|awk '{print \$9}'`;
 | |
|                         chomp($lastfile);
 | |
|                         my $lastline=`cat $todayregresultdir/$k/$lastfile |grep -- "------END::"|tail -1`;
 | |
|                         chomp($lastline);
 | |
|                         my $lastcase;
 | |
|                         $lastcase=$1 if($lastline =~ /------END::([a-zA-Z0-9_-]+)::([a-zA-Z0-9_-]+)::Time.+/);
 | |
| 
 | |
|                         $mailreport .= "\tTotalCase $totalcase TotalRun $totalcnt Failed $failcnt\n\tFailed cases: $faillist\n\tFinal environment stop at $lastcase\n";
 | |
| 		}else{ # regression test out of time
 | |
| 			$mailreport .= "\tTime consumption: Out of 9 hours!!!!!!\n";
 | |
| 		}
 | |
|     }
 | |
| 	
 | |
|     &runcmd("touch $mailfile && echo \"$mailreport\" > $mailfile"); 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # send email
 | |
| #######################################
 | |
| sub send_email{
 | |
| 	my $checkinlist="";
 | |
| 	my $cnt =`cat  $commitinfofile |grep '20[0-9][0-9] [-+]0[0-9]00'|awk '{print \$1}' |grep -v root|sort | uniq|wc -l`;
 | |
| 	my $out =`cat  $commitinfofile |grep '20[0-9][0-9] [-+]0[0-9]00'|awk '{print \$1}' |grep -v root|sort | uniq`;
 | |
| 	for(my $i=1;$i<$cnt+1;$i++){
 | |
|         my $tmpline=`echo "$out"|sed -n ${i}p`;
 | |
| 		chomp($tmpline);
 | |
| 		$checkinlist.= "$tmpline ";
 | |
| 	}
 | |
| 	
 | |
| 	my $totalcnt=0;
 | |
| 	my $failcnt=0;
 | |
|         my $totalcase=0;   
 | |
| $cnt =`cat  $mailfile |grep "Total"|grep "Failed"|wc -l`;
 | |
| 	$out =`cat  $mailfile |grep "Total"|grep "Failed"`;
 | |
| 	for(my $i=1;$i<$cnt+1;$i++){
 | |
|         my $tmpline=`echo "$out"|sed -n ${i}p`;
 | |
| 		chomp($tmpline);
 | |
| 		if($tmpline =~ /TotalCase (\d+) TotalRun (\d+) Failed (\d+)/){
 | |
|                    $totalcase+=$1;
 | |
| 		    $totalcnt+=$2;
 | |
| 			$failcnt+=$3;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	# $gitupdateflag = 0 git update out of time
 | |
| 	# $gitupdateflag = 1 there isn't new code checkin in last one day
 | |
| 	# $gitupdateflag = 2 git update failed
 | |
|         $depupdateflag = `cat $logfiledir/$logfile |grep "updated for xcat dep" `;
 | |
| 	my $subject="";
 | |
| 	if($gitupdateflag==0 || $gitupdateflag==2){
 | |
| 	    $subject = "[$mailtitle] Git update failed, stop regression test today!!!";
 | |
| 	}elsif($gitupdateflag==1 && ! $forceregwithoutupdate){
 | |
| 	    $subject = "[$mailtitle] No code checkin, stop regression test today!!!";
 | |
| 	}elsif($gitupdateflag==1 && $forceregwithoutupdate){
 | |
|             `cat $logfiledir/$logfile |grep "updated for xcat dep" `;
 | |
|             if($?==0){
 | |
|                $subject = "[$mailtitle] TotalCase:".$totalcase.", TotalRun:".$totalcnt.", Fail:".$failcnt.", Branch:".$branch.", xcatdep updated, Checkin: NO ONE !!";
 | |
|              }else{
 | |
|                 $subject = "[$mailtitle] TotalCase:".$totalcase.", TotalRun:".$totalcnt.", Fail:".$failcnt.", Branch:".$branch.", xcatdep no updated, Checkin: NO ONE !!";
 | |
|                }
 | |
|          }else{
 | |
|             `cat $logfiledir/$logfile |grep "updated for xcat dep" `;
 | |
|             if($?==0){
 | |
|                $subject = "[$mailtitle] TotalCase:".$totalcase.", TotalRun:".$totalcnt.", Fail:".$failcnt.", Branch:".$branch.", xcatdep updated, Checkin: ".$checkinlist;
 | |
|             }else{
 | |
|                $subject = "[$mailtitle] TotalCase:".$totalcase.", TotalRun:".$totalcnt.", Fail:".$failcnt.", Branch:".$branch.", xcatdep no updated, Checkin: ".$checkinlist;
 | |
|              }
 | |
|           }
 | |
|     my $mailreport .= "\n\n======================================\n";
 | |
|     $mailreport .= "       Commit Codes Last Day\n";
 | |
|     $mailreport .= "======================================\n\n";
 | |
| 	
 | |
| 	&runcmd("echo \"$mailreport\">> $mailfile");
 | |
|     &runcmd("cat $commitinfofile >> $mailfile");  	
 | |
| 	
 | |
| 	my $attachfile="/tmp/failed_case_detail.txt";
 | |
| 	&runcmd("echo \"\" > $attachfile");
 | |
| 	if($failcnt > 0){
 | |
|         opendir(DIR, "$todayregresultdir");
 | |
|         foreach my $subdir (readdir DIR){
 | |
|             next  if($subdir =~ /^\./);
 | |
|             #print "subdir-> $subdir\n";
 | |
| 			
 | |
| 			my $scenario="[".$confkeys{$subdir."os"};
 | |
| 			if($subdir =~ /p/){
 | |
|                             $scenario.="+PPC64] ";
 | |
|                             }elsif($subdir =~ /x/){
 | |
|                             $scenario.="+x86_64] ";
 | |
|                             }elsif($subdir =~ /E/){
 | |
|                             $scenario.="+ppc64le] ";
 | |
|                          }
 | |
| 
 | |
|             my $separator .= "\n###############################################################\n";
 | |
|             $separator .= "                    $scenario\n";
 | |
|             $separator .= "###############################################################\n\n";
 | |
| 			&runcmd("echo \"$separator\" >> $attachfile");
 | |
|             opendir(SUBDIR, "$todayregresultdir/$subdir");
 | |
|             foreach my $file (readdir SUBDIR){
 | |
|                 next if($file !~ /^failedcases/);
 | |
|                 next if(-z "$todayregresultdir/$subdir/$file");
 | |
|                 #print "\t$file\n";
 | |
|                 system("cat $todayregresultdir/$subdir/$file >> $attachfile");
 | |
|             }
 | |
|         }
 | |
| 	}
 | |
| 	
 | |
| 	if($mail_list){
 | |
| 	    if($failcnt > 0){
 | |
| 	        system("cat $mailfile"." | /bin/mail -s \"$subject\" -a $attachfile \"$mail_list\"");
 | |
| 		}else{
 | |
| 	        system("cat $mailfile"." | /bin/mail -s \"$subject\" \"$mail_list\"");		
 | |
| 		}
 | |
| 	}else{
 | |
| 	    if($failcnt > 0){
 | |
|             system("cat $mailfile"." | /bin/mail -s \"$subject\" -a $attachfile \"$confkeys{mailgroup}\"");
 | |
| 	    }else{
 | |
|             system("cat $mailfile"." | /bin/mail -s \"$subject\" \"$confkeys{mailgroup}\"");
 | |
| 		}
 | |
| 	}
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| #######################################
 | |
| #git update
 | |
| #return value:
 | |
| #0 successful
 | |
| #1 code is already at latest version
 | |
| #2 someting error
 | |
| #######################################
 | |
| sub git_update{
 | |
| 	send_msg(2, "[git update] starting to update xcat source code from git"); 
 | |
| 	
 | |
|     my $res = system("cd $xcatcoredir && git checkout $branch > /dev/nul 2>&1");
 | |
|     if ($res != 0){
 | |
|         send_msg(0, "[git update] change to branch $branch....[failed]");
 | |
|         return 2;
 | |
|     }
 | |
|     send_msg(2, "[git update] change to branch $branch....[ok]");
 | |
| 	
 | |
| 	my $gitpulloutput = "/tmp/gitpulloutput";
 | |
| 	my $trytime=1;
 | |
|     while($trytime < 4){	
 | |
|         $res = system("cd $xcatcoredir && git pull > $gitpulloutput 2>&1");
 | |
|         if ($res != 0){
 | |
|             send_msg(0, "[git update] pull the latest code to control node....[$trytime failed]");
 | |
| 			$trytime++;
 | |
|             &runcmd("sleep 120");  	
 | |
|         }else{
 | |
| 		    last;
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	if($trytime == 4){
 | |
|         send_msg(0, "[git update] pull the latest code to control node....[finally failed]");
 | |
|         return 2;		
 | |
| 	}
 | |
| 	
 | |
|     $res = system("grep 'Already up-to-date' $gitpulloutput > /dev/nul 2>&1");
 | |
|     if ($res == 0 && ! $forceregwithoutupdate) {
 | |
|         send_msg(2, "[git update] code is already at latest version. exit regresson");
 | |
|         return 1;
 | |
|     }elsif($res == 0 && $forceregwithoutupdate){
 | |
|         send_msg(2, "[git update] code is already at latest version. But force to run regresson");
 | |
|         return 0;
 | |
| 	}
 | |
| 	send_msg(2, "[git update] pull the latest code to control node....[ok]");
 | |
| 	
 | |
|     my $lastcommitfile="/tmp/lastcommitfile";
 | |
| 	my $lastcommitinfo;
 | |
| 	if (-f $lastcommitfile){
 | |
|         $lastcommitinfo = `cat $lastcommitfile`;
 | |
| 		chomp($lastcommitinfo);
 | |
|     }else{
 | |
| 	    $lastcommitinfo = "";
 | |
| 	}
 | |
| 	#print "lastcommitinfo=$lastcommitinfo\n";
 | |
| 	
 | |
| 	if($lastcommitinfo eq ""){
 | |
|         $res = system("cd $xcatcoredir && git log --since=\"1 days ago\"  --pretty=format:\"%cn %ad %s\" --name-status > $commitinfofile");
 | |
|         if ($res != 0  || (-f $commitinfofile and -z _)){
 | |
|             send_msg(0, "[git update] get commit information....[failed]");
 | |
|             return 2;
 | |
|         }
 | |
|         send_msg(0, "[git update] get commit information....[ok]");
 | |
| 	}else{
 | |
|         $res = system("cd $xcatcoredir && git log $lastcommitinfo..HEAD  --pretty=format:\"%cn %ad %s\" --name-status > $commitinfofile");
 | |
|         if ($res != 0 || (-f $commitinfofile and -z _)){
 | |
|             send_msg(0, "[git update] get commit information....[failed]");
 | |
|             return 2;
 | |
|         }
 | |
|         send_msg(2, "[git update] get commit information....[ok]");
 | |
| 	}
 | |
| 	
 | |
| 	$res = system("cd $xcatcoredir && git log -n 1|awk 'NR==1'|awk '{print \$2}' > $lastcommitfile");
 | |
|     if ($res != 0){
 | |
|         send_msg(0, "[git update] get latest commit number failed");
 | |
|         exit;
 | |
|     }
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #######################################
 | |
| # step 0. Parse input arguments
 | |
| #######################################
 | |
| send_msg(2, "step 1, Parse input arguments............");
 | |
| =pod
 | |
| if (
 | |
|     !GetOptions("--help|h|?" => \$needhelp,
 | |
|                 "f=s" => \$configfile,
 | |
|                 "b=s" => \$branch,
 | |
|                 "m=s" => \$management_node,
 | |
|                 "V"   => \$verbose_mode,
 | |
|                 "U"   => \$updates_regression,
 | |
|                 "e=s" => \$send_msg)
 | |
|  )
 | |
| =cut
 | |
| if (
 | |
|     !GetOptions("--help|h|?" => \$needhelp,
 | |
|                 "f=s" => \$configfile,
 | |
|                 "b=s" => \$branch,
 | |
|                 "m=s" => \$management_node,
 | |
| 				"a"   => \$forceregwithoutupdate,
 | |
|                 "e=s" => \$mail_list)
 | |
| )
 | |
| {
 | |
|     &usage;
 | |
|     send_msg(0, "step 0, PARSE ARGUMENTS returns error, exit");
 | |
|     exit;
 | |
| }
 | |
| if ($needhelp)
 | |
| {
 | |
|     &usage;
 | |
|     exit 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| xCATreg_init();
 | |
| 
 | |
| ###############################################################
 | |
| # Mainfunction
 | |
| ###############################################################
 | |
| send_msg(2,"........................");
 | |
| send_msg(2,"........................");
 | |
| send_msg(2,".....ooooO..............");
 | |
| send_msg(2,"....(....)....Ooooo.....");
 | |
| send_msg(2,".....\\..(.....(....)....");
 | |
| send_msg(2,"......\\__).....)../.....");
 | |
| send_msg(2,"..............(_ /......");
 | |
| send_msg(2,"........................");
 | |
| send_msg(2,".........START .........");
 | |
| send_msg(2,"........................");
 | |
| #######################################
 | |
| # step 1. Read configuration files
 | |
| #######################################
 | |
| send_msg(2, "step 2, Reading xCATreg conf............");
 | |
| my $rst = read_conf();
 | |
| unless (! $rst) {
 | |
|     send_msg(0, "read xCATreg configuration failed...........exit");
 | |
|     exit;
 | |
| }
 | |
| 
 | |
| foreach my $k (keys %confkeys) {
 | |
| print "$k = $confkeys{$k}\n";
 | |
| }
 | |
| 
 | |
| # begin to find which mn should be used
 | |
| if ($management_node) {
 | |
|     my @all;
 | |
|     if ($management_node =~ /,/) {
 | |
|         @all = split /,/, $management_node;
 | |
|     } else {
 | |
|         push @all, $management_node;
 | |
|     }
 | |
|     foreach my $mn (@all) {
 | |
|         foreach my $k (keys %confkeys) {
 | |
|             if ($confkeys{$k} eq $mn) {
 | |
|                 $mns{$k} = $mn;
 | |
|                 send_msg(2, "specify mn :$mn");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| pipe  PREAD,CWRITE;
 | |
| my $gitpid = fork();
 | |
| if( !defined($gitpid)){
 | |
|     send_msg(0, "fork process for git update error");
 | |
|     exit;
 | |
| }elsif($gitpid ==0){
 | |
|     close PREAD;
 | |
|     send_msg(2, "..........fork 1 process[pid=$$] for git update..........");
 | |
|     my $res = git_update();
 | |
|     if($res > 1){
 | |
| 		send_msg(0, "git_update......[failed]");
 | |
|         syswrite CWRITE,"git update failed\n";
 | |
| 		close CWRITE;
 | |
|         exit 1;
 | |
|     }
 | |
| 	if($res == 1){
 | |
| 	    send_msg(2, "git_update......[not find new code]");
 | |
|         syswrite CWRITE,"git update got nothing\n";
 | |
| 		close CWRITE;
 | |
|         exit 1;
 | |
|     }   
 | |
| 	send_msg(2, "git_update......[ok]");
 | |
|     syswrite CWRITE,"git update successful\n";
 | |
|     close CWRITE;
 | |
| 	exit 0;
 | |
| }
 | |
| 
 | |
| {#main process
 | |
|     close CWRITE;
 | |
|     my $gitstarttime = time();
 | |
|     my $gitprocess=1;
 | |
|     my $gitselect = new IO::Select;
 | |
|     $gitselect->add(\*PREAD);     
 | |
|     while($gitprocess){
 | |
|         my @hdls;
 | |
| 		if (@hdls = $gitselect->can_read(0)) {
 | |
| 	        my $hdl;
 | |
| 	        foreach $hdl (@hdls) {
 | |
| 	            if ($hdl == \*PREAD) {
 | |
| 	                my $line;
 | |
| 	                chomp($line=<PREAD>);
 | |
| 	                if ($line){
 | |
| 					    if($line =~ /successful/){
 | |
| 						    send_msg(2, "[[main]]: $line");
 | |
| 							$gitupdateflag=3;
 | |
| 						}
 | |
| 						if($line =~ /failed/){
 | |
| 						    send_msg(0, "[[main]]: $line");
 | |
|                             $gitupdateflag=2;							
 | |
| 						}
 | |
| 						if($line =~ /nothing/){
 | |
| 						    send_msg(2, "[[main]]: there isn't new code checkin during last one day.");
 | |
| 							$gitupdateflag=1;
 | |
| 						}
 | |
| 	                    $gitprocess = 0;
 | |
| 	                }
 | |
| 	            } 
 | |
| 	        }
 | |
| 	    }
 | |
| 
 | |
| 		if(time() - $gitstarttime > 7200) {
 | |
| 		#if(time() - $gitstarttime > 2) {
 | |
| 			send_msg(0, "[[main]] 2 hours is expired. git update out of time");
 | |
| 			last;
 | |
| 		}
 | |
| 		&runcmd("sleep 2");   
 | |
|     }    
 | |
| 	close PREAD;
 | |
| 	
 | |
| 	&runcmd("kill $gitpid") if($gitprocess==1);
 | |
|     send_msg(2, "[[main]]........git process[$gitpid] exit successful..............");
 | |
| 	
 | |
|     # $gitupdateflag = 0 git update out of time
 | |
| 	# $gitupdateflag = 1 there isn't new code checkin in last one day
 | |
| 	# $gitupdateflag = 2 there is something wrong during git update
 | |
| 	if($gitupdateflag<3){
 | |
| 		send_msg(2, "[[main]]: creat regression result report...........");
 | |
| 		$rst = creat_report();
 | |
| 		if ($rst) {
 | |
| 		    send_msg(0, "[[main]]: creat regression result report...........[FAILED]");
 | |
| 		}else{
 | |
| 		    send_msg(2, "[[main]]: creat regression result report...........[OK]");
 | |
| 		
 | |
| 		    send_msg(2, "[[main]]: send report email...........");
 | |
| 		    $rst = send_email();
 | |
| 		    if ($rst) {
 | |
| 		        send_msg(0, "[[main]]: send report email...........[FAILED]");
 | |
| 		    }else{
 | |
| 		         send_msg(2, "[[main]]: send report email...........[OK]");
 | |
| 		    }
 | |
| 		}
 | |
| 		exit 1;
 | |
| 	}
 | |
| 	send_msg(2, "[[main]]: git update successful, start regression today........");
 | |
| 
 | |
| 	#exit 0
 | |
| }
 | |
| 
 | |
| 
 | |
| my $platformfork = 0;
 | |
| my $timingork = 0;
 | |
| # begin child process
 | |
| pipe CONTROLREAD,MNWRITE;
 | |
| foreach my $m (keys %mns) {
 | |
|     $platformfork += 1;
 | |
|     my $mn = $mns{$m};
 | |
|     my $pid = fork();
 | |
|     if ( !defined($pid) ) {
 | |
| 	    send_msg(0, "fork process for $m error");
 | |
|         exit;
 | |
|     } elsif ( $pid == 0 ) { # child process
 | |
| 	    send_msg(2, "..........fork process[pid=$$] for $m [$confkeys{$m}]..........");
 | |
|         close CONTROLREAD;
 | |
| 		my $res; 
 | |
|       		
 | |
|        #######################################
 | |
|        # step 3. download xcat core
 | |
|        ########################################
 | |
|        send_msg(2, "[$m]step 3, Running down_xcat_core...............");
 | |
|        $res = down_xcat_core_build($m);
 | |
|           if ($res) {
 | |
|            syswrite MNWRITE,"REPORTFROM:$m->$mn: download xcat core for $mn failed\n";
 | |
|            exit 1;
 | |
|         }
 | |
|                send_msg(2, "[$m]step 3, Run down_xcat_core...............[OK]");
 | |
|         
 | |
|         #######################################
 | |
|         # step 4. Install MNs,
 | |
|         #######################################
 | |
|         send_msg(2, "[$m]step 4, Running mn_install...............");
 | |
|         $res = mn_install($m);
 | |
|         if ($res) {
 | |
|             syswrite MNWRITE,"REPORTFROM:$m->$mn: install $mn failed\n";
 | |
|             exit 1;
 | |
|         }
 | |
| 		send_msg(2, "[$m]step 4, Run mn_install...............[OK]");
 | |
|         #######################################
 | |
|         # step 5. Down xcatdep to MNs
 | |
|         #######################################
 | |
|         send_msg(2, "[$m]step 5, Down xcatdep...............");
 | |
|         $depupdateflag = down_dep($m);
 | |
|         if ($depupdateflag ==2){
 | |
|             send_msg(2, "[$m]step 5,  updated for xcat dep");
 | |
|         }else{
 | |
|            send_msg(2, "[$m]step 5, no update for xcat dep");
 | |
|         }
 | |
|         #######################################
 | |
|         # step 6. Copy code to MNs
 | |
|         #######################################
 | |
|         send_msg(2, "[$m]step 6, Running copy_code...............");
 | |
|         $res =  copy_code($m);
 | |
|         if ($res) {
 | |
|             syswrite MNWRITE,"REPORTFROM:$m->$mn: copy xcat source code to $mn failed\n";
 | |
|             exit 1;
 | |
|         }
 | |
| 		send_msg(2, "[$m]step 6, Run copy_code...............[OK]");
 | |
|  
 | |
|         ########################################
 | |
|         # step 7. Read xCAT MN's configuration
 | |
|         #######################################
 | |
|         send_msg(2, "[$m]step 7, Running install_xcat...............");
 | |
|         $res = install_xcat($m);
 | |
|         if ($res) {
 | |
|             syswrite MNWRITE,"REPORTFROM:$m->$mn: install new xcat in $mn failed\n";
 | |
|             exit 1;
 | |
|         }
 | |
| 		send_msg(2, "[$m]step 7, Run install_xcat...............[OK]");
 | |
| 	
 | |
|         #######################################
 | |
|         # step 8. Genrate local configuration file for xcattest
 | |
|         #         Do test
 | |
|         #         Write log
 | |
|         #######################################
 | |
|         send_msg(2, "[$m]step 8, Running do_test...............");
 | |
|         $res = do_test($m);
 | |
|         if ($res) {
 | |
|             syswrite MNWRITE,"REPORTFROM:$m->$mn: run regression test cases in $mn failed\n";
 | |
|             exit 1;
 | |
|         }
 | |
|         send_msg(2, "[$m]step 8,  Running do_test...............[OK]");	
 | |
| 		
 | |
|         send_msg(2, "whole regression test for $mn finished");
 | |
| 		syswrite MNWRITE,"REPORTFROM:$m->$mn: whole regression test are successful\n";
 | |
|         exit 0;
 | |
|     } # end of child process
 | |
|     &runcmd("mkdir -p $todayregresultdir/$m");
 | |
|     $pidrecord{$m} = $pid;
 | |
|     $piderrrecord{$m} = "";
 | |
| } # end of foreach
 | |
| 
 | |
| 
 | |
| { # parent process
 | |
| 	close MNWRITE;
 | |
| 	my $rst;
 | |
| 	my $regstarttime = time();
 | |
| 	
 | |
| 	my $select = new IO::Select;
 | |
| 	$select->add(\*CONTROLREAD);
 | |
| 	while ($platformfork) {
 | |
| 	    my @hdls;
 | |
| 		if (@hdls = $select->can_read(0)) {
 | |
| 	        my $hdl;
 | |
| 	        foreach $hdl (@hdls) {
 | |
| 	            if ($hdl == \*CONTROLREAD) {
 | |
| 	                my $line;
 | |
| 	                chomp($line=<CONTROLREAD>);
 | |
| 	                if ($line){
 | |
| 						if($line =~ /successful/){
 | |
| 						    send_msg(2, "[[main]]: $line");
 | |
| 						    $line =~ s/^REPORTFROM:(.+)->.+/$1/g;
 | |
| 						    $pidrecord{$line} = 0;
 | |
| 						    $consumptionrecord{$line} = time() - $regstarttime;
 | |
| 						}
 | |
| 						if($line =~ /failed/){
 | |
| 						    send_msg(0, "[[main]]: $line");
 | |
| 							my $tmp = $line;
 | |
| 						    $line =~ s/^REPORTFROM:(.+)->.+/$1/g;
 | |
| 						    $pidrecord{$line} = 0;
 | |
| 						    $consumptionrecord{$line} = time() - $regstarttime;
 | |
| 							$tmp =~ s/REPORTFROM:.+->.+:(.+)/$1/g;
 | |
| 							$piderrrecord{$line} = $tmp;
 | |
| 						}
 | |
| 	                    $platformfork -= 1;
 | |
| 	                }
 | |
| 	            } 
 | |
| 	        }
 | |
| 	    }
 | |
| 		
 | |
| 		if(time() - $regstarttime > 36000) {
 | |
| 		#if($curtime - $regstarttime > 10) {
 | |
| 			send_msg(1, "[timing] 8 hours is expired");
 | |
| 			last;
 | |
| 		}
 | |
| 		&runcmd("sleep 1");  
 | |
| 	}
 | |
| 	
 | |
| 	close CONTROLREAD;
 | |
| 	if($platformfork){
 | |
|         send_msg(0, "[[main]]: there are $platformfork platform's regression test return out of time");
 | |
|         while(my($k,$v) = each %pidrecord){
 | |
|             &runcmd("kill $v") if ($v != 0);
 | |
|         }
 | |
| 	}else{
 | |
| 	    send_msg(2, "[[main]]: all platform's regression test return on time");
 | |
| 	}
 | |
| 	
 | |
| 	send_msg(2, "[[main]]: creat regression result report...........");
 | |
| 	$rst = creat_report();
 | |
| 	if ($rst) {
 | |
| 		send_msg(0, "[[main]]: creat regression result report...........[FAILED]");
 | |
| 	}else{
 | |
|         send_msg(2, "[[main]]: creat regression result report...........[OK]");
 | |
| 		
 | |
| 		send_msg(2, "[[main]]: send report email...........");
 | |
| 		$rst = send_email();
 | |
| 		if ($rst) {
 | |
| 		    send_msg(0, "[[main]]: send report email...........[FAILED]");
 | |
| 		}else{
 | |
| 		    send_msg(2, "[[main]]: send report email...........[OK]");
 | |
| 		}
 | |
| 	}
 | |
| 	send_msg(2, "[[main]]: main process exit");
 | |
| 	exit 0;
 | |
| }
 | |
| 
 | |
| 
 |