From 78f66a6ce9680114cef683196d7745a765d82bd1 Mon Sep 17 00:00:00 2001 From: Wojciech Tyczynski Date: Wed, 4 Feb 2015 18:14:17 +0100 Subject: [PATCH] Check Docker version in Kubelet /healthz handler --- pkg/kubelet/kubelet.go | 17 +++++++++++++++++ pkg/kubelet/server.go | 23 +++++++++++++++++++++-- pkg/kubelet/server_test.go | 5 +++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index bd3cd98f46b..fe5cd4890ad 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1361,6 +1361,23 @@ func (kl *Kubelet) syncLoop(updates <-chan PodUpdate, handler SyncHandler) { } } +// Returns Docker version for this Kubelet. +func (kl *Kubelet) GetDockerVersion() (string, error) { + if kl.dockerClient == nil { + return "", fmt.Errorf("No Docker client") + } + env, err := kl.dockerClient.Version() + if err != nil { + return "", err + } + for _, entry := range *env { + if strings.HasPrefix(entry, "Version=") { + return strings.Split(entry, "=")[1], nil + } + } + return "", fmt.Errorf("Docker version unknown") +} + // GetKubeletContainerLogs returns logs from the container // The second parameter of GetPodStatus and FindPodContainer methods represents pod UUID, which is allowed to be blank // TODO: this method is returning logs of random container attempts, when it should be returning the most recent attempt diff --git a/pkg/kubelet/server.go b/pkg/kubelet/server.go index 222cedb52e2..fdcb402072e 100644 --- a/pkg/kubelet/server.go +++ b/pkg/kubelet/server.go @@ -31,7 +31,6 @@ import ( "github.com/GoogleCloudPlatform/kubernetes/pkg/api" "github.com/GoogleCloudPlatform/kubernetes/pkg/api/latest" - "github.com/GoogleCloudPlatform/kubernetes/pkg/healthz" "github.com/GoogleCloudPlatform/kubernetes/pkg/httplog" "github.com/GoogleCloudPlatform/kubernetes/pkg/runtime" "github.com/GoogleCloudPlatform/kubernetes/pkg/types" @@ -64,6 +63,7 @@ func ListenAndServeKubeletServer(host HostInterface, address net.IP, port uint, type HostInterface interface { GetContainerInfo(podFullName string, uid types.UID, containerName string, req *info.ContainerInfoRequest) (*info.ContainerInfo, error) GetRootInfo(req *info.ContainerInfoRequest) (*info.ContainerInfo, error) + GetDockerVersion() (string, error) GetMachineInfo() (*info.MachineInfo, error) GetBoundPods() ([]api.BoundPod, error) GetPodByName(namespace, name string) (*api.BoundPod, bool) @@ -88,7 +88,7 @@ func NewServer(host HostInterface, enableDebuggingHandlers bool) Server { // InstallDefaultHandlers registers the default set of supported HTTP request patterns with the mux. func (s *Server) InstallDefaultHandlers() { - healthz.InstallHandler(s.mux) + s.mux.HandleFunc("/healthz", s.handleHealthz) s.mux.HandleFunc("/podInfo", s.handlePodInfoOld) s.mux.HandleFunc("/api/v1beta1/podInfo", s.handlePodInfoVersioned) s.mux.HandleFunc("/boundPods", s.handleBoundPods) @@ -109,6 +109,25 @@ func (s *Server) error(w http.ResponseWriter, err error) { http.Error(w, fmt.Sprintf("Internal Error: %v", err), http.StatusInternalServerError) } +// handleHealthz handles /healthz request and checks Docker version +func (s *Server) handleHealthz(w http.ResponseWriter, req *http.Request) { + version, err := s.host.GetDockerVersion() + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + w.Write([]byte("unknown Docker version")) + return + } + const minDockerVersion = "1.3.0" + if version < minDockerVersion { + w.WriteHeader(http.StatusInternalServerError) + msg := "Docker version is too old (" + version + ")" + w.Write([]byte(msg)) + return; + } + w.WriteHeader(http.StatusOK) + w.Write([]byte("ok")) +} + // handleContainerLogs handles containerLogs request against the Kubelet func (s *Server) handleContainerLogs(w http.ResponseWriter, req *http.Request) { defer req.Body.Close() diff --git a/pkg/kubelet/server_test.go b/pkg/kubelet/server_test.go index 69dd77eeb12..2dd2f45e46c 100644 --- a/pkg/kubelet/server_test.go +++ b/pkg/kubelet/server_test.go @@ -42,6 +42,7 @@ type fakeKubelet struct { boundPodsFunc func() ([]api.BoundPod, error) logFunc func(w http.ResponseWriter, req *http.Request) runFunc func(podFullName string, uid types.UID, containerName string, cmd []string) ([]byte, error) + dockerVersionFunc func() (string, error) containerLogsFunc func(podFullName, containerName, tail string, follow bool, stdout, stderr io.Writer) error } @@ -61,6 +62,10 @@ func (fk *fakeKubelet) GetRootInfo(req *info.ContainerInfoRequest) (*info.Contai return fk.rootInfoFunc(req) } +func (fk *fakeKubelet) GetDockerVersion() (string, error) { + return fk.dockerVersionFunc() +} + func (fk *fakeKubelet) GetMachineInfo() (*info.MachineInfo, error) { return fk.machineInfoFunc() }