Skip to content

Commit

Permalink
Fix match onExitCodes when Pod is not terminated
Browse files Browse the repository at this point in the history
Change-Id: Id1f9c46f8b6a12115577a1fadb12adc580c9ba6a
  • Loading branch information
alculquicondor committed Nov 11, 2022
1 parent cc704f9 commit bc5afaf
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
10 changes: 10 additions & 0 deletions pkg/controller/job/pod_failure_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ func matchPodFailurePolicy(podFailurePolicy *batch.PodFailurePolicy, failedPod *
return nil, true, nil
}

// matchOnExitCodes returns a terminated container status that matches the error code requirement, if any exists.
// If the returned status is non-nil, it has a non-nil Terminated field.
func matchOnExitCodes(podStatus *v1.PodStatus, requirement *batch.PodFailurePolicyOnExitCodesRequirement) *v1.ContainerStatus {
if containerStatus := getMatchingContainerFromList(podStatus.ContainerStatuses, requirement); containerStatus != nil {
return containerStatus
Expand All @@ -86,8 +88,16 @@ func matchOnPodConditions(podStatus *v1.PodStatus, requirement []batch.PodFailur
return nil
}

// getMatchingContainerFromList returns the first terminated container status in the list that matches the error code requirement, or nil if none match.
// If the returned status is non-nil, it has a non-nil Terminated field
func getMatchingContainerFromList(containerStatuses []v1.ContainerStatus, requirement *batch.PodFailurePolicyOnExitCodesRequirement) *v1.ContainerStatus {
for _, containerStatus := range containerStatuses {
if containerStatus.State.Terminated == nil {
// This container is still be terminating. There is no exit code to match.
// TODO(#113855): Remove this check when it's guaranteed that the
// container is terminated.
continue
}
if requirement.ContainerName == nil || *requirement.ContainerName == containerStatus.Name {
if containerStatus.State.Terminated.ExitCode != 0 {
if isOnExitCodesOperatorMatching(containerStatus.State.Terminated.ExitCode, requirement) {
Expand Down
5 changes: 4 additions & 1 deletion pkg/controller/job/pod_failure_policy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,10 @@ func TestMatchPodFailurePolicy(t *testing.T) {
Phase: v1.PodFailed,
ContainerStatuses: []v1.ContainerStatus{
{
Name: "main-container",
Name: "foo",
},
{
Name: "bar",
State: v1.ContainerState{
Terminated: &v1.ContainerStateTerminated{
ExitCode: 2,
Expand Down

0 comments on commit bc5afaf

Please sign in to comment.