boinc/tools/demo_submit_batch

77 lines
2.1 KiB
Python
Executable File

#! /usr/bin/env python3
# usage: demo_submit_batch user_id app_name dir
# submit a batch of jobs
# assumptions:
# - you have an app that takes 1 input file
# - there's a directory of input files
#
# The job names will be of the form
# appname__batchid__*
# so that assimilators can know where to put output files
import os, sys, time, subprocess
def main(argv):
if len(argv) != 4:
print('Usage: demo_submit_batch user_id app_name dir')
sys.exit(1)
user_id = int(argv[1])
app_name = argv[2]
dir = argv[3]
# get list of input files
files = []
for entry in os.scandir(dir):
if not entry.is_file():
raise Exception('not file')
files.append(entry.name)
# make the batch record
cmd = [
'bin/create_batch',
'--app_name', app_name,
'--user_id', str(user_id),
'--njobs', str(len(files)),
'--name', '%s__%d'%(app_name, int(time.time()))
]
ret = subprocess.run(cmd, capture_output=True, encoding='ascii')
if ret.returncode:
raise Exception('create_batch failed (%d): %s %s'%(ret.returncode, ret.stdout, ret.stderr))
batch_id = int(ret.stdout)
# stage the input files
cmd = ['bin/stage_file', '--copy', dir]
ret = subprocess.run(cmd, capture_output=True, encoding='ascii')
if ret.returncode:
raise Exception('stage_file failed (%d): %s %s'%(ret.returncode, ret.stdout, ret.stderr))
# create the jobs
fstr = '\n'.join(files)
cmd = [
'bin/create_work',
'--appname', app_name,
'--batch', str(batch_id),
'--stdin'
]
ret = subprocess.run(cmd, input=fstr, capture_output=True, encoding='ascii')
if ret.returncode:
print(cmd)
raise Exception('create_work failed (%d): %s %s'%(ret.returncode, ret.stdout, ret.stderr))
# mark the batch as in progress
cmd = ['bin/create_batch', '--enable', str(batch_id)]
ret = subprocess.run(cmd, capture_output=True)
if ret.returncode:
raise Exception('enable batch failed (%d): %s'%(ret.returncode, ret.stdout))
print('%d jobs submitted. Batch ID %d'%(len(files), batch_id))
main(sys.argv)