in pkg/client/kubeclient.go [210:247]
func (nc SchedulerKubeClient) UpdateStatus(pod *v1.Pod) (*v1.Pod, error) {
var updatedPod *v1.Pod
var updateErr error
newPodStatus := pod.Status
// In case of conflicts, retry using the logic in
// https://github.com/kubernetes/client-go/blob/v0.21.1/examples/create-update-delete-deployment/main.go#L118-L121
retryErr := retry.RetryOnConflict(retry.DefaultRetry, func() error {
// Retrieve the latest version of Pod before attempting status update
// RetryOnConflict uses exponential backoff to avoid exhausting the API server
latestPod, getErr := nc.clientSet.CoreV1().Pods(pod.Namespace).Get(context.Background(), pod.Name, apis.GetOptions{})
if getErr != nil {
log.Log(log.ShimClient).Warn("failed to get latest version of Pod",
zap.Error(getErr))
}
latestPod.Status = newPodStatus
if updatedPod, updateErr = nc.clientSet.CoreV1().Pods(pod.Namespace).UpdateStatus(context.Background(), latestPod, apis.UpdateOptions{}); updateErr != nil {
log.Log(log.ShimClient).Warn("failed to update pod status",
zap.String("namespace", pod.Namespace),
zap.String("podName", pod.Name),
zap.Error(updateErr))
return updateErr
}
return nil
})
if retryErr != nil {
log.Log(log.ShimClient).Error("Update pod status failed",
zap.String("namespace", pod.Namespace),
zap.String("podName", pod.Name),
zap.Error(retryErr))
return pod, retryErr
}
log.Log(log.ShimClient).Info("Successfully updated pod status",
zap.String("namespace", pod.Namespace),
zap.String("podName", pod.Name),
zap.Stringer("newStatus", &pod.Status))
return updatedPod, nil
}