k8s-openapi-ext 0.27.3

Collection of fluent builder traits for Kubernetes objects
Documentation
use super::*;

pub trait ServiceGetExt {
    fn spec(&self) -> Option<&corev1::ServiceSpec>;
    fn status(&self) -> Option<&corev1::ServiceStatus>;

    fn cluster_ip(&self) -> Option<&str> {
        self.spec()?.cluster_ip.as_deref()
    }

    fn cluster_ips(&self) -> Option<&[String]> {
        self.spec()?.cluster_ips.as_deref()
    }

    fn ports(&self) -> Option<&[corev1::ServicePort]> {
        self.spec()?.ports.as_deref()
    }

    fn port(&self, name: &str) -> Option<&corev1::ServicePort> {
        self.ports()?
            .iter()
            .find(|port| port.name.as_deref() == Some(name))
    }

    fn external_name(&self) -> Option<&str> {
        self.spec()?.external_name.as_deref()
    }

    fn external_ips(&self) -> Option<&[String]> {
        self.spec()?.external_ips.as_deref()
    }

    fn selector(&self) -> Option<&BTreeMap<String, String>> {
        self.spec()?.selector.as_ref()
    }

    fn r#type(&self) -> Option<&str> {
        self.spec()?.type_.as_deref()
    }

    fn load_balancer_ingress(&self) -> Option<&[corev1::LoadBalancerIngress]> {
        self.status()?
            .load_balancer
            .as_ref()
            .and_then(|lb| lb.ingress.as_deref())
    }

    fn is_cluster_ip(&self) -> bool;

    fn is_external_name(&self) -> bool;

    fn is_node_port(&self) -> bool;

    fn is_load_balancer(&self) -> bool;

    fn conditions(&self) -> Option<&[metav1::Condition]> {
        self.status()?.conditions.as_deref()
    }
}

impl ServiceGetExt for corev1::Service {
    fn spec(&self) -> Option<&corev1::ServiceSpec> {
        self.spec.as_ref()
    }

    fn status(&self) -> Option<&corev1::ServiceStatus> {
        self.status.as_ref()
    }

    fn is_cluster_ip(&self) -> bool {
        self.r#type()
            .is_none_or(|r#type| r#type == <Self as ServiceExt>::CLUSTER_IP)
    }

    fn is_external_name(&self) -> bool {
        self.r#type()
            .is_some_and(|r#type| r#type == <Self as ServiceExt>::EXTERNAL_NAME)
    }

    fn is_node_port(&self) -> bool {
        self.r#type()
            .is_some_and(|r#type| r#type == <Self as ServiceExt>::NODE_PORT)
    }

    fn is_load_balancer(&self) -> bool {
        self.r#type()
            .is_some_and(|r#type| r#type == <Self as ServiceExt>::LOAD_BALANCER)
    }
}