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:
Kubernetes Prow Robot 2025-09-02 06:51:16 -07:00 committed by GitHub
commit eff19217ed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 180 additions and 23 deletions

View file

@ -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"
}
}

View file

@ -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 {