github.com/jlmeeker/kismatic@v1.10.1-0.20180612190640-57f9005a1f1a/integration-tests/ingress.go (about) 1 package integration_tests 2 3 import ( 4 "crypto/tls" 5 "fmt" 6 "net/http" 7 "time" 8 9 "github.com/apprenda/kismatic/pkg/retry" 10 . "github.com/onsi/ginkgo" 11 ) 12 13 func verifyIngressNodes(master NodeDeets, ingressNodes []NodeDeets, sshKey string) error { 14 By("Adding a service and an ingress resource") 15 addIngressResource(master, sshKey) 16 17 By("Verifying the service is accessible via the ingress point(s)") 18 for _, ingNode := range ingressNodes { 19 if err := verifyIngressPoint(ingNode); err != nil { 20 // For debugging purposes... 21 runViaSSH([]string{"sudo kubectl --kubeconfig /root/.kube/config describe -f /tmp/ingress.yaml", "sudo kubectl --kubeconfig /root/.kube/config describe pods"}, []NodeDeets{master}, sshKey, 1*time.Minute) 22 return err 23 } 24 } 25 26 return nil 27 } 28 29 func addIngressResource(node NodeDeets, sshKey string) { 30 err := copyFileToRemote("test-resources/ingress.yaml", "/tmp/ingress.yaml", node, sshKey, 1*time.Minute) 31 FailIfError(err, "Error copying ingress test file") 32 33 err = runViaSSH([]string{"sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key -out /tmp/tls.crt -subj \"/CN=kismaticintegration.com\""}, []NodeDeets{node}, sshKey, 1*time.Minute) 34 FailIfError(err, "Error creating certificates for HTTPs") 35 36 err = runViaSSH([]string{"sudo kubectl --kubeconfig /root/.kube/config create secret tls kismaticintegration-tls --cert=/tmp/tls.crt --key=/tmp/tls.key"}, []NodeDeets{node}, sshKey, 1*time.Minute) 37 FailIfError(err, "Error creating tls secret") 38 39 err = runViaSSH([]string{"sudo kubectl --kubeconfig /root/.kube/config apply -f /tmp/ingress.yaml"}, []NodeDeets{node}, sshKey, 1*time.Minute) 40 FailIfError(err, "Error creating ingress resources") 41 } 42 43 func verifyIngressPoint(node NodeDeets) error { 44 // HTTP ingress 45 url := "http://" + node.PublicIP + "/echo" 46 if err := retry.WithBackoff(func() error { return ingressRequest(url) }, 7); err != nil { 47 return err 48 } 49 // HTTPS ingress 50 url = "https://" + node.PublicIP + "/echo-tls" 51 if err := retry.WithBackoff(func() error { return ingressRequest(url) }, 7); err != nil { 52 return err 53 } 54 return nil 55 } 56 57 func ingressRequest(url string) error { 58 tr := &http.Transport{ 59 TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, 60 } 61 client := http.Client{ 62 Timeout: 1000 * time.Millisecond, 63 Transport: tr, 64 } 65 req, err := http.NewRequest(http.MethodGet, url, nil) 66 if err != nil { 67 return fmt.Errorf("Could not create request for ingress via %s, %v", url, err) 68 } 69 // Set the host header since this is not a real domain, curl $IP/echo -H 'Host: kismaticintegration.com' 70 req.Host = "kismaticintegration.com" 71 resp, err := client.Do(req) 72 if err != nil { 73 return fmt.Errorf("Could not reach ingress via %s, %v", url, err) 74 } 75 if resp.StatusCode != 200 { 76 return fmt.Errorf("Ingress status code is not 200, got %d vi %s", resp.StatusCode, url) 77 } 78 79 return nil 80 }