zoo-runner-common
A shared utility library for ZOO-Project CWL runners – centralizing reusable components across runners like Calrissian, Argo Workflows, and WES.
Overview
The zoo-runner-common repository provides core shared components used across multiple ZOO CWL runners. It eliminates code duplication by hosting:
- Common base class (
BaseRunner) with 8+ shared methods - Zoo-specific configuration handlers (
ZooConf,ZooInputs,ZooOutputs) - CWL workflow parsing and resource evaluation (
CWLWorkflow) - Execution handler interface (
ExecutionHandler) for hooks - Service stubs (
ZooStub) to communicate with ZOO kernel
Key Benefits
- ✅ ~437 lines of code duplication eliminated across 3 runners
- ✅ Single source of truth for common functionality
- ✅ Easier maintenance - fix once, benefit everywhere
- ✅ Consistent behavior across all runners
Directory Structure
zoo-runner-common/
├── base_runner.py # Abstract BaseRunner with common methods
├── zoo_conf.py # ZooConf, ZooInputs, ZooOutputs, CWLWorkflow
├── handlers.py # ExecutionHandler abstract base class
├── zoostub.py # ZooStub for ZOO kernel communication
└── __init__.py # Package initialization
Installation
As a dependency (recommended)
Add to your runner's pyproject.toml:
[project]
dependencies = [
"zoo-runner-common @ git+https://github.com/ZOO-Project/zoo-runner-common.git@main",
]
Local development
export PYTHONPATH="$PYTHONPATH:/path/to/zoo-runner-common"
Or use relative imports:
import sys
sys.path.insert(0, os.path.abspath('../zoo-runner-common'))
from base_runner import BaseRunner
from zoo_conf import ZooConf, ZooInputs, ZooOutputs, CWLWorkflow
from handlers import ExecutionHandler
Components
BaseRunner (base_runner.py)
Abstract base class providing common functionality for all CWL runners:
Methods provided:
get_workflow_id()- Get workflow identifierget_workflow_inputs(mandatory=False)- Get workflow input parametersget_max_cores()- Get maximum CPU cores from CWLget_max_ram()- Get maximum RAM from CWLget_volume_size(unit='Gi')- Calculate volume size (supports Mi/Gi)assert_parameters(mandatory=True)- Validate required inputsget_processing_parameters()- Get execution parametersget_namespace_name()- Generate unique namespace nameupdate_status(progress, message)- Update execution statusprepare()- Pre-execution preparation with hooksfinalize(log, output, usage_report, tool_logs)- Post-execution finalization
Abstract methods (to implement):
wrap()- Wrap CWL with stage-in/stage-outexecute()- Execute the workflow
Zoo Configuration Classes (zoo_conf.py)
| Class | Description |
|---|---|
ZooConf |
Wraps ZOO configuration dictionary |
ZooInputs |
Handles input parameter conversion and validation |
ZooOutputs |
Manages output parameters |
CWLWorkflow |
Parses CWL, evaluates resources, handles scatter |
ResourceRequirement |
CWL resource hints dataclass |
Key Features:
- Advanced type conversion (int, float, bool, arrays)
- File handling with format metadata
- OGC bounding box support
- NULL value handling
- Array inputs with
isArray
ExecutionHandler (handlers.py)
Abstract base class for execution customization:
class ExecutionHandler(ABC):
@abstractmethod
def pre_execution_hook(self): pass
@abstractmethod
def post_execution_hook(self, log, output, usage_report, tool_logs): pass
@abstractmethod
def get_secrets(self): pass
@abstractmethod
def get_pod_env_vars(self): pass
@abstractmethod
def get_pod_node_selector(self): pass
@abstractmethod
def handle_outputs(self, log, output, usage_report, tool_logs): pass
@abstractmethod
def get_additional_parameters(self): pass
Usage Example
from zoo_runner_common.base_runner import BaseRunner
from zoo_runner_common.handlers import ExecutionHandler
class MyCustomRunner(BaseRunner):
def wrap(self):
# Implement CWL wrapping logic
return wrapped_cwl
def execute(self):
# Prepare execution
cwljob = self.prepare()
# Execute workflow (custom logic)
result = my_executor.run(cwljob.cwl, cwljob.params)
# Finalize
self.finalize(log, output, usage_report, tool_logs)
return result
Runners Using zoo-runner-common
| Runner | Backend | Repository |
|---|---|---|
| zoo-calrissian-runner | Calrissian/Kubernetes | EOEPCA/zoo-calrissian-runner |
| zoo-argowf-runner | Argo Workflows | ZOO-Project/zoo-argowf-runner |
| zoo-wes-runner | WES/TOIL | ZOO-Project/zoo-wes-runner |
Module Reference
| Module | Description |
|---|---|
| BaseRunner | Abstract runner blueprint all runners must extend |
| ZooConf | Parses conf.json, manages job ID, state |
| ZooInputs | Parses inputs.json, formats CWL-style parameters |
| ZooOutputs | Handles writing and setting output results |
| CWLWorkflow | Loads, parses, and analyzes CWL workflows |
| ResourceRequirement | Parses and evaluates CWL resource hints/requirements |
| wrapper_utils | Provides helper to build wrapped CWL pipeline |
| ZooStub | Interacts with ZOO's lenv for progress updates |
Used By
- zoo-wes-runner
- zoo-argowf-runner
- zoo-calrissian-runner
Metadata
Release files for zoo-runner-common 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| zoo_runner_common-0.1.3.tar.gz | 12.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| zoo_runner_common-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 24.2 kB
Release files / zoo_runner_common-0.1.3.tar.gz
| Download URL | zoo_runner_common-0.1.3.tar.gz |
|---|---|
| Size | 12.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
7b93cf37800408e53eb5864f21ffb32441136b0be9e1ef1a4495293fce00169a
|
|
BLAKE2b-256 checksum How to use checksums |
64784a52d952da45a8f8daeb2f0af5db5b1f53fff90b6ced016a90bededec2af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 21, 2026.
Transparency logRelease files / zoo_runner_common-0.1.3-py3-none-any.whl
| Download URL | zoo_runner_common-0.1.3-py3-none-any.whl |
|---|---|
| Size | 11.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
9aeb829950074a34c8cae8ac9b797843be1e3274e5b705ed095936e1dc52799b
|
|
BLAKE2b-256 checksum How to use checksums |
2ad4ec313530c8ea79fa2564604634d108a085402c3ab9ebe081d1f6aa8c2bc7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jan 21, 2026.
Transparency log