Skip to main content

Beampipe

CI Release v0.5.2 Python 3.10 or newer DALiuGE 6.6 and 6.7 compatible

beampipe-palette provides the two project-neutral native DALiuGE applications that connect a portable graph to Beampipe Core: one injects Core's immutable execution manifest at the graph boundary, and one verifies durable outputs at the terminal boundary.

What it does

  • Manifest ingress: beampipe-ingest receives inline JSON injected by Core, canonicalizes it, and emits it once through a path-backed FileDROP.
  • Durable publication: beampipe-publish independently discovers every required output, publishes each object create-only, reads it back, and verifies its SHA-256.
  • Trusted completion evidence: the publisher emits beampipe-output-inventory/v1 to DALiuGE and writes the byte-identical receipt to an attempt-scoped session handoff.
  • Callback-free remote runs: Core retrieves the receipt over its existing SSH/SFTP control connection after Slurm completion. Graphs contain no Core URL, bearer token, storage credential, or project-specific topology.

Native DALiuGE components

Terminal-style beampipe-ingest and beampipe-publish DALiuGE application nodes with their manifest, completion, and inventory ports

beampipe-ingest and beampipe-publish are native BarrierAppDROP applications—not PyFunc snippets. Their graph-facing contracts stay deliberately small; Core and the selected deployment profile supply execution details outside the logical graph.

Manifest entering beampipe-ingest

{
  "inputs": {},
  "sources": [{
    "source_identifier": "source-1",
    "groups": [{
      "group_key": "group-1",
      "records": [{
        "record_id": "record-1",
        "access_url": "https://data.example/record-1"
      }]
    }]
  }],
  "_beampipe": {
    "selection": [{
      "source_identifier": "source-1",
      "group_key": "group-1",
      "record_ids": ["record-1"]
    }]
  }
}

Inventory emitted by beampipe-publish

{
  "schema": "beampipe-output-inventory/v1",
  "execution_id":
    "607fd31f-db2a-4978-a64f-ef8ce412483a",
  "execution_attempt": 0,
  "patterns": ["**/result.bin"],
  "pattern_counts": {"**/result.bin": 1},
  "products": [{
    "path": "products/result.bin",
    "bytes": 1048576,
    "sha256":
      "a40f3e3d82fd741d64da75530ccb205588b8fbb5a5fbd7d52f18a77ef85d5e60"
  }],
  "inventory_sha256":
    "5efa576ea4393a413c121862a75efcb5086cffa4b651ec77178dfa1c8caa07ce",
  "durable_destination_uri":
    "file:///srv/products/executions/607fd31f-db2a-4978-a64f-ef8ce412483a/attempt-0",
  "publication": {
    "acknowledged": true,
    "publisher": "beampipe-publish",
    "receipt_id":
      "beampipe-publish/v1:5efa576ea4393a413c121862a75efcb5086cffa4b651ec77178dfa1c8caa07ce",
    "published_at": "2026-08-27T10:32:16Z"
  }
}

The examples show the stable project-neutral fields. Real manifests may add project-owned record metadata, while real inventories contain one entry for every selected product and the exact hashes observed after durable read-back.

Where the nodes go

Terminal-style DALiuGE graph flow showing Core manifest into beampipe-ingest, the project graph and completion barrier, then beampipe-publish and the inventory receipt retrieved by Core
  • Put beampipe-ingest at the graph boundary. Core patches its manifest_path setting with the immutable execution manifest. Connect its single manifest_bytes FileDROP to the first project application that needs those bytes.
  • Put beampipe-publish after the project-owned completion barrier. The barrier must become complete only after every required output is closed and stable. Connect the publisher's inventory output to one terminal FileDROP.
  • Do not draw a callback edge to Core. On remote Slurm deployments the publisher writes the canonical handoff inside the session; Core pulls and verifies it after the scheduler reports completion.

First-time setup

Python 3.10 or newer is required. Install the validated public release into the same Python environment used by every DALiuGE execution node:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install \
  https://github.com/jbwod/beampipe-palette/releases/download/v0.5.2/beampipe_palette-0.5.2-py3-none-any.whl
beampipe-publish --version

The released wheel is normally installed into an existing DALiuGE runtime. A source checkout can create a self-contained DALiuGE 6.x environment with python -m pip install -e '.[daliuge]'.

Install the bounded S3 transport only on runtimes that select an S3 destination:

python -m pip install \
  'beampipe-palette[s3] @ https://github.com/jbwod/beampipe-palette/archive/refs/tags/v0.5.2.tar.gz'

Download or load the checked-in EAGLE palette:

https://raw.githubusercontent.com/jbwod/beampipe-palette/v0.5.2/daliuge/palettes/beampipe.palette

EAGLE graph contract

Load daliuge/palettes/beampipe.palette in EAGLE. The wheel also installs it at share/beampipe-palette/daliuge/palettes/beampipe.palette under the active Python prefix.

Component Field EAGLE usage Contract
beampipe-ingest manifest_path NoPort inline JSON from Core or an absolute manifest path
beampipe-ingest manifest_bytes OutputPort one path-backed FileDROP, pickle encoding
beampipe-publish completion InputPort one project-owned completion FileDROP
beampipe-publish inventory OutputPort one path-backed canonical inventory FileDROP
beampipe-publish expected_patterns_json NoPort project-owned JSON string array of required output globs

