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