From 79ce4cb67d17d6e1c2147586f2556176a2ea9cc7 Mon Sep 17 00:00:00 2001 From: shashidharatd Date: Wed, 11 Jan 2017 18:21:26 +0530 Subject: [PATCH] Move some common functions in e2e to e2e.framework for reusability --- test/e2e/framework/util.go | 52 ++++++++++++++++++++++++++++++++ test/e2e/ingress.go | 8 ++--- test/e2e/ingress_utils.go | 37 +++-------------------- test/e2e/serviceloadbalancers.go | 27 +---------------- 4 files changed, 62 insertions(+), 62 deletions(-) diff --git a/test/e2e/framework/util.go b/test/e2e/framework/util.go index b92b39c426a..fc7c98b4dcf 100644 --- a/test/e2e/framework/util.go +++ b/test/e2e/framework/util.go @@ -23,6 +23,7 @@ import ( "errors" "fmt" "io" + "io/ioutil" "math/rand" "net" "net/http" @@ -5300,3 +5301,54 @@ func RcByNameContainer(name string, replicas int32, image string, labels map[str }, } } + +// SimpleGET executes a get on the given url, returns error if non-200 returned. +func SimpleGET(c *http.Client, url, host string) (string, error) { + req, err := http.NewRequest("GET", url, nil) + if err != nil { + return "", err + } + req.Host = host + res, err := c.Do(req) + if err != nil { + return "", err + } + defer res.Body.Close() + rawBody, err := ioutil.ReadAll(res.Body) + if err != nil { + return "", err + } + body := string(rawBody) + if res.StatusCode != http.StatusOK { + err = fmt.Errorf( + "GET returned http error %v", res.StatusCode) + } + return body, err +} + +// PollURL polls till the url responds with a healthy http code. If +// expectUnreachable is true, it breaks on first non-healthy http code instead. +func PollURL(route, host string, timeout time.Duration, interval time.Duration, httpClient *http.Client, expectUnreachable bool) error { + var lastBody string + pollErr := wait.PollImmediate(interval, timeout, func() (bool, error) { + var err error + lastBody, err = SimpleGET(httpClient, route, host) + if err != nil { + Logf("host %v path %v: %v unreachable", host, route, err) + return expectUnreachable, nil + } + return !expectUnreachable, nil + }) + if pollErr != nil { + return fmt.Errorf("Failed to execute a successful GET within %v, Last response body for %v, host %v:\n%v\n\n%v\n", + timeout, route, host, lastBody, pollErr) + } + return nil +} + +func DescribeIng(ns string) { + Logf("\nOutput of kubectl describe ing:\n") + desc, _ := RunKubectl( + "describe", "ing", fmt.Sprintf("--namespace=%v", ns)) + Logf(desc) +} diff --git a/test/e2e/ingress.go b/test/e2e/ingress.go index c379d75c90b..58f31e198a1 100644 --- a/test/e2e/ingress.go +++ b/test/e2e/ingress.go @@ -102,7 +102,7 @@ var _ = framework.KubeDescribe("Loadbalancing: L7", func() { // Platform specific cleanup AfterEach(func() { if CurrentGinkgoTestDescription().Failed { - describeIng(ns) + framework.DescribeIng(ns) } if jig.ing == nil { By("No ingress created, no cleanup necessary") @@ -137,10 +137,10 @@ var _ = framework.KubeDescribe("Loadbalancing: L7", func() { By("waiting for Ingress to come up with ip: " + ip) httpClient := buildInsecureClient(reqTimeout) - framework.ExpectNoError(pollURL(fmt.Sprintf("https://%v/", ip), "", framework.LoadBalancerPollTimeout, jig.pollInterval, httpClient, false)) + framework.ExpectNoError(framework.PollURL(fmt.Sprintf("https://%v/", ip), "", framework.LoadBalancerPollTimeout, jig.pollInterval, httpClient, false)) By("should reject HTTP traffic") - framework.ExpectNoError(pollURL(fmt.Sprintf("http://%v/", ip), "", framework.LoadBalancerPollTimeout, jig.pollInterval, httpClient, true)) + framework.ExpectNoError(framework.PollURL(fmt.Sprintf("http://%v/", ip), "", framework.LoadBalancerPollTimeout, jig.pollInterval, httpClient, true)) By("should have correct firewall rule for ingress") fw := gceController.getFirewallRule() @@ -192,7 +192,7 @@ var _ = framework.KubeDescribe("Loadbalancing: L7", func() { framework.ExpectNoError(gcloudDelete("firewall-rules", fmt.Sprintf("ingress-80-443-%v", ns), framework.TestContext.CloudConfig.ProjectID)) } if CurrentGinkgoTestDescription().Failed { - describeIng(ns) + framework.DescribeIng(ns) } if jig.ing == nil { By("No ingress created, no cleanup necessary") diff --git a/test/e2e/ingress_utils.go b/test/e2e/ingress_utils.go index 15e76913bdb..b35e0f3039e 100644 --- a/test/e2e/ingress_utils.go +++ b/test/e2e/ingress_utils.go @@ -181,33 +181,13 @@ func createComformanceTests(jig *testJig, ns string) []conformanceTests { }) By("Checking that " + pathToFail + " is not exposed by polling for failure") route := fmt.Sprintf("http://%v%v", jig.address, pathToFail) - framework.ExpectNoError(pollURL(route, updateURLMapHost, framework.LoadBalancerCleanupTimeout, jig.pollInterval, &http.Client{Timeout: reqTimeout}, true)) + framework.ExpectNoError(framework.PollURL(route, updateURLMapHost, framework.LoadBalancerCleanupTimeout, jig.pollInterval, &http.Client{Timeout: reqTimeout}, true)) }, fmt.Sprintf("Waiting for path updates to reflect in L7"), }, } } -// pollURL polls till the url responds with a healthy http code. If -// expectUnreachable is true, it breaks on first non-healthy http code instead. -func pollURL(route, host string, timeout time.Duration, interval time.Duration, httpClient *http.Client, expectUnreachable bool) error { - var lastBody string - pollErr := wait.PollImmediate(interval, timeout, func() (bool, error) { - var err error - lastBody, err = simpleGET(httpClient, route, host) - if err != nil { - framework.Logf("host %v path %v: %v unreachable", host, route, err) - return expectUnreachable, nil - } - return !expectUnreachable, nil - }) - if pollErr != nil { - return fmt.Errorf("Failed to execute a successful GET within %v, Last response body for %v, host %v:\n%v\n\n%v\n", - timeout, route, host, lastBody, pollErr) - } - return nil -} - // generateRSACerts generates a basic self signed certificate using a key length // of rsaBits, valid for validFor time. func generateRSACerts(host string, isCA bool, keyOut, certOut io.Writer) error { @@ -327,13 +307,6 @@ func createSecret(kubeClient clientset.Interface, ing *extensions.Ingress) (host return host, cert, key, err } -func describeIng(ns string) { - framework.Logf("\nOutput of kubectl describe ing:\n") - desc, _ := framework.RunKubectl( - "describe", "ing", fmt.Sprintf("--namespace=%v", ns)) - framework.Logf(desc) -} - func cleanupGCE(gceController *GCEIngressController) { pollErr := wait.Poll(5*time.Second, framework.LoadBalancerCleanupTimeout, func() (bool, error) { if err := gceController.Cleanup(false); err != nil { @@ -821,7 +794,7 @@ func (j *testJig) update(update func(ing *extensions.Ingress)) { update(j.ing) j.ing, err = j.client.Extensions().Ingresses(ns).Update(j.ing) if err == nil { - describeIng(j.ing.Namespace) + framework.DescribeIng(j.ing.Namespace) return } if !apierrs.IsConflict(err) && !apierrs.IsServerTimeout(err) { @@ -889,7 +862,7 @@ func (j *testJig) waitForIngress(waitForNodePort bool) { } route := fmt.Sprintf("%v://%v%v", proto, address, p.Path) framework.Logf("Testing route %v host %v with simple GET", route, rules.Host) - framework.ExpectNoError(pollURL(route, rules.Host, framework.LoadBalancerPollTimeout, j.pollInterval, timeoutClient, false)) + framework.ExpectNoError(framework.PollURL(route, rules.Host, framework.LoadBalancerPollTimeout, j.pollInterval, timeoutClient, false)) } } } @@ -898,7 +871,7 @@ func (j *testJig) waitForIngress(waitForNodePort bool) { // given url returns a non-healthy http code even once. func (j *testJig) verifyURL(route, host string, iterations int, interval time.Duration, httpClient *http.Client) error { for i := 0; i < iterations; i++ { - b, err := simpleGET(httpClient, route, host) + b, err := framework.SimpleGET(httpClient, route, host) if err != nil { framework.Logf(b) return err @@ -913,7 +886,7 @@ func (j *testJig) curlServiceNodePort(ns, name string, port int) { // TODO: Curl all nodes? u, err := framework.GetNodePortURL(j.client, ns, name, port) framework.ExpectNoError(err) - framework.ExpectNoError(pollURL(u, "", 30*time.Second, j.pollInterval, &http.Client{Timeout: reqTimeout}, false)) + framework.ExpectNoError(framework.PollURL(u, "", 30*time.Second, j.pollInterval, &http.Client{Timeout: reqTimeout}, false)) } // getIngressNodePorts returns all related backend services' nodePorts. diff --git a/test/e2e/serviceloadbalancers.go b/test/e2e/serviceloadbalancers.go index 8bd4fa9948d..8d1688ac2eb 100644 --- a/test/e2e/serviceloadbalancers.go +++ b/test/e2e/serviceloadbalancers.go @@ -18,7 +18,6 @@ package e2e import ( "fmt" - "io/ioutil" "net/http" "k8s.io/apimachinery/pkg/labels" @@ -197,7 +196,7 @@ func (s *ingManager) test(path string) error { url := fmt.Sprintf("%v/hostName", path) httpClient := &http.Client{} return wait.Poll(pollInterval, framework.ServiceRespondingTimeout, func() (bool, error) { - body, err := simpleGET(httpClient, url, "") + body, err := framework.SimpleGET(httpClient, url, "") if err != nil { framework.Logf("%v\n%v\n%v", url, body, err) return false, nil @@ -239,30 +238,6 @@ var _ = framework.KubeDescribe("ServiceLoadBalancer [Feature:ServiceLoadBalancer }) }) -// simpleGET executes a get on the given url, returns error if non-200 returned. -func simpleGET(c *http.Client, url, host string) (string, error) { - req, err := http.NewRequest("GET", url, nil) - if err != nil { - return "", err - } - req.Host = host - res, err := c.Do(req) - if err != nil { - return "", err - } - defer res.Body.Close() - rawBody, err := ioutil.ReadAll(res.Body) - if err != nil { - return "", err - } - body := string(rawBody) - if res.StatusCode != http.StatusOK { - err = fmt.Errorf( - "GET returned http error %v", res.StatusCode) - } - return body, err -} - // rcFromManifest reads a .json/yaml file and returns the rc in it. func rcFromManifest(fileName string) *v1.ReplicationController { var controller v1.ReplicationController