The Python classes are:

beampipe_palette.apps.BeampipeIngestApp
beampipe_palette.apps.BeampipePublishApp

The ingest output intentionally uses DALiuGE's pickle encoding. It wraps the canonical bytes with DALiuGE's own serialized-data envelope before the single pickle port write. This is the common named-port contract that returns exact bytes on both DALiuGE 6.6 and 6.7. The publisher uses path-backed FileDROPs directly and performs no second DROP write.

Projects must set expected_patterns_json explicitly. Matching is bounded and Core-compatible: * and ? stay within one path component, while ** is allowed only as a complete component. Character classes, brace expansion, embedded double-stars, traversal, backslashes, controls, and duplicates are rejected. The output tree is scanned once regardless of pattern count.

Runtime contract

Runtime details are environment variables, never graph fields:

Environment variable Meaning
BEAMPIPE_OUTPUT_ROOT source directory containing completed outputs
BEAMPIPE_OUTPUT_DESTINATION_URI base file:// or s3:// destination
BEAMPIPE_EXECUTION_ID canonical execution UUID
BEAMPIPE_EXECUTION_ATTEMPT zero-based locked Core retry_count
BEAMPIPE_OUTPUT_INVENTORY_HANDOFF_PATH required attempt-scoped receipt path prepared by the session transport

The durable destination is always namespaced as:

<base>/executions/<execution_uuid>/attempt-<retry_count>

The handoff path must be absolute, non-root, outside BEAMPIPE_OUTPUT_ROOT, free of symbolic-link components, and have an existing private parent. No Core URL, Core credential, storage secret, project identifier, or output pattern is embedded in the component.

Publication guarantees

  • Create-only writes: files, inventories, and handoffs are never overwritten. An existing byte-identical object is reused; conflicting evidence fails the run.
  • Read-back verification: every durable file or S3 object is retrieved in full and hashed before it is acknowledged.
  • Exact retries: a retry of the same execution attempt reuses the same canonical inventory bytes and publication timestamp. A later attempt has a separate immutable namespace.
  • Fail-closed evidence: missing patterns, empty outputs, symlinks, unsafe paths, oversized receipts, changed files, partial uploads, and mismatched prior evidence all fail publication.

Filesystem destinations use absolute, non-overlapping file:// roots. S3 destinations require beampipe-palette[s3], boto3 1.38 or newer, conditional single-object/multipart creation, and full object read-back. NGAS is not claimed until an adapter can provide authoritative file ID/version assignment and retrieval verification.

Development

The DALiuGE 6.7 Python component guide uses dlg_paletteGen with inline Doxygen metadata. Install the two system tools once on Debian/Ubuntu:

sudo apt-get install doxygen xsltproc
make virtualenv
make lint
make test
make palette-check
make docs
make build

Palette generation reads the EAGLE_START component descriptions in beampipe_palette/apps.py through pinned dlg_paletteGen 0.6.7, then canonicalizes IDs and timestamps so the checked EAGLE palette is deterministic.

The offline suite covers both native applications, canonical JSON, path and port policy, one-pass discovery, filesystem/S3 create-only publication, read-back hashes, exact retries, attempt isolation, session handoff, palette signature drift, and project-neutral defaults. CI additionally runs the native DALiuGE boundary regression against the released 6.6 engine and the pinned 6.7 source contract used by the linked 6.7 developer documentation.

Documentation

Task Page
Download the current wheel and source archive v0.5.2 release
Review the publication sequence Publisher guide
Import the components into EAGLE Checked-in palette
Contribute and run the local gates Contributing guide
Review template provenance Template notes

This repository was created from ICRAR's daliuge-component-template and retains its license.

Metadata

Release files for beampipe-palette 0.5.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for beampipe-palette 0.5.2
File Size Uploaded Provenance Actions
beampipe_palette-0.5.2.tar.gz 1.6 MB Without provenance Details for beampipe_palette-0.5.2.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for beampipe-palette 0.5.2
File Interpreter ABI Platform Actions
beampipe_palette-0.5.2-py3-none-any.whl Python 3 none any Details for beampipe_palette-0.5.2-py3-none-any.whl

Total release size: 1.7 MB

Release files / beampipe_palette-0.5.2.tar.gz

Download URL beampipe_palette-0.5.2.tar.gz
Size 1.6 MB
Tags Source
SHA-256 checksum
How to use checksums
975a3a81b6659a95574d4f43f2bfd2f4da8d77024e35320b478304f440695491
BLAKE2b-256 checksum
How to use checksums
4c8e517cc8f50c167db7e71a144b8b9e864f50162fa2924434648cca4c4a50dc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / beampipe_palette-0.5.2-py3-none-any.whl

Download URL beampipe_palette-0.5.2-py3-none-any.whl
Size 27.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b31185d5a55a1b66b3ddd46ec98bc208f7b4777999b7a090cc9250b2d0fce52e
BLAKE2b-256 checksum
How to use checksums
df747fc7e4b9ec6d445e2d3b12461a234cb93b9c4606570ef12f922b4d973813
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Security for beampipe-palette 0.5.2

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.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.5.2 This release

2 release files No provenance

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