...
1
16
17 package services
18
19 import (
20 "crypto/tls"
21 "fmt"
22 "net/http"
23 "os"
24 "os/signal"
25 "syscall"
26 "time"
27
28 "k8s.io/klog/v2"
29
30 "k8s.io/kubernetes/test/e2e/framework"
31 )
32
33
34
35 var terminationSignals = []os.Signal{syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT}
36
37
38 func waitForTerminationSignal() {
39 sig := make(chan os.Signal, 1)
40 signal.Notify(sig, terminationSignals...)
41 <-sig
42 }
43
44
45
46
47 func readinessCheck(name string, urls []string, errCh <-chan error) error {
48 klog.Infof("Running readiness check for service %q", name)
49
50 insecureTransport := http.DefaultTransport.(*http.Transport).Clone()
51 insecureTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
52 insecureHTTPClient := &http.Client{
53 Transport: insecureTransport,
54 }
55
56 endTime := time.Now().Add(*serverStartTimeout)
57 blockCh := make(chan error)
58 defer close(blockCh)
59 for endTime.After(time.Now()) {
60 select {
61
62
63
64
65
66
67 case err, ok := <-errCh:
68 if ok {
69 if err != nil {
70 return err
71 }
72
73 } else {
74
75
76 errCh = blockCh
77 }
78 case <-time.After(time.Second):
79 ready := true
80 for _, url := range urls {
81 if !healthCheck(insecureHTTPClient, url) {
82 ready = false
83 break
84 }
85 }
86 if ready {
87 return nil
88 }
89 }
90 }
91 return fmt.Errorf("e2e service %q readiness check timeout %v", name, *serverStartTimeout)
92 }
93
94
95
96 func healthCheck(client *http.Client, url string) bool {
97 req, err := http.NewRequest("HEAD", url, nil)
98 if err != nil {
99 return false
100 }
101 req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", framework.TestContext.BearerToken))
102 resp, err := client.Do(req)
103 if err != nil {
104 klog.Warningf("Health check on %q failed, error=%v", url, err)
105 } else if resp.StatusCode != http.StatusOK {
106 klog.Warningf("Health check on %q failed, status=%d", url, resp.StatusCode)
107 }
108 return err == nil && resp.StatusCode == http.StatusOK
109 }
110
View as plain text