app.json#
Here’s a detailed walkthrough of each field in the app.json file for the OpenSees-express Tapis App.
https://github.com/TACC/WMA-Tapis-Templates/blob/main/applications/opensees-express/app.json
App-Definition File#
app.json
The following json was copied from github and may have changed.
{
"id": "opensees-express",
"version": "latest",
"description": "OpenSees-EXPRESS provides users with a sequential OpenSees interpreter. It is ideal to run small sequential scripts on DesignSafe resources freeing up your own machine.",
"owner": "${apiUserId}",
"enabled": true,
"runtime": "ZIP",
"runtimeVersion": null,
"runtimeOptions": null,
"containerImage": "tapis://cloud.data/corral/tacc/aci/CEP/applications/v3/opensees/latest/OpenSees-EXPRESS/opensees_express.zip",
"jobType": "FORK",
"maxJobs": -1,
"maxJobsPerUser": -1,
"strictFileInputs": true,
"jobAttributes": {
"execSystemConstraints": null,
"execSystemId": "wma-exec-01",
"execSystemExecDir": "${JobWorkingDir}",
"execSystemInputDir": "${JobWorkingDir}",
"execSystemOutputDir": "${JobWorkingDir}",
"execSystemLogicalQueue": null,
"archiveSystemId": "cloud.data",
"archiveSystemDir": "/tmp/${JobOwner}/tapis-jobs-archive/${JobCreateDate}/${JobName}-${JobUUID}",
"archiveOnAppError": true,
"isMpi": false,
"mpiCmd": null,
"cmdPrefix": null,
"parameterSet": {
"appArgs": [],
"containerArgs": [],
"schedulerOptions": [],
"envVariables": [
{
"key": "mainProgram",
"value": "OpenSees",
"description": "Choose the OpenSees binary to use.",
"inputMode": "REQUIRED",
"notes": {
"label": "Main Program",
"enum_values": [
{
"OpenSees": "OpenSees"
},
{
"OpenSeesSP": "OpenSeesSP"
},
{
"OpenSeesMP": "OpenSeesMP"
}
]
}
},
{
"key": "tclScript",
"value": "",
"description": "The filename of the OpenSees TCL script to execute, e.g. \"freeFieldEffective.tcl\".",
"inputMode": "REQUIRED",
"notes": {
"label": "Main Script",
"inputType": "fileInput"
}
}
],
"archiveFilter": {
"includes": [],
"excludes": [
"opensees-express.zip",
"tapisjob.env"
],
"includeLaunchFiles": true
}
},
"fileInputs": [
{
"name": "Input Directory",
"inputMode": "REQUIRED",
"sourceUrl": null,
"targetPath": "*",
"envKey": "inputDirectory",
"description": "Input directory that includes the tcl script as well as any other required files. Example input is in tapis://designsafe.storage.community/app_examples/opensees/OpenSeesEXPRESS",
"notes": {
"selectionMode": "directory"
}
}
],
"fileInputArrays": [],
"maxMinutes": 1440,
"subscriptions": [],
"tags": []
},
"tags": [
"portalName: DesignSafe",
"portalName: CEP"
],
"notes": {
"label": "OpenSees-EXPRESS (VM)",
"helpUrl": "https://www.designsafe-ci.org/user-guide/tools/simulation/#opensees-user-guide",
"hideNodeCountAndCoresPerNode": true,
"isInteractive": false,
"icon": "OpenSees",
"category": "Simulation"
}
}
Basic App Metadata#
Field |
Purpose |
|---|---|
|
Unique identifier for this app within Tapis (e.g., |
|
Version string (e.g., |
|
A short user-facing explanation of what the app does |
|
The Tapis user ID that owns this app (in this case, a variable |
|
Whether the app is active and visible for use |
Runtime & Container Setup#
Field |
Purpose |
|---|---|
|
Set to |
|
Tapis path to the zipped runtime package (this is hosted in the TACC |
|
|
|
Limits on concurrent job submissions (−1 means unlimited) |
|
If |
Job Execution Attributes (jobAttributes)#
This section controls how and where the job is run:
Field |
Purpose |
|---|---|
|
The registered Tapis system (here, |
|
All point to |
|
Where results are stored after the job finishes (here, |
|
Path format for archived output, with dynamic variables like |
|
Whether outputs should still be archived even if the job errors out ( |
|
Set to |
|
Max walltime allowed (in minutes); |
Parameters (parameterSet.envVariables)
These are app parameters passed as environment variables:
| Key | Value | | ------------------- | ---------------------------------------------------------- | | `key` | `"mainProgram"` — defines which OpenSees binary to run | | `value` | Default: `"OpenSees"` | | `inputMode` | `"REQUIRED"` | | `notes.enum_values` | Options include `OpenSees`, `OpenSeesSP`, and `OpenSeesMP` | → Although this app is called `OpenSees-express`, it seems the template allows flexibility to run other OpenSees binaries as well (if present in the container).
| Key | Value | | ----------------- | -------------------------------------------------------- | | `key` | `"tclScript"` — the specific `.tcl` script to run | | `value` | Empty by default — user must provide a script name | | `inputMode` | `"REQUIRED"` | | `notes.inputType` | `"fileInput"` — this gets linked to uploaded input files |
File Inputs (fileInputs)
The app expects a directory of inputs:
Field
Description
name"Input Directory"— shown in the UIinputMode"REQUIRED"— user must supply this folderenvKey"inputDirectory"— used in the wrapper scriptnotes.selectionMode"directory"— user selects a full directory, not individual filesArchive Filter (archiveFilter)
Controls what gets archived (i.e., saved after job completion):
Field
Purpose
includesEmpty — archive everything by default
excludes"opensees-express.zip","tapisjob.env"— avoids cluttering the archive with setup filesincludeLaunchFilestrue— includes wrapper script and job manifest (for reproducibility)
Notes and UI Metadata#
Field |
Description |
|---|---|
|
|
|
Link to user documentation |
|
|
|
|
|
|
|
|
Summary#
This app.json makes OpenSees-express:
A single-node, single-script app
Designed to run inside a ZIP-based Docker container
Configured for portable, containerized execution on a small VM or cloud system
Easy to use: users just upload a folder with a
.tclfile and specify which file to run