Skip to main content

SSH-only Slurm cluster client library

Project description

slurmly

SSH-only Slurm client library for Python.

slurmly controls Slurm clusters by running the standard CLI (sbatch, squeue, sacct, scancel) over SSH against a login node. No REST API, no PySlurm, no C bindings — if you can ssh to the login node, you can drive jobs from Python.

  • Fully typed (Pydantic v2), async-first, framework-agnostic.
  • First-class support for job arrays, dependencies, batched status, artifacts, cleanup, and capability detection.
  • Observable via typed hooks; testable with an in-memory FakeTransport (no SSH or cluster required).

Installation

pip install slurmly

Requires Python 3.11+. Runtime dependencies: asyncssh>=2.14, pydantic>=2.5, PyYAML>=6.0.


Quickstart

import asyncio
from slurmly import SlurmSSHClient, JobSpec

async def main():
    async with SlurmSSHClient.connect(
        host="login.example.edu",
        username="myuser",
        key_path="~/.ssh/cluster_ed25519",       # absolute paths work too
        account="my_allocation",
    ) as client:
        job = await client.submit(JobSpec(
            name="hello",
            command_template="echo hi from $HOSTNAME",
            partition="shared",
            time_limit="00:01:00",
        ))
        info = await client.get_job(job.slurm_job_id, submitted_at=job.submitted_at)
        print(job.slurm_job_id, info.lifecycle)

asyncio.run(main())

That's the whole API. For polling loops, log tailing, arrays, dependencies, artifacts, and cleanup, see docs/cookbook.md.

Loading from a config file (optional)

If you'd rather keep configuration out of code, SlurmSSHClient.from_config(path) reads YAML, TOML, or JSON. See docs/configuration.md for the full schema. Minimal slurmly.yaml:

ssh:
  host: login.example.edu
  username: myuser
  key_path: ~/.ssh/cluster_ed25519   # private key (not .pub)

slurm:
  account: my_allocation
  # remote_base_dir defaults to ~/slurmly when omitted
async with SlurmSSHClient.from_config("slurmly.yaml") as client:
    ...

Features

Capability Entry point
Submit a job client.submit(spec)
Render-only (no SSH) client.render_only(spec)
Cancel / signal client.cancel(job_id, signal=...)
Tail stdout / stderr client.tail_stdout(job), client.tail_stderr(job)
Get a single status client.get_job(job_id, submitted_at=...)
Get many statuses (batched) client.get_jobs([id1, id2, ...])
Polling helpers client.poll_job(...), PollingPolicy, is_terminal(...)
Capability probe client.detect_capabilities()
Job arrays JobSpec(array="0-99%10", command_template=...)
Typed dependencies JobDependency(type="afterok", job_ids=[...])
List / download artifacts client.list_artifacts(job), client.download_artifact(job, ...)
Plan / execute remote cleanup client.plan_cleanup(...), client.cleanup(plan)
Observability hooks Subclass SlurmlyHooks, pass to constructor
In-memory testing from slurmly.testing import FakeTransport

Documentation

Topic File
API reference docs/api-reference.md
Configuration files (YAML/TOML/JSON) docs/configuration.md
Purdue Anvil guide docs/anvil.md
Cookbook (patterns & recipes) docs/cookbook.md

License

MIT.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

slurmly-0.1.2.tar.gz (68.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

slurmly-0.1.2-py3-none-any.whl (49.1 kB view details)

Uploaded Python 3

File details

Details for the file slurmly-0.1.2.tar.gz.

File metadata

  • Download URL: slurmly-0.1.2.tar.gz
  • Upload date:
  • Size: 68.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for slurmly-0.1.2.tar.gz
Algorithm Hash digest
SHA256 c88dc2a78a8954c2855e0847140037a67c3fc6a49cd9164b744353ec875746f8
MD5 3b78b174883a58b3c244732638cac840
BLAKE2b-256 e7a6d9ce937ffe46bacae23e32d814b9597b9575fcbb041a7b8dd744cc45eac5

See more details on using hashes here.

File details

Details for the file slurmly-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: slurmly-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 49.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for slurmly-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 57043db64a7b668b86ce2df6bd471a0e2c6ddca4868bbb05502f7b8c480c5827
MD5 24e18bc43677205a73511d22dc2c8f4d
BLAKE2b-256 8056548eb8c613f11e93c99238f88defa60dfe50549f2f202df1760cb56167bc

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page