From 60a77221f54e83c739a0992e982aa2593407ee71 Mon Sep 17 00:00:00 2001 From: Victor Marmol Date: Fri, 1 May 2015 16:01:06 -0700 Subject: [PATCH 1/4] Add dummy ListImages and RemoveImage to rkt runtime. --- pkg/kubelet/rkt/pull.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/kubelet/rkt/pull.go b/pkg/kubelet/rkt/pull.go index 961be74504e..5677cf3de29 100644 --- a/pkg/kubelet/rkt/pull.go +++ b/pkg/kubelet/rkt/pull.go @@ -22,6 +22,7 @@ import ( "path" "strings" + kubecontainer "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container" "github.com/docker/docker/pkg/parsers" docker "github.com/fsouza/go-dockerclient" "github.com/golang/glog" @@ -108,3 +109,11 @@ func (r *Runtime) IsImagePresent(img string) (bool, error) { } return true, nil } + +func (r *Runtime) ListImages() ([]kubecontainer.Image, error) { + return []kubecontainer.Image{}, fmt.Errorf("rkt: ListImages unimplemented") +} + +func (r *Runtime) RemoveImage(image string) error { + return fmt.Errorf("rkt: RemoveImages unimplemented") +} From 79fc8bee34caf2afda59aff092cc4127bd7da290 Mon Sep 17 00:00:00 2001 From: Victor Marmol Date: Fri, 1 May 2015 16:07:05 -0700 Subject: [PATCH 2/4] Change GetContainerLogs() signature. This works for both runtimes. We need to eventually unify the ID scheme for this method. --- pkg/kubelet/container/runtime.go | 3 ++- pkg/kubelet/dockertools/manager.go | 2 +- pkg/kubelet/kubelet.go | 6 +++++- pkg/kubelet/rkt/log.go | 6 +++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/pkg/kubelet/container/runtime.go b/pkg/kubelet/container/runtime.go index a30ab71321e..9ec71176d8a 100644 --- a/pkg/kubelet/container/runtime.go +++ b/pkg/kubelet/container/runtime.go @@ -69,11 +69,12 @@ type Runtime interface { ListImages() ([]Image, error) // Removes the specified image. RemoveImage(image string) error + // TODO(vmarmol): Unify pod and containerID args. // GetContainerLogs returns logs of a specific container. By // default, it returns a snapshot of the container log. Set 'follow' to true to // stream the log. Set 'follow' to false and specify the number of lines (e.g. // "100" or "all") to tail the log. - GetContainerLogs(containerID, tail string, follow bool, stdout, stderr io.Writer) (err error) + GetContainerLogs(podUID *api.Pod, containerID, tail string, follow bool, stdout, stderr io.Writer) (err error) } // Customizable hooks injected into container runtimes. diff --git a/pkg/kubelet/dockertools/manager.go b/pkg/kubelet/dockertools/manager.go index 20113701925..24129d52922 100644 --- a/pkg/kubelet/dockertools/manager.go +++ b/pkg/kubelet/dockertools/manager.go @@ -209,7 +209,7 @@ func (sc *stringCache) Get(uid types.UID, name string) (string, bool) { // stream the log. Set 'follow' to false and specify the number of lines (e.g. // "100" or "all") to tail the log. // TODO: Make 'RawTerminal' option flagable. -func (dm *DockerManager) GetContainerLogs(containerID, tail string, follow bool, stdout, stderr io.Writer) (err error) { +func (dm *DockerManager) GetContainerLogs(pod *api.Pod, containerID, tail string, follow bool, stdout, stderr io.Writer) (err error) { opts := docker.LogsOptions{ Container: containerID, Stdout: true, diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index e599f7422c0..3073e4f340c 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1383,7 +1383,11 @@ func (kl *Kubelet) GetKubeletContainerLogs(podFullName, containerName, tail stri // waiting state. return err } - return kl.containerRuntime.GetContainerLogs(containerID, tail, follow, stdout, stderr) + pod, ok := kl.GetPodByFullName(podFullName) + if !ok { + return fmt.Errorf("unable to get logs for container %q in pod %q: unable to find pod", containerName, podFullName) + } + return kl.containerRuntime.GetContainerLogs(pod, containerID, tail, follow, stdout, stderr) } // GetHostname Returns the hostname as the kubelet sees it. diff --git a/pkg/kubelet/rkt/log.go b/pkg/kubelet/rkt/log.go index da49b75e469..89b0baef0ea 100644 --- a/pkg/kubelet/rkt/log.go +++ b/pkg/kubelet/rkt/log.go @@ -21,7 +21,7 @@ import ( "os/exec" "strconv" - kubecontainer "github.com/GoogleCloudPlatform/kubernetes/pkg/kubelet/container" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api" ) // GetContainerLogs uses journalctl to get the logs of the container. @@ -31,8 +31,8 @@ import ( // TODO(yifan): Currently, it fetches all the containers' log within a pod. We will // be able to fetch individual container's log once https://github.com/coreos/rkt/pull/841 // landed. -func (r *Runtime) GetContainerLogs(pod kubecontainer.Pod, tail string, follow bool, stdout, stderr io.Writer) error { - unitName := makePodServiceFileName(pod.ID) +func (r *Runtime) GetContainerLogs(pod *api.Pod, containerID string, tail string, follow bool, stdout, stderr io.Writer) error { + unitName := makePodServiceFileName(pod.UID) cmd := exec.Command("journalctl", "-u", unitName) if follow { cmd.Args = append(cmd.Args, "-f") From e44d9df0f4ede211a659a5bba3bad82f31e031d0 Mon Sep 17 00:00:00 2001 From: Victor Marmol Date: Fri, 1 May 2015 16:13:22 -0700 Subject: [PATCH 3/4] Changes to rkt's PortForward to match Runtime API. --- pkg/kubelet/rkt/runner.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/kubelet/rkt/runner.go b/pkg/kubelet/rkt/runner.go index 0d1ab694e60..447a31c79de 100644 --- a/pkg/kubelet/rkt/runner.go +++ b/pkg/kubelet/rkt/runner.go @@ -107,7 +107,7 @@ func (r *Runtime) ExecInContainer(containerID string, cmd []string, stdin io.Rea // findRktID returns the rkt uuid for the pod. // TODO(yifan): This is unefficient which require us to list // all the unit files. -func (r *Runtime) findRktID(pod kubecontainer.Pod) (string, error) { +func (r *Runtime) findRktID(pod *kubecontainer.Pod) (string, error) { units, err := r.systemd.ListUnits() if err != nil { return "", err @@ -150,7 +150,7 @@ func (r *Runtime) findRktID(pod kubecontainer.Pod) (string, error) { // - should we support nsenter + socat in a container, running with elevated privs and --pid=host? // // TODO(yifan): Merge with the same function in dockertools. -func (r *Runtime) PortForward(pod kubecontainer.Pod, port uint16, stream io.ReadWriteCloser) error { +func (r *Runtime) PortForward(pod *kubecontainer.Pod, port uint16, stream io.ReadWriteCloser) error { glog.V(4).Infof("Rkt port forwarding in container.") podInfos, err := r.getPodInfos() From ba7e940a575e64732108a8b7a7d21f85b5d952eb Mon Sep 17 00:00:00 2001 From: Victor Marmol Date: Fri, 1 May 2015 16:12:14 -0700 Subject: [PATCH 4/4] Make rkt implement the container Runtime --- pkg/kubelet/container/runtime.go | 2 +- pkg/kubelet/kubelet.go | 1 + pkg/kubelet/rkt/rkt.go | 2 ++ 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/container/runtime.go b/pkg/kubelet/container/runtime.go index 9ec71176d8a..6f26162dc96 100644 --- a/pkg/kubelet/container/runtime.go +++ b/pkg/kubelet/container/runtime.go @@ -74,7 +74,7 @@ type Runtime interface { // default, it returns a snapshot of the container log. Set 'follow' to true to // stream the log. Set 'follow' to false and specify the number of lines (e.g. // "100" or "all") to tail the log. - GetContainerLogs(podUID *api.Pod, containerID, tail string, follow bool, stdout, stderr io.Writer) (err error) + GetContainerLogs(pod *api.Pod, containerID, tail string, follow bool, stdout, stderr io.Writer) (err error) } // Customizable hooks injected into container runtimes. diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 3073e4f340c..e440b4e5899 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1369,6 +1369,7 @@ func (kl *Kubelet) validateContainerStatus(podStatus *api.PodStatus, containerNa // TODO: this method is returning logs of random container attempts, when it should be returning the most recent attempt // or all of them. func (kl *Kubelet) GetKubeletContainerLogs(podFullName, containerName, tail string, follow bool, stdout, stderr io.Writer) error { + // TODO(vmarmol): Refactor to not need the pod status and verification. podStatus, err := kl.GetPodStatus(podFullName) if err != nil { return fmt.Errorf("failed to get status for pod %q - %v", podFullName, err) diff --git a/pkg/kubelet/rkt/rkt.go b/pkg/kubelet/rkt/rkt.go index 39c473b51eb..7986ed343dd 100644 --- a/pkg/kubelet/rkt/rkt.go +++ b/pkg/kubelet/rkt/rkt.go @@ -81,6 +81,8 @@ type Runtime struct { dockerKeyring credentialprovider.DockerKeyring } +var _ kubecontainer.Runtime = &Runtime{} + // New creates the rkt container runtime which implements the container runtime interface. // It will test if the rkt binary is in the $PATH, and whether we can get the // version of it. If so, creates the rkt container runtime, otherwise returns an error.