Skip to content

Commit 028709b

Browse files
ArvindthiruArvind Thirumurugan
authored andcommitted
add E2Es
1 parent b000bd9 commit 028709b

File tree

3 files changed

+390
-0
lines changed

3 files changed

+390
-0
lines changed

test/e2e/actuals_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,15 @@ func crpEvictionRemovedActual(crpEvictionName string) func() error {
922922
}
923923
}
924924

925+
func crpDisruptionBudgetRemovedActual(crpDisruptionBudgetName string) func() error {
926+
return func() error {
927+
if err := hubClient.Get(ctx, types.NamespacedName{Name: crpDisruptionBudgetName}, &placementv1alpha1.ClusterResourcePlacementDisruptionBudget{}); !errors.IsNotFound(err) {
928+
return fmt.Errorf("CRP disruption budget still exists or an unexpected error occurred: %w", err)
929+
}
930+
return nil
931+
}
932+
}
933+
925934
func validateCRPSnapshotRevisions(crpName string, wantPolicySnapshotRevision, wantResourceSnapshotRevision int) error {
926935
matchingLabels := client.MatchingLabels{placementv1beta1.CRPTrackingLabel: crpName}
927936

test/e2e/placement_eviction_test.go

Lines changed: 370 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111
. "github.com/onsi/ginkgo/v2"
1212
. "github.com/onsi/gomega"
1313
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
14+
"k8s.io/apimachinery/pkg/util/intstr"
15+
"k8s.io/utils/ptr"
1416

1517
placementv1alpha1 "go.goms.io/fleet/apis/placement/v1alpha1"
1618
placementv1beta1 "go.goms.io/fleet/apis/placement/v1beta1"
@@ -165,5 +167,373 @@ var _ = Describe("ClusterResourcePlacement eviction of bound binding, no taint s
165167
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
166168
})
167169

