...
1
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
80 probeSpec.ProbeHandler = v1.ProbeHandler{
81 Exec: &v1.ExecAction{},
82 }
83
84
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
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,
125 &record.FakeRecorder{},
126 ).(*manager)
127
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 }
164
View as plain text