in pkg/apis/frameworkcontroller/v1/completion.go [430:476]
func ClassifyPodCreationError(apiErr error) PodMatchResult {
diag := fmt.Sprintf("Failed to create Pod: %v", common.ToJson(apiErr))
// Treat Platform Error as Transient Error, such as Pod decoding error.
if strings.Contains(apiErr.Error(), "object provided is unrecognized") ||
strings.Contains(apiErr.Error(), "exceeded quota") {
return PodMatchResult{
CodeInfo: completionCodeInfoMap[CompletionCodePodCreationTransientError],
Diagnostics: diag,
}
}
// Treat General Framework Error as Unknown Error for safety.
if apiErrors.IsBadRequest(apiErr) ||
apiErrors.IsForbidden(apiErr) {
return PodMatchResult{
CodeInfo: completionCodeInfoMap[CompletionCodePodCreationUnknownError],
Diagnostics: diag,
}
}
// Treat Permanent Framework Error as Permanent Error only if it must be
// Permanent Error.
if apiErrors.IsInvalid(apiErr) ||
apiErrors.IsRequestEntityTooLargeError(apiErr) {
// TODO: Also check net.IsConnectionRefused
if net.IsConnectionReset(apiErr) || net.IsProbableEOF(apiErr) {
// The ApiServer Permanent Error may be caused by Network Transient Error,
// so treat it as Unknown Error for safety.
return PodMatchResult{
CodeInfo: completionCodeInfoMap[CompletionCodePodCreationUnknownError],
Diagnostics: diag,
}
} else {
return PodMatchResult{
CodeInfo: completionCodeInfoMap[CompletionCodePodCreationPermanentError],
Diagnostics: diag,
}
}
}
// Treat all other errors as Transient Error, including all non-APIStatus errors.
return PodMatchResult{
CodeInfo: completionCodeInfoMap[CompletionCodePodCreationTransientError],
Diagnostics: diag,
}
}