#!/usr/bin/python
# testkernel <client> <control> <kernel> <config> <patches ...>
#
# Create a config that builds the kernel+patches specified, 
# then runs the tests specified in the control file supplied.
#
# Run that control file on the comma-separated list of machines supplied
# by dumping a control file in $AUTOTEST_DIR/queue/machine. 
import os, sys, time

if len(sys.argv) < 5:
	print "Usage: testkernel <client> <control> <kernel> <config> <patches ...>"
	sys.exit(1)
(client, control, kernel, config) = sys.argv[1:5]
if len(sys.argv) > 5:
	patches = sys.argv[5:]
else:
	patches = []


# Need to be careful to create the control file atomically, so don't end up
# executing half of it. Try to create it in the same filesystem, then move it.
queuedir = os.path.join(os.environ['AUTOTEST_DIR'], 'queue')
tmpfile = os.path.join(queuedir, 'tmp_control.%d' % os.getpid())
c = open(tmpfile, 'w')
print >> c, "def step_init():"
print >> c, "\t" + "job.next_step([step_test])"
print >> c, "\t" + "testkernel = job.kernel('%s')" % kernel
if patches:
	patch_list = ', '.join(["'%s'" % x for x in patches])
	print >> c, "\t" + "testkernel.patch(%s)" % patch_list
print >> c, "\t" + "testkernel.config('%s')" % config
print >> c, "\t" + "testkernel.build()"
print >> c, "\t" + "testkernel.boot()"
print >> c, ""
print >> c, "def step_test():"

for line in open(control, 'r'):
	print >> c, "\t" + line,
c.close()
# This is pretty revolting, but will do as a hack for testing
jobname = os.path.basename(control) + '.' + os.path.basename(kernel)
output = os.path.join(queuedir, client, jobname)
if os.path.exists(output):
	output += ".%d" % int(time.time())
os.rename(tmpfile, output)
