in pkg/controllers/configmap_controller.go [95:144]
func (cmc *configMapControl) PatchConfigMap(
ctx context.Context, sc *SyncContext) (cm *corev1.ConfigMap, err error) {
nc := sc.ndb
configMapName := nc.GetConfigMapName()
cmOrg, err := cmc.getConfigMap(nc.Namespace, configMapName)
if err != nil {
klog.Errorf("Error retrieving ConfigMap %q : %s", getNamespacedName2(nc.Namespace, configMapName), err)
return nil, err
}
// Get an updated config map copy
cs := sc.configSummary
cmChg := resources.GetUpdatedConfigMap(nc, cmOrg, cs)
j, err := json.Marshal(cmOrg)
if err != nil {
return nil, err
}
j2, err := json.Marshal(cmChg)
if err != nil {
return nil, err
}
patchBytes, err := strategicpatch.CreateTwoWayMergePatch(j, j2, corev1.ConfigMap{})
if err != nil {
return nil, err
}
var result *corev1.ConfigMap
ConfigMapInterface := cmc.getConfigMapInterface(nc.Namespace)
// Patch the ConfigMap with retries on failure
updateErr := wait.ExponentialBackoff(retry.DefaultBackoff, func() (ok bool, err error) {
result, err = ConfigMapInterface.Patch(
ctx, cmOrg.Name, types.StrategicMergePatchType, patchBytes, metav1.PatchOptions{})
if err != nil {
klog.Errorf("Failed to patch ConfigMap %q : %s",
getNamespacedName2(nc.Namespace, configMapName), err)
return false, err
}
return true, nil
})
klog.Infof("Successfully patched ConfigMap %q", getNamespacedName(cmChg))
return result, updateErr
}