Skip to main content

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 identifier
  • get_workflow_inputs(mandatory=False) - Get workflow input parameters
  • get_max_cores() - Get maximum CPU cores from CWL
  • get_max_ram() - Get maximum RAM from CWL
  • get_volume_size(unit='Gi') - Calculate volume size (supports Mi/Gi)
  • assert_parameters(mandatory=True) - Validate required inputs
  • get_processing_parameters() - Get execution parameters
  • get_namespace_name() - Generate unique namespace name
  • update_status(progress, message) - Update execution status
  • prepare() - Pre-execution preparation with hooks
  • finalize(log, output, usage_report, tool_logs) - Post-execution finalization

Abstract methods (to implement):

  • wrap() - Wrap CWL with stage-in/stage-out
  • execute() - 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)

Source distribution for zoo-runner-common 0.1.3
File Size Uploaded
zoo_runner_common-0.1.3.tar.gz 12.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for zoo-runner-common 0.1.3
File Interpreter ABI Platform
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 log

Release 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

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page