Fix match onExitCodes when Pod is not terminated

Change-Id: Id1f9c46f8b6a12115577a1fadb12adc580c9ba6a
This commit is contained in:
Aldo Culquicondor 2022-11-11 10:05:03 -05:00
parent cc704f9778
commit bc5afaf580
No known key found for this signature in database
GPG Key ID: 51D903912270D4EE
2 changed files with 14 additions and 1 deletions

View File

@ -68,6 +68,8 @@ func matchPodFailurePolicy(podFailurePolicy *batch.PodFailurePolicy, failedPod *
return nil, true, nil 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 { func matchOnExitCodes(podStatus *v1.PodStatus, requirement *batch.PodFailurePolicyOnExitCodesRequirement) *v1.ContainerStatus {
if containerStatus := getMatchingContainerFromList(podStatus.ContainerStatuses, requirement); containerStatus != nil { if containerStatus := getMatchingContainerFromList(podStatus.ContainerStatuses, requirement); containerStatus != nil {
return containerStatus return containerStatus
@ -86,8 +88,16 @@ func matchOnPodConditions(podStatus *v1.PodStatus, requirement []batch.PodFailur
return nil 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 { func getMatchingContainerFromList(containerStatuses []v1.ContainerStatus, requirement *batch.PodFailurePolicyOnExitCodesRequirement) *v1.ContainerStatus {
for _, containerStatus := range containerStatuses { 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 requirement.ContainerName == nil || *requirement.ContainerName == containerStatus.Name {
if containerStatus.State.Terminated.ExitCode != 0 { if containerStatus.State.Terminated.ExitCode != 0 {
if isOnExitCodesOperatorMatching(containerStatus.State.Terminated.ExitCode, requirement) { if isOnExitCodesOperatorMatching(containerStatus.State.Terminated.ExitCode, requirement) {

View File

@ -389,7 +389,10 @@ func TestMatchPodFailurePolicy(t *testing.T) {
Phase: v1.PodFailed, Phase: v1.PodFailed,
ContainerStatuses: []v1.ContainerStatus{ ContainerStatuses: []v1.ContainerStatus{
{ {
Name: "main-container", Name: "foo",
},
{
Name: "bar",
State: v1.ContainerState{ State: v1.ContainerState{
Terminated: &v1.ContainerStateTerminated{ Terminated: &v1.ContainerStateTerminated{
ExitCode: 2, ExitCode: 2,