Skip to content

Commit c93b302

Browse files
author
Arvind Thirumurugan
committed
inspect drain evictions, mc
Signed-off-by: Arvind Thirumurugan <[email protected]>
1 parent b61f337 commit c93b302

File tree

2 files changed

+159
-2
lines changed

2 files changed

+159
-2
lines changed

test/e2e/actuals_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,14 @@ import (
2929
"k8s.io/apimachinery/pkg/types"
3030
"sigs.k8s.io/controller-runtime/pkg/client"
3131

32+
clusterv1beta1 "go.goms.io/fleet/apis/cluster/v1beta1"
3233
placementv1beta1 "go.goms.io/fleet/apis/placement/v1beta1"
3334
"go.goms.io/fleet/pkg/controllers/clusterresourceplacement"
3435
"go.goms.io/fleet/pkg/controllers/workapplier"
3536
scheduler "go.goms.io/fleet/pkg/scheduler/framework"
3637
"go.goms.io/fleet/pkg/utils/condition"
3738
"go.goms.io/fleet/test/e2e/framework"
39+
toolsutils "go.goms.io/fleet/tools/utils"
3840
)
3941

4042
func validateWorkNamespaceOnCluster(cluster *framework.Cluster, name types.NamespacedName) error {
@@ -1266,3 +1268,35 @@ func updateRunStrategyRemovedActual(strategyName string) func() error {
12661268
return nil
12671269
}
12681270
}
1271+
1272+
func memberClusterCordonTaintAddedActual(mcName string) func() error {
1273+
return func() error {
1274+
var mc clusterv1beta1.MemberCluster
1275+
if err := hubClient.Get(ctx, types.NamespacedName{Name: mcName}, &mc); err != nil {
1276+
return fmt.Errorf("failed to get member cluster %s: %w", mcName, err)
1277+
}
1278+
1279+
for _, taint := range mc.Spec.Taints {
1280+
if taint == toolsutils.CordonTaint {
1281+
return nil
1282+
}
1283+
}
1284+
return fmt.Errorf("cordon taint not found on member cluster %s", mcName)
1285+
}
1286+
}
1287+
1288+
func memberClusterCordonTaintRemovedActual(mcName string) func() error {
1289+
return func() error {
1290+
var mc clusterv1beta1.MemberCluster
1291+
if err := hubClient.Get(ctx, types.NamespacedName{Name: mcName}, &mc); err != nil {
1292+
return fmt.Errorf("failed to get member cluster %s: %w", mcName, err)
1293+
}
1294+
1295+
for _, taint := range mc.Spec.Taints {
1296+
if taint == toolsutils.CordonTaint {
1297+
return fmt.Errorf("cordon taint found on member cluster %s", mcName)
1298+
}
1299+
}
1300+
return nil
1301+
}
1302+
}

test/e2e/drain_tool_test.go

Lines changed: 125 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3234
var _ = 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

Comments
 (0)