11use std:: { collections:: BTreeMap , string:: FromUtf8Error } ;
22
3- use reqwest:: StatusCode ;
43use serde:: Deserialize ;
54use snafu:: { OptionExt , ResultExt , Snafu } ;
65use 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 ;
2723use tracing:: { Span , info, instrument} ;
2824use 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