in pkg/webhooks/admission/jobs/validate/util.go [58:119]
func validatePolicies(policies []batchv1alpha1.LifecyclePolicy, fldPath *field.Path) error {
var err error
policyEvents := map[busv1alpha1.Event]struct{}{}
exitCodes := map[int32]struct{}{}
for _, policy := range policies {
if (policy.Event != "" || len(policy.Events) != 0) && policy.ExitCode != nil {
err = multierror.Append(err, fmt.Errorf("must not specify event and exitCode simultaneously"))
break
}
if policy.Event == "" && len(policy.Events) == 0 && policy.ExitCode == nil {
err = multierror.Append(err, fmt.Errorf("either event and exitCode should be specified"))
break
}
if len(policy.Event) != 0 || len(policy.Events) != 0 {
bFlag := false
policyEventsList := getEventList(policy)
for _, event := range policyEventsList {
if allow, ok := policyEventMap[event]; !ok || !allow {
err = multierror.Append(err, field.Invalid(fldPath, event, "invalid policy event"))
bFlag = true
break
}
if allow, ok := policyActionMap[policy.Action]; !ok || !allow {
err = multierror.Append(err, field.Invalid(fldPath, policy.Action, "invalid policy action"))
bFlag = true
break
}
if _, found := policyEvents[event]; found {
err = multierror.Append(err, fmt.Errorf("duplicate event %v across different policy", event))
bFlag = true
break
} else {
policyEvents[event] = struct{}{}
}
}
if bFlag {
break
}
} else {
if *policy.ExitCode == 0 {
err = multierror.Append(err, fmt.Errorf("0 is not a valid error code"))
break
}
if _, found := exitCodes[*policy.ExitCode]; found {
err = multierror.Append(err, fmt.Errorf("duplicate exitCode %v", *policy.ExitCode))
break
} else {
exitCodes[*policy.ExitCode] = struct{}{}
}
}
}
if _, found := policyEvents[busv1alpha1.AnyEvent]; found && len(policyEvents) > 1 {
err = multierror.Append(err, fmt.Errorf("if there's * here, no other policy should be here"))
}
return err
}