From c5db87409077cef0b936bf4e11ab164e2563965b Mon Sep 17 00:00:00 2001 From: Brendan Burns Date: Tue, 15 Jul 2014 11:39:19 -0700 Subject: [PATCH] Addressed comments. --- pkg/health/doc.go | 18 ++++++++++++++++++ pkg/{util => health}/health.go | 18 +++++++++--------- pkg/{kubelet => health}/health_check.go | 19 +++++++++---------- pkg/{kubelet => health}/health_check_test.go | 5 ++--- pkg/kubelet/kubelet.go | 15 ++++++++------- pkg/kubelet/kubelet_test.go | 5 +++-- pkg/registry/healthy_minion_registry.go | 12 ++++++------ 7 files changed, 55 insertions(+), 37 deletions(-) create mode 100644 pkg/health/doc.go rename pkg/{util => health}/health.go (75%) rename pkg/{kubelet => health}/health_check.go (84%) rename pkg/{kubelet => health}/health_check_test.go (95%) diff --git a/pkg/health/doc.go b/pkg/health/doc.go new file mode 100644 index 00000000000..6c5580a1301 --- /dev/null +++ b/pkg/health/doc.go @@ -0,0 +1,18 @@ +/* +Copyright 2014 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 health contains utilities for health checking, as well as health status information. +package health diff --git a/pkg/util/health.go b/pkg/health/health.go similarity index 75% rename from pkg/util/health.go rename to pkg/health/health.go index 1adf1b7972e..9d986d36771 100644 --- a/pkg/util/health.go +++ b/pkg/health/health.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package util +package health import ( "net/http" @@ -22,30 +22,30 @@ import ( "github.com/golang/glog" ) -type HealthCheckStatus int +type Status int const ( - CheckHealthy HealthCheckStatus = 0 - CheckUnhealthy HealthCheckStatus = 1 - CheckUnknown HealthCheckStatus = 2 + Healthy Status = iota + Unhealthy + Unknown ) type HTTPGetInterface interface { Get(url string) (*http.Response, error) } -func IsHealthy(url string, client HTTPGetInterface) (HealthCheckStatus, error) { +func Check(url string, client HTTPGetInterface) (Status, error) { res, err := client.Get(url) if res.Body != nil { defer res.Body.Close() } if err != nil { - return CheckUnknown, err + return Unknown, err } if res.StatusCode >= http.StatusOK && res.StatusCode < http.StatusBadRequest { - return CheckHealthy, nil + return Healthy, nil } else { glog.V(1).Infof("Health check failed for %s, Response: %v", url, *res) - return CheckUnhealthy, nil + return Unhealthy, nil } } diff --git a/pkg/kubelet/health_check.go b/pkg/health/health_check.go similarity index 84% rename from pkg/kubelet/health_check.go rename to pkg/health/health_check.go index a08539253a7..695559e755c 100644 --- a/pkg/kubelet/health_check.go +++ b/pkg/health/health_check.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubelet +package health import ( "fmt" @@ -22,12 +22,11 @@ import ( "strconv" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/golang/glog" ) type HealthChecker interface { - HealthCheck(container api.Container) (util.HealthCheckStatus, error) + HealthCheck(container api.Container) (Status, error) } // MakeHealthChecker creates a new HealthChecker. @@ -46,18 +45,18 @@ type MuxHealthChecker struct { checkers map[string]HealthChecker } -func (m *MuxHealthChecker) HealthCheck(container api.Container) (util.HealthCheckStatus, error) { +func (m *MuxHealthChecker) HealthCheck(container api.Container) (Status, error) { checker, ok := m.checkers[container.LivenessProbe.Type] if !ok || checker == nil { glog.Warningf("Failed to find health checker for %s %s", container.Name, container.LivenessProbe.Type) - return util.CheckUnknown, nil + return Unknown, nil } return checker.HealthCheck(container) } // HTTPHealthChecker is an implementation of HealthChecker which checks container health by sending HTTP Get requests. type HTTPHealthChecker struct { - client util.HTTPGetInterface + client HTTPGetInterface } func (h *HTTPHealthChecker) findPort(container api.Container, portName string) int64 { @@ -70,17 +69,17 @@ func (h *HTTPHealthChecker) findPort(container api.Container, portName string) i return -1 } -func (h *HTTPHealthChecker) HealthCheck(container api.Container) (util.HealthCheckStatus, error) { +func (h *HTTPHealthChecker) HealthCheck(container api.Container) (Status, error) { params := container.LivenessProbe.HTTPGet if params == nil { - return util.CheckUnknown, fmt.Errorf("Error, no HTTP parameters specified: %v", container) + return Unknown, fmt.Errorf("Error, no HTTP parameters specified: %v", container) } port := h.findPort(container, params.Port) if port == -1 { var err error port, err = strconv.ParseInt(params.Port, 10, 0) if err != nil { - return util.CheckUnknown, err + return Unknown, err } } var host string @@ -90,5 +89,5 @@ func (h *HTTPHealthChecker) HealthCheck(container api.Container) (util.HealthChe host = "localhost" } url := fmt.Sprintf("http://%s:%d%s", host, port, params.Path) - return util.IsHealthy(url, h.client) + return Check(url, h.client) } diff --git a/pkg/kubelet/health_check_test.go b/pkg/health/health_check_test.go similarity index 95% rename from pkg/kubelet/health_check_test.go rename to pkg/health/health_check_test.go index 1997a86858a..17dc3612466 100644 --- a/pkg/kubelet/health_check_test.go +++ b/pkg/health/health_check_test.go @@ -14,14 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -package kubelet +package health import ( "net/http" "testing" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" - "github.com/GoogleCloudPlatform/kubernetes/pkg/util" ) type fakeHTTPClient struct { @@ -57,7 +56,7 @@ func TestHttpHealth(t *testing.T) { } ok, err := check.HealthCheck(container) - if ok != util.CheckHealthy { + if ok != Healthy { t.Error("Unexpected unhealthy") } if err != nil { diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index f713810d961..1cf622ffff4 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -34,6 +34,7 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/health" _ "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" @@ -94,7 +95,7 @@ type Kubelet struct { SyncFrequency time.Duration HTTPCheckFrequency time.Duration pullLock sync.Mutex - HealthChecker HealthChecker + HealthChecker health.HealthChecker } type manifestUpdate struct { @@ -159,7 +160,7 @@ func (kl *Kubelet) RunKubelet(dockerEndpoint, configPath, manifestURL, etcdServe } go util.Forever(func() { s.ListenAndServe() }, 0) } - kl.HealthChecker = MakeHealthChecker() + kl.HealthChecker = health.MakeHealthChecker() kl.syncLoop(updateChannel, kl) } @@ -736,7 +737,7 @@ func (kl *Kubelet) syncManifest(manifest *api.ContainerManifest, keepChannel cha glog.V(1).Infof("health check errored: %v", err) continue } - if healthy != util.CheckHealthy { + if healthy != health.Healthy { glog.V(1).Infof("manifest %s container %s is unhealthy.", manifest.ID, container.Name) if err != nil { glog.V(1).Infof("Failed to get container info %v, for %s", err, containerID) @@ -993,16 +994,16 @@ func (kl *Kubelet) GetMachineStats() (*api.ContainerStats, error) { return kl.statsFromContainerPath("/") } -func (kl *Kubelet) healthy(container api.Container, dockerContainer *docker.APIContainers) (util.HealthCheckStatus, error) { +func (kl *Kubelet) healthy(container api.Container, dockerContainer *docker.APIContainers) (health.Status, error) { // Give the container 60 seconds to start up. if container.LivenessProbe == nil { - return util.CheckHealthy, nil + return health.Healthy, nil } if time.Now().Unix()-dockerContainer.Created < container.LivenessProbe.InitialDelaySeconds { - return util.CheckHealthy, nil + return health.Healthy, nil } if kl.HealthChecker == nil { - return util.CheckHealthy, nil + return health.Healthy, nil } return kl.HealthChecker.HealthCheck(container) } diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 0aebddfd7e0..0c517217d13 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -26,6 +26,7 @@ import ( "testing" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/health" "github.com/GoogleCloudPlatform/kubernetes/pkg/tools" "github.com/GoogleCloudPlatform/kubernetes/pkg/util" "github.com/coreos/go-etcd/etcd" @@ -424,8 +425,8 @@ func TestSyncManifestsDeletes(t *testing.T) { type FalseHealthChecker struct{} -func (f *FalseHealthChecker) HealthCheck(container api.Container) (util.HealthCheckStatus, error) { - return util.CheckUnhealthy, nil +func (f *FalseHealthChecker) HealthCheck(container api.Container) (health.Status, error) { + return health.Unhealthy, nil } func TestSyncManifestsUnhealthy(t *testing.T) { diff --git a/pkg/registry/healthy_minion_registry.go b/pkg/registry/healthy_minion_registry.go index 87622a20f47..32273cb4856 100644 --- a/pkg/registry/healthy_minion_registry.go +++ b/pkg/registry/healthy_minion_registry.go @@ -20,12 +20,12 @@ import ( "fmt" "net/http" - "github.com/GoogleCloudPlatform/kubernetes/pkg/util" + "github.com/GoogleCloudPlatform/kubernetes/pkg/health" ) type HealthyMinionRegistry struct { delegate MinionRegistry - client util.HTTPGetInterface + client health.HTTPGetInterface port int } @@ -48,11 +48,11 @@ func (h *HealthyMinionRegistry) List() (currentMinions []string, err error) { return result, err } for _, minion := range list { - status, err := util.IsHealthy(h.makeMinionURL(minion), h.client) + status, err := health.Check(h.makeMinionURL(minion), h.client) if err != nil { return result, err } - if status == util.CheckHealthy { + if status == health.Healthy { result = append(result, minion) } } @@ -75,11 +75,11 @@ func (h *HealthyMinionRegistry) Contains(minion string) (bool, error) { if !contains { return false, nil } - status, err := util.IsHealthy(h.makeMinionURL(minion), h.client) + status, err := health.Check(h.makeMinionURL(minion), h.client) if err != nil { return false, err } - if status == util.CheckUnhealthy { + if status == health.Unhealthy { return false, nil } return true, nil