Skip to content

Commit 9c049bb

Browse files
test: add RP envelop resource test (#208)
1 parent 4161bca commit 9c049bb

File tree

2 files changed

+195
-24
lines changed

2 files changed

+195
-24
lines changed

test/e2e/enveloped_object_placement_test.go

Lines changed: 194 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ var _ = Describe("placing wrapped resources using a CRP", func() {
208208
AfterAll(func() {
209209
By(fmt.Sprintf("deleting envelope %s", testResourceEnvelope.Name))
210210
Expect(hubClient.Delete(ctx, &testResourceEnvelope)).To(Succeed(), "Failed to delete ResourceEnvelope")
211-
By(fmt.Sprintf("deleting envelope %s", testClusterResourceEnvelope.Name))
211+
By(fmt.Sprintf("deleting cluster scoped envelope %s", testClusterResourceEnvelope.Name))
212212
Expect(hubClient.Delete(ctx, &testClusterResourceEnvelope)).To(Succeed(), "Failed to delete testClusterResourceEnvelope")
213213
By(fmt.Sprintf("deleting placement %s and related resources", crpName))
214214
ensureCRPAndRelatedResourcesDeleted(crpName, allMemberClusters)
@@ -514,6 +514,163 @@ var _ = Describe("placing wrapped resources using a CRP", func() {
514514
})
515515
})
516516

517+
// Note that this container will run in parallel with other containers.
518+
var _ = Describe("Test NamespaceOnly placement through CRP then resource placement through ResourcePlacement", Ordered, func() {
519+
crpName := fmt.Sprintf(crpNameTemplate, GinkgoParallelProcess())
520+
rpName := fmt.Sprintf(rpNameTemplate, GinkgoParallelProcess())
521+
workNamespaceName := appNamespace().Name
522+
523+
BeforeAll(func() {
524+
// Create the test resources.
525+
By("Create the test resources in the namespace")
526+
readEnvelopTestManifests()
527+
createWrappedResourcesForEnvelopTest()
528+
})
529+
530+
It("Create the CRP that selects only the namespace with NamespaceOnly scope", func() {
531+
createNamespaceOnlyCRP(crpName)
532+
})
533+
534+
It("should update CRP status to show namespace placement", func() {
535+
statusUpdatedActual := crpStatusUpdatedActual(workNamespaceIdentifiers(), allMemberClusterNames, nil, "0")
536+
Eventually(statusUpdatedActual, workloadEventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update CRP status as expected")
537+
})
538+
539+
It("should place only the namespace on all member clusters", func() {
540+
for idx := range allMemberClusters {
541+
memberCluster := allMemberClusters[idx]
542+
// Verify namespace is placed
543+
workNamespacePlacedActual := func() error {
544+
return validateWorkNamespaceOnCluster(memberCluster, types.NamespacedName{Name: workNamespaceName})
545+
}
546+
Eventually(workNamespacePlacedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to place namespace on member cluster %s", memberCluster.ClusterName)
547+
548+
// Verify configMap is NOT placed (NamespaceOnly should not include resources within namespace)
549+
nameSpaceResourceNotPlacedActual := namespacedResourcesRemovedFromClusterActual(memberCluster, &testConfigMap)
550+
Consistently(nameSpaceResourceNotPlacedActual, consistentlyDuration, consistentlyInterval).Should(Succeed(), "Namespace resource (ConfigMap) should not be placed with NamespaceOnly selection on member cluster %s", memberCluster.ClusterName)
551+
}
552+
})
553+
554+
It("Create the ResourcePlacement that selects the ResourceEnvelope", func() {
555+
rp := &placementv1beta1.ResourcePlacement{
556+
ObjectMeta: metav1.ObjectMeta{
557+
Name: rpName,
558+
Namespace: workNamespaceName,
559+
// Add a custom finalizer; this would allow us to better observe
560+
// the behavior of the controllers.
561+
Finalizers: []string{customDeletionBlockerFinalizer},
562+
},
563+
Spec: placementv1beta1.PlacementSpec{
564+
ResourceSelectors: []placementv1beta1.ResourceSelectorTerm{
565+
{
566+
Group: placementv1beta1.GroupVersion.Group,
567+
Kind: placementv1beta1.ResourceEnvelopeKind,
568+
Version: placementv1beta1.GroupVersion.Version,
569+
Name: testResourceEnvelope.Name,
570+
},
571+
},
572+
Strategy: placementv1beta1.RolloutStrategy{
573+
Type: placementv1beta1.RollingUpdateRolloutStrategyType,
574+
RollingUpdate: &placementv1beta1.RollingUpdateConfig{
575+
UnavailablePeriodSeconds: ptr.To(2),
576+
},
577+
},
578+
},
579+
}
580+
Expect(hubClient.Create(ctx, rp)).To(Succeed(), "Failed to create ResourcePlacement")
581+
})
582+
583+
It("should update ResourcePlacement status as expected", func() {
584+
rpSelectedResources := []placementv1beta1.ResourceIdentifier{
585+
{
586+
Group: placementv1beta1.GroupVersion.Group,
587+
Kind: placementv1beta1.ResourceEnvelopeKind,
588+
Version: placementv1beta1.GroupVersion.Version,
589+
Name: testResourceEnvelope.Name,
590+
Namespace: workNamespaceName,
591+
},
592+
}
593+
Eventually(rpStatusUpdatedActual(rpSelectedResources, allMemberClusterNames, nil, "0"), eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to update ResourcePlacement status as expected")
594+
})
595+
596+
It("should place the enveloped resources on all member clusters", func() {
597+
for idx := range allMemberClusters {
598+
memberCluster := allMemberClusters[idx]
599+
workResourcesPlacedActual := checkEnvelopedResourcesPlacement(memberCluster)
600+
Eventually(workResourcesPlacedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to place enveloped resources on member cluster %s", memberCluster.ClusterName)
601+
}
602+
})
603+
604+
It("should not placed the configMap on any clusters as its not selected", func() {
605+
// Verify that all resources placed have been removed from specified member clusters.
606+
for idx := range allMemberClusters {
607+
memberCluster := allMemberClusters[idx]
608+
configMapNotPlacedActual := namespacedResourcesRemovedFromClusterActual(memberCluster, &testConfigMap)
609+
Eventually(configMapNotPlacedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove work resources from member cluster %s", memberCluster.ClusterName)
610+
}
611+
})
612+
613+
It("can delete the ResourcePlacement", func() {
614+
rp := &placementv1beta1.ResourcePlacement{
615+
ObjectMeta: metav1.ObjectMeta{
616+
Name: rpName,
617+
Namespace: workNamespaceName,
618+
},
619+
}
620+
Expect(hubClient.Delete(ctx, rp)).To(Succeed(), "Failed to delete ResourcePlacement")
621+
})
622+
623+
It("should remove enveloped resources from all clusters", func() {
624+
// Verify that all resources placed have been removed from specified member clusters.
625+
for idx := range allMemberClusters {
626+
memberCluster := allMemberClusters[idx]
627+
workResourcesRemovedActual := namespacedResourcesRemovedFromClusterActual(memberCluster, &testDeployment, &testResourceQuota)
628+
Eventually(workResourcesRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove work resources from member cluster %s", memberCluster.ClusterName)
629+
}
630+
})
631+
632+
It("should remove controller finalizers from ResourcePlacement", func() {
633+
finalizerRemovedActual := allFinalizersExceptForCustomDeletionBlockerRemovedFromPlacementActual(types.NamespacedName{Name: rpName, Namespace: workNamespaceName})
634+
Eventually(finalizerRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove controller finalizers from ResourcePlacement")
635+
})
636+
637+
It("should not remove namespace on all member clusters", func() {
638+
for idx := range allMemberClusters {
639+
memberCluster := allMemberClusters[idx]
640+
// Verify namespace is placed
641+
workNamespacePlacedActual := func() error {
642+
return validateWorkNamespaceOnCluster(memberCluster, types.NamespacedName{Name: workNamespaceName})
643+
}
644+
Eventually(workNamespacePlacedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to place namespace on member cluster %s", memberCluster.ClusterName)
645+
}
646+
})
647+
648+
It("can delete the CRP", func() {
649+
crp := &placementv1beta1.ClusterResourcePlacement{
650+
ObjectMeta: metav1.ObjectMeta{
651+
Name: crpName,
652+
},
653+
}
654+
Expect(hubClient.Delete(ctx, crp)).To(Succeed(), "Failed to delete CRP")
655+
})
656+
657+
It("should remove placed resources from all member clusters", checkIfRemovedWorkResourcesFromAllMemberClusters)
658+
659+
It("should remove controller finalizers from CRP", func() {
660+
finalizerRemovedActual := allFinalizersExceptForCustomDeletionBlockerRemovedFromPlacementActual(types.NamespacedName{Name: crpName})
661+
Eventually(finalizerRemovedActual, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove controller finalizers from CRP")
662+
})
663+
664+
AfterAll(func() {
665+
By(fmt.Sprintf("deleting ResourcePlacement %s and related resources", rpName))
666+
ensureRPAndRelatedResourcesDeleted(types.NamespacedName{Name: rpName, Namespace: workNamespaceName}, allMemberClusters)
667+
By(fmt.Sprintf("deleting envelope %s", testClusterResourceEnvelope.Name))
668+
Expect(hubClient.Delete(ctx, &testClusterResourceEnvelope)).To(Succeed(), "Failed to delete testClusterResourceEnvelope")
669+
By(fmt.Sprintf("deleting placement %s and related resources", crpName))
670+
ensureCRPAndRelatedResourcesDeleted(crpName, allMemberClusters)
671+
})
672+
})
673+
517674
var _ = Describe("Process objects with generate name", Ordered, func() {
518675
crpName := fmt.Sprintf(crpNameTemplate, GinkgoParallelProcess())
519676
workNamespaceName := fmt.Sprintf(workNamespaceNameTemplate, GinkgoParallelProcess())
@@ -772,9 +929,10 @@ func readEnvelopTestManifests() {
772929
}
773930

774931
By("Create ClusterResourceEnvelope template")
932+
clusterEnvName := fmt.Sprintf("test-cluster-resource-envelope-%d", GinkgoParallelProcess())
775933
testClusterResourceEnvelope = placementv1beta1.ClusterResourceEnvelope{
776934
ObjectMeta: metav1.ObjectMeta{
777-
Name: "test-cluster-resource-envelope",
935+
Name: clusterEnvName,
778936
},
779937
Data: make(map[string]runtime.RawExtension),
780938
}
@@ -824,28 +982,10 @@ func cleanupWrappedResourcesForEnvelopTest() {
824982
}, eventuallyDuration, eventuallyInterval).Should(Succeed(), "Failed to remove testClusterResourceEnvelope from hub cluster")
825983
}
826984

827-
func checkAllResourcesPlacement(memberCluster *framework.Cluster) func() error {
985+
// checkEnvelopedResourcesPlacement checks if the enveloped resources (ResourceQuota and Deployment from ResourceEnvelope) are placed correctly
986+
func checkEnvelopedResourcesPlacement(memberCluster *framework.Cluster) func() error {
828987
workNamespaceName := appNamespace().Name
829988
return func() error {
830-
// Verify namespace exists on target cluster
831-
if err := validateWorkNamespaceOnCluster(memberCluster, types.NamespacedName{Name: workNamespaceName}); err != nil {
832-
return err
833-
}
834-
835-
// Check that ConfigMap was placed
836-
By("Check ConfigMap")
837-
placedConfigMap := &corev1.ConfigMap{}
838-
if err := memberCluster.KubeClient.Get(ctx, types.NamespacedName{
839-
Namespace: workNamespaceName,
840-
Name: testConfigMap.Name,
841-
}, placedConfigMap); err != nil {
842-
return fmt.Errorf("failed to find configMap %s: %w", testConfigMap.Name, err)
843-
}
844-
// Verify the Configmap matches expected spec
845-
if diff := cmp.Diff(placedConfigMap.Data, testConfigMap.Data); diff != "" {
846-
return fmt.Errorf("ResourceQuota from ResourceEnvelope diff (-got, +want): %s", diff)
847-
}
848-
849989
// Check that ResourceQuota from ResourceEnvelope was placed
850990
By("Check ResourceQuota from ResourceEnvelope")
851991
placedResourceQuota := &corev1.ResourceQuota{}
@@ -867,14 +1007,45 @@ func checkAllResourcesPlacement(memberCluster *framework.Cluster) func() error {
8671007
Namespace: workNamespaceName,
8681008
Name: testDeployment.Name,
8691009
}, placedDeployment); err != nil {
870-
return fmt.Errorf("failed to find ResourceQuota from ResourceEnvelope: %w", err)
1010+
return fmt.Errorf("failed to find Deployment from ResourceEnvelope: %w", err)
8711011
}
8721012

8731013
// Verify the deployment matches expected spec
8741014
if diff := cmp.Diff(placedDeployment.Spec.Template.Spec.Containers[0].Image, testDeployment.Spec.Template.Spec.Containers[0].Image); diff != "" {
8751015
return fmt.Errorf("deployment from ResourceEnvelope diff (-got, +want): %s", diff)
8761016
}
8771017

1018+
return nil
1019+
}
1020+
}
1021+
1022+
func checkAllResourcesPlacement(memberCluster *framework.Cluster) func() error {
1023+
workNamespaceName := appNamespace().Name
1024+
return func() error {
1025+
// Verify namespace exists on target cluster
1026+
if err := validateWorkNamespaceOnCluster(memberCluster, types.NamespacedName{Name: workNamespaceName}); err != nil {
1027+
return err
1028+
}
1029+
1030+
// Check that ConfigMap was placed
1031+
By("Check ConfigMap")
1032+
placedConfigMap := &corev1.ConfigMap{}
1033+
if err := memberCluster.KubeClient.Get(ctx, types.NamespacedName{
1034+
Namespace: workNamespaceName,
1035+
Name: testConfigMap.Name,
1036+
}, placedConfigMap); err != nil {
1037+
return fmt.Errorf("failed to find configMap %s: %w", testConfigMap.Name, err)
1038+
}
1039+
// Verify the Configmap matches expected spec
1040+
if diff := cmp.Diff(placedConfigMap.Data, testConfigMap.Data); diff != "" {
1041+
return fmt.Errorf("ConfigMap diff (-got, +want): %s", diff)
1042+
}
1043+
1044+
// Check enveloped resources (ResourceQuota and Deployment from ResourceEnvelope)
1045+
if err := checkEnvelopedResourcesPlacement(memberCluster)(); err != nil {
1046+
return err
1047+
}
1048+
8781049
// Check that ClusterRole from ClusterResourceEnvelope was placed
8791050
By("Check ClusterRole from ClusterResourceEnvelope")
8801051
placedClusterRole := &rbacv1.ClusterRole{}

test/e2e/resource_placement_pickfixed_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ var _ = Describe("placing namespaced scoped resources using an RP with PickFixed
112112
})
113113

114114
Context("refreshing target clusters", Ordered, func() {
115-
It("should should create an RP with pickFixed policy successfully", func() {
115+
It("should create an RP with pickFixed policy successfully", func() {
116116
// Create the RP in the same namespace selecting namespaced resources.
117117
rp := &placementv1beta1.ResourcePlacement{
118118
ObjectMeta: metav1.ObjectMeta{

0 commit comments

Comments
 (0)