// readyPods returns the old and new ready counts for their pods. // If a pod is observed as being ready, it's considered ready even // if it later becomes notReady. func (r *RollingUpdater) readyPods(oldRc, newRc *api.ReplicationController, minReadySeconds int32) (int32, int32, error) { controllers := []*api.ReplicationController{oldRc, newRc} oldReady := int32(0) newReady := int32(0) if r.nowFn == nil { r.nowFn = func() unversioned.Time { return unversioned.Now() } } for i := range controllers { controller := controllers[i] selector := labels.Set(controller.Spec.Selector).AsSelector() options := api.ListOptions{LabelSelector: selector} pods, err := r.c.Pods(controller.Namespace).List(options) if err != nil { return 0, 0, err } for _, pod := range pods.Items { if !deployment.IsPodAvailable(&pod, minReadySeconds, r.nowFn().Time) { continue } switch controller.Name { case oldRc.Name: oldReady++ case newRc.Name: newReady++ } } } return oldReady, newReady, nil }
// GetAvailablePods returns all the available pods from the provided pod list. func GetAvailablePods(pods []api.Pod, minReadySeconds int32) int32 { available := int32(0) for i := range pods { pod := pods[i] if kdeplutil.IsPodAvailable(&pod, minReadySeconds) { available++ } } return available }
// Accept implements UpdateAcceptor. func (c *AcceptNewlyObservedReadyPods) Accept(deployment *kapi.ReplicationController) error { // Make a pod store to poll and ensure it gets cleaned up. podStore, stopStore := c.getDeploymentPodStore(deployment) defer close(stopStore) // Start checking for pod updates. if c.acceptedPods.Len() > 0 { fmt.Fprintf(c.out, "--> Waiting up to %s for pods in deployment %s to become ready (%d pods previously accepted)\n", c.timeout, deployment.Name, c.acceptedPods.Len()) } else { fmt.Fprintf(c.out, "--> Waiting up to %s for pods in deployment %s to become ready\n", c.timeout, deployment.Name) } err := wait.Poll(c.interval, c.timeout, func() (done bool, err error) { // Check for pod readiness. unready := sets.NewString() for _, obj := range podStore.List() { pod := obj.(*kapi.Pod) // Skip previously accepted pods; we only want to verify newly observed // and unaccepted pods. if c.acceptedPods.Has(pod.Name) { continue } if kdeployutil.IsPodAvailable(pod, c.minReadySeconds, time.Now()) { // If the pod is ready, track it as accepted. c.acceptedPods.Insert(pod.Name) } else { // Otherwise, track it as unready. unready.Insert(pod.Name) } } // Check to see if we're done. if unready.Len() == 0 { return true, nil } // Otherwise, try again later. glog.V(4).Infof("Still waiting for %d pods to become ready for deployment %s", unready.Len(), deployment.Name) return false, nil }) // Handle acceptance failure. if err != nil { if err == wait.ErrWaitTimeout { return fmt.Errorf("pods for deployment %q took longer than %.f seconds to become ready", deployment.Name, c.timeout.Seconds()) } return fmt.Errorf("pod readiness check failed for deployment %q: %v", deployment.Name, err) } return nil }