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  }