From 23ff1bb7047782ba7e30963b148b28b7266f6db2 Mon Sep 17 00:00:00 2001 From: Minhan Xia Date: Wed, 18 Oct 2017 16:44:48 -0700 Subject: [PATCH] add e2e test for syncing endpoints to NEG --- test/e2e/framework/ingress_utils.go | 22 +++++++++++++++ test/e2e/network/ingress.go | 44 ++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/test/e2e/framework/ingress_utils.go b/test/e2e/framework/ingress_utils.go index 666fafe60b4..982e244e677 100644 --- a/test/e2e/framework/ingress_utils.go +++ b/test/e2e/framework/ingress_utils.go @@ -1104,6 +1104,28 @@ func (j *IngressTestJig) ConstructFirewallForIngress(gceController *GCEIngressCo return &fw } +// GetDistinctResponseFromIngress tries GET call to the ingress VIP and return all distinct responses. +func (j *IngressTestJig) GetDistinctResponseFromIngress() (sets.String, error) { + // Wait for the loadbalancer IP. + address, err := WaitForIngressAddress(j.Client, j.Ingress.Namespace, j.Ingress.Name, LoadBalancerPollTimeout) + if err != nil { + Failf("Ingress failed to acquire an IP address within %v", LoadBalancerPollTimeout) + } + responses := sets.NewString() + timeoutClient := &http.Client{Timeout: IngressReqTimeout} + + for i := 0; i < 100; i++ { + url := fmt.Sprintf("http://%v", address) + res, err := SimpleGET(timeoutClient, url, "") + if err != nil { + Logf("Failed to GET %q. Got responses: %q: %v", url, res, err) + return responses, err + } + responses.Insert(res) + } + return responses, nil +} + func (cont *GCEIngressController) getL7AddonUID() (string, error) { Logf("Retrieving UID from config map: %v/%v", metav1.NamespaceSystem, uidConfigMap) cm, err := cont.Client.Core().ConfigMaps(metav1.NamespaceSystem).Get(uidConfigMap, metav1.GetOptions{}) diff --git a/test/e2e/network/ingress.go b/test/e2e/network/ingress.go index b1fb5d80895..a25ce072197 100644 --- a/test/e2e/network/ingress.go +++ b/test/e2e/network/ingress.go @@ -33,7 +33,8 @@ import ( ) const ( - NEGAnnotation = "alpha.cloud.google.com/load-balancer-neg" + NEGAnnotation = "alpha.cloud.google.com/load-balancer-neg" + NEGUpdateTimeout = 2 * time.Minute ) var _ = SIGDescribe("Loadbalancing: L7", func() { @@ -237,6 +238,47 @@ var _ = SIGDescribe("Loadbalancing: L7", func() { }) jig.WaitForIngress(true) }) + + It("should sync endpoints to NEG", func() { + name := "hostname" + scaleAndValidateNEG := func(num int) { + scale, err := f.ClientSet.ExtensionsV1beta1().Deployments(ns).GetScale(name, metav1.GetOptions{}) + Expect(err).NotTo(HaveOccurred()) + if scale.Spec.Replicas != int32(num) { + scale.Spec.Replicas = int32(num) + _, err = f.ClientSet.ExtensionsV1beta1().Deployments(ns).UpdateScale(name, scale) + Expect(err).NotTo(HaveOccurred()) + } + wait.Poll(5*time.Second, NEGUpdateTimeout, func() (bool, error) { + res, err := jig.GetDistinctResponseFromIngress() + if err != nil { + return false, err + } + return res.Len() == num, err + }) + } + + By("Create a basic HTTP ingress using NEG") + jig.CreateIngress(filepath.Join(framework.IngressManifestPath, "neg"), ns, map[string]string{}, map[string]string{}) + jig.WaitForIngress(true) + usingNEG, err := gceController.BackendServiceUsingNEG(jig.GetIngressNodePorts(false)) + Expect(err).NotTo(HaveOccurred()) + Expect(usingNEG).To(BeTrue()) + // initial replicas number is 1 + scaleAndValidateNEG(1) + + By("Scale up number of backends to 5") + scaleAndValidateNEG(5) + + By("Scale down number of backends to 3") + scaleAndValidateNEG(3) + + By("Scale up number of backends to 6") + scaleAndValidateNEG(6) + + By("Scale down number of backends to 2") + scaleAndValidateNEG(3) + }) }) // Time: borderline 5m, slow by design