mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Add node e2e test for log rotation.
This commit is contained in:
		
							
								
								
									
										107
									
								
								test/e2e_node/container_log_rotation_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								test/e2e_node/container_log_rotation_test.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,107 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright 2018 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 (
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"k8s.io/api/core/v1"
 | 
			
		||||
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/features"
 | 
			
		||||
	"k8s.io/kubernetes/pkg/kubelet/apis/kubeletconfig"
 | 
			
		||||
	kubecontainer "k8s.io/kubernetes/pkg/kubelet/container"
 | 
			
		||||
	kubelogs "k8s.io/kubernetes/pkg/kubelet/logs"
 | 
			
		||||
	kubetypes "k8s.io/kubernetes/pkg/kubelet/types"
 | 
			
		||||
	"k8s.io/kubernetes/test/e2e/framework"
 | 
			
		||||
 | 
			
		||||
	. "github.com/onsi/ginkgo"
 | 
			
		||||
	. "github.com/onsi/gomega"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	testContainerLogMaxFiles    = 3
 | 
			
		||||
	testContainerLogMaxSize     = "40Ki"
 | 
			
		||||
	rotationPollInterval        = 5 * time.Second
 | 
			
		||||
	rotationEventuallyTimeout   = 3 * time.Minute
 | 
			
		||||
	rotationConsistentlyTimeout = 2 * time.Minute
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var _ = framework.KubeDescribe("ContainerLogRotation [Slow] [Serial] [Disruptive]", func() {
 | 
			
		||||
	f := framework.NewDefaultFramework("container-log-rotation-test")
 | 
			
		||||
	Context("when a container generates a lot of log", func() {
 | 
			
		||||
		BeforeEach(func() {
 | 
			
		||||
			if framework.TestContext.ContainerRuntime != kubetypes.RemoteContainerRuntime {
 | 
			
		||||
				framework.Skipf("Skipping ContainerLogRotation test since the container runtime is not remote")
 | 
			
		||||
			}
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		tempSetCurrentKubeletConfig(f, func(initialConfig *kubeletconfig.KubeletConfiguration) {
 | 
			
		||||
			initialConfig.FeatureGates[string(features.CRIContainerLogRotation)] = true
 | 
			
		||||
			initialConfig.ContainerLogMaxFiles = testContainerLogMaxFiles
 | 
			
		||||
			initialConfig.ContainerLogMaxSize = testContainerLogMaxSize
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
		It("should be rotated and limited to a fixed amount of files", func() {
 | 
			
		||||
			By("create log container")
 | 
			
		||||
			pod := &v1.Pod{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name: "test-container-log-rotation",
 | 
			
		||||
				},
 | 
			
		||||
				Spec: v1.PodSpec{
 | 
			
		||||
					RestartPolicy: v1.RestartPolicyNever,
 | 
			
		||||
					Containers: []v1.Container{
 | 
			
		||||
						{
 | 
			
		||||
							Name:  "log-container",
 | 
			
		||||
							Image: busyboxImage,
 | 
			
		||||
							Command: []string{
 | 
			
		||||
								"sh",
 | 
			
		||||
								"-c",
 | 
			
		||||
								// ~12Kb/s. Exceeding 40Kb in 4 seconds. Log rotation period is 10 seconds.
 | 
			
		||||
								"while true; do echo hello world; sleep 0.001; done;",
 | 
			
		||||
							},
 | 
			
		||||
						},
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			}
 | 
			
		||||
			pod = f.PodClient().CreateSync(pod)
 | 
			
		||||
			By("get container log path")
 | 
			
		||||
			Expect(len(pod.Status.ContainerStatuses)).To(Equal(1))
 | 
			
		||||
			id := kubecontainer.ParseContainerID(pod.Status.ContainerStatuses[0].ContainerID).ID
 | 
			
		||||
			r, _, err := getCRIClient()
 | 
			
		||||
			Expect(err).NotTo(HaveOccurred())
 | 
			
		||||
			status, err := r.ContainerStatus(id)
 | 
			
		||||
			Expect(err).NotTo(HaveOccurred())
 | 
			
		||||
			logPath := status.GetLogPath()
 | 
			
		||||
			By("wait for container log being rotated to max file limit")
 | 
			
		||||
			Eventually(func() (int, error) {
 | 
			
		||||
				logs, err := kubelogs.GetAllLogs(logPath)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return 0, err
 | 
			
		||||
				}
 | 
			
		||||
				return len(logs), nil
 | 
			
		||||
			}, rotationEventuallyTimeout, rotationPollInterval).Should(Equal(testContainerLogMaxFiles), "should eventually rotate to max file limit")
 | 
			
		||||
			By("make sure container log number won't exceed max file limit")
 | 
			
		||||
			Consistently(func() (int, error) {
 | 
			
		||||
				logs, err := kubelogs.GetAllLogs(logPath)
 | 
			
		||||
				if err != nil {
 | 
			
		||||
					return 0, err
 | 
			
		||||
				}
 | 
			
		||||
				return len(logs), nil
 | 
			
		||||
			}, rotationConsistentlyTimeout, rotationPollInterval).Should(BeNumerically("<=", testContainerLogMaxFiles), "should never exceed max file limit")
 | 
			
		||||
		})
 | 
			
		||||
	})
 | 
			
		||||
})
 | 
			
		||||
		Reference in New Issue
	
	Block a user