Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions pkg/pod/status.go
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,9 @@ func updateIncompleteTaskRunStatus(trs *v1.TaskRunStatus, pod *corev1.Pod) {
switch {
case IsPodExceedingNodeResources(pod):
markStatusRunning(trs, ReasonExceededNodeResources, "TaskRun Pod exceeded available resources")
case isSubPathDirectoryError(pod):
// if subPath directory creation errors, mark as running and wait for recovery
markStatusRunning(trs, ReasonPodPending, "Waiting for subPath directory creation to complete")
case isPodHitConfigError(pod):
markStatusFailure(trs, ReasonCreateContainerConfigError, "Failed to create pod due to config error")
case isPullImageError(pod):
Expand Down Expand Up @@ -803,6 +806,10 @@ func IsPodExceedingNodeResources(pod *corev1.Pod) bool {
func isPodHitConfigError(pod *corev1.Pod) bool {
for _, containerStatus := range pod.Status.ContainerStatuses {
if containerStatus.State.Waiting != nil && containerStatus.State.Waiting.Reason == ReasonCreateContainerConfigError {
// for subPath directory creation errors, we want to allow recovery
if strings.Contains(containerStatus.State.Waiting.Message, "failed to create subPath directory") {
return false
}
return true
}
}
Expand Down Expand Up @@ -912,3 +919,14 @@ func sortPodContainerStatuses(podContainerStatuses []corev1.ContainerStatus, pod
func isOOMKilled(s corev1.ContainerStatus) bool {
return s.State.Terminated.Reason == oomKilled
}

func isSubPathDirectoryError(pod *corev1.Pod) bool {
for _, containerStatus := range pod.Status.ContainerStatuses {
if containerStatus.State.Waiting != nil &&
containerStatus.State.Waiting.Reason == ReasonCreateContainerConfigError &&
strings.Contains(containerStatus.State.Waiting.Message, "failed to create subPath directory") {
return true
}
}
return false
}
138 changes: 138 additions & 0 deletions pkg/pod/status_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3165,3 +3165,141 @@ func TestGetTaskResultsFromSidecarLogs(t *testing.T) {
t.Error(diff.PrintWantGot(d))
}
}

func TestIsSubPathDirectoryError(t *testing.T) {
tests := []struct {
name string
pod *corev1.Pod
expected bool
}{
{
name: "container has subPath directory error",
pod: &corev1.Pod{
Status: corev1.PodStatus{
ContainerStatuses: []corev1.ContainerStatus{
{
State: corev1.ContainerState{
Waiting: &corev1.ContainerStateWaiting{
Reason: "CreateContainerConfigError",
Message: "failed to create subPath directory",
},
},
},
},
},
},
expected: true,
},
{
name: "container has different config error",
pod: &corev1.Pod{
Status: corev1.PodStatus{
ContainerStatuses: []corev1.ContainerStatus{
{
State: corev1.ContainerState{
Waiting: &corev1.ContainerStateWaiting{
Reason: "CreateContainerConfigError",
Message: "some other error",
},
},
},
},
},
},
expected: false,
},
{
name: "container is running normally",
pod: &corev1.Pod{
Status: corev1.PodStatus{
ContainerStatuses: []corev1.ContainerStatus{
{
State: corev1.ContainerState{
Running: &corev1.ContainerStateRunning{},
},
},
},
},
},
expected: false,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got := isSubPathDirectoryError(tt.pod)
if got != tt.expected {
t.Errorf("isSubPathDirectoryError() = %v, want %v", got, tt.expected)
}
})
}
}

func TestUpdateIncompleteTaskRunStatus_SubPathError(t *testing.T) {
tests := []struct {
name string
pod *corev1.Pod
trs *v1.TaskRunStatus
expected *apis.Condition
}{
{
name: "subPath directory error should mark as running",
pod: &corev1.Pod{
Status: corev1.PodStatus{
Phase: corev1.PodPending,
ContainerStatuses: []corev1.ContainerStatus{
{
State: corev1.ContainerState{
Waiting: &corev1.ContainerStateWaiting{
Reason: "CreateContainerConfigError",
Message: "failed to create subPath directory",
},
},
},
},
},
},
trs: &v1.TaskRunStatus{},
expected: &apis.Condition{
Type: apis.ConditionSucceeded,
Status: corev1.ConditionUnknown,
Reason: "Pending",
Message: "Waiting for subPath directory creation to complete",
},
},
{
name: "other config error should mark as failure",
pod: &corev1.Pod{
Status: corev1.PodStatus{
Phase: corev1.PodPending,
ContainerStatuses: []corev1.ContainerStatus{
{
State: corev1.ContainerState{
Waiting: &corev1.ContainerStateWaiting{
Reason: "CreateContainerConfigError",
Message: "some other config error",
},
},
},
},
},
},
trs: &v1.TaskRunStatus{},
expected: &apis.Condition{
Type: apis.ConditionSucceeded,
Status: corev1.ConditionFalse,
Reason: "CreateContainerConfigError",
Message: "Failed to create pod due to config error",
},
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
updateIncompleteTaskRunStatus(tt.trs, tt.pod)
if d := cmp.Diff(tt.expected, tt.trs.GetCondition(apis.ConditionSucceeded), cmpopts.IgnoreFields(apis.Condition{}, "LastTransitionTime.Inner.Time")); d != "" {
t.Errorf("Unexpected status: %s", diff.PrintWantGot(d))
}
})
}
}
Loading