2015-01-23 18:03:04 +00:00
|
|
|
/*
|
|
|
|
Copyright 2015 Google Inc. All rights reserved.
|
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package http
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"net/http"
|
|
|
|
"net/url"
|
|
|
|
"strconv"
|
2015-01-29 04:35:49 +00:00
|
|
|
"time"
|
2015-01-23 18:03:04 +00:00
|
|
|
|
|
|
|
"github.com/GoogleCloudPlatform/kubernetes/pkg/probe"
|
|
|
|
|
|
|
|
"github.com/golang/glog"
|
|
|
|
)
|
|
|
|
|
2015-01-27 18:00:21 +00:00
|
|
|
func New() HTTPProber {
|
2015-01-29 04:35:49 +00:00
|
|
|
transport := &http.Transport{}
|
2015-02-08 20:19:34 +00:00
|
|
|
return httpProber{transport}
|
2015-01-27 18:00:21 +00:00
|
|
|
}
|
|
|
|
|
2015-02-08 20:19:34 +00:00
|
|
|
type HTTPProber interface {
|
|
|
|
Probe(host string, port int, path string, timeout time.Duration) (probe.Result, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
type httpProber struct {
|
2015-01-29 04:35:49 +00:00
|
|
|
transport *http.Transport
|
2015-01-27 18:00:21 +00:00
|
|
|
}
|
2015-01-23 18:03:04 +00:00
|
|
|
|
|
|
|
// Probe returns a ProbeRunner capable of running an http check.
|
2015-02-08 20:19:34 +00:00
|
|
|
func (pr httpProber) Probe(host string, port int, path string, timeout time.Duration) (probe.Result, error) {
|
2015-01-29 04:35:49 +00:00
|
|
|
return DoHTTPProbe(formatURL(host, port, path), &http.Client{Timeout: timeout, Transport: pr.transport})
|
2015-01-23 18:03:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
type HTTPGetInterface interface {
|
|
|
|
Get(u string) (*http.Response, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DoHTTPProbe checks if a GET request to the url succeeds.
|
2015-01-16 22:28:20 +00:00
|
|
|
// If the HTTP response code is successful (i.e. 400 > code >= 200), it returns Success.
|
|
|
|
// If the HTTP response code is unsuccessful or HTTP communication fails, it returns Failure.
|
2015-01-23 18:03:04 +00:00
|
|
|
// This is exported because some other packages may want to do direct HTTP probes.
|
2015-01-31 01:03:57 +00:00
|
|
|
func DoHTTPProbe(url string, client HTTPGetInterface) (probe.Result, error) {
|
2015-01-23 18:03:04 +00:00
|
|
|
res, err := client.Get(url)
|
|
|
|
if err != nil {
|
|
|
|
glog.V(1).Infof("HTTP probe error: %v", err)
|
2015-01-27 18:22:53 +00:00
|
|
|
return probe.Failure, nil
|
2015-01-23 18:03:04 +00:00
|
|
|
}
|
|
|
|
defer res.Body.Close()
|
|
|
|
if res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusBadRequest {
|
2015-01-27 18:22:53 +00:00
|
|
|
return probe.Success, nil
|
2015-01-23 18:03:04 +00:00
|
|
|
}
|
|
|
|
glog.V(1).Infof("Health check failed for %s, Response: %v", url, *res)
|
2015-01-27 18:22:53 +00:00
|
|
|
return probe.Failure, nil
|
2015-01-23 18:03:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// formatURL formats a URL from args. For testability.
|
|
|
|
func formatURL(host string, port int, path string) string {
|
|
|
|
u := url.URL{
|
|
|
|
Scheme: "http",
|
|
|
|
Host: net.JoinHostPort(host, strconv.Itoa(port)),
|
|
|
|
Path: path,
|
|
|
|
}
|
|
|
|
return u.String()
|
|
|
|
}
|