Expand description
Rust client for the Armada batch-job scheduler.
This crate provides an async gRPC client for submitting and monitoring batch jobs on an Armada cluster. It is built on top of tonic and exposes a small, ergonomic API that can be shared across async tasks without locking.
§Quick start
use armada_client::k8s::io::api::core::v1::{Container, PodSpec};
use armada_client::{
ArmadaClient, JobRequestItemBuilder, JobSubmitRequest, StaticTokenProvider,
};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// 1. Connect (plaintext). Use `connect_tls` for production clusters.
let client = ArmadaClient::connect(
"http://localhost:50051",
StaticTokenProvider::new("my-token"),
)
.await?;
// 2. Build a job item — pod spec required before `.build()` compiles.
let pod_spec = PodSpec {
containers: vec![Container {
name: Some("main".into()),
image: Some("busybox:latest".into()),
command: vec!["echo".into()],
args: vec!["hello".into()],
..Default::default()
}],
..Default::default()
};
let item = JobRequestItemBuilder::new()
.namespace("default")
.priority(1.0)
.pod_spec(pod_spec)
.build();
// 3. Submit.
let response = client
.submit(JobSubmitRequest {
queue: "my-queue".into(),
job_set_id: "my-job-set".into(),
job_request_items: vec![item],
})
.await?;
for r in &response.job_response_items {
println!("job_id={}", r.job_id);
}
Ok(())
}§Features
| Feature | How to use |
|---|---|
| Plaintext connection | ArmadaClient::connect |
| TLS connection (system roots) | ArmadaClient::connect_tls |
| Per-call timeout | ArmadaClient::with_timeout |
| Job submission | ArmadaClient::submit |
| Event streaming | ArmadaClient::watch |
| Static bearer token | StaticTokenProvider |
| Custom auth (OIDC, OAuth2…) | Implement TokenProvider |
| Compile-time safe job builder | JobRequestItemBuilder |
§Kubernetes proto types
Armada job specs embed Kubernetes PodSpec and related types. These are
generated from the upstream k8s protobufs and re-exported under the
k8s module, mirroring the proto package hierarchy:
ⓘ
use armada_client::k8s::io::api::core::v1::{Container, PodSpec, ResourceRequirements};
use armada_client::k8s::io::apimachinery::pkg::api::resource::Quantity;§Cloning and concurrent use
ArmadaClient is Clone. All clones share the same underlying
connection pool — cloning is cheap and the correct way to use the client
across multiple tasks:
let client = ArmadaClient::connect("http://localhost:50051", StaticTokenProvider::new("tok"))
.await?;
let c1 = client.clone();
let c2 = client.clone();
tokio::join!(
async move { /* use c1 */ },
async move { /* use c2 */ },
);Re-exports§
pub use api::EventMessage;pub use api::EventStreamMessage;pub use api::JobSubmitRequest;pub use api::JobSubmitRequestItem;pub use api::JobSubmitResponse;pub use auth::BasicAuthProvider;pub use auth::StaticTokenProvider;pub use auth::TokenProvider;pub use builder::JobRequestItemBuilder;pub use client::ArmadaClient;pub use error::Error;