Skip to content

Commit 043f0f1

Browse files
committed
delete object refactoring
1 parent 1a00526 commit 043f0f1

1 file changed

Lines changed: 20 additions & 53 deletions

File tree

  • rust/stackable-cockpit/src/utils/k8s

rust/stackable-cockpit/src/utils/k8s/client.rs

Lines changed: 20 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use std::{collections::BTreeMap, string::FromUtf8Error};
22

3-
use reqwest::StatusCode;
43
use serde::Deserialize;
54
use snafu::{OptionExt, ResultExt, Snafu};
65
use stackable_operator::{
@@ -20,10 +19,7 @@ use stackable_operator::{
2019
},
2120
kvp::{Label, Labels},
2221
};
23-
use tokio::{
24-
sync::RwLock,
25-
time::{self, sleep},
26-
};
22+
use tokio::sync::RwLock;
2723
use tracing::{Span, info, instrument};
2824
use tracing_indicatif::{indicatif_eprintln, span_ext::IndicatifSpanExt as _};
2925

@@ -55,7 +51,9 @@ pub enum Error {
5551
},
5652

5753
#[snafu(display("failed to delete object"))]
58-
KubeClientDelete { source: kube::error::Error },
54+
KubeRuntimeDelete {
55+
source: kube::runtime::wait::delete::Error,
56+
},
5957

6058
#[snafu(display("failed to deserialize YAML data"))]
6159
DeserializeYaml { source: serde_yaml::Error },
@@ -258,10 +256,13 @@ impl Client {
258256
{
259257
if crd.spec.group.ends_with(group_suffix) {
260258
if let Some(name) = crd.metadata.name {
261-
api_client
262-
.delete(&name, &DeleteParams::default())
263-
.await
264-
.context(KubeClientDeleteSnafu)?;
259+
kube::runtime::wait::delete::delete_and_finalize(
260+
api_client.clone(),
261+
&name,
262+
&DeleteParams::default(),
263+
)
264+
.await
265+
.context(KubeRuntimeDeleteSnafu)?;
265266
}
266267
}
267268
}
@@ -381,56 +382,22 @@ impl Client {
381382
api_resource: &ApiResource,
382383
namespace: Option<&str>,
383384
) -> Result<(), Error> {
385+
Span::current().pb_set_message(&format!("Deleting {} {}", api_resource.kind, object_name));
386+
384387
let object_api = match namespace {
385388
Some(namespace) => {
386389
Api::<DynamicObject>::namespaced_with(self.client.clone(), namespace, api_resource)
387390
}
388391
None => Api::<DynamicObject>::all_with(self.client.clone(), api_resource),
389392
};
390393

391-
let mut delete_request = object_api
392-
.delete(object_name, &DeleteParams::foreground())
393-
.await;
394-
395-
// Wait for object to be deleted
396-
// Otherwise might result in race condition scenarios
397-
while let Ok(delete_status) = delete_request {
398-
match delete_status {
399-
// Left side of Either, when deletion is in progress
400-
either::Either::Left(_) => {
401-
Span::current()
402-
.pb_set_message(&format!("Deleting {} {}", api_resource.kind, object_name));
403-
// Short sleep to reduce number of requests
404-
sleep(time::Duration::from_millis(600)).await;
405-
// Resend request to get deletion status
406-
delete_request = object_api
407-
.delete(object_name, &DeleteParams::foreground())
408-
.await;
409-
}
410-
// Right side of Either, when deletion is done
411-
either::Either::Right(_) => {
412-
return Ok(());
413-
}
414-
}
415-
}
416-
417-
if let Err(error) = delete_request {
418-
match error {
419-
kube::Error::Api(ref error_response) => {
420-
// If object is already deleted/gone, delete operation is done
421-
if error_response.code == StatusCode::NOT_FOUND.as_u16() {
422-
return Ok(());
423-
} else {
424-
return Err(error).context(KubeClientDeleteSnafu);
425-
}
426-
}
427-
_ => {
428-
return Err(error).context(KubeClientDeleteSnafu);
429-
}
430-
}
431-
}
432-
433-
Ok(())
394+
kube::runtime::wait::delete::delete_and_finalize(
395+
object_api,
396+
object_name,
397+
&DeleteParams::foreground(),
398+
)
399+
.await
400+
.context(KubeRuntimeDeleteSnafu)
434401
}
435402

436403
/// Lists [`Service`]s by matching labels. The Services can be matched by

0 commit comments

Comments
 (0)