@@ -26,11 +26,14 @@ import (
2626 "k8s.io/apimachinery/pkg/util/intstr"
2727
2828 placementv1beta1 "go.goms.io/fleet/apis/placement/v1beta1"
29+ "go.goms.io/fleet/pkg/utils/condition"
2930 "go.goms.io/fleet/test/e2e/framework"
31+ testutilseviction "go.goms.io/fleet/test/utils/eviction"
3032)
3133
3234var _ = Describe ("Drain cluster successfully" , Ordered , Serial , func () {
3335 crpName := fmt .Sprintf (crpNameTemplate , GinkgoParallelProcess ())
36+ var drainEvictions []placementv1beta1.ClusterResourcePlacementEviction
3437 var drainClusters , noDrainClusters []* framework.Cluster
3538 var noDrainClusterNames []string
3639
@@ -61,6 +64,10 @@ var _ = Describe("Drain cluster successfully", Ordered, Serial, func() {
6164 })
6265
6366 AfterAll (func () {
67+ // remove drain evictions.
68+ for _ , eviction := range drainEvictions {
69+ ensureCRPEvictionDeleted (eviction .Name )
70+ }
6471 // remove taints from member cluster 1 again to guarantee clean up of cordon taint on test failure.
6572 removeTaintsFromMemberClusters ([]string {memberCluster1EastProdName })
6673 ensureCRPAndRelatedResourcesDeleted (crpName , allMemberClusters )
@@ -75,6 +82,24 @@ var _ = Describe("Drain cluster successfully", Ordered, Serial, func() {
7582
7683 It ("drain cluster using binary, should succeed" , func () { runDrainClusterBinary (hubClusterName , memberCluster1EastProdName ) })
7784
85+ It ("should update member cluster with cordon taint" , func () {
86+ taintAddedActual := memberClusterCordonTaintAddedActual (memberCluster1EastProdName )
87+ Eventually (taintAddedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to add cordon taint to member cluster" )
88+ })
89+
90+ It ("should update drain cluster resource placement evictions status as expected" , func () {
91+ var fetchError error
92+ drainEvictions , fetchError = fetchDrainEvictions ()
93+ Eventually (fetchError ).Should (Succeed (), "Failed to fetch drain evictions" )
94+ for _ , eviction := range drainEvictions {
95+ crpEvictionStatusUpdatedActual := testutilseviction .StatusUpdatedActual (
96+ ctx , hubClient , eviction .Name ,
97+ & testutilseviction.IsValidEviction {IsValid : true , Msg : condition .EvictionValidMessage },
98+ & testutilseviction.IsExecutedEviction {IsExecuted : true , Msg : condition .EvictionAllowedNoPDBMessage })
99+ Eventually (crpEvictionStatusUpdatedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to update cluster resource placement eviction status as expected" )
100+ }
101+ })
102+
78103 It ("should ensure no resources exist on drained clusters" , func () {
79104 for _ , cluster := range drainClusters {
80105 resourceRemovedActual := workNamespaceRemovedFromClusterActual (cluster )
@@ -96,6 +121,11 @@ var _ = Describe("Drain cluster successfully", Ordered, Serial, func() {
96121
97122 It ("uncordon cluster using binary" , func () { runUncordonClusterBinary (hubClusterName , memberCluster1EastProdName ) })
98123
124+ It ("should remove cordon taint from member cluster" , func () {
125+ taintRemovedActual := memberClusterCordonTaintRemovedActual (memberCluster1EastProdName )
126+ Eventually (taintRemovedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to remove cordon taint from member cluster" )
127+ })
128+
99129 It ("should update cluster resource placement status as expected" , func () {
100130 crpStatusUpdatedActual := crpStatusUpdatedActual (workResourceIdentifiers (), allMemberClusterNames , nil , "0" )
101131 Eventually (crpStatusUpdatedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to update cluster resource placement status as expected" )
@@ -104,8 +134,9 @@ var _ = Describe("Drain cluster successfully", Ordered, Serial, func() {
104134 It ("should place resources on the all available member clusters" , checkIfPlacedWorkResourcesOnAllMemberClusters )
105135})
106136
107- var _ = Describe ("Drain cluster blocked - ClusterResourcePlacementDisruptionBudget blocks evictions on all clusters" , Ordered , Serial , func () {
137+ var _ = FDescribe ("Drain cluster blocked - ClusterResourcePlacementDisruptionBudget blocks evictions on all clusters" , Ordered , Serial , func () {
108138 crpName := fmt .Sprintf (crpNameTemplate , GinkgoParallelProcess ())
139+ var drainEvictions []placementv1beta1.ClusterResourcePlacementEviction
109140
110141 BeforeAll (func () {
111142 By ("creating work resources" )
@@ -130,6 +161,10 @@ var _ = Describe("Drain cluster blocked - ClusterResourcePlacementDisruptionBudg
130161 })
131162
132163 AfterAll (func () {
164+ // remove drain evictions.
165+ for _ , eviction := range drainEvictions {
166+ ensureCRPEvictionDeleted (eviction .Name )
167+ }
133168 // remove taints from member cluster 1 again to guarantee clean up of cordon taint on test failure.
134169 removeTaintsFromMemberClusters ([]string {memberCluster1EastProdName })
135170 ensureCRPDisruptionBudgetDeleted (crpName )
@@ -160,6 +195,24 @@ var _ = Describe("Drain cluster blocked - ClusterResourcePlacementDisruptionBudg
160195
161196 It ("drain cluster using binary, should fail due to CRPDB" , func () { runDrainClusterBinary (hubClusterName , memberCluster1EastProdName ) })
162197
198+ It ("should update member cluster with cordon taint" , func () {
199+ taintAddedActual := memberClusterCordonTaintAddedActual (memberCluster1EastProdName )
200+ Eventually (taintAddedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to add cordon taint to member cluster" )
201+ })
202+
203+ It ("should update drain cluster resource placement evictions status as expected" , func () {
204+ var fetchError error
205+ drainEvictions , fetchError = fetchDrainEvictions ()
206+ Eventually (fetchError ).Should (Succeed (), "Failed to fetch drain evictions" )
207+ for _ , eviction := range drainEvictions {
208+ crpEvictionStatusUpdatedActual := testutilseviction .StatusUpdatedActual (
209+ ctx , hubClient , eviction .Name ,
210+ & testutilseviction.IsValidEviction {IsValid : true , Msg : condition .EvictionValidMessage },
211+ & testutilseviction.IsExecutedEviction {IsExecuted : false , Msg : fmt .Sprintf (condition .EvictionBlockedPDBSpecifiedMessageFmt , 3 , 3 )})
212+ Eventually (crpEvictionStatusUpdatedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to update cluster resource placement eviction status as expected" )
213+ }
214+ })
215+
163216 It ("should ensure cluster resource placement status remains unchanged" , func () {
164217 crpStatusUpdatedActual := crpStatusUpdatedActual (workResourceIdentifiers (), allMemberClusterNames , nil , "0" )
165218 Eventually (crpStatusUpdatedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to update cluster resource placement status as expected" )
@@ -169,6 +222,11 @@ var _ = Describe("Drain cluster blocked - ClusterResourcePlacementDisruptionBudg
169222
170223 It ("uncordon cluster using binary" , func () { runUncordonClusterBinary (hubClusterName , memberCluster1EastProdName ) })
171224
225+ It ("should remove cordon taint from member cluster" , func () {
226+ taintRemovedActual := memberClusterCordonTaintRemovedActual (memberCluster1EastProdName )
227+ Eventually (taintRemovedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to remove cordon taint from member cluster" )
228+ })
229+
172230 It ("should update cluster resource placement status as expected" , func () {
173231 crpStatusUpdatedActual := crpStatusUpdatedActual (workResourceIdentifiers (), allMemberClusterNames , nil , "0" )
174232 Eventually (crpStatusUpdatedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to update cluster resource placement status as expected" )
@@ -177,8 +235,9 @@ var _ = Describe("Drain cluster blocked - ClusterResourcePlacementDisruptionBudg
177235 It ("should place resources on the all available member clusters" , checkIfPlacedWorkResourcesOnAllMemberClusters )
178236})
179237
180- var _ = Describe ("Drain is allowed on one cluster, blocked on others - ClusterResourcePlacementDisruptionBudget blocks evictions on some clusters" , Ordered , Serial , func () {
238+ var _ = FDescribe ("Drain is allowed on one cluster, blocked on others - ClusterResourcePlacementDisruptionBudget blocks evictions on some clusters" , Ordered , Serial , func () {
181239 crpName := fmt .Sprintf (crpNameTemplate , GinkgoParallelProcess ())
240+ var drainEvictions []placementv1beta1.ClusterResourcePlacementEviction
182241 var drainClusters , noDrainClusters []* framework.Cluster
183242 var noDrainClusterNames []string
184243
@@ -209,6 +268,10 @@ var _ = Describe("Drain is allowed on one cluster, blocked on others - ClusterRe
209268 })
210269
211270 AfterAll (func () {
271+ // remove remaining drain evictions.
272+ for _ , eviction := range drainEvictions {
273+ ensureCRPEvictionDeleted (eviction .Name )
274+ }
212275 // remove taints from member clusters 1,2 again to guarantee clean up of cordon taint on test failure.
213276 removeTaintsFromMemberClusters ([]string {memberCluster1EastProdName , memberCluster2EastCanaryName })
214277 ensureCRPDisruptionBudgetDeleted (crpName )
@@ -239,8 +302,50 @@ var _ = Describe("Drain is allowed on one cluster, blocked on others - ClusterRe
239302
240303 It ("drain cluster using binary, should succeed" , func () { runDrainClusterBinary (hubClusterName , memberCluster1EastProdName ) })
241304
305+ It ("should update member cluster with cordon taint" , func () {
306+ taintAddedActual := memberClusterCordonTaintAddedActual (memberCluster1EastProdName )
307+ Eventually (taintAddedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to add cordon taint to member cluster" )
308+ })
309+
310+ It ("should update drain cluster resource placement evictions status as expected" , func () {
311+ var fetchError error
312+ drainEvictions , fetchError = fetchDrainEvictions ()
313+ Eventually (fetchError ).Should (Succeed (), "Failed to fetch drain evictions" )
314+ for _ , eviction := range drainEvictions {
315+ crpEvictionStatusUpdatedActual := testutilseviction .StatusUpdatedActual (
316+ ctx , hubClient , eviction .Name ,
317+ & testutilseviction.IsValidEviction {IsValid : true , Msg : condition .EvictionValidMessage },
318+ & testutilseviction.IsExecutedEviction {IsExecuted : true , Msg : fmt .Sprintf (condition .EvictionAllowedPDBSpecifiedMessageFmt , 3 , 3 )})
319+ Eventually (crpEvictionStatusUpdatedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to update cluster resource placement eviction status as expected" )
320+ }
321+ })
322+
323+ It ("remove drain evictions for member cluster 1" , func () {
324+ for _ , eviction := range drainEvictions {
325+ ensureCRPEvictionDeleted (eviction .Name )
326+ }
327+ })
328+
242329 It ("drain cluster using binary, should fail due to CRPDB" , func () { runDrainClusterBinary (hubClusterName , memberCluster2EastCanaryName ) })
243330
331+ It ("should update member cluster with cordon taint" , func () {
332+ taintAddedActual := memberClusterCordonTaintAddedActual (memberCluster2EastCanaryName )
333+ Eventually (taintAddedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to add cordon taint to member cluster" )
334+ })
335+
336+ It ("should update drain cluster resource placement evictions status as expected" , func () {
337+ var fetchError error
338+ drainEvictions , fetchError = fetchDrainEvictions ()
339+ Eventually (fetchError ).Should (Succeed (), "Failed to fetch drain evictions" )
340+ for _ , eviction := range drainEvictions {
341+ crpEvictionStatusUpdatedActual := testutilseviction .StatusUpdatedActual (
342+ ctx , hubClient , eviction .Name ,
343+ & testutilseviction.IsValidEviction {IsValid : true , Msg : condition .EvictionValidMessage },
344+ & testutilseviction.IsExecutedEviction {IsExecuted : false , Msg : fmt .Sprintf (condition .EvictionBlockedPDBSpecifiedMessageFmt , 2 , 2 )})
345+ Eventually (crpEvictionStatusUpdatedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to update cluster resource placement eviction status as expected" )
346+ }
347+ })
348+
244349 It ("should ensure no resources exist on drained clusters" , func () {
245350 for _ , cluster := range drainClusters {
246351 resourceRemovedActual := workNamespaceRemovedFromClusterActual (cluster )
@@ -262,8 +367,18 @@ var _ = Describe("Drain is allowed on one cluster, blocked on others - ClusterRe
262367
263368 It ("uncordon cluster using binary" , func () { runUncordonClusterBinary (hubClusterName , memberCluster1EastProdName ) })
264369
370+ It ("should remove cordon taint from member cluster" , func () {
371+ taintRemovedActual := memberClusterCordonTaintRemovedActual (memberCluster1EastProdName )
372+ Eventually (taintRemovedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to remove cordon taint from member cluster" )
373+ })
374+
265375 It ("uncordon cluster using binary" , func () { runUncordonClusterBinary (hubClusterName , memberCluster2EastCanaryName ) })
266376
377+ It ("should remove cordon taint from member cluster" , func () {
378+ taintRemovedActual := memberClusterCordonTaintRemovedActual (memberCluster2EastCanaryName )
379+ Eventually (taintRemovedActual , eventuallyDuration , eventuallyInterval ).Should (Succeed (), "Failed to remove cordon taint from member cluster" )
380+ })
381+
267382 It ("should place resources on all available member clusters" , checkIfPlacedWorkResourcesOnAllMemberClusters )
268383})
269384
@@ -284,3 +399,11 @@ func runUncordonClusterBinary(hubClusterName, memberClusterName string) {
284399 _ , err := cmd .CombinedOutput ()
285400 Expect (err ).ToNot (HaveOccurred (), "Uncordon command failed with error: %v" , err )
286401}
402+
403+ func fetchDrainEvictions () ([]placementv1beta1.ClusterResourcePlacementEviction , error ) {
404+ var evictionList placementv1beta1.ClusterResourcePlacementEvictionList
405+ if err := hubClient .List (ctx , & evictionList ); err != nil {
406+ return nil , err
407+ }
408+ return evictionList .Items , nil
409+ }
0 commit comments