diff --git a/da/platform/cartesius.py b/da/platform/cartesius.py new file mode 100755 index 0000000000000000000000000000000000000000..6354e15d9d9efc61f48a23579bd45e081d5eff8e --- /dev/null +++ b/da/platform/cartesius.py @@ -0,0 +1,171 @@ +#!/usr/bin/env python +# cartesius.py + +""" +Author : peters + +Revision History: +File created on 06 Sep 2010. + +""" + +import logging +import subprocess + +from da.baseclasses.platform import Platform + +std_joboptions = {'jobname':'test', 'jobaccount':'co2', 'jobtype':'serial', 'jobshell':'/bin/sh', 'depends':'', 'jobtime':'24:00:00', 'jobinput':'/dev/null', 'jobnodes':'1', 'jobtasks':'', 'modulenetcdf':'netcdf/4.1.2', 'networkMPI':''} + + +class CartesiusPlatform(Platform): + def __init__(self): + self.ID = 'cartesius' # the identifier gives the platform name + self.version = '1.0' # the platform version used + + + def give_blocking_flag(self): + """ + Returns a blocking flag, which is important if tm5 is submitted in a queue system. The python ctdas code is forced to wait before tm5 run is finished + + -on Huygens: return "-s" + -on Maunaloa: return "" (no queue available) + -on Jet/Zeus: return + """ + return "" + + def give_queue_type(self): + """ + Return a queue type depending whether your computer system has a queue system, or whether you prefer to run in the foreground. + On most large systems using the queue is mandatory if you run a large job. + -on Huygens: return "queue" + -on Maunaloa: return "foreground" (no queue available) + -on Jet/Zeus: return + + """ + return "queue" + + def get_job_template(self, joboptions={}, block=False): + """ + Returns the job template for a given computing system, and fill it with options from the dictionary provided as argument. + The job template should return the preamble of a job that can be submitted to a queue on your platform, + examples of popular queuing systems are: + - SGE + - MOAB + - XGrid + - + + A list of job options can be passed through a dictionary, which are then filled in on the proper line, + an example is for instance passing the dictionary {'account':'co2'} which will be placed + after the ``-A`` flag in a ``qsub`` environment. + + An extra option ``block`` has been added that allows the job template to be configured to block the current + job until the submitted job in this template has been completed fully. + """ + + #template = """## \n"""+ \ + # """## This is a set of dummy names, to be replaced by values from the dictionary \n"""+ \ + # """## Please make your own platform specific template with your own keys and place it in a subfolder of the da package.\n """+ \ + # """## \n"""+ \ + # """ \n"""+ \ + # """#$ jobname \n"""+ \ + # """#$ jobaccount \n"""+ \ + # """#$ jobnodes \n"""+ \ + # """#$ jobtime \n"""+ \ + # """#$ jobshell \n"""+ \ + # """\n"""+ \ + # """source /usr/bin/sh\n"""+ \ + # """module load python\n"""+ \ + # """\n""" + + + template = """#!/bin/bash \n""" + \ + """## \n""" + \ + """## This is a set of dummy names, to be replaced by values from the dictionary \n""" + \ + """## Please make your own platform specific template with your own keys and place it in a subfolder of the da package.\n """ + \ + """## \n""" + \ + """#$ -J jobname \n""" + \ + """#$ -p normal \n""" + \ + """#$ -n jobnodes \n""" + \ + """#$ -t jobtime \n""" + \ + """#$ -o joblog \n""" + \ + """module load python\n""" + \ + """\n""" + + if 'depends' in joboptions: + template += """#$ -hold_jid depends \n""" + + # First replace from passed dictionary + for k, v in joboptions.iteritems(): + while k in template: + template = template.replace(k, v) + + # Fill remaining values with std_options + for k, v in std_joboptions.iteritems(): + while k in template: + template = template.replace(k, v) + + return template + + + def submit_job(self, jobfile, joblog=None, block=False): + """ This method submits a jobfile to the queue, and returns the queue ID """ + + + #cmd = ["llsubmit","-s",jobfile] + #msg = "A new task will be started (%s)"%cmd ; logging.info(msg) + + if block: + cmd = ["salloc",'-n',std_joboptions['jobnodes'],'-t',std_joboptions['jobtime'], jobfile] + logging.info("A new task will be started (%s)" % cmd) + output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] + logging.info(output) + print 'output', output + jobid = output.split()[-1] + print 'jobid', jobid + else: + cmd = ["sbatch", jobfile] + logging.info("A new task will be started (%s)" % cmd) + output = subprocess.Popen(cmd, stdout=subprocess.PIPE).communicate()[0] ; logging.info(output) + jobid = output.split()[-1] + + return jobid + + + + + + + +# jobid = output.split()[2] +# retcode = output.split()[-1] +# +# #for huygens +# print 'output', output +# test = output.split()[3] +# dummy, jobid =test.split('nl.') +# jobid='%s%s' %('"',jobid) +# submitmsg ='%s%s%s'%(output.split()[4],output.split()[5],output.split()[6]) +# if submitmsg=='hasbeensubmitted.': +# retcode=2 +# print 'retcode',submitmsg,retcode +# return retcode +# +# def KillJob(self,jobid): +# """ This method kills a running job """ +# +# output = subprocess.Popen(['qdel',jobid], stdout=subprocess.PIPE).communicate()[0] ; logging.info(output) +# +# return output +# +# def StatJob(self,jobid): +# """ This method gets the status of a running job """ +# import subprocess +# +# #output = subprocess.Popen(['sgestat'], stdout=subprocess.PIPE).communicate()[0] ; logging.info(output) +# +# return '' + + + +if __name__ == "__main__": + pass