github.com/chenbh/concourse/v6@v6.4.2/worker/healthchecker.go (about)

     1  package worker
     2  
     3  import (
     4  	"context"
     5  	"net/http"
     6  	"time"
     7  
     8  	"code.cloudfoundry.org/lager"
     9  )
    10  
    11  type healthChecker struct {
    12  	client           *http.Client
    13  	baggageclaimAddr string
    14  	gardenAddr       string
    15  	timeout          time.Duration
    16  	logger           lager.Logger
    17  }
    18  
    19  func NewHealthChecker(logger lager.Logger, baggageclaimAddr, gardenAddr string, checkTimeout time.Duration) healthChecker {
    20  	return healthChecker{
    21  		logger:           logger,
    22  		baggageclaimAddr: baggageclaimAddr,
    23  		gardenAddr:       gardenAddr,
    24  		timeout:          checkTimeout,
    25  	}
    26  }
    27  
    28  func doRequest(ctx context.Context, url string) error {
    29  	req, err := http.NewRequest("GET", url, nil)
    30  	if err != nil {
    31  		return err
    32  	}
    33  
    34  	req = req.WithContext(ctx)
    35  
    36  	resp, err := http.DefaultClient.Do(req)
    37  	if err != nil {
    38  		return err
    39  	}
    40  
    41  	_ = resp.Body.Close()
    42  	return nil
    43  }
    44  
    45  func (h *healthChecker) CheckHealth(w http.ResponseWriter, req *http.Request) {
    46  	var err error
    47  
    48  	ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(h.timeout))
    49  	defer cancel()
    50  
    51  	err = doRequest(ctx, h.gardenAddr+"/ping")
    52  	if err != nil {
    53  		w.WriteHeader(503)
    54  		h.logger.Error("failed-to-ping-garden-server", err)
    55  		return
    56  	}
    57  
    58  	err = doRequest(ctx, h.baggageclaimAddr+"/volumes")
    59  	if err != nil {
    60  		w.WriteHeader(503)
    61  		h.logger.Error("failed-to-list-volumes-on-baggageclaim-server", err)
    62  		return
    63  	}
    64  
    65  	return
    66  }