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.1.tar.gz (68.4 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.1-py3-none-any.whl (49.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: slurmly-0.1.1.tar.gz
  • Upload date:
  • Size: 68.4 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.1.tar.gz
Algorithm Hash digest
SHA256 156c108d3764e4af3fcdbc29be9a485b1884753ea231cc7f2ea9a35b85e5844e
MD5 473f1d15c5ea9216e231a8a376582479
BLAKE2b-256 cdce1a3d58d172c5460e475c94b35a6eb195581d7f015a1b987b85faf1d2dfef

See more details on using hashes here.

File details

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

File metadata

  • Download URL: slurmly-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 49.0 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e35ef5fa30527abf93072a25ba3337d622304cb2fdd0979734cf8255503bdc28
MD5 f219dbe4163d82fed437312264783aa9
BLAKE2b-256 c0164661b78f9396ec51de86f387353045c92c8084999f6d6c92bfeeaa56129b

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