From 5f746b90a82041860a3504745be6754e8f73ea9f Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Tue, 18 Mar 2025 01:35:49 +0100 Subject: [PATCH] Emit warning and continue if the to be deleted user does not exist --- src/context.rs | 21 +++++++++++++++++++++ src/resources.rs | 20 +++++++++++++++++--- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/context.rs b/src/context.rs index 8b7bcc2..3b11436 100644 --- a/src/context.rs +++ b/src/context.rs @@ -43,6 +43,10 @@ pub trait ControllerEvents { async fn user_deleted(&self, obj: &T, username: &str) -> Result<(), Self::Error> where T: Resource + Sync; + + async fn user_not_found(&self, obj: &T, username: &str) -> Result<(), Self::Error> + where + T: Resource + Sync; } #[async_trait] @@ -99,4 +103,21 @@ impl ControllerEvents for Recorder { ) .await } + + async fn user_not_found(&self, obj: &T, username: &str) -> Result<(), Self::Error> + where + T: Resource + Sync, + { + self.publish( + &Event { + type_: EventType::Warning, + reason: "UserNotFound".into(), + note: Some(format!("User '{username}' not found")), + action: "UserNotFound".into(), + secondary: None, + }, + &obj.object_ref(&()), + ) + .await + } } diff --git a/src/resources.rs b/src/resources.rs index 6c648b7..4a90ca4 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -18,7 +18,7 @@ use schemars::JsonSchema; use serde::de::DeserializeOwned; use serde::{Deserialize, Serialize}; use serde_json::json; -use tracing::{debug, instrument, trace}; +use tracing::{debug, instrument, trace, warn}; use crate::context::{Context, ControllerEvents}; use crate::lldap; @@ -244,8 +244,22 @@ impl Reconcile for ServiceUser { let lldap_client = ctx.lldap_config.build_client().await?; trace!(name, username, "Deleting user"); - lldap_client.delete_user(&username).await?; - ctx.recorder.user_deleted(self.as_ref(), &username).await?; + match lldap_client.delete_user(&username).await { + Err(lldap::Error::GraphQl(err)) + if err.message == format!("Entity not found: `No such user: '{username}'`") => + { + ctx.recorder + .user_not_found(self.as_ref(), &username) + .await?; + warn!(name, username, "User not found"); + Ok(()) + } + Ok(_) => { + ctx.recorder.user_deleted(self.as_ref(), &username).await?; + Ok(()) + } + Err(err) => Err(err), + }?; Ok(Action::await_change()) }