@@ -355,3 +355,37 @@ func TestWorkbenchLoadBalancingDisabled(t *testing.T) {
355355 assert .NotEqual (t , "load-balancer-config" , v .Name , "Should not have load-balancer-config volume when load balancing is disabled" )
356356 }
357357}
358+
359+ func TestWorkbenchPodDisruptionBudgets (t * testing.T ) {
360+ ctx := context .Background ()
361+ ns := "posit-team"
362+ name := "workbench-pdb"
363+
364+ ctx , r , req , cli := initWorkbenchReconciler (t , ctx , ns , name )
365+
366+ wb := defineDefaultWorkbench (t , ns , name )
367+
368+ err := internal .BasicCreateOrUpdate (ctx , r , r .GetLogger (ctx ), req .NamespacedName , & positcov1beta1.Workbench {}, wb )
369+ require .NoError (t , err )
370+
371+ wb = getWorkbench (t , cli , ns , name )
372+
373+ res , err := r .ReconcileWorkbench (ctx , req , wb )
374+ require .NoError (t , err )
375+ require .True (t , res .IsZero ())
376+
377+ // Verify session PDB is created
378+ sessionPdb := getPodDisruptionBudget (t , cli , ns , name + "-workbench-sessions" )
379+ require .NotNil (t , sessionPdb , "Session PDB should be created" )
380+ assert .Equal (t , name + "-workbench-sessions" , sessionPdb .Name )
381+
382+ // Verify session PDB has correct selector to target session pods
383+ require .NotNil (t , sessionPdb .Spec .Selector , "Session PDB should have a selector" )
384+ assert .Equal (t , wb .ComponentName (), sessionPdb .Spec .Selector .MatchLabels ["launcher-instance-id" ],
385+ "Session PDB should select pods with launcher-instance-id label matching workbench component name" )
386+
387+ // Verify session PDB has maxUnavailable=0 to prevent any evictions
388+ require .NotNil (t , sessionPdb .Spec .MaxUnavailable , "Session PDB should have maxUnavailable set" )
389+ assert .Equal (t , int32 (0 ), sessionPdb .Spec .MaxUnavailable .IntVal ,
390+ "Session PDB should have maxUnavailable=0 to prevent session evictions" )
391+ }
0 commit comments