run_tapis_job()#
run_tapis_job(t, tapisInput, askConfirmJob=True, monitor_job=True, askConfirmMonitorRT=True, get_job_history=False, get_job_metadata=False, get_job_filedata=False, job_description={})
A convenience wrapper that submits a Tapis job and, if requested, monitors it and gathers status / metadata / history / file data — all in one call.
What it does#
Job description
If job_description (dict) is provided, it is used as-is.
Otherwise, one is built from tapisInput via OpsUtils.get_tapis_job_description.
Submit
Submits with OpsUtils.submit_tapis_job (optional confirmation).
Monitor (optional)
If monitor_job=True:
Monitors runtime with OpsUtils.monitor_tapis_job.
Always fetches basic status via OpsUtils.get_tapis_job_status.
If get_job_metadata=True, fetches detailed metadata via OpsUtils.get_tapis_job_metadata.
If get_job_history=True, fetches history via OpsUtils.get_tapis_job_history_data.
If get_job_filedata=True, fetches output file data via OpsUtils.get_tapis_job_all_files.
Parameters#
t (tapipy.tapis.Tapis) — Authenticated Tapis client.
tapisInput (dict) — Used to build the job description when job_description is not provided.
askConfirmJob (bool, default True) — Ask before submitting.
monitor_job (bool, default True) — Monitor the job in real time (required for downstream fetches).
askConfirmMonitorRT (bool, default True) — Ask before starting monitoring.
get_job_history (bool, default False) — Include job history (requires monitor_job=True).
get_job_metadata (bool, default False) — Include detailed metadata (requires monitor_job=True).
get_job_filedata (bool, default False) — Include output file listings/data (requires monitor_job=True).
job_description (dict, default {}) — Optional pre-built job request that overrides building from tapisInput.
Returns#
A dictionary seeded from OpsUtils.submit_tapis_job(…), augmented with:
{
"runJobStatus": "Finished" | "Incomplete" | ...,
"jobUuid": "...", # from submission helper
"job_start_time": <float>, # from submission helper
"job_description": <dict>, # built or provided
"JobMetadata": <dict or {}>, # status or detailed metadata
"JobHistory": <dict or {}>, # if requested
"JobFiledata": <dict or {}>, # if requested
}
If building the job description fails, returns {“runJobStatus”: “Incomplete”}.
Example#
result = run_tapis_job(
t, tapisInput,
monitor_job=True,
get_job_history=True,
get_job_metadata=True,
get_job_filedata=False
)
print("UUID:", result.get("jobUuid"))
print("Status:", result.get("JobMetadata", {}).get("status"))
Notes#
Status/metadata/history/file data are gathered only when monitor_job=True.
If OpsUtils.submit_tapis_job returns a non-Finished status, that object is returned unchanged (except the early {“runJobStatus”:”Incomplete”} short-circuit).
Author: Silvia Mazzoni, DesignSafe (silviamazzoni@yahoo.com) Date: 2025-08-16 Version: 1.1
Files#
You can find these files in Community Data.
run_tapis_job.py
def run_tapis_job(
t,
tapisInput,
askConfirmJob: bool = True,
monitor_job: bool = True,
askConfirmMonitorRT: bool = True,
get_job_history: bool = False,
get_job_metadata: bool = False,
get_job_filedata: bool = False,
job_description = {}
):
"""
Run a complete Tapis job workflow in one call: build (or accept) a job description,
submit, and optionally monitor + collect results (status/metadata/history/file data).
Workflow
--------
1) If `job_description` is provided (non-empty dict), use it as-is; otherwise,
build one from `tapisInput` via `OpsUtils.get_tapis_job_description`.
2) Submit the job via `OpsUtils.submit_tapis_job` (with optional confirmation).
3) If `monitor_job=True`, call `OpsUtils.monitor_tapis_job` and then:
- Always fetch basic status via `OpsUtils.get_tapis_job_status`.
- If `get_job_metadata=True`, fetch detailed metadata via
`OpsUtils.get_tapis_job_metadata` (this overwrites the basic status dict).
- If `get_job_history=True`, fetch history via `OpsUtils.get_tapis_job_history_data`.
- If `get_job_filedata=True`, fetch output file listings/data via
`OpsUtils.get_tapis_job_all_files`.
Parameters
----------
t : tapipy.tapis.Tapis
Authenticated Tapis client.
tapisInput : dict
Fields used to construct the job description (e.g., name, appId, inputs) when
`job_description` is not provided.
askConfirmJob : bool, default True
Ask for confirmation before submitting.
monitor_job : bool, default True
Monitor the job in real time after submission. Required for the code paths that
fetch status/metadata/history/file data in this function.
askConfirmMonitorRT : bool, default True
Ask for confirmation before starting real-time monitoring.
get_job_history : bool, default False
If True and `monitor_job=True`, include job history in the return object.
get_job_metadata : bool, default False
If True and `monitor_job=True`, include detailed job metadata in the return object
(overwrites the basic status dict).
get_job_filedata : bool, default False
If True and `monitor_job=True`, include job output file listings/data.
job_description : dict, default {}
Optional pre-built Tapis job description. If provided (non-empty), it takes
precedence over building from `tapisInput`.
Returns
-------
dict
A dictionary seeded from `OpsUtils.submit_tapis_job(...)`, augmented with:
- 'job_description' : dict
- 'JobHistory' : dict or {}
- 'JobMetadata' : dict or {}
- 'JobFiledata' : dict or {}
- 'runJobStatus' : 'Finished' | 'Incomplete' | other
If `OpsUtils.get_tapis_job_description(...)` fails, returns:
{'runJobStatus': 'Incomplete'}
Notes
-----
- Status/metadata/history/file data are gathered only when `monitor_job=True`.
- If `OpsUtils.submit_tapis_job` yields a status other than 'Finished', the function
returns that object unchanged (except the early 'Incomplete' short-circuit).
Example
-------
result = run_tapis_job(
t, tapisInput,
monitor_job=True,
get_job_history=True,
get_job_metadata=True
)
print("Job UUID:", result.get("jobUuid"))
print("Status:", result.get("JobMetadata", {}).get("status"))
Author
------
Silvia Mazzoni, DesignSafe (silviamazzoni@yahoo.com)
Date
----
2025-08-16
Version
-------
1.1
"""
from OpsUtils import OpsUtils
import ipywidgets as widgets
from IPython.display import display, clear_output
job_out = widgets.Output()
job_accordion = widgets.Accordion(children=[job_out])
job_accordion.selected_index = 0
display(job_accordion)
job_accordion.set_title(0, f'Job Run ....')
with job_out:
desc_out = widgets.Output()
desc_accordion = widgets.Accordion(children=[desc_out])
# desc_accordion.selected_index = 0
desc_accordion.set_title(0, f'Job Input')
display(desc_accordion)
with desc_out:
if not job_description:
print('Creating job_description')
job_description = OpsUtils.get_tapis_job_description(t, tapisInput)
print('job_description:',OpsUtils.display_tapis_results(job_description))
if job_description == -1:
return {"runJobStatus": "Incomplete"}
submit_out = widgets.Output()
submit_accordion = widgets.Accordion(children=[submit_out])
# submit_accordion.selected_index = 0
submit_accordion.set_title(0, f'Submit Returned Data')
with submit_out:
returnDict = OpsUtils.submit_tapis_job(t, job_description, askConfirmJob)
OpsUtils.display_tapis_results(returnDict)
display(submit_accordion)
if returnDict.get("runJobStatus") == "Submitted":
monitor_out = widgets.Output()
monitor_accordion = widgets.Accordion(children=[monitor_out])
monitor_accordion.selected_index = 0
monitor_accordion.set_title(0, f'Monitor Job')
display(monitor_accordion)
with monitor_out:
print("job_start_time:", returnDict.get("job_start_time"))
jobUuid = returnDict.get("jobUuid")
job_accordion.set_title(0, f'Job Run: {jobUuid} ...')
JobHistory = {}
JobMetadata = {}
JobFiledata = {}
JobStatusData = {}
if monitor_job and jobUuid:
with monitor_out:
OpsUtils.monitor_tapis_job(t, jobUuid, returnDict.get("job_start_time"), askConfirmMonitorRT)
# Always fetch basic status after monitoring
JobStatusData = OpsUtils.get_tapis_job_status(t, jobUuid, tapisInput,return_values=True)
job_accordion.set_title(0, f'Job : {jobUuid} {JobStatusData.status} {JobStatusData.condition}')
# Optional enrichments
if get_job_metadata:
JobMetadata = OpsUtils.get_tapis_job_metadata(t, jobUuid, tapisInput)
if get_job_history:
JobHistory = OpsUtils.get_tapis_job_history_data(t, jobUuid)
if get_job_filedata:
JobFiledata = OpsUtils.get_tapis_job_all_files(t, jobUuid)
# Augment return object
returnDict["job_description"] = job_description
returnDict["JobHistory"] = JobHistory
returnDict["JobMetadata"] = JobMetadata
returnDict["JobFiledata"] = JobFiledata
returnDict["JobStatusData"] = JobStatusData
returnDict["runJobStatus"] = "Finished"
job_accordion.set_title(0, f'Job Run: {jobUuid} done!')
return returnDict
::contentReference[oaicite:0]{index=0}