Skip to content

Commit 1ca289d

Browse files
authored
Merge pull request kubernetes#85763 from ereslibre/create-or-mutate-configmap-resiliency
kubeadm: Improve resiliency in CreateOrMutateConfigMap
2 parents 82ee37f + 14fe722 commit 1ca289d

File tree

1 file changed

+22
-8
lines changed

1 file changed

+22
-8
lines changed

cmd/kubeadm/app/util/apiclient/idempotency.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,11 @@ type ConfigMapMutator func(*v1.ConfigMap) error
4545
func CreateOrUpdateConfigMap(client clientset.Interface, cm *v1.ConfigMap) error {
4646
if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Create(cm); err != nil {
4747
if !apierrors.IsAlreadyExists(err) {
48-
return errors.Wrap(err, "unable to create configmap")
48+
return errors.Wrap(err, "unable to create ConfigMap")
4949
}
5050

5151
if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Update(cm); err != nil {
52-
return errors.Wrap(err, "unable to update configmap")
52+
return errors.Wrap(err, "unable to update ConfigMap")
5353
}
5454
}
5555
return nil
@@ -60,13 +60,27 @@ func CreateOrUpdateConfigMap(client clientset.Interface, cm *v1.ConfigMap) error
6060
// to conflicts, and a retry will be issued if the ConfigMap was modified on the server between the refresh and the update (while the mutation was
6161
// taking place)
6262
func CreateOrMutateConfigMap(client clientset.Interface, cm *v1.ConfigMap, mutator ConfigMapMutator) error {
63-
if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Create(cm); err != nil {
64-
if !apierrors.IsAlreadyExists(err) {
65-
return errors.Wrap(err, "unable to create ConfigMap")
63+
var lastError error
64+
err := wait.ExponentialBackoff(wait.Backoff{
65+
Steps: 20,
66+
Duration: 500 * time.Millisecond,
67+
Factor: 1.0,
68+
Jitter: 0.1,
69+
}, func() (bool, error) {
70+
if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Create(cm); err != nil {
71+
lastError = err
72+
if apierrors.IsAlreadyExists(err) {
73+
lastError = MutateConfigMap(client, metav1.ObjectMeta{Namespace: cm.ObjectMeta.Namespace, Name: cm.ObjectMeta.Name}, mutator)
74+
return lastError == nil, nil
75+
}
76+
return false, nil
6677
}
67-
return MutateConfigMap(client, metav1.ObjectMeta{Namespace: cm.ObjectMeta.Namespace, Name: cm.ObjectMeta.Name}, mutator)
78+
return true, nil
79+
})
80+
if err == nil {
81+
return nil
6882
}
69-
return nil
83+
return lastError
7084
}
7185

7286
// MutateConfigMap takes a ConfigMap Object Meta (namespace and name), retrieves the resource from the server and tries to mutate it
@@ -100,7 +114,7 @@ func CreateOrRetainConfigMap(client clientset.Interface, cm *v1.ConfigMap, confi
100114
}
101115
if _, err := client.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Create(cm); err != nil {
102116
if !apierrors.IsAlreadyExists(err) {
103-
return errors.Wrap(err, "unable to create configmap")
117+
return errors.Wrap(err, "unable to create ConfigMap")
104118
}
105119
}
106120
}

0 commit comments

Comments
 (0)