@@ -258,62 +258,68 @@ func (wsc *WorkspaceController) handleWorkspaceRunning(ctx context.Context, ws *
258258}
259259
260260func  (wsc  * WorkspaceController ) handleWorkspaceStop (ctx  context.Context , ws  * workspacev1.Workspace , req  ctrl.Request ) (result  ctrl.Result , err  error ) {
261- 	log  :=  log .FromContext (ctx )
262261	span , ctx  :=  opentracing .StartSpanFromContext (ctx , "handleWorkspaceStop" )
263262	defer  tracing .FinishSpan (span , & err )
264263
265264	if  ws .IsConditionTrue (workspacev1 .WorkspaceConditionPodRejected ) {
265+ 		// edge case only exercised for rejected workspace pods 
266266		if  ws .IsConditionPresent (workspacev1 .WorkspaceConditionStateWiped ) {
267267			// we are done here 
268268			return  ctrl.Result {}, nil 
269269		}
270270
271- 		// in this case we are not interested in any backups, but instead are concerned with completely wiping all state that might be dangling somewhere 
272- 		if  ws .IsConditionTrue (workspacev1 .WorkspaceConditionContainerRunning ) {
273- 			// Container is still running, we need to wait for it to stop. 
274- 			// We should get an event when the condition changes, but requeue 
275- 			// anyways to make sure we act on it in time. 
276- 			return  ctrl.Result {RequeueAfter : 500  *  time .Millisecond }, nil 
277- 		}
271+ 		return  wsc .doWipeWorkspace (ctx , ws , req )
272+ 	}
278273
279- 		 if   wsc . latestWorkspace ( ctx ,  ws )  !=   nil  { 
280- 			 return  ctrl. Result { Requeue :  true ,  RequeueAfter :  100   *   time . Millisecond },  nil 
281- 		 }
274+ 	// regular case 
275+ 	return  wsc . doWorkspaceContentBackup ( ctx ,  span ,  ws ,  req ) 
276+ }
282277
283- 		setStateWipedCondition  :=  func (s  bool ) {
284- 			err  :=  retry .RetryOnConflict (retryParams , func () error  {
285- 				if  err  :=  wsc .Get (ctx , req .NamespacedName , ws ); err  !=  nil  {
286- 					return  err 
287- 				}
278+ func  (wsc  * WorkspaceController ) doWipeWorkspace (ctx  context.Context , ws  * workspacev1.Workspace , req  ctrl.Request ) (result  ctrl.Result , err  error ) {
279+ 	log  :=  log .FromContext (ctx )
288280
289- 				if  s  {
290- 					ws .Status .SetCondition (workspacev1 .NewWorkspaceConditionStateWiped ("" , metav1 .ConditionTrue ))
291- 				} else  {
292- 					ws .Status .SetCondition (workspacev1 .NewWorkspaceConditionStateWiped ("" , metav1 .ConditionFalse ))
293- 				}
294- 				return  wsc .Client .Status ().Update (ctx , ws )
295- 			})
296- 			if  err  !=  nil  {
297- 				log .Error (err , "failed to set StateWiped condition" )
281+ 	// in this case we are not interested in any backups, but instead are concerned with completely wiping all state that might be dangling somewhere 
282+ 	if  ws .IsConditionTrue (workspacev1 .WorkspaceConditionContainerRunning ) {
283+ 		// Container is still running, we need to wait for it to stop. 
284+ 		// We should get an event when the condition changes, but requeue 
285+ 		// anyways to make sure we act on it in time. 
286+ 		return  ctrl.Result {RequeueAfter : 500  *  time .Millisecond }, nil 
287+ 	}
288+ 
289+ 	if  wsc .latestWorkspace (ctx , ws ) !=  nil  {
290+ 		return  ctrl.Result {Requeue : true , RequeueAfter : 100  *  time .Millisecond }, nil 
291+ 	}
292+ 
293+ 	setStateWipedCondition  :=  func (success  bool ) {
294+ 		err  :=  retry .RetryOnConflict (retryParams , func () error  {
295+ 			if  err  :=  wsc .Get (ctx , req .NamespacedName , ws ); err  !=  nil  {
296+ 				return  err 
298297			}
299- 		}
300- 		log .Info ("handling workspace stop - wiping mode" )
301298
302- 		err  =  wsc .operations .WipeWorkspace (ctx , ws .Name )
299+ 			if  success  {
300+ 				ws .Status .SetCondition (workspacev1 .NewWorkspaceConditionStateWiped ("" , metav1 .ConditionTrue ))
301+ 			} else  {
302+ 				ws .Status .SetCondition (workspacev1 .NewWorkspaceConditionStateWiped ("" , metav1 .ConditionFalse ))
303+ 			}
304+ 			return  wsc .Client .Status ().Update (ctx , ws )
305+ 		})
303306		if  err  !=  nil  {
304- 			setStateWipedCondition (false )
305- 			wsc .emitEvent (ws , "Wiping" , fmt .Errorf ("failed to wipe workspace: %w" , err ))
306- 			return  ctrl.Result {}, fmt .Errorf ("failed to wipe workspace: %w" , err )
307+ 			log .Error (err , "failed to set StateWiped condition" )
307308		}
309+ 	}
310+ 	log .Info ("handling workspace stop - wiping mode" )
311+ 	defer  log .Info ("handling workspace stop - wiping done." )
308312
309- 		setStateWipedCondition (true )
310- 
311- 		log .Info ("handling workspace stop - wiping done." )
312- 		return  ctrl.Result {}, nil 
313+ 	err  =  wsc .operations .WipeWorkspace (ctx , ws .Name )
314+ 	if  err  !=  nil  {
315+ 		setStateWipedCondition (false )
316+ 		wsc .emitEvent (ws , "Wiping" , fmt .Errorf ("failed to wipe workspace: %w" , err ))
317+ 		return  ctrl.Result {}, fmt .Errorf ("failed to wipe workspace: %w" , err )
313318	}
314319
315- 	// regular case 
316- 	return  wsc .doWorkspaceContentBackup (ctx , span , ws , req )
320+ 	setStateWipedCondition (true )
321+ 
322+ 	return  ctrl.Result {}, nil 
317323}
318324
319325func  (wsc  * WorkspaceController ) doWorkspaceContentBackup (ctx  context.Context , span  opentracing.Span , ws  * workspacev1.Workspace , req  ctrl.Request ) (result  ctrl.Result , err  error ) {
0 commit comments