common_test.go 4.1 KB

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