// waitForIngress waits till the ingress acquires an IP, then waits for its // hosts/urls to respond to a protocol check (either http or https). If // waitForNodePort is true, the NodePort of the Service is verified before // verifying the Ingress. NodePort is currently a requirement for cloudprovider // Ingress. func (j *testJig) waitForIngress(waitForNodePort bool) { // Wait for the loadbalancer IP. address, err := framework.WaitForIngressAddress(j.client, j.ing.Namespace, j.ing.Name, framework.LoadBalancerPollTimeout) if err != nil { framework.Failf("Ingress failed to acquire an IP address within %v", framework.LoadBalancerPollTimeout) } j.address = address framework.Logf("Found address %v for ingress %v", j.address, j.ing.Name) timeoutClient := &http.Client{Timeout: reqTimeout} // Check that all rules respond to a simple GET. for _, rules := range j.ing.Spec.Rules { proto := "http" if len(j.ing.Spec.TLS) > 0 { knownHosts := sets.NewString(j.ing.Spec.TLS[0].Hosts...) if knownHosts.Has(rules.Host) { timeoutClient.Transport, err = buildTransport(rules.Host, j.getRootCA(j.ing.Spec.TLS[0].SecretName)) framework.ExpectNoError(err) proto = "https" } } for _, p := range rules.IngressRuleValue.HTTP.Paths { if waitForNodePort { j.curlServiceNodePort(j.ing.Namespace, p.Backend.ServiceName, int(p.Backend.ServicePort.IntVal)) } 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(framework.PollURL(route, rules.Host, framework.LoadBalancerPollTimeout, j.pollInterval, timeoutClient, false)) } } }
func (j *federationTestJig) waitForFederatedIngress() { // Wait for the loadbalancer IP. address, err := waitForFederatedIngressAddress(j.client, j.ing.Namespace, j.ing.Name, framework.LoadBalancerPollTimeout) if err != nil { framework.Failf("Ingress failed to acquire an IP address within %v", framework.LoadBalancerPollTimeout) } j.address = address framework.Logf("Found address %v for ingress %v", j.address, j.ing.Name) timeoutClient := &http.Client{Timeout: reqTimeout} // Check that all rules respond to a simple GET. for _, rules := range j.ing.Spec.Rules { proto := "http" for _, p := range rules.IngressRuleValue.HTTP.Paths { 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(framework.PollURL(route, rules.Host, framework.LoadBalancerPollTimeout, framework.LoadBalancerPollInterval, timeoutClient, false)) } } }
} }) It("shoud create ingress with given static-ip", func() { // ip released when the rest of lb resources are deleted in cleanupGCE ip := gceController.createStaticIP(ns) By(fmt.Sprintf("allocated static ip %v: %v through the GCE cloud provider", ns, ip)) jig.createIngress(filepath.Join(ingressManifestPath, "static-ip"), ns, map[string]string{ "kubernetes.io/ingress.global-static-ip-name": ns, "kubernetes.io/ingress.allow-http": "false", }) By("waiting for Ingress to come up with ip: " + ip) httpClient := buildInsecureClient(reqTimeout) framework.ExpectNoError(framework.PollURL(fmt.Sprintf("https://%v/", ip), "", framework.LoadBalancerPollTimeout, jig.pollInterval, httpClient, false)) By("should reject HTTP traffic") 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() expFw := jig.constructFirewallForIngress(gceController) // Passed the last argument as `true` to verify the backend ports is a subset // of the allowed ports in firewall rule, given there may be other existing // ingress resources and backends we are not aware of. Expect(framework.VerifyFirewallRule(fw, expFw, gceController.cloud.Network, true)).NotTo(HaveOccurred()) // TODO: uncomment the restart test once we have a way to synchronize // and know that the controller has resumed watching. If we delete // the ingress before the controller is ready we will leak.
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(framework.PollURL(u, "", 30*time.Second, j.pollInterval, &http.Client{Timeout: reqTimeout}, false)) }
func createComformanceTests(jig *testJig, ns string) []conformanceTests { manifestPath := filepath.Join(ingressManifestPath, "http") // These constants match the manifests used in ingressManifestPath tlsHost := "foo.bar.com" tlsSecretName := "foo" updatedTLSHost := "foobar.com" updateURLMapHost := "bar.baz.com" updateURLMapPath := "/testurl" // Platform agnostic list of tests that must be satisfied by all controllers return []conformanceTests{ { fmt.Sprintf("should create a basic HTTP ingress"), func() { jig.createIngress(manifestPath, ns, map[string]string{}) }, fmt.Sprintf("waiting for urls on basic HTTP ingress"), }, { fmt.Sprintf("should terminate TLS for host %v", tlsHost), func() { jig.addHTTPS(tlsSecretName, tlsHost) }, fmt.Sprintf("waiting for HTTPS updates to reflect in ingress"), }, { fmt.Sprintf("should update SSL certificated with modified hostname %v", updatedTLSHost), func() { jig.update(func(ing *extensions.Ingress) { newRules := []extensions.IngressRule{} for _, rule := range ing.Spec.Rules { if rule.Host != tlsHost { newRules = append(newRules, rule) continue } newRules = append(newRules, extensions.IngressRule{ Host: updatedTLSHost, IngressRuleValue: rule.IngressRuleValue, }) } ing.Spec.Rules = newRules }) jig.addHTTPS(tlsSecretName, updatedTLSHost) }, fmt.Sprintf("Waiting for updated certificates to accept requests for host %v", updatedTLSHost), }, { fmt.Sprintf("should update url map for host %v to expose a single url: %v", updateURLMapHost, updateURLMapPath), func() { var pathToFail string jig.update(func(ing *extensions.Ingress) { newRules := []extensions.IngressRule{} for _, rule := range ing.Spec.Rules { if rule.Host != updateURLMapHost { newRules = append(newRules, rule) continue } existingPath := rule.IngressRuleValue.HTTP.Paths[0] pathToFail = existingPath.Path newRules = append(newRules, extensions.IngressRule{ Host: updateURLMapHost, IngressRuleValue: extensions.IngressRuleValue{ HTTP: &extensions.HTTPIngressRuleValue{ Paths: []extensions.HTTPIngressPath{ { Path: updateURLMapPath, Backend: existingPath.Backend, }, }, }, }, }) } ing.Spec.Rules = newRules }) By("Checking that " + pathToFail + " is not exposed by polling for failure") route := fmt.Sprintf("http://%v%v", jig.address, pathToFail) 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"), }, } }