linkerd2/pkg/k8s/api_test.go

306 lines
5.2 KiB
Go

package k8s
import (
"testing"
corev1 "k8s.io/api/core/v1"
)
func TestGetPodStatus(t *testing.T) {
scenarios := []struct {
desc string
pod string
expected string
}{
{
desc: "Pod is running",
expected: "Running",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Running
`,
},
{
desc: "Pod's reason is filled",
expected: "podReason",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
reason: podReason
`,
},
{
desc: "Pod waiting is filled",
expected: "CrashLoopBackOff",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
reason: podReason
containerStatuses:
- state:
waiting:
reason: CrashLoopBackOff
`,
},
{
desc: "Pod is terminated",
expected: "podTerminated",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
reason: podReason
containerStatuses:
- state:
terminated:
reason: podTerminated
exitCode: 2
`,
},
{
desc: "Pod terminated with signal",
expected: "Signal:9",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
reason: podReason
containerStatuses:
- state:
terminated:
signal: 9
`,
},
{
desc: "Pod terminated with exti code",
expected: "ExitCode:2",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
reason: podReason
containerStatuses:
- state:
terminated:
exitCode: 2
`,
},
{
desc: "Pod has a running container",
expected: "Running",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Running
reason: Completed
containerStatuses:
- ready: true
state:
running:
startedAt: 1995-02-10T00:42:42Z
`,
},
{
desc: "Pod init container terminated with exit code 0",
expected: "Running",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Running
containerStatuses:
- state:
running:
startedAt: 1995-02-10T00:42:42Z
initContainerStatuses:
- state:
terminated:
exitCode: 0
reason: Completed
`,
},
{
desc: "Pod init container terminated with exit code 2",
expected: "Init:ExitCode:2",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Running
containerStatuses:
- state:
running:
startedAt: 1995-02-10T00:42:42Z
initContainerStatuses:
- state:
terminated:
exitCode: 2
`,
},
{
desc: "Pod init container terminated with signal",
expected: "Init:Signal:9",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Running
containerStatuses:
- state:
running:
startedAt: 1995-02-10T00:42:42Z
initContainerStatuses:
- state:
terminated:
signal: 9
`,
},
{
desc: "Pod init container in CrashLooBackOff",
expected: "Init:CrashLoopBackOff",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
initContainerStatuses:
- state:
terminated:
exitCode: 2
reason: CrashLoopBackOff
`,
},
{
desc: "Pod init container waiting for someReason",
expected: "Init:someReason",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
initContainerStatuses:
- state:
waiting:
reason: someReason
`,
},
{
desc: "Pod init container is waiting on PodInitializing",
expected: "Init:0/0",
pod: `
apiVersion: v1
kind: Pod
metadata:
name: emoji
namespace: emojivoto
labels:
app: emoji-svc
linkerd.io/control-plane-ns: linkerd
status:
phase: Pending
initContainerStatuses:
- state:
waiting:
reason: PodInitializing
`,
},
}
for _, s := range scenarios {
obj, err := ToRuntimeObject(s.pod)
if err != nil {
t.Fatalf("could not decode yml: %s", err)
}
pod, ok := obj.(*corev1.Pod)
if !ok {
t.Fatalf("could not convert returned object to pod")
}
got := GetPodStatus(*pod)
if s.expected != got {
t.Fatalf("Wrong pod status on '%s'. Expected '%s', got '%s'", s.desc, s.expected, got)
}
}
}