Add a TCP health checker
Also, add timeout and status code parameters to the HTTP checker, and remove the threshold parameter for the file checker. Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
This commit is contained in:
parent
b9b9cafa8f
commit
e8f088fea6
6 changed files with 279 additions and 46 deletions
|
@ -2,15 +2,17 @@ package checks
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/docker/distribution/health"
|
||||
)
|
||||
|
||||
// FileChecker checks the existence of a file and returns and error
|
||||
// if the file exists, taking the application out of rotation
|
||||
// FileChecker checks the existence of a file and returns an error
|
||||
// if the file exists.
|
||||
func FileChecker(f string) health.Checker {
|
||||
return health.CheckFunc(func() error {
|
||||
if _, err := os.Stat(f); err == nil {
|
||||
|
@ -20,18 +22,32 @@ func FileChecker(f string) health.Checker {
|
|||
})
|
||||
}
|
||||
|
||||
// HTTPChecker does a HEAD request and verifies if the HTTP status
|
||||
// code return is a 200, taking the application out of rotation if
|
||||
// otherwise
|
||||
func HTTPChecker(r string) health.Checker {
|
||||
// HTTPChecker does a HEAD request and verifies that the HTTP status code
|
||||
// returned matches statusCode.
|
||||
func HTTPChecker(r string, statusCode int, timeout time.Duration) health.Checker {
|
||||
return health.CheckFunc(func() error {
|
||||
response, err := http.Head(r)
|
||||
client := http.Client{
|
||||
Timeout: timeout,
|
||||
}
|
||||
response, err := client.Head(r)
|
||||
if err != nil {
|
||||
return errors.New("error while checking: " + r)
|
||||
}
|
||||
if response.StatusCode != http.StatusOK {
|
||||
if response.StatusCode != statusCode {
|
||||
return errors.New("downstream service returned unexpected status: " + strconv.Itoa(response.StatusCode))
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
// TCPChecker attempts to open a TCP connection.
|
||||
func TCPChecker(addr string, timeout time.Duration) health.Checker {
|
||||
return health.CheckFunc(func() error {
|
||||
conn, err := net.DialTimeout("tcp", addr, timeout)
|
||||
if err != nil {
|
||||
return errors.New("connection to " + addr + " failed")
|
||||
}
|
||||
conn.Close()
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
|
|
@ -15,11 +15,11 @@ func TestFileChecker(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestHTTPChecker(t *testing.T) {
|
||||
if err := HTTPChecker("https://www.google.cybertron").Check(); err == nil {
|
||||
if err := HTTPChecker("https://www.google.cybertron", 200, 0).Check(); err == nil {
|
||||
t.Errorf("Google on Cybertron was expected as not exists")
|
||||
}
|
||||
|
||||
if err := HTTPChecker("https://www.google.pt").Check(); err != nil {
|
||||
if err := HTTPChecker("https://www.google.pt", 200, 0).Check(); err != nil {
|
||||
t.Errorf("Google at Portugal was expected as exists, error:%v", err)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue