From acc6b95c21fe3973d2a94a48b69df910b4765ebb Mon Sep 17 00:00:00 2001 From: Tim Hockin Date: Sat, 29 Nov 2014 11:02:28 -0800 Subject: [PATCH] Add functions to get kubelet directories. Gets rid of some magic constants and makes volume plugins (coming later) cleaner. --- pkg/kubelet/kubelet.go | 38 +++++++++++++++++++++++++++++- pkg/kubelet/kubelet_test.go | 46 +++++++++++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 5 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 5407476d93b..c3f41333e84 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -145,6 +145,42 @@ type Kubelet struct { maxContainerCount int } +// GetRootDir returns the full path to the directory under which kubelet can +// store data. These functions are useful to pass interfaces to other modules +// that may need to know where to write data without getting a whole kubelet +// instance. +func (kl *Kubelet) GetRootDir() string { + return kl.rootDirectory +} + +// GetPodsDir returns the full path to the directory under which pod +// directories are created. +// TODO(thockin): For now, this is the same as the root because that is assumed +// in other code. Will fix. +func (kl *Kubelet) GetPodsDir() string { + return kl.GetRootDir() +} + +// GetPodDir returns the full path to the per-pod data directory for the +// specified pod. This directory may not exist if the pod does not exist. +func (kl *Kubelet) GetPodDir(podUID string) string { + return path.Join(kl.GetRootDir(), podUID) +} + +// GetPodVolumesDir returns the full path to the per-pod data directory under +// which volumes are created for the specified pod. This directory may not +// exist if the pod does not exist. +func (kl *Kubelet) GetPodVolumesDir(podUID string) string { + return path.Join(kl.GetPodDir(podUID), "volumes") +} + +// GetPodContainerDir returns the full path to the per-pod data directory under +// which container data is held for the specified pod. This directory may not +// exist if the pod or container does not exist. +func (kl *Kubelet) GetPodContainerDir(podUID, ctrName string) string { + return path.Join(kl.GetPodDir(podUID), ctrName) +} + type ByCreated []*docker.Container func (a ByCreated) Len() int { return len(a) } @@ -477,7 +513,7 @@ func (kl *Kubelet) runContainer(pod *api.BoundPod, container *api.Container, pod } if len(container.TerminationMessagePath) != 0 { - p := path.Join(kl.rootDirectory, pod.Name, container.Name) + p := kl.GetPodContainerDir(pod.UID, container.Name) if err := os.MkdirAll(p, 0750); err != nil { glog.Errorf("Error on creating %s: %v", p, err) } else { diff --git a/pkg/kubelet/kubelet_test.go b/pkg/kubelet/kubelet_test.go index 9ffc2297da6..7cb5a27381c 100644 --- a/pkg/kubelet/kubelet_test.go +++ b/pkg/kubelet/kubelet_test.go @@ -19,6 +19,8 @@ package kubelet import ( "fmt" "net/http" + "os" + "path" "reflect" "regexp" "strconv" @@ -78,6 +80,40 @@ func verifyBoolean(t *testing.T, expected, value bool) { } } +func TestKubeletDirs(t *testing.T) { + kubelet, _, _ := newTestKubelet(t) + root := kubelet.rootDirectory + if err := os.MkdirAll(root, 0750); err != nil { + t.Fatalf("can't mkdir(%q): %s", root, err) + } + + var exp, got string + + got = kubelet.GetPodsDir() + exp = root + if got != exp { + t.Errorf("expected %q', got %q", exp, got) + } + + got = kubelet.GetPodDir("abc123") + exp = path.Join(root, "abc123") + if got != exp { + t.Errorf("expected %q', got %q", exp, got) + } + + got = kubelet.GetPodVolumesDir("abc123") + exp = path.Join(root, "abc123/volumes") + if got != exp { + t.Errorf("expected %q', got %q", exp, got) + } + + got = kubelet.GetPodContainerDir("abc123", "def456") + exp = path.Join(root, "abc123/def456") + if got != exp { + t.Errorf("expected %q', got %q", exp, got) + } +} + func TestKillContainerWithError(t *testing.T) { fakeDocker := &dockertools.FakeDockerClient{ Err: fmt.Errorf("sample error"), @@ -196,6 +232,7 @@ func TestSyncPodsWithTerminationLog(t *testing.T) { err := kubelet.SyncPods([]api.BoundPod{ { ObjectMeta: api.ObjectMeta{ + UID: "0123-45-67-89ab-cdef", Name: "foo", Namespace: "new", Annotations: map[string]string{ConfigSourceAnnotationKey: "test"}, @@ -216,10 +253,11 @@ func TestSyncPodsWithTerminationLog(t *testing.T) { fakeDocker.Lock() parts := strings.Split(fakeDocker.Container.HostConfig.Binds[0], ":") - if fakeDocker.Container.HostConfig == nil || - !matchString(t, "/tmp/kubelet/foo/bar/k8s_bar\\.[a-f0-9]", parts[0]) || - parts[1] != "/dev/somepath" { - t.Errorf("Unexpected containers created %v", fakeDocker.Container) + if !matchString(t, kubelet.GetPodContainerDir("0123-45-67-89ab-cdef", "bar")+"/k8s_bar\\.[a-f0-9]", parts[0]) { + t.Errorf("Unexpected host path: %s", parts[0]) + } + if parts[1] != "/dev/somepath" { + t.Errorf("Unexpected container path: %s", parts[1]) } fakeDocker.Unlock() }