#api #istio #istio-api-rs

istio-api-rs

A collection of CRDs for api used in Istio

10 breaking releases

0.11.0 Nov 30, 2024
0.9.0 May 26, 2024
0.7.0 Nov 24, 2023
0.4.0 Mar 23, 2023
0.2.0 Sep 1, 2022

#654 in Network programming

Download history 11/week @ 2024-12-14 3/week @ 2025-02-15 11/week @ 2025-02-22

764 downloads per month

Apache-2.0

4MB
77K SLoC

istio-api-rs

A collection of CRDs used in Istio, generated by kopium directly from istio CRDs.

Quick Start

istio-api-rs is built on top of kube-rs as a set of CRDs, which means it can be easily used under kube_rs like below:

use istio_api_rs::networking::v1beta1::{
    destination_rule::*,
    gateway::*,
    virtual_service::*,
};
use kube::{
    api::ListParams,
    client::ConfigExt,
    Api, Client, Config,
};
use hyper_util::rt::TokioExecutor;
use tower::{BoxError, ServiceBuilder};

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let kube_config = Config::infer().await?;
    let https = kube_config.rustls_https_connector()?;

    tracing_subscriber::fmt::init();

    let service = ServiceBuilder::new()
        .layer(kube_config.base_uri_layer())
        .option_layer(kube_config.auth_layer()?)
        .map_err(BoxError::from)
        .service(hyper_util::client::legacy::Client::builder(TokioExecutor::new()).build(https));
    let client = Client::new(service, kube_config.default_namespace);
    let list_opt = ListParams::default();

    let gws: Api<Gateway> = Api::namespaced(client.clone(), "default");
    for gw in gws.list(&list_opt).await? {
        println!("Found Gateway: {}", gw.metadata.name.unwrap());
    }

    let drs: Api<DestinationRule> = Api::namespaced(client.clone(), "default");
    for dr in drs.list(&list_opt).await? {
        println!("Found Destination Rule: {}", dr.metadata.name.unwrap());
    }

    let vss: Api<VirtualService> = Api::namespaced(client.clone(), "default");
    for vs in vss.list(&list_opt).await? {
        let content = serde_yaml::to_string(&vs).unwrap();
        println!("Found Virtual Service with YAML content: {}", content);
    }

    Ok(())
}

And in cargo.toml, you should specify the API version for both k8s & istio like:

[dependencies]
# ...
tokio = { version = "1", features = ["full"] }
hyper-util = "0.1.10"
tower = "0.5.1"
rustls = "0.20"
anyhow = "1"
serde_yaml = "0.9"
tracing-subscriber = "0.3"
kube = { version = "0.96", features = ["runtime", "derive"] }
k8s-openapi = { version = "0.23", features = ["v1_31"] }
istio-api-rs = { version = "0.10.0", features = ["v1_23"] }
# ...

Other

istio-api-rs is currently developed and tested on istio/api since v1.10, the lower api version is out of this repository's concern.

The repository is using istio-api-rs-codegen as code generator, go check that repository if you want to know more about how the codes are generated.

For release package, see crates.io.

Dependencies

~37MB
~588K SLoC