From d54b05e112a97207487a75992183d409ba04dc62 Mon Sep 17 00:00:00 2001 From: kieran Date: Wed, 5 Mar 2025 10:13:38 +0000 Subject: [PATCH] fix: handle failed deletion --- src/bin/api.rs | 2 +- src/dns/cloudflare.rs | 31 ++++++++++++++++++++++++++++++- src/provisioner/lnvps.rs | 8 ++++++-- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/src/bin/api.rs b/src/bin/api.rs index 6b47036..024e527 100644 --- a/src/bin/api.rs +++ b/src/bin/api.rs @@ -1,5 +1,5 @@ use anyhow::Error; -use chrono::{DateTime, Utc}; +use chrono::Utc; use clap::Parser; use config::{Config, File}; use lnvps::api; diff --git a/src/dns/cloudflare.rs b/src/dns/cloudflare.rs index 80487e1..a0d9ab1 100644 --- a/src/dns/cloudflare.rs +++ b/src/dns/cloudflare.rs @@ -20,6 +20,19 @@ impl Cloudflare { forward_zone_id: forward_zone_id.to_owned(), } } + + fn bail_error(rsp: &CfResult) -> anyhow::Result<()> { + if !rsp.success { + anyhow::bail!( + "Error updating record: {:?}", + rsp.errors + .as_ref() + .map(|e| e.iter().map(|i| i.message.clone()).collect::>().join(", ")) + .unwrap_or_default() + ); + } + Ok(()) + } } #[async_trait] @@ -45,6 +58,7 @@ impl DnsServer for Cloudflare { }, ) .await?; + Self::bail_error(&id_response)?; Ok(BasicRecord { name: id_response.result.name, value: id_response.result.content, @@ -63,7 +77,8 @@ impl DnsServer for Cloudflare { "Deleting record: [{}] {} => {}", record.kind, record.name, record.value ); - self.api + let res: CfResult = self + .api .req( reqwest::Method::DELETE, &format!("/client/v4/zones/{}/dns_records/{}", zone_id, record_id), @@ -75,6 +90,7 @@ impl DnsServer for Cloudflare { }, ) .await?; + Self::bail_error(&res)?; Ok(()) } @@ -101,6 +117,7 @@ impl DnsServer for Cloudflare { }, ) .await?; + Self::bail_error(&id_response)?; Ok(BasicRecord { name: id_response.result.name, value: id_response.result.content, @@ -122,8 +139,20 @@ struct CfRecord { pub id: Option, } +#[derive(Debug, Serialize, Deserialize)] +struct IdResult { + pub id: String, +} + #[derive(Debug, Serialize, Deserialize)] struct CfResult { pub success: bool, + pub errors: Option>, pub result: T, } + +#[derive(Debug, Serialize, Deserialize)] +struct CfError { + pub code: i32, + pub message: String, +} diff --git a/src/provisioner/lnvps.rs b/src/provisioner/lnvps.rs index 4f1140e..2c7e9ce 100644 --- a/src/provisioner/lnvps.rs +++ b/src/provisioner/lnvps.rs @@ -112,13 +112,17 @@ impl LNVpsProvisioner { if let Some(dns) = &self.dns { if let Some(_r) = &assignment.dns_reverse_ref { let rev = BasicRecord::reverse(assignment)?; - dns.delete_record(&rev).await?; + if let Err(e) = dns.delete_record(&rev).await { + warn!("Failed to delete reverse record: {}", e); + } assignment.dns_reverse_ref = None; assignment.dns_reverse = None; } if let Some(_r) = &assignment.dns_forward_ref { let rev = BasicRecord::forward(assignment)?; - dns.delete_record(&rev).await?; + if let Err(e) = dns.delete_record(&rev).await { + warn!("Failed to delete forward record: {}", e); + } assignment.dns_forward_ref = None; assignment.dns_forward = None; }