From 64c8d3ad3dd19414f78a5edf9c60243da9a519ac Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Sat, 15 Oct 2016 00:32:50 -0400 Subject: [PATCH 1/2] Add e2e node test for log path Update to use pod to check log file --- pkg/kubelet/kubelet.go | 10 +-- pkg/kubelet/runonce.go | 6 +- test/e2e_node/log_path_test.go | 120 +++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 8 deletions(-) create mode 100644 test/e2e_node/log_path_test.go diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 80209b02684..37c9d8a1e2a 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -100,7 +100,7 @@ const ( nodeStatusUpdateRetry = 5 // Location of container logs. - containerLogsDir = "/var/log/containers" + ContainerLogsDir = "/var/log/containers" // max backoff period, exported for the e2e test MaxContainerBackOff = 300 * time.Second @@ -619,7 +619,7 @@ func NewMainKubelet(kubeCfg *componentconfig.KubeletConfiguration, kubeDeps *Kub kubeCfg.PodInfraContainerImage, float32(kubeCfg.RegistryPullQPS), int(kubeCfg.RegistryBurst), - containerLogsDir, + ContainerLogsDir, kubeDeps.OSInterface, klet.networkPlugin, klet, @@ -1149,9 +1149,9 @@ func (kl *Kubelet) initializeModules() error { } // Step 3: If the container logs directory does not exist, create it. - if _, err := os.Stat(containerLogsDir); err != nil { - if err := kl.os.MkdirAll(containerLogsDir, 0755); err != nil { - glog.Errorf("Failed to create directory %q: %v", containerLogsDir, err) + if _, err := os.Stat(ContainerLogsDir); err != nil { + if err := kl.os.MkdirAll(ContainerLogsDir, 0755); err != nil { + glog.Errorf("Failed to create directory %q: %v", ContainerLogsDir, err) } } diff --git a/pkg/kubelet/runonce.go b/pkg/kubelet/runonce.go index 24ffc59834c..9ad3c476af3 100644 --- a/pkg/kubelet/runonce.go +++ b/pkg/kubelet/runonce.go @@ -48,9 +48,9 @@ func (kl *Kubelet) RunOnce(updates <-chan kubetypes.PodUpdate) ([]RunPodResult, } // If the container logs directory does not exist, create it. - if _, err := os.Stat(containerLogsDir); err != nil { - if err := kl.os.MkdirAll(containerLogsDir, 0755); err != nil { - glog.Errorf("Failed to create directory %q: %v", containerLogsDir, err) + if _, err := os.Stat(ContainerLogsDir); err != nil { + if err := kl.os.MkdirAll(ContainerLogsDir, 0755); err != nil { + glog.Errorf("Failed to create directory %q: %v", ContainerLogsDir, err) } } diff --git a/test/e2e_node/log_path_test.go b/test/e2e_node/log_path_test.go new file mode 100644 index 00000000000..b14bbd7eb7c --- /dev/null +++ b/test/e2e_node/log_path_test.go @@ -0,0 +1,120 @@ +/* +Copyright 2016 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package e2e_node + +import ( + "k8s.io/kubernetes/pkg/api" + "k8s.io/kubernetes/pkg/kubelet" + kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" + "k8s.io/kubernetes/pkg/util/uuid" + "k8s.io/kubernetes/test/e2e/framework" + + . "github.com/onsi/ginkgo" +) + +const logString = "This is the expected log content of this node e2e test" + +var _ = framework.KubeDescribe("ContainerLogPath", func() { + f := framework.NewDefaultFramework("kubelet-container-log-path") + Describe("Pod with a container", func() { + Context("printed log to stdout", func() { + It("should print log to correct log path", func() { + podClient := f.PodClient() + ns := f.Namespace.Name + + rootfsDirVolumeName := "docker-dir-vol" + + rootfsDir := "/root" + rootDir := "/" + logDir := kubelet.ContainerLogsDir + + logPodName := "logger-" + string(uuid.NewUUID()) + logContName := "logger-c-" + string(uuid.NewUUID()) + checkPodName := "checker" + string(uuid.NewUUID()) + checkContName := "checker-c-" + string(uuid.NewUUID()) + + logPod := &api.Pod{ + ObjectMeta: api.ObjectMeta{ + Name: logPodName, + }, + Spec: api.PodSpec{ + // this pod is expected to exit successfully + RestartPolicy: api.RestartPolicyNever, + Containers: []api.Container{ + { + Image: "gcr.io/google_containers/busybox:1.24", + Name: logContName, + Command: []string{"sh", "-c", "echo " + logString}, + }, + }, + }, + } + + podClient.Create(logPod) + err := framework.WaitForPodSuccessInNamespace(f.Client, logPodName, ns) + framework.ExpectNoError(err, "Failed waiting for pod: %s to enter success state", logPodName) + + // get containerID from created Pod + createdLogPod, err := podClient.Get(logPodName) + logConID := kubecontainer.ParseContainerID(createdLogPod.Status.ContainerStatuses[0].ContainerID) + framework.ExpectNoError(err, "Failed to get pod: %s", logPodName) + + expectedlogFile := logDir + "/" + logPodName + "_" + ns + "_" + logContName + "-" + logConID.ID + ".log" + + checkPod := &api.Pod{ + ObjectMeta: api.ObjectMeta{ + Name: checkPodName, + }, + Spec: api.PodSpec{ + // this pod is expected to exit successfully + RestartPolicy: api.RestartPolicyNever, + Containers: []api.Container{ + { + Image: "gcr.io/google_containers/busybox:1.24", + Name: checkContName, + // if we find expected log file and contains right content, exit 0 + // else, keep checking until test timeout + Command: []string{"sh", "-c", "chroot " + rootfsDir + " while true; do if [ -e " + expectedlogFile + " ] && grep -q " + logString + " " + expectedlogFile + "; then exit 0; fi; sleep 1; done"}, + VolumeMounts: []api.VolumeMount{ + { + Name: rootfsDirVolumeName, + MountPath: rootfsDir, + ReadOnly: true, + }, + }, + }, + }, + Volumes: []api.Volume{ + { + Name: rootfsDirVolumeName, + VolumeSource: api.VolumeSource{ + HostPath: &api.HostPathVolumeSource{ + Path: rootDir, + }, + }, + }, + }, + }, + } + + podClient.Create(checkPod) + err = framework.WaitForPodSuccessInNamespace(f.Client, checkPodName, ns) + framework.ExpectNoError(err, "Failed waiting for pod: %s to enter success state", checkPodName) + }) + }) + }) +}) From fad1990eaaaf6f602815a9a92026048abc186135 Mon Sep 17 00:00:00 2001 From: Harry Zhang Date: Tue, 25 Oct 2016 15:11:06 +0800 Subject: [PATCH 2/2] Fixe verify bazel Remove rootfs and chroot in scripts --- test/e2e/generated/BUILD | 24 ++---------------------- test/e2e_node/BUILD | 3 +++ test/e2e_node/log_path_test.go | 22 ++++++++++------------ test/test_owners.csv | 1 + 4 files changed, 16 insertions(+), 34 deletions(-) diff --git a/test/e2e/generated/BUILD b/test/e2e/generated/BUILD index a82f3efa2c1..895dd683fbd 100644 --- a/test/e2e/generated/BUILD +++ b/test/e2e/generated/BUILD @@ -13,28 +13,8 @@ load( go_library( name = "go_default_library", srcs = [ + "bindata.go", "main.go", - ":bindata", - ], -) - -genrule( - name = "bindata", - srcs = [ - "//examples:sources", - "//test/images:sources", - "//test/fixtures:sources", - "//test/e2e/testing-manifests:sources", - ], - outs = ["bindata.go"], - cmd = """ -$(location //vendor:github.com/jteeuwen/go-bindata/go-bindata) \ - -nometadata -o "$(OUTS)" -pkg generated \ - -prefix $$(pwd) \ - -ignore .jpg -ignore .png -ignore .md \ - $(SRCS) -""", - tools = [ - "//vendor:github.com/jteeuwen/go-bindata/go-bindata", ], + tags = ["automanaged"], ) diff --git a/test/e2e_node/BUILD b/test/e2e_node/BUILD index 58283738ab1..8ed218398b7 100644 --- a/test/e2e_node/BUILD +++ b/test/e2e_node/BUILD @@ -60,6 +60,7 @@ go_test( "image_id_test.go", "kubelet_test.go", "lifecycle_hook_test.go", + "log_path_test.go", "memory_eviction_test.go", "mirror_pod_test.go", "resource_usage_test.go", @@ -76,8 +77,10 @@ go_test( "//pkg/api/unversioned:go_default_library", "//pkg/client/cache:go_default_library", "//pkg/client/clientset_generated/internalclientset:go_default_library", + "//pkg/kubelet:go_default_library", "//pkg/kubelet/api/v1alpha1/stats:go_default_library", "//pkg/kubelet/cm:go_default_library", + "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/dockertools:go_default_library", "//pkg/kubelet/images:go_default_library", "//pkg/kubelet/metrics:go_default_library", diff --git a/test/e2e_node/log_path_test.go b/test/e2e_node/log_path_test.go index b14bbd7eb7c..bf2b5be1740 100644 --- a/test/e2e_node/log_path_test.go +++ b/test/e2e_node/log_path_test.go @@ -36,10 +36,7 @@ var _ = framework.KubeDescribe("ContainerLogPath", func() { podClient := f.PodClient() ns := f.Namespace.Name - rootfsDirVolumeName := "docker-dir-vol" - - rootfsDir := "/root" - rootDir := "/" + logDirVolumeName := "log-dir-vol" logDir := kubelet.ContainerLogsDir logPodName := "logger-" + string(uuid.NewUUID()) @@ -65,7 +62,7 @@ var _ = framework.KubeDescribe("ContainerLogPath", func() { } podClient.Create(logPod) - err := framework.WaitForPodSuccessInNamespace(f.Client, logPodName, ns) + err := framework.WaitForPodSuccessInNamespace(f.ClientSet, logPodName, ns) framework.ExpectNoError(err, "Failed waiting for pod: %s to enter success state", logPodName) // get containerID from created Pod @@ -86,13 +83,14 @@ var _ = framework.KubeDescribe("ContainerLogPath", func() { { Image: "gcr.io/google_containers/busybox:1.24", Name: checkContName, - // if we find expected log file and contains right content, exit 0 + // If we find expected log file and contains right content, exit 0 // else, keep checking until test timeout - Command: []string{"sh", "-c", "chroot " + rootfsDir + " while true; do if [ -e " + expectedlogFile + " ] && grep -q " + logString + " " + expectedlogFile + "; then exit 0; fi; sleep 1; done"}, + Command: []string{"sh", "-c", "while true; do if [ -e " + expectedlogFile + " ] && grep -q " + logString + " " + expectedlogFile + "; then exit 0; fi; sleep 1; done"}, VolumeMounts: []api.VolumeMount{ { - Name: rootfsDirVolumeName, - MountPath: rootfsDir, + Name: logDirVolumeName, + // mount ContainerLogsDir to the same path in container + MountPath: expectedlogFile, ReadOnly: true, }, }, @@ -100,10 +98,10 @@ var _ = framework.KubeDescribe("ContainerLogPath", func() { }, Volumes: []api.Volume{ { - Name: rootfsDirVolumeName, + Name: logDirVolumeName, VolumeSource: api.VolumeSource{ HostPath: &api.HostPathVolumeSource{ - Path: rootDir, + Path: expectedlogFile, }, }, }, @@ -112,7 +110,7 @@ var _ = framework.KubeDescribe("ContainerLogPath", func() { } podClient.Create(checkPod) - err = framework.WaitForPodSuccessInNamespace(f.Client, checkPodName, ns) + err = framework.WaitForPodSuccessInNamespace(f.ClientSet, checkPodName, ns) framework.ExpectNoError(err, "Failed waiting for pod: %s to enter success state", checkPodName) }) }) diff --git a/test/test_owners.csv b/test/test_owners.csv index be056d9e983..0ab68e5058c 100644 --- a/test/test_owners.csv +++ b/test/test_owners.csv @@ -40,6 +40,7 @@ Container Runtime Conformance Test container runtime conformance blackbox test w Container Runtime Conformance Test container runtime conformance blackbox test when starting a container that exits should report termination message if TerminationMessagePath is set,timothysc,1 DNS horizontal autoscaling kube-dns-autoscaler should scale kube-dns pods in both nonfaulty and faulty scenarios,MrHohn,0 DNS horizontal autoscaling kube-dns-autoscaler should scale kube-dns pods when cluster size changed,MrHohn,0 +ContainerLogPath Pod with a container printed log to stdout should print log to correct log path,resouer,0 DNS should provide DNS for ExternalName services,rmmh,1 DNS should provide DNS for pods for Hostname and Subdomain Annotation,mtaufen,1 DNS should provide DNS for services,roberthbailey,1