mirror of
https://github.com/kubernetes/kubernetes.git
synced 2026-06-04 14:22:38 -04:00
Merge pull request #124766 from kkkkun/fix-show-status-error
Fixes pod status error when it has an error container
This commit is contained in:
commit
eff19217ed
2 changed files with 180 additions and 23 deletions
|
|
@ -982,6 +982,7 @@ func printPod(pod *api.Pod, options printers.GenerateOptions) ([]metav1.TableRow
|
|||
restarts = restartableInitContainerRestarts
|
||||
lastRestartDate = lastRestartableInitContainerRestartDate
|
||||
hasRunning := false
|
||||
errorReason := ""
|
||||
for i := len(pod.Status.ContainerStatuses) - 1; i >= 0; i-- {
|
||||
container := pod.Status.ContainerStatuses[i]
|
||||
|
||||
|
|
@ -992,27 +993,33 @@ func printPod(pod *api.Pod, options printers.GenerateOptions) ([]metav1.TableRow
|
|||
lastRestartDate = terminatedDate
|
||||
}
|
||||
}
|
||||
if container.State.Waiting != nil && container.State.Waiting.Reason != "" {
|
||||
switch {
|
||||
case container.State.Waiting != nil && container.State.Waiting.Reason != "":
|
||||
reason = container.State.Waiting.Reason
|
||||
} else if container.State.Terminated != nil && container.State.Terminated.Reason != "" {
|
||||
reason = container.State.Terminated.Reason
|
||||
} else if container.State.Terminated != nil && container.State.Terminated.Reason == "" {
|
||||
if container.State.Terminated.Signal != 0 {
|
||||
case container.State.Terminated != nil:
|
||||
if len(container.State.Terminated.Reason) > 0 {
|
||||
reason = container.State.Terminated.Reason
|
||||
} else if container.State.Terminated.Signal != 0 {
|
||||
reason = fmt.Sprintf("Signal:%d", container.State.Terminated.Signal)
|
||||
} else {
|
||||
reason = fmt.Sprintf("ExitCode:%d", container.State.Terminated.ExitCode)
|
||||
}
|
||||
} else if container.Ready && container.State.Running != nil {
|
||||
if container.State.Terminated.ExitCode != 0 {
|
||||
errorReason = reason
|
||||
}
|
||||
case container.Ready && container.State.Running != nil:
|
||||
hasRunning = true
|
||||
readyContainers++
|
||||
}
|
||||
}
|
||||
|
||||
// change pod status back to "Running" if there is at least one container still reporting as "Running" status
|
||||
if reason == "Completed" && hasRunning {
|
||||
if hasPodReadyCondition(pod.Status.Conditions) {
|
||||
if reason == "Completed" {
|
||||
if hasRunning && hasPodReadyCondition(pod.Status.Conditions) {
|
||||
reason = "Running"
|
||||
} else {
|
||||
} else if errorReason != "" {
|
||||
reason = errorReason
|
||||
} else if hasRunning {
|
||||
reason = "NotReady"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1536,9 +1536,8 @@ func TestPrintPod(t *testing.T) {
|
|||
Phase: api.PodSucceeded,
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: false,
|
||||
RestartCount: 0,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{Reason: "Completed", ExitCode: 0}},
|
||||
Ready: false,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{Reason: "Completed", ExitCode: 0}},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -1554,9 +1553,8 @@ func TestPrintPod(t *testing.T) {
|
|||
Phase: api.PodFailed,
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: false,
|
||||
RestartCount: 0,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{Reason: "Error", ExitCode: 1}},
|
||||
Ready: false,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{Reason: "Error", ExitCode: 1}},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -1572,9 +1570,8 @@ func TestPrintPod(t *testing.T) {
|
|||
Phase: api.PodSucceeded,
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: false,
|
||||
RestartCount: 0,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{Reason: "Completed", ExitCode: 0}},
|
||||
Ready: false,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{Reason: "Completed", ExitCode: 0}},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -1587,12 +1584,11 @@ func TestPrintPod(t *testing.T) {
|
|||
ObjectMeta: metav1.ObjectMeta{Name: "test19", DeletionTimestamp: &deleteTime},
|
||||
Spec: api.PodSpec{Containers: make([]api.Container, 1)},
|
||||
Status: api.PodStatus{
|
||||
Phase: "Running",
|
||||
Phase: api.PodRunning,
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: false,
|
||||
RestartCount: 0,
|
||||
State: api.ContainerState{Running: &api.ContainerStateRunning{}},
|
||||
Ready: false,
|
||||
State: api.ContainerState{Running: &api.ContainerStateRunning{}},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
@ -1604,11 +1600,165 @@ func TestPrintPod(t *testing.T) {
|
|||
ObjectMeta: metav1.ObjectMeta{Name: "test20", DeletionTimestamp: &deleteTime},
|
||||
Spec: api.PodSpec{Containers: make([]api.Container, 1)},
|
||||
Status: api.PodStatus{
|
||||
Phase: "Pending",
|
||||
Phase: api.PodPending,
|
||||
},
|
||||
},
|
||||
[]metav1.TableRow{{Cells: []interface{}{"test20", "0/1", "Terminating", "0", "<unknown>"}}},
|
||||
},
|
||||
// Test the two containers. They are ready and State are Error/Running
|
||||
// reference: https://github.com/kubernetes/kubernetes/issues/107713
|
||||
{
|
||||
api.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "test21"},
|
||||
Spec: api.PodSpec{Containers: make([]api.Container, 2)},
|
||||
Status: api.PodStatus{
|
||||
Phase: api.PodFailed,
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: false,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{
|
||||
FinishedAt: metav1.NewTime(time.Now()),
|
||||
ExitCode: 1,
|
||||
Reason: "podCrash"},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
{
|
||||
Ready: true,
|
||||
State: api.ContainerState{Running: &api.ContainerStateRunning{
|
||||
StartedAt: metav1.NewTime(time.Now())},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
[]metav1.TableRow{
|
||||
{
|
||||
Cells: []interface{}{"test21", "1/2", "podCrash", "0", "<unknown>"},
|
||||
Conditions: podFailedConditions,
|
||||
},
|
||||
},
|
||||
},
|
||||
// Test the two containers. They are ready and State are Running/Error
|
||||
// reference: https://github.com/kubernetes/kubernetes/issues/107713
|
||||
{
|
||||
api.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "test22"},
|
||||
Spec: api.PodSpec{Containers: make([]api.Container, 2)},
|
||||
Status: api.PodStatus{
|
||||
Phase: api.PodFailed,
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: true,
|
||||
State: api.ContainerState{Running: &api.ContainerStateRunning{
|
||||
StartedAt: metav1.NewTime(time.Now())},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
{
|
||||
Ready: false,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{
|
||||
FinishedAt: metav1.NewTime(time.Now()),
|
||||
ExitCode: 1,
|
||||
Reason: "podCrash"},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
[]metav1.TableRow{
|
||||
{
|
||||
Cells: []interface{}{"test22", "1/2", "podCrash", "0", "<unknown>"},
|
||||
Conditions: podFailedConditions,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
// Test the three containers. They are ready and State are Running/Error/Completed
|
||||
api.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "test23"},
|
||||
Spec: api.PodSpec{Containers: make([]api.Container, 3)},
|
||||
Status: api.PodStatus{
|
||||
Phase: "Failed",
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: true,
|
||||
State: api.ContainerState{Running: &api.ContainerStateRunning{
|
||||
StartedAt: metav1.NewTime(time.Now())},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
{
|
||||
Ready: true,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{
|
||||
FinishedAt: metav1.NewTime(time.Now()),
|
||||
ExitCode: 1,
|
||||
Reason: "podCrash"},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
{
|
||||
Ready: true,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{
|
||||
FinishedAt: metav1.NewTime(time.Now()),
|
||||
ExitCode: 0},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
[]metav1.TableRow{
|
||||
{
|
||||
Cells: []interface{}{"test23", "1/3", "podCrash", "0", "<unknown>"},
|
||||
Conditions: podFailedConditions,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
// Test the three containers. They are notReady and State are Running/Error/Completed
|
||||
api.Pod{
|
||||
ObjectMeta: metav1.ObjectMeta{Name: "test24"},
|
||||
Spec: api.PodSpec{Containers: make([]api.Container, 3)},
|
||||
Status: api.PodStatus{
|
||||
Phase: "Failed",
|
||||
ContainerStatuses: []api.ContainerStatus{
|
||||
{
|
||||
Ready: false,
|
||||
State: api.ContainerState{Running: &api.ContainerStateRunning{
|
||||
StartedAt: metav1.NewTime(time.Now())},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
{
|
||||
Ready: false,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{
|
||||
FinishedAt: metav1.NewTime(time.Now()),
|
||||
ExitCode: 1,
|
||||
Reason: "podCrash"},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
{
|
||||
Ready: false,
|
||||
State: api.ContainerState{Terminated: &api.ContainerStateTerminated{
|
||||
FinishedAt: metav1.NewTime(time.Now()),
|
||||
ExitCode: 0},
|
||||
},
|
||||
LastTerminationState: api.ContainerState{},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
[]metav1.TableRow{
|
||||
{
|
||||
Cells: []interface{}{"test24", "0/3", "podCrash", "0", "<unknown>"},
|
||||
Conditions: podFailedConditions,
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for i, test := range tests {
|
||||
|
|
|
|||
Loading…
Reference in a new issue