cloudflare-dns-operator 0.1.11

Kubernetes operator to manage Cloudflare DNS records
Documentation
use crate::resources::CloudflareDNSRecord;
use chrono::prelude::*;
use k8s_openapi::apimachinery::pkg::apis::meta::v1::{
    Condition,
    Time,
};

pub(crate) fn error_condition(
    current: &CloudflareDNSRecord,
    reason: impl ToString,
    message: impl ToString,
    observed_generation: Option<i64>,
) -> Condition {
    let conditions = current.status.as_ref().and_then(|status| status.conditions.as_ref());

    let (was_ready, last_condition) = last_ready_condition(conditions);

    let last_transition_time = if was_ready {
        Time(Utc::now())
    } else {
        last_condition
            .map(|condition| condition.last_transition_time.clone())
            .unwrap_or_else(|| Time(Utc::now()))
    };

    Condition {
        type_: "Ready".to_string(),
        status: "False".to_string(),
        reason: reason.to_string(),
        message: message.to_string(),
        last_transition_time,
        observed_generation,
    }
}

pub(crate) fn success_condition(current: &CloudflareDNSRecord, observed_generation: Option<i64>) -> Condition {
    let conditions = current.status.as_ref().and_then(|status| status.conditions.as_ref());

    let (was_ready, last_condition) = last_ready_condition(conditions);

    let last_transition_time = if !was_ready {
        Time(Utc::now())
    } else {
        last_condition
            .map(|condition| condition.last_transition_time.clone())
            .unwrap_or_else(|| Time(Utc::now()))
    };

    Condition {
        type_: "Ready".to_string(),
        status: "True".to_string(),
        reason: "Sucessfully applied changes".to_string(),
        message: "DNS record ready".to_string(),
        last_transition_time,
        observed_generation,
    }
}

fn last_ready_condition(conditions: Option<&Vec<Condition>>) -> (bool, Option<&Condition>) {
    let (was_ready, last_condition) = conditions.map_or((true, None), |conditions| {
        let ready_cond = conditions.iter().find(|condition| condition.type_ == "Ready");
        (
            ready_cond.map_or(false, |condition| condition.status == "True"),
            ready_cond,
        )
    });
    (was_ready, last_condition)
}