diff --git a/pkg/controlplane/controller/legacytokentracking/controller.go b/pkg/controlplane/controller/legacytokentracking/controller.go index f5719e03cea..548d742b4f5 100644 --- a/pkg/controlplane/controller/legacytokentracking/controller.go +++ b/pkg/controlplane/controller/legacytokentracking/controller.go @@ -22,6 +22,7 @@ import ( "time" "golang.org/x/time/rate" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -187,6 +188,9 @@ func (c *Controller) syncConfigMap() error { configMap := obj.(*corev1.ConfigMap) if _, err = time.Parse(dateFormat, configMap.Data[ConfigMapDataKey]); err != nil { configMap := configMap.DeepCopy() + if configMap.Data == nil { + configMap.Data = map[string]string{} + } configMap.Data[ConfigMapDataKey] = now.UTC().Format(dateFormat) if _, err = c.configMapClient.ConfigMaps(metav1.NamespaceSystem).Update(context.TODO(), configMap, metav1.UpdateOptions{}); err != nil { if apierrors.IsNotFound(err) || apierrors.IsConflict(err) { diff --git a/pkg/controlplane/controller/legacytokentracking/controller_test.go b/pkg/controlplane/controller/legacytokentracking/controller_test.go index 1e56f838681..5f982f25459 100644 --- a/pkg/controlplane/controller/legacytokentracking/controller_test.go +++ b/pkg/controlplane/controller/legacytokentracking/controller_test.go @@ -22,6 +22,7 @@ import ( "github.com/google/go-cmp/cmp" "golang.org/x/time/rate" + corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" @@ -111,6 +112,20 @@ func TestSyncConfigMap(t *testing.T) { core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "configmaps"}, metav1.NamespaceSystem, &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: ConfigMapName}, Data: map[string]string{ConfigMapDataKey: now.Format(dateFormat)}}), }, }, + { + name: "update configmap with no data", + enabled: true, + clientObjects: []runtime.Object{ + &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: ConfigMapName}, Data: nil}, + }, + existingConfigMap: &corev1.ConfigMap{ + ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: ConfigMapName}, + Data: nil, + }, + expectedActions: []core.Action{ + core.NewUpdateAction(schema.GroupVersionResource{Version: "v1", Resource: "configmaps"}, metav1.NamespaceSystem, &corev1.ConfigMap{ObjectMeta: metav1.ObjectMeta{Namespace: metav1.NamespaceSystem, Name: ConfigMapName}, Data: map[string]string{ConfigMapDataKey: now.Format(dateFormat)}}), + }, + }, { name: "update configmap should ignore NotFound error [cache with unexpected date format, no live object]", enabled: true,