helm upgrade --wait command failded because of etcdserver: leader changed

Signed-off-by: Joseph Sheng <jiajun.sheng@microfocus.com>
pull/9513/head
Joseph Sheng 5 years ago
parent ab12382ddc
commit 1b382e8c72

@ -52,6 +52,8 @@ type waiter struct {
func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool) error { func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool) error {
w.log("beginning wait for %d resources with timeout of %v", len(created), w.timeout) w.log("beginning wait for %d resources with timeout of %v", len(created), w.timeout)
var retryCount, maxRetryCount = 0, 60
return wait.Poll(2*time.Second, w.timeout, func() (bool, error) { return wait.Poll(2*time.Second, w.timeout, func() (bool, error) {
for _, v := range created { for _, v := range created {
var ( var (
@ -64,20 +66,29 @@ func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool)
switch value := AsVersioned(v).(type) { switch value := AsVersioned(v).(type) {
case *corev1.Pod: case *corev1.Pod:
pod, err := w.c.CoreV1().Pods(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{}) pod, err := w.c.CoreV1().Pods(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{})
if err != nil || !w.isPodReady(pod) { if err != nil {
retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
}
if !w.isPodReady(pod) {
return false, err return false, err
} }
case *batchv1.Job: case *batchv1.Job:
if waitForJobsEnabled { if waitForJobsEnabled {
job, err := w.c.BatchV1().Jobs(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{}) job, err := w.c.BatchV1().Jobs(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{})
if err != nil || !w.jobReady(job) { if err != nil {
retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
}
if !w.jobReady(job) {
return false, err return false, err
} }
} }
case *appsv1.Deployment, *appsv1beta1.Deployment, *appsv1beta2.Deployment, *extensionsv1beta1.Deployment: case *appsv1.Deployment, *appsv1beta1.Deployment, *appsv1beta2.Deployment, *extensionsv1beta1.Deployment:
currentDeployment, err := w.c.AppsV1().Deployments(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{}) currentDeployment, err := w.c.AppsV1().Deployments(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
} }
// If paused deployment will never be ready // If paused deployment will never be ready
if currentDeployment.Spec.Paused { if currentDeployment.Spec.Paused {
@ -94,7 +105,8 @@ func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool)
case *corev1.PersistentVolumeClaim: case *corev1.PersistentVolumeClaim:
claim, err := w.c.CoreV1().PersistentVolumeClaims(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{}) claim, err := w.c.CoreV1().PersistentVolumeClaims(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
} }
if !w.volumeReady(claim) { if !w.volumeReady(claim) {
return false, nil return false, nil
@ -102,7 +114,8 @@ func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool)
case *corev1.Service: case *corev1.Service:
svc, err := w.c.CoreV1().Services(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{}) svc, err := w.c.CoreV1().Services(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
} }
if !w.serviceReady(svc) { if !w.serviceReady(svc) {
return false, nil return false, nil
@ -110,14 +123,16 @@ func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool)
case *extensionsv1beta1.DaemonSet, *appsv1.DaemonSet, *appsv1beta2.DaemonSet: case *extensionsv1beta1.DaemonSet, *appsv1.DaemonSet, *appsv1beta2.DaemonSet:
ds, err := w.c.AppsV1().DaemonSets(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{}) ds, err := w.c.AppsV1().DaemonSets(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
} }
if !w.daemonSetReady(ds) { if !w.daemonSetReady(ds) {
return false, nil return false, nil
} }
case *apiextv1beta1.CustomResourceDefinition: case *apiextv1beta1.CustomResourceDefinition:
if err := v.Get(); err != nil { if err := v.Get(); err != nil {
return false, err retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
} }
crd := &apiextv1beta1.CustomResourceDefinition{} crd := &apiextv1beta1.CustomResourceDefinition{}
if err := scheme.Scheme.Convert(v.Object, crd, nil); err != nil { if err := scheme.Scheme.Convert(v.Object, crd, nil); err != nil {
@ -128,7 +143,8 @@ func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool)
} }
case *apiextv1.CustomResourceDefinition: case *apiextv1.CustomResourceDefinition:
if err := v.Get(); err != nil { if err := v.Get(); err != nil {
return false, err retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
} }
crd := &apiextv1.CustomResourceDefinition{} crd := &apiextv1.CustomResourceDefinition{}
if err := scheme.Scheme.Convert(v.Object, crd, nil); err != nil { if err := scheme.Scheme.Convert(v.Object, crd, nil); err != nil {
@ -140,13 +156,18 @@ func (w *waiter) waitForResources(created ResourceList, waitForJobsEnabled bool)
case *appsv1.StatefulSet, *appsv1beta1.StatefulSet, *appsv1beta2.StatefulSet: case *appsv1.StatefulSet, *appsv1beta1.StatefulSet, *appsv1beta2.StatefulSet:
sts, err := w.c.AppsV1().StatefulSets(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{}) sts, err := w.c.AppsV1().StatefulSets(v.Namespace).Get(context.Background(), v.Name, metav1.GetOptions{})
if err != nil { if err != nil {
return false, err retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
} }
if !w.statefulSetReady(sts) { if !w.statefulSetReady(sts) {
return false, nil return false, nil
} }
case *corev1.ReplicationController, *extensionsv1beta1.ReplicaSet, *appsv1beta2.ReplicaSet, *appsv1.ReplicaSet: case *corev1.ReplicationController, *extensionsv1beta1.ReplicaSet, *appsv1beta2.ReplicaSet, *appsv1.ReplicaSet:
ok, err = w.podsReadyForObject(v.Namespace, value) ok, err = w.podsReadyForObject(v.Namespace, value)
if err != nil {
retryCount++
return waitWithRetry(w, retryCount, maxRetryCount, err)
}
} }
if !ok || err != nil { if !ok || err != nil {
return false, err return false, err
@ -410,3 +431,13 @@ func SelectorsForObject(object runtime.Object) (selector labels.Selector, err er
return selector, errors.Wrap(err, "invalid label selector") return selector, errors.Wrap(err, "invalid label selector")
} }
func waitWithRetry(w *waiter, retryCount, maxRetryCount int, err error) (bool, error) {
if retryCount <= maxRetryCount {
w.log("failed to call k8s api during waiting, retry times %d, err: %v", retryCount, err)
time.Sleep(time.Second * 1)
return false, nil
} else {
return false, err
}
}

Loading…
Cancel
Save