170+
It("should still place resources on the all available member clusters", checkIfPlacedWorkResourcesOnAllMemberClusters)
171+
})
172+
173+
var _ = Describe("ClusterResourcePlacement eviction of bound binding - PickAll CRP, PDB specified, eviction denied", Ordered, Serial, func() {
174+
crpName := fmt.Sprintf(crpNameTemplate, GinkgoParallelProcess())
175+
crpEvictionName := fmt.Sprintf(crpEvictionNameTemplate, GinkgoParallelProcess())
176+
177+
BeforeAll(func() {
178+
By("creating work resources")
179+
createWorkResources()
180+
181+
// Create the CRP.
182+
crp := &placementv1beta1.ClusterResourcePlacement{
183+
ObjectMeta: metav1.ObjectMeta{
184+
Name: crpName,
185+
// Add a custom finalizer; this would allow us to better observe
186+
// the behavior of the controllers.
187+
Finalizers: []string{customDeletionBlockerFinalizer},
188+
},
189+
Spec: placementv1beta1.ClusterResourcePlacementSpec{
190+
ResourceSelectors: workResourceSelector(),
191+
},
192+
}
193+
Expect(hubClient.Create(ctx, crp)).To(Succeed(), "Failed to create CRP %s", crpName)
194+
})
195+
196+
AfterAll(func() {
197+
ensureCRPEvictionDeletion(crpEvictionName)
198+
ensureCRPDisruptionBudgetDeletion(crpName)
199+
ensureCRPAndRelatedResourcesDeletion(crpName, allMemberClusters)
200+
})
201+
202+
It("should update cluster resource placement status as expected", func() {
203+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), allMemberClusterNames, nil, "0")
204+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
205+
})
206+
207+
It("should place resources on the all available member clusters", checkIfPlacedWorkResourcesOnAllMemberClusters)
208+
209+
It("create cluster resource placement disruption budget to block eviction", func() {
210+
crpdb := placementv1alpha1.ClusterResourcePlacementDisruptionBudget{
211+
ObjectMeta: metav1.ObjectMeta{
212+
Name: crpName,
213+
},
214+
Spec: placementv1alpha1.PlacementDisruptionBudgetSpec{
215+
MinAvailable: &intstr.IntOrString{
216+
Type: intstr.Int,
217+
IntVal: 3,
218+
},
219+
},
220+
}
221+
Expect(hubClient.Create(ctx, &crpdb)).To(Succeed(), "Failed to create CRP Disruption Budget %s", crpName)
222+
})
223+
224+
It("create cluster resource placement eviction targeting member cluster 1", func() {
225+
crpe := &placementv1alpha1.ClusterResourcePlacementEviction{
226+
ObjectMeta: metav1.ObjectMeta{
227+
Name: crpEvictionName,
228+
},
229+
Spec: placementv1alpha1.PlacementEvictionSpec{
230+
PlacementName: crpName,
231+
ClusterName: memberCluster1EastProdName,
232+
},
233+
}
234+
Expect(hubClient.Create(ctx, crpe)).To(Succeed(), "Failed to create CRP eviction %s", crpe.Name)
235+
})
236+
237+
It("should update cluster resource placement eviction status as expected", func() {
238+
crpEvictionStatusUpdatedActual := testutilseviction.StatusUpdatedActual(
239+
ctx, hubClient, crpEvictionName,
240+
&testutilseviction.IsValidEviction{IsValid: true, Msg: condition.EvictionValidMessage},
241+
&testutilseviction.IsExecutedEviction{IsExecuted: false, Msg: fmt.Sprintf(condition.EvictionBlockedPDBSpecifiedMessageFmt, 3, 3)})
242+
Eventually(crpEvictionStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement eviction status as expected")
243+
})
244+
245+
It("should ensure cluster resource placement status is unchanged", func() {
246+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), allMemberClusterNames, nil, "0")
247+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
248+
})
249+
250+
It("should still place resources on the all available member clusters", checkIfPlacedWorkResourcesOnAllMemberClusters)
251+
})
252+
253+
var _ = Describe("ClusterResourcePlacement eviction of bound binding - PickAll CRP, PDB specified, eviction allowed", Ordered, Serial, func() {
254+
crpName := fmt.Sprintf(crpNameTemplate, GinkgoParallelProcess())
255+
crpEvictionName := fmt.Sprintf(crpEvictionNameTemplate, GinkgoParallelProcess())
256+
taintClusterNames := []string{memberCluster1EastProdName}
257+
258+
BeforeAll(func() {
259+
By("creating work resources")
260+
createWorkResources()
261+
262+
// Create the CRP.
263+
crp := &placementv1beta1.ClusterResourcePlacement{
264+
ObjectMeta: metav1.ObjectMeta{
265+
Name: crpName,
266+
// Add a custom finalizer; this would allow us to better observe
267+
// the behavior of the controllers.
268+
Finalizers: []string{customDeletionBlockerFinalizer},
269+
},
270+
Spec: placementv1beta1.ClusterResourcePlacementSpec{
271+
ResourceSelectors: workResourceSelector(),
272+
},
273+
}
274+
Expect(hubClient.Create(ctx, crp)).To(Succeed(), "Failed to create CRP %s", crpName)
275+
})
276+
277+
AfterAll(func() {
278+
removeTaintsFromMemberClusters(taintClusterNames)
279+
ensureCRPEvictionDeletion(crpEvictionName)
280+
ensureCRPDisruptionBudgetDeletion(crpName)
281+
ensureCRPAndRelatedResourcesDeletion(crpName, allMemberClusters)
282+
})
283+
284+
It("should update cluster resource placement status as expected", func() {
285+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), allMemberClusterNames, nil, "0")
286+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
287+
})
288+
289+
It("should place resources on the all available member clusters", checkIfPlacedWorkResourcesOnAllMemberClusters)
290+
291+
It("create cluster resource placement disruption budget to block eviction", func() {
292+
crpdb := placementv1alpha1.ClusterResourcePlacementDisruptionBudget{
293+
ObjectMeta: metav1.ObjectMeta{
294+
Name: crpName,
295+
},
296+
Spec: placementv1alpha1.PlacementDisruptionBudgetSpec{
297+
MinAvailable: &intstr.IntOrString{
298+
Type: intstr.Int,
299+
IntVal: 2,
300+
},
301+
},
302+
}
303+
Expect(hubClient.Create(ctx, &crpdb)).To(Succeed(), "Failed to create CRP Disruption Budget %s", crpName)
304+
})
305+
306+
It("add taint to member cluster 1", func() {
307+
addTaintsToMemberClusters(taintClusterNames, buildTaints(taintClusterNames))
308+
})
309+
310+
It("create cluster resource placement eviction targeting member cluster 1", func() {
311+
crpe := &placementv1alpha1.ClusterResourcePlacementEviction{
312+
ObjectMeta: metav1.ObjectMeta{
313+
Name: crpEvictionName,
314+
},
315+
Spec: placementv1alpha1.PlacementEvictionSpec{
316+
PlacementName: crpName,
317+
ClusterName: memberCluster1EastProdName,
318+
},
319+
}
320+
Expect(hubClient.Create(ctx, crpe)).To(Succeed(), "Failed to create CRP eviction %s", crpe.Name)
321+
})
322+
323+
It("should update cluster resource placement eviction status as expected", func() {
324+
crpEvictionStatusUpdatedActual := testutilseviction.StatusUpdatedActual(
325+
ctx, hubClient, crpEvictionName,
326+
&testutilseviction.IsValidEviction{IsValid: true, Msg: condition.EvictionValidMessage},
327+
&testutilseviction.IsExecutedEviction{IsExecuted: true, Msg: fmt.Sprintf(condition.EvictionAllowedPDBSpecifiedMessageFmt, 3, 3)})
328+
Eventually(crpEvictionStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement eviction status as expected")
329+
})
330+
331+
It("should ensure no resources exist on evicted member cluster with taint", func() {
332+
unSelectedClusters := []*framework.Cluster{memberCluster1EastProd}
333+
for _, cluster := range unSelectedClusters {
334+
resourceRemovedActual := workNamespaceRemovedFromClusterActual(cluster)
335+
Eventually(resourceRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to check if resources doesn't exist on member cluster")
336+
}
337+
})
338+
339+
It("should update cluster resource placement status as expected", func() {
340+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), []string{memberCluster2EastCanaryName, memberCluster3WestProdName}, nil, "0")
341+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
342+
})
343+
344+
It("should place resources on the selected clusters with no taint", func() {
345+
targetClusters := []*framework.Cluster{memberCluster2EastCanary, memberCluster3WestProd}
346+
for _, cluster := range targetClusters {
347+
resourcePlacedActual := workNamespaceAndConfigMapPlacedOnClusterActual(cluster)
348+
Eventually(resourcePlacedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to place resources on the selected clusters")
349+
}
350+
})
351+
})
352+
353+
var _ = Describe("ClusterResourcePlacement eviction of bound binding - PickN CRP, PDB with MaxUnavailable specified as Integer, eviction blocked", Ordered, Serial, func() {
354+
crpName := fmt.Sprintf(crpNameTemplate, GinkgoParallelProcess())
355+
crpEvictionName := fmt.Sprintf(crpEvictionNameTemplate, GinkgoParallelProcess())
356+
357+
BeforeAll(func() {
358+
By("creating work resources")
359+
createWorkResources()
360+
361+
// Create the CRP.
362+
crp := &placementv1beta1.ClusterResourcePlacement{
363+
ObjectMeta: metav1.ObjectMeta{
364+
Name: crpName,
365+
// Add a custom finalizer; this would allow us to better observe
366+
// the behavior of the controllers.
367+
Finalizers: []string{customDeletionBlockerFinalizer},
368+
},
369+
Spec: placementv1beta1.ClusterResourcePlacementSpec{
370+
Policy: &placementv1beta1.PlacementPolicy{
371+
PlacementType: placementv1beta1.PickNPlacementType,
372+
NumberOfClusters: ptr.To(int32(3)),
373+
},
374+
ResourceSelectors: workResourceSelector(),
375+
},
376+
}
377+
Expect(hubClient.Create(ctx, crp)).To(Succeed(), "Failed to create CRP %s", crpName)
378+
})
379+
380+
AfterAll(func() {
381+
ensureCRPEvictionDeletion(crpEvictionName)
382+
ensureCRPDisruptionBudgetDeletion(crpName)
383+
ensureCRPAndRelatedResourcesDeletion(crpName, allMemberClusters)
384+
})
385+
386+
It("should update cluster resource placement status as expected", func() {
387+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), allMemberClusterNames, nil, "0")
388+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
389+
})
390+
168391
It("should place resources on the all available member clusters", checkIfPlacedWorkResourcesOnAllMemberClusters)
392+
393+
It("create cluster resource placement disruption budget to block eviction", func() {
394+
crpdb := placementv1alpha1.ClusterResourcePlacementDisruptionBudget{
395+
ObjectMeta: metav1.ObjectMeta{
396+
Name: crpName,
397+
},
398+
Spec: placementv1alpha1.PlacementDisruptionBudgetSpec{
399+
MaxUnavailable: &intstr.IntOrString{
400+
Type: intstr.Int,
401+
IntVal: 0,
402+
},
403+
},
404+
}
405+
Expect(hubClient.Create(ctx, &crpdb)).To(Succeed(), "Failed to create CRP Disruption Budget %s", crpName)
406+
})
407+
408+
It("create cluster resource placement eviction targeting member cluster 1", func() {
409+
crpe := &placementv1alpha1.ClusterResourcePlacementEviction{
410+
ObjectMeta: metav1.ObjectMeta{
411+
Name: crpEvictionName,
412+
},
413+
Spec: placementv1alpha1.PlacementEvictionSpec{
414+
PlacementName: crpName,
415+
ClusterName: memberCluster1EastProdName,
416+
},
417+
}
418+
Expect(hubClient.Create(ctx, crpe)).To(Succeed(), "Failed to create CRP eviction %s", crpe.Name)
419+
})
420+
421+
It("should update cluster resource placement eviction status as expected", func() {
422+
crpEvictionStatusUpdatedActual := testutilseviction.StatusUpdatedActual(
423+
ctx, hubClient, crpEvictionName,
424+
&testutilseviction.IsValidEviction{IsValid: true, Msg: condition.EvictionValidMessage},
425+
&testutilseviction.IsExecutedEviction{IsExecuted: false, Msg: fmt.Sprintf(condition.EvictionBlockedPDBSpecifiedMessageFmt, 3, 3)})
426+
Eventually(crpEvictionStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement eviction status as expected")
427+
})
428+
429+
It("should ensure cluster resource placement status is unchanged", func() {
430+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), allMemberClusterNames, nil, "0")
431+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
432+
})
433+
434+
It("should still place resources on the all available member clusters", checkIfPlacedWorkResourcesOnAllMemberClusters)
435+
})
436+
437+
var _ = Describe("ClusterResourcePlacement eviction of bound binding - PickN CRP, PDB with MaxUnavailable specified as percentage, eviction allowed", Ordered, Serial, func() {
438+
crpName := fmt.Sprintf(crpNameTemplate, GinkgoParallelProcess())
439+
crpEvictionName := fmt.Sprintf(crpEvictionNameTemplate, GinkgoParallelProcess())
440+
taintClusterNames := []string{memberCluster1EastProdName}
441+
442+
BeforeAll(func() {
443+
By("creating work resources")
444+
createWorkResources()
445+
446+
// Create the CRP.
447+
crp := &placementv1beta1.ClusterResourcePlacement{
448+
ObjectMeta: metav1.ObjectMeta{
449+
Name: crpName,
450+
// Add a custom finalizer; this would allow us to better observe
451+
// the behavior of the controllers.
452+
Finalizers: []string{customDeletionBlockerFinalizer},
453+
},
454+
Spec: placementv1beta1.ClusterResourcePlacementSpec{
455+
Policy: &placementv1beta1.PlacementPolicy{
456+
PlacementType: placementv1beta1.PickNPlacementType,
457+
NumberOfClusters: ptr.To(int32(3)),
458+
},
459+
ResourceSelectors: workResourceSelector(),
460+
},
461+
}
462+
Expect(hubClient.Create(ctx, crp)).To(Succeed(), "Failed to create CRP %s", crpName)
463+
})
464+
465+
AfterAll(func() {
466+
removeTaintsFromMemberClusters(taintClusterNames)
467+
ensureCRPEvictionDeletion(crpEvictionName)
468+
ensureCRPDisruptionBudgetDeletion(crpName)
469+
ensureCRPAndRelatedResourcesDeletion(crpName, allMemberClusters)
470+
})
471+
472+
It("should update cluster resource placement status as expected", func() {
473+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), allMemberClusterNames, nil, "0")
474+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
475+
})
476+
477+
It("should place resources on the all available member clusters", checkIfPlacedWorkResourcesOnAllMemberClusters)
478+
479+
It("add taint to member cluster 1", func() {
480+
addTaintsToMemberClusters(taintClusterNames, buildTaints(taintClusterNames))
481+
})
482+
483+
It("create cluster resource placement disruption budget to block eviction", func() {
484+
crpdb := placementv1alpha1.ClusterResourcePlacementDisruptionBudget{
485+
ObjectMeta: metav1.ObjectMeta{
486+
Name: crpName,
487+
},
488+
Spec: placementv1alpha1.PlacementDisruptionBudgetSpec{
489+
MaxUnavailable: &intstr.IntOrString{
490+
Type: intstr.String,
491+
StrVal: "10%",
492+
},
493+
},
494+
}
495+
Expect(hubClient.Create(ctx, &crpdb)).To(Succeed(), "Failed to create CRP Disruption Budget %s", crpName)
496+
})
497+
498+
It("create cluster resource placement eviction targeting member cluster 1", func() {
499+
crpe := &placementv1alpha1.ClusterResourcePlacementEviction{
500+
ObjectMeta: metav1.ObjectMeta{
501+
Name: crpEvictionName,
502+
},
503+
Spec: placementv1alpha1.PlacementEvictionSpec{
504+
PlacementName: crpName,
505+
ClusterName: memberCluster1EastProdName,
506+
},
507+
}
508+
Expect(hubClient.Create(ctx, crpe)).To(Succeed(), "Failed to create CRP eviction %s", crpe.Name)
509+
})
510+
511+
It("should update cluster resource placement eviction status as expected", func() {
512+
crpEvictionStatusUpdatedActual := testutilseviction.StatusUpdatedActual(
513+
ctx, hubClient, crpEvictionName,
514+
&testutilseviction.IsValidEviction{IsValid: true, Msg: condition.EvictionValidMessage},
515+
&testutilseviction.IsExecutedEviction{IsExecuted: true, Msg: fmt.Sprintf(condition.EvictionAllowedPDBSpecifiedMessageFmt, 3, 3)})
516+
Eventually(crpEvictionStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement eviction status as expected")
517+
})
518+
519+
It("should ensure no resources exist on evicted member cluster with taint", func() {
520+
unSelectedClusters := []*framework.Cluster{memberCluster1EastProd}
521+
for _, cluster := range unSelectedClusters {
522+
resourceRemovedActual := workNamespaceRemovedFromClusterActual(cluster)
523+
Eventually(resourceRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to check if resources doesn't exist on member cluster")
524+
}
525+
})
526+
527+
It("should update cluster resource placement status as expected", func() {
528+
crpStatusUpdatedActual := crpStatusUpdatedActual(workResourceIdentifiers(), []string{memberCluster2EastCanaryName, memberCluster3WestProdName}, []string{memberCluster1EastProdName}, "0")
529+
Eventually(crpStatusUpdatedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update cluster resource placement status as expected")
530+
})
531+
532+
It("should place resources on the selected clusters with no taint", func() {
533+
targetClusters := []*framework.Cluster{memberCluster2EastCanary, memberCluster3WestProd}
534+
for _, cluster := range targetClusters {
535+
resourcePlacedActual := workNamespaceAndConfigMapPlacedOnClusterActual(cluster)
536+
Eventually(resourcePlacedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to place resources on the selected clusters")
537+
}
538+
})
169539
})

0 commit comments

Comments
 (0)