Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kubelet directory-name builder funcs #2667

Merged
merged 1 commit into from
Dec 8, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
38 changes: 37 additions & 1 deletion pkg/kubelet/kubelet.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) }
Expand Down Expand Up @@ -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 {
Expand Down
46 changes: 42 additions & 4 deletions pkg/kubelet/kubelet_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ package kubelet
import (
"fmt"
"net/http"
"os"
"path"
"reflect"
"regexp"
"strconv"
Expand Down Expand Up @@ -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"),
Expand Down Expand Up @@ -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"},
Expand All @@ -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()
}
Expand Down