From 272b77ee634d4c199addd3527a8ee85097633edf Mon Sep 17 00:00:00 2001 From: Shubham Pampattiwar Date: Tue, 1 Oct 2024 01:03:18 -0700 Subject: [PATCH] Add Backup warning for inclusion of NS managed by ArgoCD Signed-off-by: Shubham Pampattiwar add changelog file Signed-off-by: Shubham Pampattiwar run make update Signed-off-by: Shubham Pampattiwar re-position import Signed-off-by: Shubham Pampattiwar update argo cd label comment Signed-off-by: Shubham Pampattiwar --- .../unreleased/8257-shubham-pampattiwar | 1 + pkg/backup/backup.go | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 changelogs/unreleased/8257-shubham-pampattiwar diff --git a/changelogs/unreleased/8257-shubham-pampattiwar b/changelogs/unreleased/8257-shubham-pampattiwar new file mode 100644 index 0000000000..422943690f --- /dev/null +++ b/changelogs/unreleased/8257-shubham-pampattiwar @@ -0,0 +1 @@ +Add Backup warning for inclusion of NS managed by ArgoCD \ No newline at end of file diff --git a/pkg/backup/backup.go b/pkg/backup/backup.go index 0304e71ced..5d83494579 100644 --- a/pkg/backup/backup.go +++ b/pkg/backup/backup.go @@ -30,6 +30,7 @@ import ( "github.com/pkg/errors" "github.com/sirupsen/logrus" + corev1api "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -71,6 +72,9 @@ const BackupVersion = 1 // BackupFormatVersion is the current backup version for Velero, including major, minor, and patch. const BackupFormatVersion = "1.1.0" +// ArgoCD managed by namespace label key +const ArgoCDManagedByNamespaceLabel = "argocd.argoproj.io/managed-by" + // Backupper performs backups. type Backupper interface { // Backup takes a backup using the specification in the velerov1api.Backup and writes backup and log data @@ -244,6 +248,15 @@ func (kb *kubernetesBackupper) BackupWithResolvers( log.Infof("Including namespaces: %s", backupRequest.NamespaceIncludesExcludes.IncludesString()) log.Infof("Excluding namespaces: %s", backupRequest.NamespaceIncludesExcludes.ExcludesString()) + // check if there are any namespaces included in the backup which are managed by argoCD + // We will check for the existence of a ArgoCD label in the includedNamespaces and add a warning + // so that users are at least aware about the existence of argoCD managed ns in their backup + nsManagedByArgoCD := getNamespacesManagedByArgoCD(kb.kbClient, backupRequest.Spec.IncludedNamespaces, log) + + if len(nsManagedByArgoCD) > 0 { + log.Warnf("backup operation may encounter complications and potentially produce undesirable results due to the inclusion of namespaces %v managed by ArgoCD in the backup.", nsManagedByArgoCD) + } + if collections.UseOldResourceFilters(backupRequest.Spec) { backupRequest.ResourceIncludesExcludes = collections.GetGlobalResourceIncludesExcludes(kb.discoveryHelper, log, backupRequest.Spec.IncludedResources, @@ -1107,3 +1120,21 @@ func putVolumeInfos( return backupStore.PutBackupVolumeInfos(backupName, backupVolumeInfoBuf) } + +func getNamespacesManagedByArgoCD(kbClient kbclient.Client, includedNamespaces []string, log logrus.FieldLogger) []string { + var nsManagedByArgoCD []string + + for _, nsName := range includedNamespaces { + ns := corev1api.Namespace{} + if err := kbClient.Get(context.Background(), kbclient.ObjectKey{Name: nsName}, &ns); err != nil { + log.WithError(err).Errorf("error getting namespace %s", nsName) + continue + } + + nsLabels := ns.GetLabels() + if len(nsLabels[ArgoCDManagedByNamespaceLabel]) > 0 { + nsManagedByArgoCD = append(nsManagedByArgoCD, nsName) + } + } + return nsManagedByArgoCD +}