summaryrefslogtreecommitdiff
path: root/scheduler/monitor_queue
diff options
context:
space:
mode:
Diffstat (limited to 'scheduler/monitor_queue')
-rwxr-xr-xscheduler/monitor_queue206
1 files changed, 103 insertions, 103 deletions
diff --git a/scheduler/monitor_queue b/scheduler/monitor_queue
index df058b4f..74eaca15 100755
--- a/scheduler/monitor_queue
+++ b/scheduler/monitor_queue
@@ -5,35 +5,35 @@ from subprocess import *
import tempfile
if (len(sys.argv) < 3):
- print "Usage: monitor_queue <spool_directory> <resultsdir> [<conmux_server>]"
- sys.exit(1)
+ print "Usage: monitor_queue <spool_directory> <resultsdir> [<conmux_server>]"
+ sys.exit(1)
(spooldir, resultsdir) = [os.path.abspath(p) for p in sys.argv[1:3]]
queue_name = os.path.basename(spooldir)
dotmachines = os.path.join(spooldir, '.machines')
if os.path.exists(dotmachines):
- machines = [l.strip() for l in open(dotmachines).readlines() if len(l.strip())]
+ machines = [l.strip() for l in open(dotmachines).readlines() if len(l.strip())]
else:
- print "No .machines file in %s, assuming queue name is a machine"\
- % queue_name
- machines = [queue_name]
+ print "No .machines file in %s, assuming queue name is a machine"\
+ % queue_name
+ machines = [queue_name]
if len(sys.argv) == 5:
- console = sys.argv[4]
+ console = sys.argv[4]
else:
- console = None
+ console = None
if not os.path.exists(spooldir):
- print "spooldir %s does not exist" % spooldir
- sys.exit(1)
+ print "spooldir %s does not exist" % spooldir
+ sys.exit(1)
if not os.path.exists(resultsdir):
- print "resultsdir %s does not exist" % resultsdir
- sys.exit(1)
+ print "resultsdir %s does not exist" % resultsdir
+ sys.exit(1)
##### Control file templates #####
SERV_MULTI = """# monitor_queue generated autoserv file (SERV_MULTI template)
hosts = [hosts.SSHHost(hostname, server=%s)
- for hostname in machines]
+ for hostname in machines]
at = autotest.Autotest()
@@ -41,16 +41,16 @@ control_path = %s
results = %s
def install_run(host):
- at.install(host)
- host_results = os.path.join(results, host.hostname)
- at.run(control_path, host_results, host)
+ at.install(host)
+ host_results = os.path.join(results, host.hostname)
+ at.run(control_path, host_results, host)
parallel([subcommand(install_run, [host]) for host in hosts])"""
SERV_SINGLE = """# monitor_queue generated autoserv file (SERV_SINGLE template)
host = hosts.SSHHost(machines[0], server=%s)
-
+
at = autotest.Autotest()
control_path = %s
@@ -62,99 +62,99 @@ at.run(control_path, results, host)"""
##### End control file templates #####
def pick_job(jobs):
- """Pick the next job to run. Currently we just pick the oldest job
- However, this would be the place to put prioritizations."""
- if not jobs:
- return None
- return sorted(jobs, key=lambda x:os.stat(x).st_mtime, reverse=True)[0]
+ """Pick the next job to run. Currently we just pick the oldest job
+ However, this would be the place to put prioritizations."""
+ if not jobs:
+ return None
+ return sorted(jobs, key=lambda x:os.stat(x).st_mtime, reverse=True)[0]
def __create_autoserv_wrapper(template, control_path, results):
- """Create an autoserv file that runs an autotest file at
- control_path on clients and outputs the results in results."""
- # Create an autoserv control file to run this autotest control file
- tmpfd, tmpname = tempfile.mkstemp()
- tmp = os.fdopen(tmpfd, 'w')
-
- print >> tmp, template % tuple([repr(s) for s in (console,
- control_path,
- results)])
- return tmpname
-
+ """Create an autoserv file that runs an autotest file at
+ control_path on clients and outputs the results in results."""
+ # Create an autoserv control file to run this autotest control file
+ tmpfd, tmpname = tempfile.mkstemp()
+ tmp = os.fdopen(tmpfd, 'w')
+
+ print >> tmp, template % tuple([repr(s) for s in (console,
+ control_path,
+ results)])
+ return tmpname
+
def run_job(control, queuename, scheduler_dir):
- """Runs a control file from the spooldir.
- Args:
- control: A path to a control file. It is assumed to be an
- Autotest control file in which case it will automatically
- be wrapped with autoserv control commands and run with
- autoserv. If the file name ends with .srv the wrapping
- procedure will be skipped and the autoserv file will be
- run directly.
-
- Return:
- The return code from the autoserv process.
- """
- # Make sure all the output directories are all setup
- results = os.path.join(resultsdir, queuename + '-' + control)
- if os.path.exists(results):
- print "Resultsdir %s already present, " % results,
- results = "%s.%d" % (results, int(time.time()))
- print "changing to %s" % results
- os.mkdir(results)
- debug = os.path.join(results, 'debug')
- os.mkdir(debug)
-
- # If this is an autoserv file then don't create the wrapper control
- is_autoserv_ctl = control.endswith('.srv')
- control_path = os.path.abspath(os.path.join(spooldir, control))
- # Otherwise create a tmp autoserv file just to launch the AT ctl file
- if not is_autoserv_ctl:
- if len(machines) > 1:
- # Run autotest file on *all* machines in *parallel*
- template = SERV_MULTI
- else:
- # Run autotest file on *one* machine
- template = SERV_SINGLE
- control_path = __create_autoserv_wrapper(template,
- control_path,
- results)
-
- # Now run the job
- autoserv_exe = os.path.join(scheduler_dir, '..', 'server', 'autoserv')
- autoserv_exe = os.path.abspath(autoserv_exe)
-
- autoserv_cmd = ' '.join([autoserv_exe, '-m', ','.join(machines),
- control_path])
-
- print "Starting job: %s" % control
- print autoserv_cmd
-
- open(os.path.join(debug, 'autoserv.cmd'), 'w', 0).write(autoserv_cmd + '\n')
- autoserv_stdout = open(os.path.join(debug, 'autoserv.stdout'), 'w', 0)
- autoserv_stderr = open(os.path.join(debug, 'autoserv.stderr'), 'w', 0)
- p = Popen(autoserv_cmd, shell=True, stdout=autoserv_stdout,
- stderr=autoserv_stderr, cwd=results)
- (pid, ret) = os.waitpid(p.pid, 0)
- autoserv_stdout.close()
- autoserv_stderr.close()
-
- # If this was a tempfile then clean it up
- if not is_autoserv_ctl:
- os.unlink(control_path)
- print "Completed job: %s (%d) " % (control, ret)
-
- return ret
-
+ """Runs a control file from the spooldir.
+ Args:
+ control: A path to a control file. It is assumed to be an
+ Autotest control file in which case it will automatically
+ be wrapped with autoserv control commands and run with
+ autoserv. If the file name ends with .srv the wrapping
+ procedure will be skipped and the autoserv file will be
+ run directly.
+
+ Return:
+ The return code from the autoserv process.
+ """
+ # Make sure all the output directories are all setup
+ results = os.path.join(resultsdir, queuename + '-' + control)
+ if os.path.exists(results):
+ print "Resultsdir %s already present, " % results,
+ results = "%s.%d" % (results, int(time.time()))
+ print "changing to %s" % results
+ os.mkdir(results)
+ debug = os.path.join(results, 'debug')
+ os.mkdir(debug)
+
+ # If this is an autoserv file then don't create the wrapper control
+ is_autoserv_ctl = control.endswith('.srv')
+ control_path = os.path.abspath(os.path.join(spooldir, control))
+ # Otherwise create a tmp autoserv file just to launch the AT ctl file
+ if not is_autoserv_ctl:
+ if len(machines) > 1:
+ # Run autotest file on *all* machines in *parallel*
+ template = SERV_MULTI
+ else:
+ # Run autotest file on *one* machine
+ template = SERV_SINGLE
+ control_path = __create_autoserv_wrapper(template,
+ control_path,
+ results)
+
+ # Now run the job
+ autoserv_exe = os.path.join(scheduler_dir, '..', 'server', 'autoserv')
+ autoserv_exe = os.path.abspath(autoserv_exe)
+
+ autoserv_cmd = ' '.join([autoserv_exe, '-m', ','.join(machines),
+ control_path])
+
+ print "Starting job: %s" % control
+ print autoserv_cmd
+
+ open(os.path.join(debug, 'autoserv.cmd'), 'w', 0).write(autoserv_cmd + '\n')
+ autoserv_stdout = open(os.path.join(debug, 'autoserv.stdout'), 'w', 0)
+ autoserv_stderr = open(os.path.join(debug, 'autoserv.stderr'), 'w', 0)
+ p = Popen(autoserv_cmd, shell=True, stdout=autoserv_stdout,
+ stderr=autoserv_stderr, cwd=results)
+ (pid, ret) = os.waitpid(p.pid, 0)
+ autoserv_stdout.close()
+ autoserv_stderr.close()
+
+ # If this was a tempfile then clean it up
+ if not is_autoserv_ctl:
+ os.unlink(control_path)
+ print "Completed job: %s (%d) " % (control, ret)
+
+ return ret
+
scheduler_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
os.chdir(spooldir)
print "monitoring spool directory: " + spooldir
while True:
- jobs = [j for j in os.listdir(spooldir) if not j.startswith('.')]
- next_job = pick_job(jobs)
- if not next_job:
- time.sleep(10)
- continue
- ret = run_job(next_job, os.path.basename(spooldir), scheduler_dir)
- os.remove(next_job)
+ jobs = [j for j in os.listdir(spooldir) if not j.startswith('.')]
+ next_job = pick_job(jobs)
+ if not next_job:
+ time.sleep(10)
+ continue
+ ret = run_job(next_job, os.path.basename(spooldir), scheduler_dir)
+ os.remove(next_job)