From 1781824adb2d634a83c6782eae994d4a4e572397 Mon Sep 17 00:00:00 2001 From: Michal Pryc Date: Thu, 7 Aug 2025 12:42:07 +0200 Subject: [PATCH] Use proper ConfigMap for the repository maintenance job The CM for the Repository Maintenance do not match the CM layout for the Node Agent. In upstream documentation CM for the Repository Maintenance is the same as for the Node Agent, but implementation is different. Upstream issue: https://github.com/vmware-tanzu/velero/issues/9159 Signed-off-by: Michal Pryc --- internal/controller/repository_maintenance.go | 17 ++++++++------- .../controller/repository_maintenance_test.go | 21 ++++++++++++------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/internal/controller/repository_maintenance.go b/internal/controller/repository_maintenance.go index 38fd149b79..e4364a7f1d 100644 --- a/internal/controller/repository_maintenance.go +++ b/internal/controller/repository_maintenance.go @@ -27,12 +27,6 @@ func (r *DataProtectionApplicationReconciler) updateRepositoryMaintenanceCM(cm * return fmt.Errorf("failed to set controller reference: %w", err) } - // Convert NodeAgentConfigMapSettings to a generic map - configRepositoryMaintenanceJSON, err := json.Marshal(r.dpa.Spec.Configuration.RepositoryMaintenance) - if err != nil { - return fmt.Errorf("failed to serialize repository maintenance config: %w", err) - } - cm.Name = common.RepoMaintConfigMapPrefix + r.dpa.Name cm.Namespace = r.NamespacedName.Namespace cm.Labels = map[string]string{ @@ -45,7 +39,16 @@ func (r *DataProtectionApplicationReconciler) updateRepositoryMaintenanceCM(cm * if cm.Data == nil { cm.Data = make(map[string]string) } - cm.Data["repository-maintenance-config"] = string(configRepositoryMaintenanceJSON) + // TODO: This implementation of ConfigMap is different from the Node-Agent + // to to match the upstream implementation + // https://github.com/vmware-tanzu/velero/issues/9159 + for key, config := range r.dpa.Spec.Configuration.RepositoryMaintenance { + configJSON, err := json.Marshal(config) + if err != nil { + return fmt.Errorf("failed to serialize repository maintenance config for key %s: %w", key, err) + } + cm.Data[key] = string(configJSON) + } return nil } diff --git a/internal/controller/repository_maintenance_test.go b/internal/controller/repository_maintenance_test.go index c4ceb984df..0fa0459fd6 100644 --- a/internal/controller/repository_maintenance_test.go +++ b/internal/controller/repository_maintenance_test.go @@ -84,7 +84,8 @@ func TestDataProtectionApplicationReconciler_updateRepositoryMaintenanceCM(t *te }, }, Data: map[string]string{ - "repository-maintenance-config": `{"global":{"loadAffinity":[{"nodeSelector":{"matchLabels":{"app.kubernetes.io/name":"test-dpa"}}}],"podResources":{"cpuRequest":"100m","memoryRequest":"128Mi","cpuLimit":"200m","memoryLimit":"256Mi"}},"maintenance-job-1":{"loadAffinity":[{"nodeSelector":{"matchLabels":{"app.kubernetes.io/name":"test-dpa"}}}]}}`, + "global": `{"loadAffinity":[{"nodeSelector":{"matchLabels":{"app.kubernetes.io/name":"test-dpa"}}}],"podResources":{"cpuRequest":"100m","memoryRequest":"128Mi","cpuLimit":"200m","memoryLimit":"256Mi"}}`, + "maintenance-job-1": `{"loadAffinity":[{"nodeSelector":{"matchLabels":{"app.kubernetes.io/name":"test-dpa"}}}]}`, }, }, }, @@ -116,15 +117,19 @@ func TestDataProtectionApplicationReconciler_updateRepositoryMaintenanceCM(t *te require.Equal(t, tt.wantCM.ObjectMeta.Labels, tt.cm.ObjectMeta.Labels, "ConfigMap Labels do not match") // Compare Data fields, we need to unmarshal the JSON to ignore key order - expectedData := tt.wantCM.Data["repository-maintenance-config"] - actualData := tt.cm.Data["repository-maintenance-config"] + require.Equal(t, len(tt.wantCM.Data), len(tt.cm.Data), "ConfigMap Data key count does not match") - var expectedMap map[string]interface{} - var actualMap map[string]interface{} + for key, expectedData := range tt.wantCM.Data { + actualData, exists := tt.cm.Data[key] + require.True(t, exists, "ConfigMap Data key %s not found", key) - require.NoError(t, json.Unmarshal([]byte(expectedData), &expectedMap), "Failed to unmarshal expected Data") - require.NoError(t, json.Unmarshal([]byte(actualData), &actualMap), "Failed to unmarshal actual Data") - require.Equal(t, expectedMap, actualMap, "ConfigMap Data does not match") + var expectedMap map[string]interface{} + var actualMap map[string]interface{} + + require.NoError(t, json.Unmarshal([]byte(expectedData), &expectedMap), "Failed to unmarshal expected Data for key %s", key) + require.NoError(t, json.Unmarshal([]byte(actualData), &actualMap), "Failed to unmarshal actual Data for key %s", key) + require.Equal(t, expectedMap, actualMap, "ConfigMap Data does not match for key %s", key) + } }) } }