// UpdatePodWithRetries updates a pod with given applyUpdate function. Note that pod not found error is ignored. // The returned bool value can be used to tell if the pod is actually updated. func UpdatePodWithRetries(podClient v1core.PodInterface, podLister *cache.StoreToPodLister, namespace, name string, applyUpdate updatePodFunc) (*v1.Pod, error) { var pod *v1.Pod retryErr := retry.RetryOnConflict(retry.DefaultBackoff, func() error { var err error pod, err = podLister.Pods(namespace).Get(name) if err != nil { return err } obj, deepCopyErr := api.Scheme.DeepCopy(pod) if deepCopyErr != nil { return deepCopyErr } pod = obj.(*v1.Pod) // Apply the update, then attempt to push it to the apiserver. if applyErr := applyUpdate(pod); applyErr != nil { return applyErr } pod, err = podClient.Update(pod) return err }) // Ignore the precondition violated error, this pod is already updated // with the desired label. if retryErr == errorsutil.ErrPreconditionViolated { glog.V(4).Infof("Pod %s/%s precondition doesn't hold, skip updating it.", namespace, name) retryErr = nil } return pod, retryErr }
func filterPods(store cache.StoreToPodLister, podList []string) []string { filteredList := make([]string, 0, len(podList)) for _, key := range podList { item, exists, err := store.GetByKey(key) if err != nil || !exists { continue } pod := item.(*api.Pod) if IgnorePod(pod) { continue } filteredList = append(filteredList, key) } return filteredList }