From d5775aef5eec8ecb03d40dcdd7e690445ec9f3ba Mon Sep 17 00:00:00 2001 From: Dave Chen Date: Wed, 23 Feb 2022 16:42:50 +0800 Subject: [PATCH 1/2] e2e: Embed dns related maninfests into codebase Signed-off-by: Dave Chen --- test/e2e/network/example_cluster_dns.go | 41 ++++++------------- .../cluster-dns/dns-backend-rc.yaml | 21 ++++++++++ .../cluster-dns/dns-backend-service.yaml | 9 ++++ .../cluster-dns/dns-frontend-pod.yaml | 16 ++++++++ test/e2e/testing-manifests/embed.go | 2 +- 5 files changed, 60 insertions(+), 29 deletions(-) create mode 100644 test/e2e/testing-manifests/cluster-dns/dns-backend-rc.yaml create mode 100644 test/e2e/testing-manifests/cluster-dns/dns-backend-service.yaml create mode 100644 test/e2e/testing-manifests/cluster-dns/dns-frontend-pod.yaml diff --git a/test/e2e/network/example_cluster_dns.go b/test/e2e/network/example_cluster_dns.go index 7fbef28ae60..41029a30283 100644 --- a/test/e2e/network/example_cluster_dns.go +++ b/test/e2e/network/example_cluster_dns.go @@ -19,8 +19,6 @@ package network import ( "context" "fmt" - "io" - "os" "path/filepath" "strings" "time" @@ -38,6 +36,7 @@ import ( e2epod "k8s.io/kubernetes/test/e2e/framework/pod" e2eresource "k8s.io/kubernetes/test/e2e/framework/resource" e2eservice "k8s.io/kubernetes/test/e2e/framework/service" + e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" "k8s.io/kubernetes/test/e2e/network/common" ) @@ -64,25 +63,26 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { c = f.ClientSet }) - ginkgo.It("should create pod that uses dns", func() { - mkpath := func(file string) string { - return filepath.Join(os.Getenv("GOPATH"), "src/k8s.io/examples/staging/cluster-dns", file) + read := func(file string) string { + data, err := e2etestfiles.Read(file) + if err != nil { + framework.Fail(err.Error()) } + return string(data) + } + ginkgo.It("should create pod that uses dns", func() { // contrary to the example, this test does not use contexts, for simplicity // namespaces are passed directly. // Also, for simplicity, we don't use yamls with namespaces, but we // create testing namespaces instead. - backendRcYaml := mkpath("dns-backend-rc.yaml") backendRcName := "dns-backend" - backendSvcYaml := mkpath("dns-backend-service.yaml") backendSvcName := "dns-backend" backendPodName := "dns-backend" - frontendPodYaml := mkpath("dns-frontend-pod.yaml") frontendPodName := "dns-frontend" frontendPodContainerName := "dns-frontend" - + clusterDnsPath := "test/e2e/testing-manifests/cluster-dns" podOutput := "Hello World!" // we need two namespaces anyway, so let's forget about @@ -96,11 +96,11 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { } for _, ns := range namespaces { - framework.RunKubectlOrDie(ns.Name, "create", "-f", backendRcYaml, getNsCmdFlag(ns)) + framework.RunKubectlOrDieInput(ns.Name, read(filepath.Join(clusterDnsPath, "dns-backend-rc.yaml")), "create", "-f", "-") } for _, ns := range namespaces { - framework.RunKubectlOrDie(ns.Name, "create", "-f", backendSvcYaml, getNsCmdFlag(ns)) + framework.RunKubectlOrDieInput(ns.Name, read(filepath.Join(clusterDnsPath, "dns-backend-service.yaml")), "create", "-f", "-") } // wait for objects @@ -144,11 +144,11 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { _, err = framework.LookForStringInPodExec(namespaces[0].Name, podName, []string{"python", "-c", queryDNS}, "ok", dnsReadyTimeout) framework.ExpectNoError(err, "waiting for output from pod exec") - updatedPodYaml := prepareResourceWithReplacedString(frontendPodYaml, fmt.Sprintf("dns-backend.development.svc.%s", framework.TestContext.ClusterDNSDomain), fmt.Sprintf("dns-backend.%s.svc.%s", namespaces[0].Name, framework.TestContext.ClusterDNSDomain)) + updatedPodYaml := strings.Replace(read(filepath.Join(clusterDnsPath, "dns-frontend-pod.yaml")), fmt.Sprintf("dns-backend.development.svc.%s", framework.TestContext.ClusterDNSDomain), fmt.Sprintf("dns-backend.%s.svc.%s", namespaces[0].Name, framework.TestContext.ClusterDNSDomain), 1) // create a pod in each namespace for _, ns := range namespaces { - framework.NewKubectlCommand(ns.Name, "create", "-f", "-", getNsCmdFlag(ns)).WithStdinData(updatedPodYaml).ExecOrDie(ns.Name) + framework.RunKubectlOrDieInput(ns.Name, updatedPodYaml, "create", "-f", "-") } // wait until the pods have been scheduler, i.e. are not Pending anymore. Remember @@ -166,21 +166,6 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { }) }) -func getNsCmdFlag(ns *v1.Namespace) string { - return fmt.Sprintf("--namespace=%v", ns.Name) -} - -// pass enough context with the 'old' parameter so that it replaces what your really intended. -func prepareResourceWithReplacedString(inputFile, old, new string) string { - f, err := os.Open(inputFile) - framework.ExpectNoError(err, "failed to open file: %s", inputFile) - defer f.Close() - data, err := io.ReadAll(f) - framework.ExpectNoError(err, "failed to read from file: %s", inputFile) - podYaml := strings.Replace(string(data), old, new, 1) - return podYaml -} - // waitForServiceResponding waits for the service to be responding. func waitForServiceResponding(c clientset.Interface, ns, name string) error { ginkgo.By(fmt.Sprintf("trying to dial the service %s.%s via the proxy", ns, name)) diff --git a/test/e2e/testing-manifests/cluster-dns/dns-backend-rc.yaml b/test/e2e/testing-manifests/cluster-dns/dns-backend-rc.yaml new file mode 100644 index 00000000000..4af1b0dcbaa --- /dev/null +++ b/test/e2e/testing-manifests/cluster-dns/dns-backend-rc.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: ReplicationController +metadata: + name: dns-backend + labels: + name: dns-backend +spec: + replicas: 1 + selector: + name: dns-backend + template: + metadata: + labels: + name: dns-backend + spec: + containers: + - name: dns-backend + image: k8s.gcr.io/example-dns-backend:v1 + ports: + - name: backend-port + containerPort: 8000 diff --git a/test/e2e/testing-manifests/cluster-dns/dns-backend-service.yaml b/test/e2e/testing-manifests/cluster-dns/dns-backend-service.yaml new file mode 100644 index 00000000000..0a814ce1896 --- /dev/null +++ b/test/e2e/testing-manifests/cluster-dns/dns-backend-service.yaml @@ -0,0 +1,9 @@ +kind: Service +apiVersion: v1 +metadata: + name: dns-backend +spec: + ports: + - port: 8000 + selector: + name: dns-backend diff --git a/test/e2e/testing-manifests/cluster-dns/dns-frontend-pod.yaml b/test/e2e/testing-manifests/cluster-dns/dns-frontend-pod.yaml new file mode 100644 index 00000000000..4a7695f1138 --- /dev/null +++ b/test/e2e/testing-manifests/cluster-dns/dns-frontend-pod.yaml @@ -0,0 +1,16 @@ +apiVersion: v1 +kind: Pod +metadata: + name: dns-frontend + labels: + name: dns-frontend +spec: + containers: + - name: dns-frontend + image: k8s.gcr.io/example-dns-frontend:v1 + command: + - python + - client.py + - http://dns-backend.development.svc.cluster.local:8000 + imagePullPolicy: Always + restartPolicy: Never diff --git a/test/e2e/testing-manifests/embed.go b/test/e2e/testing-manifests/embed.go index 1b91b46aa51..a763b2fc87c 100644 --- a/test/e2e/testing-manifests/embed.go +++ b/test/e2e/testing-manifests/embed.go @@ -22,7 +22,7 @@ import ( e2etestfiles "k8s.io/kubernetes/test/e2e/framework/testfiles" ) -//go:embed flexvolume guestbook kubectl sample-device-plugin.yaml scheduling/nvidia-driver-installer.yaml statefulset storage-csi +//go:embed cluster-dns flexvolume guestbook kubectl sample-device-plugin.yaml scheduling/nvidia-driver-installer.yaml statefulset storage-csi var e2eTestingManifestsFS embed.FS func GetE2ETestingManifestsFS() e2etestfiles.EmbeddedFileSource { From cee132b197dcb7d22293de840ce552a927e05e14 Mon Sep 17 00:00:00 2001 From: Dave Chen Date: Wed, 23 Feb 2022 17:08:10 +0800 Subject: [PATCH 2/2] Remove couple of variables to simplify the code Signed-off-by: Dave Chen --- test/e2e/network/example_cluster_dns.go | 27 +++++++++++-------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/test/e2e/network/example_cluster_dns.go b/test/e2e/network/example_cluster_dns.go index 41029a30283..97c6f34768e 100644 --- a/test/e2e/network/example_cluster_dns.go +++ b/test/e2e/network/example_cluster_dns.go @@ -77,11 +77,8 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { // Also, for simplicity, we don't use yamls with namespaces, but we // create testing namespaces instead. - backendRcName := "dns-backend" - backendSvcName := "dns-backend" - backendPodName := "dns-backend" - frontendPodName := "dns-frontend" - frontendPodContainerName := "dns-frontend" + backendName := "dns-backend" + frontendName := "dns-frontend" clusterDnsPath := "test/e2e/testing-manifests/cluster-dns" podOutput := "Hello World!" @@ -105,21 +102,21 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { // wait for objects for _, ns := range namespaces { - e2eresource.WaitForControlledPodsRunning(c, ns.Name, backendRcName, api.Kind("ReplicationController")) - e2enetwork.WaitForService(c, ns.Name, backendSvcName, true, framework.Poll, framework.ServiceStartTimeout) + e2eresource.WaitForControlledPodsRunning(c, ns.Name, backendName, api.Kind("ReplicationController")) + e2enetwork.WaitForService(c, ns.Name, backendName, true, framework.Poll, framework.ServiceStartTimeout) } // it is not enough that pods are running because they may be set to running, but // the application itself may have not been initialized. Just query the application. for _, ns := range namespaces { - label := labels.SelectorFromSet(labels.Set(map[string]string{"name": backendRcName})) + label := labels.SelectorFromSet(labels.Set(map[string]string{"name": backendName})) options := metav1.ListOptions{LabelSelector: label.String()} pods, err := c.CoreV1().Pods(ns.Name).List(context.TODO(), options) framework.ExpectNoError(err, "failed to list pods in namespace: %s", ns.Name) - err = e2epod.PodsResponding(c, ns.Name, backendPodName, false, pods) + err = e2epod.PodsResponding(c, ns.Name, backendName, false, pods) framework.ExpectNoError(err, "waiting for all pods to respond") framework.Logf("found %d backend pods responding in namespace %s", len(pods.Items), ns.Name) - err = waitForServiceResponding(c, ns.Name, backendSvcName) + err = waitForServiceResponding(c, ns.Name, backendName) framework.ExpectNoError(err, "waiting for the service to respond") } @@ -131,7 +128,7 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { // This complicated code may be removed if the pod itself retried after // dns error or timeout. // This code is probably unnecessary, but let's stay on the safe side. - label := labels.SelectorFromSet(labels.Set(map[string]string{"name": backendPodName})) + label := labels.SelectorFromSet(labels.Set(map[string]string{"name": backendName})) options := metav1.ListOptions{LabelSelector: label.String()} pods, err := c.CoreV1().Pods(namespaces[0].Name).List(context.TODO(), options) @@ -140,7 +137,7 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { } podName := pods.Items[0].Name - queryDNS := fmt.Sprintf(queryDNSPythonTemplate, backendSvcName+"."+namespaces[0].Name) + queryDNS := fmt.Sprintf(queryDNSPythonTemplate, backendName+"."+namespaces[0].Name) _, err = framework.LookForStringInPodExec(namespaces[0].Name, podName, []string{"python", "-c", queryDNS}, "ok", dnsReadyTimeout) framework.ExpectNoError(err, "waiting for output from pod exec") @@ -154,14 +151,14 @@ var _ = common.SIGDescribe("ClusterDns [Feature:Example]", func() { // wait until the pods have been scheduler, i.e. are not Pending anymore. Remember // that we cannot wait for the pods to be running because our pods terminate by themselves. for _, ns := range namespaces { - err := e2epod.WaitForPodNotPending(c, ns.Name, frontendPodName) + err := e2epod.WaitForPodNotPending(c, ns.Name, frontendName) framework.ExpectNoError(err) } // wait for pods to print their result for _, ns := range namespaces { - _, err := framework.LookForStringInLog(ns.Name, frontendPodName, frontendPodContainerName, podOutput, framework.PodStartTimeout) - framework.ExpectNoError(err, "pod %s failed to print result in logs", frontendPodName) + _, err := framework.LookForStringInLog(ns.Name, frontendName, frontendName, podOutput, framework.PodStartTimeout) + framework.ExpectNoError(err, "pod %s failed to print result in logs", frontendName) } }) })