type GetFunc … type APIGetFunc … type APIListFunc … // GetObject takes a get function like clientset.CoreV1().Pods(ns).Get // and the parameters for it and returns a function that executes that get // operation in a [gomega.Eventually] or [gomega.Consistently]. // // Delays and retries are handled by [HandleRetry]. A "not found" error is // a fatal error that causes polling to stop immediately. If that is not // desired, then wrap the result with [IgnoreNotFound]. func GetObject[T any](get APIGetFunc[T], name string, getOptions metav1.GetOptions) GetFunc[T] { … } // ListObjects takes a list function like clientset.CoreV1().Pods(ns).List // and the parameters for it and returns a function that executes that list // operation in a [gomega.Eventually] or [gomega.Consistently]. // // Delays and retries are handled by [HandleRetry]. func ListObjects[T any](list APIListFunc[T], listOptions metav1.ListOptions) GetFunc[T] { … } // HandleRetry wraps an arbitrary get function. When the wrapped function // returns an error, HandleGetError will decide whether the call should be // retried and if requested, will sleep before doing so. // // This is meant to be used inside [gomega.Eventually] or [gomega.Consistently]. func HandleRetry[T any](get GetFunc[T]) GetFunc[T] { … } // ShouldRetry decides whether to retry an API request. Optionally returns a // delay to retry after. func ShouldRetry(err error) (retry bool, retryAfter time.Duration) { … } // RetryNotFound wraps an arbitrary get function. When the wrapped function // encounters a "not found" error, that error is treated as a transient problem // and polling continues. // // This is meant to be used inside [gomega.Eventually] or [gomega.Consistently]. func RetryNotFound[T any](get GetFunc[T]) GetFunc[T] { … } type transientError … func (err transientError) Unwrap() error { … }