diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index ebd6107d4aa..64626306bfb 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -822,6 +822,11 @@ func (kl *Kubelet) GetKubeletContainerLogs(podFullName, containerName, tail stri return dockertools.GetKubeletDockerContainerLogs(kl.dockerClient, dockerContainer.ID, tail, follow, stdout, stderr) } +// GetBoundPods returns all pods bound to the kubelet and their spec +func (kl *Kubelet) GetBoundPods() ([]api.BoundPod, error) { + return kl.pods, nil +} + // GetPodInfo returns information from Docker about the containers in a pod func (kl *Kubelet) GetPodInfo(podFullName, uuid string) (api.PodInfo, error) { var manifest api.PodSpec diff --git a/pkg/kubelet/server.go b/pkg/kubelet/server.go index c0e4822436b..32ebcba2e55 100644 --- a/pkg/kubelet/server.go +++ b/pkg/kubelet/server.go @@ -31,6 +31,7 @@ import ( "time" "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/kubelet/dockertools" @@ -66,6 +67,7 @@ type HostInterface interface { GetContainerInfo(podFullName, uuid, containerName string, req *info.ContainerInfoRequest) (*info.ContainerInfo, error) GetRootInfo(req *info.ContainerInfoRequest) (*info.ContainerInfo, error) GetMachineInfo() (*info.MachineInfo, error) + GetBoundPods() ([]api.BoundPod, error) GetPodInfo(name, uuid string) (api.PodInfo, error) RunInContainer(name, uuid, container string, cmd []string) ([]byte, error) GetKubeletContainerLogs(podFullName, containerName, tail string, follow bool, stdout, stderr io.Writer) error @@ -90,6 +92,7 @@ func NewServer(host HostInterface, updates chan<- interface{}, enableDebuggingHa func (s *Server) InstallDefaultHandlers() { healthz.InstallHandler(s.mux) s.mux.HandleFunc("/podInfo", s.handlePodInfo) + s.mux.HandleFunc("/boundPods", s.handleBoundPods) s.mux.HandleFunc("/stats/", s.handleStats) s.mux.HandleFunc("/spec/", s.handleSpec) } @@ -226,6 +229,26 @@ func (s *Server) handleContainerLogs(w http.ResponseWriter, req *http.Request) { } } +// handleBoundPods returns a list of pod bound to the Kubelet and their spec +func (s *Server) handleBoundPods(w http.ResponseWriter, req *http.Request) { + pods, err := s.host.GetBoundPods() + if err != nil { + s.error(w, err) + return + } + boundPods := &api.BoundPods{ + Items: pods, + } + data, err := latest.Codec.Encode(boundPods) + if err != nil { + s.error(w, err) + return + } + w.WriteHeader(http.StatusOK) + w.Header().Add("Content-type", "application/json") + w.Write(data) +} + // handlePodInfo handles podInfo requests against the Kubelet func (s *Server) handlePodInfo(w http.ResponseWriter, req *http.Request) { u, err := url.ParseRequestURI(req.RequestURI) diff --git a/pkg/kubelet/server_test.go b/pkg/kubelet/server_test.go index 396170828ff..4c879a5b772 100644 --- a/pkg/kubelet/server_test.go +++ b/pkg/kubelet/server_test.go @@ -39,6 +39,7 @@ type fakeKubelet struct { containerInfoFunc func(podFullName, containerName string, req *info.ContainerInfoRequest) (*info.ContainerInfo, error) rootInfoFunc func(query *info.ContainerInfoRequest) (*info.ContainerInfo, error) machineInfoFunc func() (*info.MachineInfo, error) + boundPodsFunc func() ([]api.BoundPod, error) logFunc func(w http.ResponseWriter, req *http.Request) runFunc func(podFullName, uuid, containerName string, cmd []string) ([]byte, error) containerLogsFunc func(podFullName, containerName, tail string, follow bool, stdout, stderr io.Writer) error @@ -60,6 +61,10 @@ func (fk *fakeKubelet) GetMachineInfo() (*info.MachineInfo, error) { return fk.machineInfoFunc() } +func (fk *fakeKubelet) GetBoundPods() ([]api.BoundPod, error) { + return fk.boundPodsFunc() +} + func (fk *fakeKubelet) ServeLogs(w http.ResponseWriter, req *http.Request) { fk.logFunc(w, req) }