mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 09:22:44 +00:00
Move some common functions in e2e to e2e.framework for reusability
This commit is contained in:
parent
62c92678b6
commit
79ce4cb67d
@ -23,6 +23,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"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)
|
||||||
|
}
|
||||||
|
@ -102,7 +102,7 @@ var _ = framework.KubeDescribe("Loadbalancing: L7", func() {
|
|||||||
// Platform specific cleanup
|
// Platform specific cleanup
|
||||||
AfterEach(func() {
|
AfterEach(func() {
|
||||||
if CurrentGinkgoTestDescription().Failed {
|
if CurrentGinkgoTestDescription().Failed {
|
||||||
describeIng(ns)
|
framework.DescribeIng(ns)
|
||||||
}
|
}
|
||||||
if jig.ing == nil {
|
if jig.ing == nil {
|
||||||
By("No ingress created, no cleanup necessary")
|
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)
|
By("waiting for Ingress to come up with ip: " + ip)
|
||||||
httpClient := buildInsecureClient(reqTimeout)
|
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")
|
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")
|
By("should have correct firewall rule for ingress")
|
||||||
fw := gceController.getFirewallRule()
|
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))
|
framework.ExpectNoError(gcloudDelete("firewall-rules", fmt.Sprintf("ingress-80-443-%v", ns), framework.TestContext.CloudConfig.ProjectID))
|
||||||
}
|
}
|
||||||
if CurrentGinkgoTestDescription().Failed {
|
if CurrentGinkgoTestDescription().Failed {
|
||||||
describeIng(ns)
|
framework.DescribeIng(ns)
|
||||||
}
|
}
|
||||||
if jig.ing == nil {
|
if jig.ing == nil {
|
||||||
By("No ingress created, no cleanup necessary")
|
By("No ingress created, no cleanup necessary")
|
||||||
|
@ -181,33 +181,13 @@ func createComformanceTests(jig *testJig, ns string) []conformanceTests {
|
|||||||
})
|
})
|
||||||
By("Checking that " + pathToFail + " is not exposed by polling for failure")
|
By("Checking that " + pathToFail + " is not exposed by polling for failure")
|
||||||
route := fmt.Sprintf("http://%v%v", jig.address, pathToFail)
|
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"),
|
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
|
// generateRSACerts generates a basic self signed certificate using a key length
|
||||||
// of rsaBits, valid for validFor time.
|
// of rsaBits, valid for validFor time.
|
||||||
func generateRSACerts(host string, isCA bool, keyOut, certOut io.Writer) error {
|
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
|
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) {
|
func cleanupGCE(gceController *GCEIngressController) {
|
||||||
pollErr := wait.Poll(5*time.Second, framework.LoadBalancerCleanupTimeout, func() (bool, error) {
|
pollErr := wait.Poll(5*time.Second, framework.LoadBalancerCleanupTimeout, func() (bool, error) {
|
||||||
if err := gceController.Cleanup(false); err != nil {
|
if err := gceController.Cleanup(false); err != nil {
|
||||||
@ -821,7 +794,7 @@ func (j *testJig) update(update func(ing *extensions.Ingress)) {
|
|||||||
update(j.ing)
|
update(j.ing)
|
||||||
j.ing, err = j.client.Extensions().Ingresses(ns).Update(j.ing)
|
j.ing, err = j.client.Extensions().Ingresses(ns).Update(j.ing)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
describeIng(j.ing.Namespace)
|
framework.DescribeIng(j.ing.Namespace)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if !apierrs.IsConflict(err) && !apierrs.IsServerTimeout(err) {
|
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)
|
route := fmt.Sprintf("%v://%v%v", proto, address, p.Path)
|
||||||
framework.Logf("Testing route %v host %v with simple GET", route, rules.Host)
|
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.
|
// 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 {
|
func (j *testJig) verifyURL(route, host string, iterations int, interval time.Duration, httpClient *http.Client) error {
|
||||||
for i := 0; i < iterations; i++ {
|
for i := 0; i < iterations; i++ {
|
||||||
b, err := simpleGET(httpClient, route, host)
|
b, err := framework.SimpleGET(httpClient, route, host)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
framework.Logf(b)
|
framework.Logf(b)
|
||||||
return err
|
return err
|
||||||
@ -913,7 +886,7 @@ func (j *testJig) curlServiceNodePort(ns, name string, port int) {
|
|||||||
// TODO: Curl all nodes?
|
// TODO: Curl all nodes?
|
||||||
u, err := framework.GetNodePortURL(j.client, ns, name, port)
|
u, err := framework.GetNodePortURL(j.client, ns, name, port)
|
||||||
framework.ExpectNoError(err)
|
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.
|
// getIngressNodePorts returns all related backend services' nodePorts.
|
||||||
|
@ -18,7 +18,6 @@ package e2e
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/labels"
|
"k8s.io/apimachinery/pkg/labels"
|
||||||
@ -197,7 +196,7 @@ func (s *ingManager) test(path string) error {
|
|||||||
url := fmt.Sprintf("%v/hostName", path)
|
url := fmt.Sprintf("%v/hostName", path)
|
||||||
httpClient := &http.Client{}
|
httpClient := &http.Client{}
|
||||||
return wait.Poll(pollInterval, framework.ServiceRespondingTimeout, func() (bool, error) {
|
return wait.Poll(pollInterval, framework.ServiceRespondingTimeout, func() (bool, error) {
|
||||||
body, err := simpleGET(httpClient, url, "")
|
body, err := framework.SimpleGET(httpClient, url, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
framework.Logf("%v\n%v\n%v", url, body, err)
|
framework.Logf("%v\n%v\n%v", url, body, err)
|
||||||
return false, nil
|
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.
|
// rcFromManifest reads a .json/yaml file and returns the rc in it.
|
||||||
func rcFromManifest(fileName string) *v1.ReplicationController {
|
func rcFromManifest(fileName string) *v1.ReplicationController {
|
||||||
var controller v1.ReplicationController
|
var controller v1.ReplicationController
|
||||||
|
Loading…
Reference in New Issue
Block a user