// 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 }
// WaitForPodToDisappear polls the API server if the pod has been deleted. func WaitForPodToDisappear(podClient coreclient.PodInterface, podName string, interval, timeout time.Duration) error { return wait.PollImmediate(interval, timeout, func() (bool, error) { _, err := podClient.Get(podName) if err == nil { return false, nil } else { if errors.IsNotFound(err) { return true, nil } else { return false, err } } }) }
// 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, pod *v1.Pod, applyUpdate updatePodFunc) (*v1.Pod, bool, error) { var err error var podUpdated bool oldPod := pod if err = wait.Poll(10*time.Millisecond, 1*time.Minute, func() (bool, error) { pod, err = podClient.Get(oldPod.Name) if err != nil { return false, err } // Apply the update, then attempt to push it to the apiserver. if err = applyUpdate(pod); err != nil { return false, err } if pod, err = podClient.Update(pod); err == nil { // Update successful. return true, nil } // TODO: don't retry on perm-failed errors and handle them gracefully // Update could have failed due to conflict error. Try again. return false, nil }); err == nil { // When there's no error, we've updated this pod. podUpdated = true } // Handle returned error from wait poll if err == wait.ErrWaitTimeout { err = fmt.Errorf("timed out trying to update pod: %#v", oldPod) } // Ignore the pod not found error, but the pod isn't updated. if errors.IsNotFound(err) { glog.V(4).Infof("%s %s/%s is not found, skip updating it.", oldPod.Kind, oldPod.Namespace, oldPod.Name) err = nil } // Ignore the precondition violated error, but the pod isn't updated. if err == errorsutil.ErrPreconditionViolated { glog.V(4).Infof("%s %s/%s precondition doesn't hold, skip updating it.", oldPod.Kind, oldPod.Namespace, oldPod.Name) err = nil } // If the error is non-nil the returned pod cannot be trusted; if podUpdated is false, the pod isn't updated; // if the error is nil and podUpdated is true, the returned pod contains the applied update. return pod, podUpdated, err }
) const ( gcePDDetachTimeout = 10 * time.Minute gcePDDetachPollTime = 10 * time.Second nodeStatusTimeout = 1 * time.Minute nodeStatusPollTime = 1 * time.Second gcePDRetryTimeout = 5 * time.Minute gcePDRetryPollTime = 5 * time.Second maxReadRetry = 3 ) var _ = framework.KubeDescribe("Pod Disks", func() { var ( podClient v1core.PodInterface nodeClient v1core.NodeInterface host0Name types.NodeName host1Name types.NodeName ) f := framework.NewDefaultFramework("pod-disks") BeforeEach(func() { framework.SkipUnlessNodeCountIsAtLeast(2) podClient = f.ClientSet.Core().Pods(f.Namespace.Name) nodeClient = f.ClientSet.Core().Nodes() nodes := framework.GetReadySchedulableNodesOrDie(f.ClientSet) Expect(len(nodes.Items)).To(BeNumerically(">=", 2), "Requires at least 2 nodes") host0Name = types.NodeName(nodes.Items[0].ObjectMeta.Name) host1Name = types.NodeName(nodes.Items[1].ObjectMeta.Name)