...
1
16
17 package utils
18
19 import (
20 "fmt"
21
22 v1 "k8s.io/api/core/v1"
23 podutil "k8s.io/kubernetes/pkg/api/v1/pod"
24 )
25
26 type ContainerFailures struct {
27 status *v1.ContainerStateTerminated
28 Restarts int
29 }
30
31
32
33 func PodRunningReady(p *v1.Pod) (bool, error) {
34
35 if p.Status.Phase != v1.PodRunning {
36 return false, fmt.Errorf("want pod '%s' on '%s' to be '%v' but was '%v'",
37 p.ObjectMeta.Name, p.Spec.NodeName, v1.PodRunning, p.Status.Phase)
38 }
39
40 if !podutil.IsPodReady(p) {
41 return false, fmt.Errorf("pod '%s' on '%s' didn't have condition {%v %v}; conditions: %v",
42 p.ObjectMeta.Name, p.Spec.NodeName, v1.PodReady, v1.ConditionTrue, p.Status.Conditions)
43 }
44 return true, nil
45 }
46
47 func PodRunningReadyOrSucceeded(p *v1.Pod) (bool, error) {
48
49 if p.Status.Phase == v1.PodSucceeded {
50 return true, nil
51 }
52 return PodRunningReady(p)
53 }
54
55 func PodSucceeded(p *v1.Pod) (bool, error) {
56 return p.Status.Phase == v1.PodSucceeded, nil
57 }
58
59
60
61
62
63 func FailedContainers(pod *v1.Pod) map[string]ContainerFailures {
64 var state ContainerFailures
65 states := make(map[string]ContainerFailures)
66
67 statuses := pod.Status.ContainerStatuses
68 if len(statuses) == 0 {
69 return nil
70 }
71 for _, status := range statuses {
72 if status.State.Terminated != nil {
73 states[status.ContainerID] = ContainerFailures{status: status.State.Terminated}
74 } else if status.LastTerminationState.Terminated != nil {
75 states[status.ContainerID] = ContainerFailures{status: status.LastTerminationState.Terminated}
76 }
77 if status.RestartCount > 0 {
78 var ok bool
79 if state, ok = states[status.ContainerID]; !ok {
80 state = ContainerFailures{}
81 }
82 state.Restarts = int(status.RestartCount)
83 states[status.ContainerID] = state
84 }
85 }
86
87 return states
88 }
89
90
91
92
93 func TerminatedContainers(pod *v1.Pod) map[string]string {
94 states := make(map[string]string)
95 statuses := pod.Status.ContainerStatuses
96 if len(statuses) == 0 {
97 return states
98 }
99 for _, status := range statuses {
100 if status.State.Terminated != nil {
101 states[status.Name] = status.State.Terminated.Reason
102 }
103 }
104 return states
105 }
106
107
108 func PodNotReady(p *v1.Pod) (bool, error) {
109
110 if podutil.IsPodReady(p) {
111 return false, fmt.Errorf("pod '%s' on '%s' didn't have condition {%v %v}; conditions: %v",
112 p.ObjectMeta.Name, p.Spec.NodeName, v1.PodReady, v1.ConditionFalse, p.Status.Conditions)
113 }
114 return true, nil
115 }
116
View as plain text