pub struct DNSZoneStatusUpdater { /* private fields */ }Expand description
Centralized status updater for DNSZone resources.
This struct collects all status changes during reconciliation and applies them atomically in a single Kubernetes API call. This prevents the tight reconciliation loop caused by multiple status updates triggering multiple “object updated” events.
Pattern aligns with kube-condition project for future migration.
§Example
use bindy::reconcilers::status::DNSZoneStatusUpdater;
async fn reconcile(client: Client, zone: DNSZone) -> Result<()> {
let mut status_updater = DNSZoneStatusUpdater::new(&zone);
// Collect status changes in memory
status_updater.set_condition("Progressing", "True", "Configuring", "Setting up zone");
status_updater.set_records(vec![/* discovered records */]);
// Single atomic update at the end
status_updater.apply(&client).await?;
Ok(())
}Implementations§
Source§impl DNSZoneStatusUpdater
impl DNSZoneStatusUpdater
Sourcepub fn new(dnszone: &DNSZone) -> Self
pub fn new(dnszone: &DNSZone) -> Self
Create a new status updater for a DNSZone.
Initializes with the current status from the zone, or creates a new empty status.
Sourcepub fn set_condition(
&mut self,
condition_type: &str,
status: &str,
reason: &str,
message: &str,
)
pub fn set_condition( &mut self, condition_type: &str, status: &str, reason: &str, message: &str, )
Update or add a condition (in-memory only, no API call).
Marks the status as changed if the condition differs from the current state.
Sourcepub fn set_records(&mut self, records: &[RecordReferenceWithTimestamp])
pub fn set_records(&mut self, records: &[RecordReferenceWithTimestamp])
Set the discovered DNS records list (in-memory only, no API call).
Sourcepub fn set_observed_generation(&mut self, generation: Option<i64>)
pub fn set_observed_generation(&mut self, generation: Option<i64>)
Set the observed generation to match the current generation.
Sourcepub fn update_instance_status(
&mut self,
name: &str,
namespace: &str,
status: InstanceStatus,
message: Option<String>,
)
pub fn update_instance_status( &mut self, name: &str, namespace: &str, status: InstanceStatus, message: Option<String>, )
Update instance status (in-memory only, no API call).
Updates the status of a specific instance in the status.bind9Instances list.
Creates a new entry if the instance doesn’t exist.
§Arguments
name- Instance namenamespace- Instance namespacestatus- New status (Claimed, Configured, Failed, Unclaimed)message- Optional status message (error details, etc.)
Sourcepub fn remove_instance(&mut self, name: &str, namespace: &str)
pub fn remove_instance(&mut self, name: &str, namespace: &str)
Remove instance from the instances list (in-memory only, no API call).
Removes an instance from status.bind9Instances when it no longer claims the zone
or has been deleted.
§Arguments
name- Instance namenamespace- Instance namespace
Sourcepub fn has_changes(&self) -> bool
pub fn has_changes(&self) -> bool
Check if the status has actually changed compared to the current status.
Returns true if there are semantic changes that warrant an API update.
CRITICAL: The comparison uses InstanceReferenceWithStatus::eq() which excludes
last_reconciled_at timestamps. Without this, nanosecond precision differences would
cause infinite reconciliation loops.
Sourcepub fn has_degraded_condition(&self) -> bool
pub fn has_degraded_condition(&self) -> bool
Check if a Degraded condition was set during this reconciliation.
Returns true only if set_condition("Degraded", "True", ...) was called
during this reconciliation, not if a Degraded condition existed from a previous reconciliation.
Sourcepub fn clear_degraded_condition(&mut self)
pub fn clear_degraded_condition(&mut self)
Clear any Degraded condition by setting it to False (in-memory only, no API call).
This method should be called when reconciliation succeeds to ensure stale Degraded conditions from previous failures are cleared.
If no Degraded condition exists, this method does nothing.
Sourcepub fn set_duplicate_zone_condition(
&mut self,
zone_name: &str,
conflicting_zones: &[String],
)
pub fn set_duplicate_zone_condition( &mut self, zone_name: &str, conflicting_zones: &[String], )
Set the Ready condition to False with DuplicateZone reason (in-memory only, no API call).
This method should be called when a duplicate zone is detected to signal that this zone cannot be reconciled because another zone already claims the same zone name.
§Arguments
zone_name- The zone name that has a conflictconflicting_zones- List of conflicting zone identifiers (namespace/name)
Sourcepub async fn apply(&self, client: &Client) -> Result<()>
pub async fn apply(&self, client: &Client) -> Result<()>
Apply the collected status changes to Kubernetes (single atomic API call).
Only makes the API call if there are actual changes. Skips the update if the status is semantically unchanged, preventing unnecessary reconciliation loops.
§Errors
Returns an error if the Kubernetes API call fails.
Auto Trait Implementations§
impl Freeze for DNSZoneStatusUpdater
impl RefUnwindSafe for DNSZoneStatusUpdater
impl Send for DNSZoneStatusUpdater
impl Sync for DNSZoneStatusUpdater
impl Unpin for DNSZoneStatusUpdater
impl UnwindSafe for DNSZoneStatusUpdater
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<L> LayerExt<L> for L
impl<L> LayerExt<L> for L
§fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>where
L: Layer<S>,
Layered].