bldsystemtools/commonbldutils/bfcClient.pl
changeset 0 83f4b4db085c
child 1 d4b442d23379
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bldsystemtools/commonbldutils/bfcClient.pl	Tue Feb 02 01:39:43 2010 +0200
@@ -0,0 +1,190 @@
+# Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+#!/usr/bin/perl -w
+use strict;
+use Getopt::Long;
+use HTTP::Date;
+
+my $JOBS_PATH = "autobfc\\";
+my $JOB_QUEUE = 'jobqueue.lst';
+my $CURR_JOB = 'currentjob.bat';
+my $QUIT_BFC = 'quit.txt';
+
+my $ENV_BFCPOOL = "AutoBFCServerPool";
+
+
+SendBFC( ProcessCommandLine() );
+
+# SendBFC
+# Send a BFC test request to an active Auto BFC server
+# 
+# Return 0 if request was successfully added to the BFC queue.
+#
+# N.B: Since this script is invoked during the system build, WARNING/ERROR
+# messages must NOT be printed out in order to avoid affecting the BRAG status.
+#
+
+sub SendBFC
+{
+	my ($iProduct, $iBuild, $iCodeline, $iServerPool, $iARMVer, $iMWVer, $iWait, $iExtraArg, $iQuit, $iSubType) = @_;
+
+	# Get server list from ENV or from command line
+	$iServerPool = $ENV{$ENV_BFCPOOL} if (!defined($iServerPool));
+
+	my $server = FindAvailableServer(split /\#/, $iServerPool);
+
+	if (!$server)
+	{
+		print "Could not find BFC server \n";
+		return 1;
+	}
+
+	my $jobQueue = "\\\\$server\\".$JOBS_PATH.$JOB_QUEUE;
+
+	# Set basic release info
+	my $request = "Product=$iProduct,SnapshotNumber=$iBuild,CurrentCodeline=$iCodeline";
+
+	# Set timeout
+	if (defined($iWait) && !($iExtraArg =~ /-o/))
+	{
+		my $nowStr = HTTP::Date::time2isoz(time() + $iWait*60*60);
+		$request .= ",BFCTimeout=$nowStr";
+	}
+
+	$request .= ",ARMRVCTBLD=$iARMVer" if ($iARMVer);
+	$request .= ",MWVER=$iMWVer" if ($iMWVer);
+
+	$request .= ",QMAction=$iQuit" if ($iQuit);
+
+	# Get BuildSubType from ENV or from command line, if specified.
+	$iSubType = $ENV{'BuildSubType'} unless ($iSubType);
+	$request .= ",BuildSubType=$iSubType" if ($iSubType);
+
+	# Add extra arguments at the end
+	$request .= ",BFCCommand=$iExtraArg" if ($iExtraArg);
+
+	# Add the request to the server queue
+	open FILE, ">> $jobQueue" or die "Can't open $jobQueue\n$!\n";
+	print FILE "$request \n";
+	close FILE;
+
+	print "Added request: $request\nto $server\n";
+	return 0;
+}
+
+# FindAvailableServer
+# Scan the server list and find an available AutoBFC server.
+# 
+# Return the first bfc server with no jobs or the bfc server with
+# the least jobs on the queue.
+#
+sub FindAvailableServer
+{
+	my @servers = @_;
+
+	my %bestServer;
+	foreach my $server (@servers)
+	{
+		# Check autobfc shared dir.
+		my $jobsPath = "\\\\$server\\".$JOBS_PATH;
+		next if !(-d $jobsPath);
+
+		# This is a valid server.
+		# Check the job list.
+		my $jobQueue = $jobsPath.$JOB_QUEUE;
+		my $currentJob = $jobsPath.$CURR_JOB;
+		push my @jobs, "current"  if (-e $currentJob);
+		if (open (FH1, $jobQueue))
+		{
+			push @jobs, <FH1>;
+			close FH1;
+		}
+		%bestServer = ('Server' => $server, 'Jobs' => scalar @jobs) if (!exists($bestServer{'Server'}) || (scalar @jobs < $bestServer{'Jobs'}));
+		last if ($bestServer{'Jobs'} == 0);
+	}
+	
+	return $bestServer{'Server'}; 
+}
+
+
+# ProcessCommandLine
+#
+
+sub ProcessCommandLine
+{
+  my ($iHelp);
+  my ($iProduct, $iBuild, $iCodeline, $iServerPool, $iARMVer, $iMWVer, $iWait, $iExtraArg, $iQuit, $iSubType);
+
+  my $ret = GetOptions('h' => \$iHelp,
+                       "product=s" => \$iProduct,
+                       "build=s" => \$iBuild,
+		       "codeline=s" => \$iCodeline,
+                       "server=s" => \$iServerPool,
+                       "arm=s" => \$iARMVer,
+                       "mw=s" => \$iMWVer,
+                       "wait=i" => \$iWait,
+                       "reboot" => \$iQuit,
+		       "type=s" => \$iSubType);
+
+  $iExtraArg = join(' ',  @ARGV);
+
+  if ((!$ret) || ($iHelp) || (!defined $iProduct) || (!defined $iBuild) || (!defined $iCodeline))
+  {
+    Usage();
+  }
+
+  if (defined($iQuit))
+  {
+  	$iQuit = "reboot";
+  }
+
+  return ($iProduct, $iBuild, $iCodeline, $iServerPool, $iARMVer, $iMWVer, $iWait, $iExtraArg, $iQuit, $iSubType);
+}
+
+# Usage
+#
+# Output Usage Information.
+#
+
+sub Usage 
+{
+  print <<USAGE_EOF;
+
+  Request a BFC
+  Usage: bfcClient.pl -p <Ver> -b <BuildNo> -c <Codeline> -s <ServerPool> [options] -- [bfc extra arg]
+
+  --product   Specify OS product (e.g. 9.1).
+  --build     Specify Build Number (e.g. M04191).
+  --codeline  Specify Codeline (e.g. Master, Symbian_OS_v9.4)
+  --server    Hash separated BFC server list (e.g lon-engbuild20\#lon-engbuild21).
+              Alternatively, set $ENV_BFCPOOL.
+  
+  [Options]
+  -h           This help
+  --arm        Specify ARM version to be used (435 or 559 or 616).
+  --mw         Specify Metrowerk version to be used (3.0 or 3.1.1 or 3.1.2).
+  --wait 0..n  Force the bfc process to wait no more than n hours from now.
+  --reboot     Force the bfc process to reboot before this task.
+  --type       Specify BuildSubType (e.g. Daily, Test).
+
+  [bfc extra arg]
+   Any other switches will be passed to the bfc process tools
+
+USAGE_EOF
+	exit 0;
+}
+
+