diff --git a/test/e2e/suites/base/search_test.go b/test/e2e/suites/base/search_test.go index 81aac8cf0..bf10025e1 100644 --- a/test/e2e/suites/base/search_test.go +++ b/test/e2e/suites/base/search_test.go @@ -362,6 +362,7 @@ var _ = ginkgo.Describe("[karmada-search] karmada search testing", ginkgo.Ordere m1Client, m2Client, proxyClient kubernetes.Interface m1Dynamic, m2Dynamic dynamic.Interface nodeGVR = corev1.SchemeGroupVersion.WithResource("nodes") + secretGVR = corev1.SchemeGroupVersion.WithResource("secrets") ) ginkgo.BeforeAll(func() { @@ -721,7 +722,108 @@ var _ = ginkgo.Describe("[karmada-search] karmada search testing", ginkgo.Ordere gomega.Expect(metav1.HasAnnotation(node.ObjectMeta, clusterv1alpha1.CacheSourceAnnotationKey)).Should(gomega.BeFalse()) }) }) + + ginkgo.Context("caching secret via two ResourceRegistry configurations from different namespaces", func() { + var m1SecretName1, m1SecretName2 string + var m1Secret1, m1Secret2 *corev1.Secret + var member1Client kubernetes.Interface + + var rrName string + var rr *searchv1alpha1.ResourceRegistry + var rr2Name string + var rr2 *searchv1alpha1.ResourceRegistry + + ginkgo.BeforeAll(func() { + member1Client = framework.GetClusterClient(member1) + gomega.Expect(member1Client).ShouldNot(gomega.BeNil()) + // create two secrets in two different namespaces + m1SecretName1 = secretNamePrefix + rand.String(RandomStrLength) + m1Secret1 = testhelper.NewSecret(testNamespace, m1SecretName1, map[string][]byte{"user": []byte("karmada")}) + framework.CreateSecret(member1Client, m1Secret1) + + m1SecretName2 = secretNamePrefix + rand.String(RandomStrLength) + m1Secret2 = testhelper.NewSecret(secondaryTestNamespace, m1SecretName2, map[string][]byte{"user": []byte("karmada")}) + framework.CreateSecret(member1Client, m1Secret2) + // create two resourceRegistries,same cluster with different namespaces + rrName = resourceRegistryPrefix + rand.String(RandomStrLength) + rr = &searchv1alpha1.ResourceRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: rrName, + }, + Spec: searchv1alpha1.ResourceRegistrySpec{ + TargetCluster: policyv1alpha1.ClusterAffinity{ + ClusterNames: []string{member1}, + }, + ResourceSelectors: []searchv1alpha1.ResourceSelector{ + { + APIVersion: "v1", + Kind: "Secret", + Namespace: testNamespace, + }, + }, + }, + } + framework.CreateResourceRegistry(karmadaClient, rr) + + rr2Name = resourceRegistryPrefix + rand.String(RandomStrLength) + rr2 = &searchv1alpha1.ResourceRegistry{ + ObjectMeta: metav1.ObjectMeta{ + Name: rr2Name, + }, + Spec: searchv1alpha1.ResourceRegistrySpec{ + TargetCluster: policyv1alpha1.ClusterAffinity{ + ClusterNames: []string{member1}, + }, + ResourceSelectors: []searchv1alpha1.ResourceSelector{ + { + APIVersion: "v1", + Kind: "Secret", + Namespace: secondaryTestNamespace, + }, + }, + }, + } + framework.CreateResourceRegistry(karmadaClient, rr2) + }) + + ginkgo.AfterAll(func() { + framework.RemoveSecret(member1Client, testNamespace, m1SecretName1) + framework.RemoveSecret(member1Client, secondaryTestNamespace, m1SecretName2) + framework.RemoveResourceRegistry(karmadaClient, rrName) + framework.RemoveResourceRegistry(karmadaClient, rr2Name) + }) + + ginkgo.It("all secrets should be listed from two namespaces", func() { + fromM1TestNamespace := framework.GetResourceNames(m1Dynamic.Resource(secretGVR).Namespace(testNamespace)) + ginkgo.By(fmt.Sprintf("list secret from cluster %s namespace %s: %s", member1, testNamespace, strings.Join(sets.List(fromM1TestNamespace), ","))) + + fromM1TestNamespace2 := framework.GetResourceNames(m1Dynamic.Resource(secretGVR).Namespace(secondaryTestNamespace)) + ginkgo.By(fmt.Sprintf("list secret from cluster %s namespace %s: %s", member1, secondaryTestNamespace, strings.Join(sets.List(fromM1TestNamespace2), ","))) + fromMembers := sets.New[string]().Union(fromM1TestNamespace).Union(fromM1TestNamespace2) + + var proxyList *corev1.SecretList + gomega.Eventually(func(g gomega.Gomega) { + var err error + proxyList, err = proxyClient.CoreV1().Secrets(testNamespace).List(context.TODO(), metav1.ListOptions{}) + g.Expect(err).ShouldNot(gomega.HaveOccurred()) + + fromProxy := sets.New[string]() + for _, item := range proxyList.Items { + fromProxy.Insert(item.Name) + } + + proxyList, err = proxyClient.CoreV1().Secrets(secondaryTestNamespace).List(context.TODO(), metav1.ListOptions{}) + g.Expect(err).ShouldNot(gomega.HaveOccurred()) + for _, item := range proxyList.Items { + fromProxy.Insert(item.Name) + } + + g.Expect(fromProxy).Should(gomega.Equal(fromMembers)) + }, pollTimeout, pollInterval).Should(gomega.Succeed()) + }) + }) }) + }) }) diff --git a/test/e2e/suites/base/suite_test.go b/test/e2e/suites/base/suite_test.go index d772ecfab..64894cd87 100644 --- a/test/e2e/suites/base/suite_test.go +++ b/test/e2e/suites/base/suite_test.go @@ -103,23 +103,28 @@ var ( ) var ( - hostContext string - karmadaContext string - kubeconfig string - karmadactlPath string - restConfig *rest.Config - karmadaHost string - hostKubeClient kubernetes.Interface - kubeClient kubernetes.Interface - karmadaClient karmada.Interface - dynamicClient dynamic.Interface - discoveryClient *discovery.DiscoveryClient - restMapper meta.RESTMapper - controlPlaneClient client.Client - testNamespace string - clusterProvider *cluster.Provider - clusterLabels = map[string]string{"location": "CHN"} - pushModeClusterLabels = map[string]string{"sync-mode": "Push"} + hostContext string + karmadaContext string + kubeconfig string + karmadactlPath string + restConfig *rest.Config + karmadaHost string + hostKubeClient kubernetes.Interface + kubeClient kubernetes.Interface + karmadaClient karmada.Interface + dynamicClient dynamic.Interface + discoveryClient *discovery.DiscoveryClient + restMapper meta.RESTMapper + controlPlaneClient client.Client + // testNamespace is the main namespace for testing. + // It is the default namespace where most test resources are created and validated. + testNamespace string + // secondaryTestNamespace is an additional namespace used for testing. + // It is only required in specific scenarios where resources need to be created and tested across multiple namespaces. + secondaryTestNamespace string + clusterProvider *cluster.Provider + clusterLabels = map[string]string{"location": "CHN"} + pushModeClusterLabels = map[string]string{"sync-mode": "Push"} ) func init() { @@ -187,6 +192,10 @@ var _ = ginkgo.SynchronizedBeforeSuite(func() []byte { err = setupTestNamespace(testNamespace, kubeClient) gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) + secondaryTestNamespace = fmt.Sprintf("karmadatest-%s", rand.String(RandomStrLength)) + err = setupTestNamespace(secondaryTestNamespace, kubeClient) + gomega.Expect(err).ShouldNot(gomega.HaveOccurred()) + framework.WaitNamespacePresentOnClusters(framework.ClusterNames(), testNamespace) })