send.py revision 1383:e6881c83438c
12810SN/A#!/usr/bin/env python
212728Snikos.nikoleris@arm.com# Copyright (c) 2005 The Regents of The University of Michigan
39796Sprakash.ramrakhyani@arm.com# All rights reserved.
49796Sprakash.ramrakhyani@arm.com#
59796Sprakash.ramrakhyani@arm.com# Redistribution and use in source and binary forms, with or without
69796Sprakash.ramrakhyani@arm.com# modification, are permitted provided that the following conditions are
79796Sprakash.ramrakhyani@arm.com# met: redistributions of source code must retain the above copyright
89796Sprakash.ramrakhyani@arm.com# notice, this list of conditions and the following disclaimer;
99796Sprakash.ramrakhyani@arm.com# redistributions in binary form must reproduce the above copyright
109796Sprakash.ramrakhyani@arm.com# notice, this list of conditions and the following disclaimer in the
119796Sprakash.ramrakhyani@arm.com# documentation and/or other materials provided with the distribution;
129796Sprakash.ramrakhyani@arm.com# neither the name of the copyright holders nor the names of its
139796Sprakash.ramrakhyani@arm.com# contributors may be used to endorse or promote products derived from
142810SN/A# this software without specific prior written permission.
152810SN/A#
162810SN/A# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
172810SN/A# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
182810SN/A# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
192810SN/A# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
202810SN/A# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
212810SN/A# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
222810SN/A# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232810SN/A# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242810SN/A# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252810SN/A# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
262810SN/A# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272810SN/A#
282810SN/A# Authors: Ali Saidi
292810SN/A#          Nathan Binkert
302810SN/A
312810SN/Aimport os, os.path, re, sys
322810SN/Afrom os import environ as env, listdir
332810SN/Afrom os.path import basename, isdir, isfile, islink, join as joinpath
342810SN/Afrom filecmp import cmp as filecmp
352810SN/Afrom shutil import copyfile
362810SN/A
372810SN/Aprogname = basename(sys.argv[0])
382810SN/Ausage = """\
392810SN/AUsage:
402810SN/A    %(progname)s [-c] [-e] [-f] [-q queue] [-v] <regexp>
412810SN/A    -c           clean directory if job can be run
422810SN/A    -e           only echo pbs command info, don't actually send the job
432810SN/A    -f           force the job to run regardless of state
442810SN/A    -q <queue>   submit job to the named queue
452810SN/A    -v           be verbose
462810SN/A
472810SN/A    %(progname)s -l [-v] <regexp>
482810SN/A    -l           list job names, don't submit
4911486Snikos.nikoleris@arm.com    -v           be verbose (list job parameters)
5011486Snikos.nikoleris@arm.com
5112727Snikos.nikoleris@arm.com    %(progname)s -h
5212727Snikos.nikoleris@arm.com    -h           display this help
5312727Snikos.nikoleris@arm.com""" % locals()
5413225Sodanrc@yahoo.com.br
5513219Sodanrc@yahoo.com.brtry:
5612727Snikos.nikoleris@arm.com    import getopt
5712727Snikos.nikoleris@arm.com    opts, args = getopt.getopt(sys.argv[1:], '-cd:efhlq:v')
582810SN/Aexcept getopt.GetoptError:
5912727Snikos.nikoleris@arm.com    sys.exit(usage)
602810SN/A
619796Sprakash.ramrakhyani@arm.comclean = False
6211893Snikos.nikoleris@arm.comonlyecho = False
6313418Sodanrc@yahoo.com.brexprs = []
6413419Sodanrc@yahoo.com.brforce = False
6512513Sodanrc@yahoo.com.brlistonly = False
6612629Sodanrc@yahoo.com.brqueue = ''
6712629Sodanrc@yahoo.com.brverbose = False
689796Sprakash.ramrakhyani@arm.comrootdir = re.sub(r'^/\.automount/', r'/n/', os.getcwd())
699796Sprakash.ramrakhyani@arm.comfor opt,arg in opts:
709796Sprakash.ramrakhyani@arm.com    if opt == '-c':
7113219Sodanrc@yahoo.com.br        clean = True
7213219Sodanrc@yahoo.com.br    if opt == '-d':
7313217Sodanrc@yahoo.com.br        rootdir = arg
7413219Sodanrc@yahoo.com.br    if opt == '-e':
7513217Sodanrc@yahoo.com.br        onlyecho = True
7613217Sodanrc@yahoo.com.br    if opt == '-f':
7713217Sodanrc@yahoo.com.br        force = True
7813217Sodanrc@yahoo.com.br    if opt == '-h':
7913217Sodanrc@yahoo.com.br        print usage
8013217Sodanrc@yahoo.com.br        sys.exit(0)
8113217Sodanrc@yahoo.com.br    if opt == '-l':
8213217Sodanrc@yahoo.com.br        listonly = True
8313219Sodanrc@yahoo.com.br    if opt == '-q':
8413219Sodanrc@yahoo.com.br        queue = arg
8513219Sodanrc@yahoo.com.br    if opt == '-v':
8613217Sodanrc@yahoo.com.br        verbose = True
8713217Sodanrc@yahoo.com.br
8813219Sodanrc@yahoo.com.brbasedir = joinpath(rootdir, 'Base')
8913217Sodanrc@yahoo.com.brlinkdir = joinpath(rootdir, 'Link')
9013217Sodanrc@yahoo.com.br
9113217Sodanrc@yahoo.com.brfor arg in args:
9213217Sodanrc@yahoo.com.br    exprs.append(re.compile(arg))
9313217Sodanrc@yahoo.com.br
9413217Sodanrc@yahoo.com.brif not listonly and not onlyecho and isdir(linkdir):
9513217Sodanrc@yahoo.com.br    print 'Checking for outdated files in Link directory'
9613217Sodanrc@yahoo.com.br    entries = listdir(linkdir)
9713217Sodanrc@yahoo.com.br    for entry in entries:
9813217Sodanrc@yahoo.com.br        link = joinpath(linkdir, entry)
9913217Sodanrc@yahoo.com.br        if not islink(link) or not isfile(link):
1002810SN/A            continue
10113215Sodanrc@yahoo.com.br
10213215Sodanrc@yahoo.com.br        base = joinpath(basedir, entry)
10313215Sodanrc@yahoo.com.br        if not isfile(base) or not filecmp(link, base):
10412636Sodanrc@yahoo.com.br            print 'Base/%s is different than Link/%s: copying' % (entry, entry)
10512722Snikos.nikoleris@arm.com            copyfile(link, base)
10612722Snikos.nikoleris@arm.com
10712636Sodanrc@yahoo.com.brimport job, jobfile, pbs
10812636Sodanrc@yahoo.com.br
10912636Sodanrc@yahoo.com.brtest = jobfile.JobFile(joinpath(basedir, 'test.py'))
11013419Sodanrc@yahoo.com.br
11113215Sodanrc@yahoo.com.brjoblist = []
11212636Sodanrc@yahoo.com.brfor jobname in test.jobs:
11312691Sodanrc@yahoo.com.br    if not exprs:
11413215Sodanrc@yahoo.com.br        joblist.append(jobname)
11512636Sodanrc@yahoo.com.br        continue
11613215Sodanrc@yahoo.com.br
11712703Snikos.nikoleris@arm.com    for expr in exprs:
11812703Snikos.nikoleris@arm.com        if expr.match(jobname):
11912703Snikos.nikoleris@arm.com            joblist.append(jobname)
12012703Snikos.nikoleris@arm.com            break
12112703Snikos.nikoleris@arm.com
12212636Sodanrc@yahoo.com.brif listonly:
12312636Sodanrc@yahoo.com.br    if verbose:
12412636Sodanrc@yahoo.com.br        for jobname in joblist:
12512636Sodanrc@yahoo.com.br            test.printinfo(jobname)
12612636Sodanrc@yahoo.com.br    else:
12713219Sodanrc@yahoo.com.br        for jobname in joblist:
12813219Sodanrc@yahoo.com.br            print jobname
12913219Sodanrc@yahoo.com.br    sys.exit(0)
13013219Sodanrc@yahoo.com.br
13113219Sodanrc@yahoo.com.brif not onlyecho:
13213219Sodanrc@yahoo.com.br    jl = []
13312636Sodanrc@yahoo.com.br    for jobname in joblist:
13412728Snikos.nikoleris@arm.com        jobdir = joinpath(rootdir, jobname)
13512728Snikos.nikoleris@arm.com        if os.path.exists(jobname):
13612728Snikos.nikoleris@arm.com            if not force:
13712728Snikos.nikoleris@arm.com                if os.path.isfile(joinpath(jobdir, '.success')):
13812728Snikos.nikoleris@arm.com                    continue
13912728Snikos.nikoleris@arm.com
14012728Snikos.nikoleris@arm.com                if os.path.isfile(joinpath(jobdir, '.start')) and \
14112728Snikos.nikoleris@arm.com                       not os.path.isfile(joinpath(jobdir, '.stop')):
14212728Snikos.nikoleris@arm.com                    continue
14312728Snikos.nikoleris@arm.com
14412728Snikos.nikoleris@arm.com            if not clean:
14512728Snikos.nikoleris@arm.com                sys.exit('job directory not clean!')
14612728Snikos.nikoleris@arm.com
14712728Snikos.nikoleris@arm.com            job.cleandir(jobdir)
14812728Snikos.nikoleris@arm.com        else:
14912728Snikos.nikoleris@arm.com            os.mkdir(jobdir)
15012728Snikos.nikoleris@arm.com    jl.append(jobname)
15112728Snikos.nikoleris@arm.com    joblist = jl
15212728Snikos.nikoleris@arm.com
15312728Snikos.nikoleris@arm.comfor jobname in joblist:
15412728Snikos.nikoleris@arm.com    jobdir = joinpath(rootdir, jobname)
15512728Snikos.nikoleris@arm.com
15612728Snikos.nikoleris@arm.com    if not onlyecho and not os.path.isdir(jobdir):
15712728Snikos.nikoleris@arm.com        sys.exit('%s is not a directory.  Cannot build job' % jobdir)
15812728Snikos.nikoleris@arm.com
15912728Snikos.nikoleris@arm.com    print >>sys.stderr, 'Job name:       %s' % jobname
16012728Snikos.nikoleris@arm.com    print >>sys.stderr, 'Job directory:  %s' % jobdir
16112728Snikos.nikoleris@arm.com
16212728Snikos.nikoleris@arm.com    qsub = pbs.qsub()
16312728Snikos.nikoleris@arm.com    qsub.pbshost = 'simpool.eecs.umich.edu'
16412728Snikos.nikoleris@arm.com    qsub.stdout = joinpath(jobdir, 'jobout')
16512728Snikos.nikoleris@arm.com    qsub.name = jobname
16612728Snikos.nikoleris@arm.com    qsub.join = True
16712728Snikos.nikoleris@arm.com    qsub.node_type = 'FAST'
16812728Snikos.nikoleris@arm.com    qsub.onlyecho = onlyecho
16912728Snikos.nikoleris@arm.com    qsub.env['ROOTDIR'] = rootdir
17012728Snikos.nikoleris@arm.com    qsub.verbose = verbose
17112728Snikos.nikoleris@arm.com    if len(queue):
17212728Snikos.nikoleris@arm.com        qsub.queue = queue
17312728Snikos.nikoleris@arm.com
17412728Snikos.nikoleris@arm.com    qsub.do(joinpath(basedir, 'job.py'))
17512728Snikos.nikoleris@arm.com    print >>sys.stderr, ''
17612728Snikos.nikoleris@arm.com