gateway-api 0.21.0

Kubernetes Gateway API bindings in Rust
Documentation
use gateway_api::{
    constants::{GatewayConditionReason, GatewayConditionType, ListenerConditionReason, ListenerConditionType},
    gateways::{Gateway, GatewaySpec, GatewayStatus, GatewayStatusAddresses, GatewayStatusListeners},
};
use k8s_openapi::{
    apimachinery::pkg::apis::meta::v1::{Condition, Time},
    jiff::Timestamp,
};
use kube::{
    Api,
    api::{Patch, PatchParams, PostParams},
    core::ObjectMeta,
};
use serde_json::json;

use crate::common;

#[ignore]
#[tokio::test]
async fn crud_with_status() {
    let client = common::client().await;

    let gw = Gateway {
        metadata: ObjectMeta {
            name: Some("test-gateway".into()),
            ..Default::default()
        },
        spec: GatewaySpec {
            gateway_class_name: "test-gateway-class".into(),
            ..Default::default()
        },
        status: None,
    };

    let created = Api::default_namespaced(client.clone())
        .create(&PostParams::default(), &gw)
        .await
        .expect("failed to create Gateway");

    assert!(created.metadata.name.is_some());
    assert!(created.metadata.uid.is_some());

    let status = GatewayStatus {
        addresses: Some(vec![GatewayStatusAddresses::default()]),
        attached_listener_sets: None,
        listeners: Some(vec![GatewayStatusListeners {
            name: "tcp".into(),
            attached_routes: 0,
            supported_kinds: Some(vec![]),
            conditions: vec![Condition {
                last_transition_time: Time(Timestamp::now()),
                message: "testing gateway".into(),
                observed_generation: Some(1),
                reason: ListenerConditionReason::Programmed.to_string(),
                status: "True".into(),
                type_: ListenerConditionType::Programmed.to_string(),
            }],
        }]),
        conditions: Some(vec![Condition {
            last_transition_time: Time(Timestamp::now()),
            message: "testing gateway".into(),
            observed_generation: Some(1),
            reason: GatewayConditionReason::Programmed.to_string(),
            status: "True".into(),
            type_: GatewayConditionType::Programmed.to_string(),
        }]),
    };

    let patched: Gateway = Api::default_namespaced(client.clone())
        .patch_status(
            "test-gateway",
            &PatchParams::default(),
            &Patch::Merge(json!({ "status": status })),
        )
        .await
        .expect("failed to patch Gateway status");

    let s = patched.status.expect("status should be set");
    assert!(s.addresses.is_some());
    assert!(s.listeners.is_some());
    assert!(s.conditions.is_some());
}