A simple workflow is implemented with the function mainflow defined in views.py and a template defined in `templates/job_template.j2`:
+-- views.py
+-+ templates/
+ job_template.j2
views.py:
from jobbergate import appform
def mainflow(data):
return [appform.Text("jobname", "What is the jobname?", default="simulation")]
job_template.j2:
#!/bin/bash
#SBATCH -j {{ data.jobname }}
sleep 30
A workflow with implicit workflows is built by defining mainflow and functions decorated with `appform.workflow`:
+-- views.py
+-+ templates/
+ job_template.j2
views.py:
from jobbergate import appform
def mainflow(data):
return [appform.Text("jobname", "What is the jobname?", default="simulation")]
@appform.workflow
def debug(data):
return [appform.Confirm("debug", "Add debug info?")]
@appform.workflow
def gpu(data):
return [appform.Integer("gpus", "Number of gpus?", default=1, maxval=10)]
job_template.j2:
#!/bin/bash
#SBATCH -j {{ data.jobname }}
{% if data.gpus %}
NUMBER_OF_GPUS={{ data.gpus }}
{% else %}
NUMBER_OF_GPUS=0
{% endif %}
{% if data.debug %}
/application/debug_prepare
{% endif %}
/application/run_application -gpus $NUMBER_OF_GPUS
API internal configuration
genindex
modindex
search