code.cloudfoundry.org/diego-upgrade-stability-tests@v0.0.0-20210607152719-27f1f0151c54/poller_test.go (about) 1 package dusts_test 2 3 import ( 4 "errors" 5 "fmt" 6 "net/http" 7 "os" 8 "time" 9 10 "code.cloudfoundry.org/inigo/helpers" 11 "code.cloudfoundry.org/lager" 12 13 . "github.com/onsi/ginkgo" 14 ) 15 16 var nRetries = 10 17 18 type poller struct { 19 logger lager.Logger 20 routerAddr string 21 host string 22 } 23 24 func NewPoller(logger lager.Logger, routerAddr, host string) *poller { 25 return &poller{ 26 logger: logger, 27 routerAddr: routerAddr, 28 host: host, 29 } 30 } 31 32 func (c *poller) Run(signals <-chan os.Signal, ready chan<- struct{}) error { 33 defer GinkgoRecover() 34 35 loop: 36 for { 37 select { 38 case <-signals: 39 c.logger.Info("exiting-poller") 40 return nil 41 42 default: 43 _, status, _ := helpers.ResponseBodyAndStatusCodeFromHost(c.routerAddr, c.host) 44 45 if status == http.StatusOK { 46 break loop 47 } 48 } 49 } 50 51 close(ready) 52 53 for { 54 select { 55 case <-signals: 56 c.logger.Info("exiting-poller") 57 return nil 58 59 default: 60 status, err := c.pollWithRetries() 61 if err != nil { 62 return err 63 } 64 65 if status != http.StatusOK { 66 return errors.New(fmt.Sprintf("request failed with status %d", status)) 67 } 68 } 69 } 70 } 71 72 func (c *poller) pollWithRetries() (int, error) { 73 var status, retry int 74 var err error 75 76 for retry = 0; retry <= nRetries; retry++ { 77 _, status, err = helpers.ResponseBodyAndStatusCodeFromHost(c.routerAddr, c.host) 78 79 switch status { 80 case http.StatusNotFound: 81 c.logger.Info("poller-status-not-found", lager.Data{"status": status, "error": err, "retry": retry}) 82 time.Sleep(100 * time.Millisecond) 83 continue 84 default: 85 c.logger.Info("poller-exit-status", lager.Data{"status": status, "error": err, "retry": retry}) 86 return status, err 87 } 88 } 89 90 c.logger.Info("poller-no-more-retries", lager.Data{"status": status, "error": err, "retry": retry}) 91 return status, err 92 }