diff --git a/changelogs/unreleased/1843-prydonius b/changelogs/unreleased/1843-prydonius new file mode 100644 index 000000000..98670537a --- /dev/null +++ b/changelogs/unreleased/1843-prydonius @@ -0,0 +1 @@ +fix excluding additional items with the velero.io/exclude-from-backup=true label diff --git a/pkg/backup/backup_test.go b/pkg/backup/backup_test.go index 35b89bd36..db18c733c 100644 --- a/pkg/backup/backup_test.go +++ b/pkg/backup/backup_test.go @@ -1329,6 +1329,36 @@ func TestBackupActionAdditionalItems(t *testing.T) { "resources/pods/namespaces/ns-2/pod-2.json", }, }, + { + name: "additional items with the velero.io/exclude-from-backup label are not backed up", + backup: defaultBackup().IncludedNamespaces("ns-1").Result(), + apiResources: []*test.APIResource{ + test.Pods( + builder.ForPod("ns-1", "pod-1").Result(), + ), + test.PVs( + builder.ForPersistentVolume("pv-1").ObjectMeta(builder.WithLabels("velero.io/exclude-from-backup", "true")).Result(), + builder.ForPersistentVolume("pv-2").Result(), + ), + }, + actions: []velero.BackupItemAction{ + &pluggableAction{ + executeFunc: func(item runtime.Unstructured, backup *velerov1.Backup) (runtime.Unstructured, []velero.ResourceIdentifier, error) { + additionalItems := []velero.ResourceIdentifier{ + {GroupResource: kuberesource.PersistentVolumes, Name: "pv-1"}, + {GroupResource: kuberesource.PersistentVolumes, Name: "pv-2"}, + } + + return item, additionalItems, nil + }, + }, + }, + want: []string{ + "resources/pods/namespaces/ns-1/pod-1.json", + "resources/persistentvolumes/cluster/pv-2.json", + }, + }, + { name: "if there's an error backing up additional items, the item the action was run for isn't backed up", backup: defaultBackup().Result(), diff --git a/pkg/backup/item_backupper.go b/pkg/backup/item_backupper.go index 2532ad5f0..522565565 100644 --- a/pkg/backup/item_backupper.go +++ b/pkg/backup/item_backupper.go @@ -123,6 +123,11 @@ func (ib *defaultItemBackupper) backupItem(logger logrus.FieldLogger, obj runtim log = log.WithField("namespace", namespace) } + if metadata.GetLabels()["velero.io/exclude-from-backup"] == "true" { + log.Info("Excluding item because it has label velero.io/exclude-from-backup=true") + return nil + } + // NOTE: we have to re-check namespace & resource includes/excludes because it's possible that // backupItem can be invoked by a custom action. if namespace != "" && !ib.backupRequest.NamespaceIncludesExcludes.ShouldInclude(namespace) { diff --git a/pkg/backup/resource_backupper.go b/pkg/backup/resource_backupper.go index 771b4494f..dae8017ba 100644 --- a/pkg/backup/resource_backupper.go +++ b/pkg/backup/resource_backupper.go @@ -216,9 +216,9 @@ func (rb *defaultResourceBackupper) backupResource(group *metav1.APIResourceList continue } - labelSelector := "velero.io/exclude-from-backup!=true" + var labelSelector string if selector := rb.backupRequest.Spec.LabelSelector; selector != nil { - labelSelector = labelSelector + "," + metav1.FormatLabelSelector(selector) + labelSelector = metav1.FormatLabelSelector(selector) } log.Info("Listing items")