k8s.io/kubernetes@v1.29.3/pkg/kubelet/prober/common_test.go (about) 1 /* 2 Copyright 2015 The Kubernetes Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package prober 18 19 import ( 20 "os" 21 "reflect" 22 "sync" 23 24 v1 "k8s.io/api/core/v1" 25 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 26 "k8s.io/client-go/kubernetes/fake" 27 "k8s.io/client-go/tools/record" 28 kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" 29 kubepod "k8s.io/kubernetes/pkg/kubelet/pod" 30 "k8s.io/kubernetes/pkg/kubelet/prober/results" 31 "k8s.io/kubernetes/pkg/kubelet/status" 32 statustest "k8s.io/kubernetes/pkg/kubelet/status/testing" 33 kubeletutil "k8s.io/kubernetes/pkg/kubelet/util" 34 "k8s.io/kubernetes/pkg/probe" 35 "k8s.io/utils/exec" 36 ) 37 38 const ( 39 testContainerName = "cOnTaInEr_NaMe" 40 testPodUID = "pOd_UiD" 41 ) 42 43 var testContainerID = kubecontainer.ContainerID{Type: "test", ID: "cOnTaInEr_Id"} 44 45 func getTestRunningStatus() v1.PodStatus { 46 return getTestRunningStatusWithStarted(true) 47 } 48 49 func getTestRunningStatusWithStarted(started bool) v1.PodStatus { 50 containerStatus := v1.ContainerStatus{ 51 Name: testContainerName, 52 ContainerID: testContainerID.String(), 53 } 54 containerStatus.State.Running = &v1.ContainerStateRunning{StartedAt: metav1.Now()} 55 containerStatus.Started = &started 56 podStatus := v1.PodStatus{ 57 Phase: v1.PodRunning, 58 ContainerStatuses: []v1.ContainerStatus{containerStatus}, 59 } 60 return podStatus 61 } 62 63 func getTestPod() *v1.Pod { 64 container := v1.Container{ 65 Name: testContainerName, 66 } 67 pod := v1.Pod{ 68 Spec: v1.PodSpec{ 69 Containers: []v1.Container{container}, 70 RestartPolicy: v1.RestartPolicyNever, 71 }, 72 } 73 pod.Name = "testPod" 74 pod.UID = testPodUID 75 return &pod 76 } 77 78 func setTestProbe(pod *v1.Pod, probeType probeType, probeSpec v1.Probe) { 79 // All tests rely on the fake exec prober. 80 probeSpec.ProbeHandler = v1.ProbeHandler{ 81 Exec: &v1.ExecAction{}, 82 } 83 84 // Apply test defaults, overwridden for test speed. 85 defaults := map[string]int64{ 86 "TimeoutSeconds": 1, 87 "PeriodSeconds": 1, 88 "SuccessThreshold": 1, 89 "FailureThreshold": 1, 90 } 91 for field, value := range defaults { 92 f := reflect.ValueOf(&probeSpec).Elem().FieldByName(field) 93 if f.Int() == 0 { 94 f.SetInt(value) 95 } 96 } 97 98 switch probeType { 99 case readiness: 100 pod.Spec.Containers[0].ReadinessProbe = &probeSpec 101 case liveness: 102 pod.Spec.Containers[0].LivenessProbe = &probeSpec 103 case startup: 104 pod.Spec.Containers[0].StartupProbe = &probeSpec 105 } 106 } 107 108 func newTestManager() *manager { 109 podManager := kubepod.NewBasicPodManager() 110 podStartupLatencyTracker := kubeletutil.NewPodStartupLatencyTracker() 111 // Add test pod to pod manager, so that status manager can get the pod from pod manager if needed. 112 podManager.AddPod(getTestPod()) 113 testRootDir := "" 114 if tempDir, err := os.MkdirTemp("", "kubelet_test."); err != nil { 115 return nil 116 } else { 117 testRootDir = tempDir 118 } 119 m := NewManager( 120 status.NewManager(&fake.Clientset{}, podManager, &statustest.FakePodDeletionSafetyProvider{}, podStartupLatencyTracker, testRootDir), 121 results.NewManager(), 122 results.NewManager(), 123 results.NewManager(), 124 nil, // runner 125 &record.FakeRecorder{}, 126 ).(*manager) 127 // Don't actually execute probes. 128 m.prober.exec = fakeExecProber{probe.Success, nil} 129 return m 130 } 131 132 func newTestWorker(m *manager, probeType probeType, probeSpec v1.Probe) *worker { 133 pod := getTestPod() 134 setTestProbe(pod, probeType, probeSpec) 135 return newWorker(m, probeType, pod, pod.Spec.Containers[0]) 136 } 137 138 type fakeExecProber struct { 139 result probe.Result 140 err error 141 } 142 143 func (p fakeExecProber) Probe(c exec.Cmd) (probe.Result, string, error) { 144 return p.result, "", p.err 145 } 146 147 type syncExecProber struct { 148 sync.RWMutex 149 fakeExecProber 150 } 151 152 func (p *syncExecProber) set(result probe.Result, err error) { 153 p.Lock() 154 defer p.Unlock() 155 p.result = result 156 p.err = err 157 } 158 159 func (p *syncExecProber) Probe(cmd exec.Cmd) (probe.Result, string, error) { 160 p.RLock() 161 defer p.RUnlock() 162 return p.fakeExecProber.Probe(cmd) 163 }