diff --git a/changelogs/unreleased/6762-blackpiglet b/changelogs/unreleased/6762-blackpiglet new file mode 100644 index 0000000000..db9b5a118c --- /dev/null +++ b/changelogs/unreleased/6762-blackpiglet @@ -0,0 +1 @@ +Fix #6752: add namespace exclude check. \ No newline at end of file diff --git a/pkg/backup/item_collector.go b/pkg/backup/item_collector.go index 5dc6ceacb0..328125a278 100644 --- a/pkg/backup/item_collector.go +++ b/pkg/backup/item_collector.go @@ -196,9 +196,8 @@ func (r *itemCollector) getResourceItems(log logrus.FieldLogger, gv schema.Group log.Info("Getting items for resource") var ( - gvr = gv.WithResource(resource.Name) - gr = gvr.GroupResource() - clusterScoped = !resource.Namespaced + gvr = gv.WithResource(resource.Name) + gr = gvr.GroupResource() ) orders := getOrderedResourcesForType(r.backupRequest.Backup.Spec.OrderedResources, resource.Name) @@ -272,8 +271,6 @@ func (r *itemCollector) getResourceItems(log logrus.FieldLogger, gv schema.Group } } - namespacesToList := getNamespacesToList(r.backupRequest.NamespaceIncludesExcludes) - // Handle namespace resource here. // Namespace are only filtered by namespace include/exclude filters. // Label selectors are not checked. @@ -289,10 +286,12 @@ func (r *itemCollector) getResourceItems(log logrus.FieldLogger, gv schema.Group return nil, errors.WithStack(err) } - items := r.backupNamespaces(unstructuredList, namespacesToList, gr, preferredGVR, log) + items := r.backupNamespaces(unstructuredList, r.backupRequest.NamespaceIncludesExcludes, gr, preferredGVR, log) return items, nil } + clusterScoped := !resource.Namespaced + namespacesToList := getNamespacesToList(r.backupRequest.NamespaceIncludesExcludes) // If we get here, we're backing up something other than namespaces if clusterScoped { @@ -533,31 +532,13 @@ func (r *itemCollector) listItemsForLabel(unstructuredItems []unstructured.Unstr // backupNamespaces process namespace resource according to namespace filters. func (r *itemCollector) backupNamespaces(unstructuredList *unstructured.UnstructuredList, - namespacesToList []string, gr schema.GroupResource, preferredGVR schema.GroupVersionResource, + ie *collections.IncludesExcludes, gr schema.GroupResource, preferredGVR schema.GroupVersionResource, log logrus.FieldLogger) []*kubernetesResource { var items []*kubernetesResource for index, unstructured := range unstructuredList.Items { - found := false - if len(namespacesToList) == 0 { - // No namespace found. By far, this condition cannot be triggered. Either way, - // namespacesToList is not empty. - log.Debug("Skip namespace resource, because no item found by namespace filters.") - break - } else if len(namespacesToList) == 1 && namespacesToList[0] == "" { - // All namespaces are included. - log.Debugf("Backup namespace %s due to full cluster backup.", unstructured.GetName()) - found = true - } else { - for _, ns := range namespacesToList { - if unstructured.GetName() == ns { - log.Debugf("Backup namespace %s due to namespace filters setting.", unstructured.GetName()) - found = true - break - } - } - } + if ie.ShouldInclude(unstructured.GetName()) { + log.Debugf("Backup namespace %s due to namespace filters setting.", unstructured.GetName()) - if found { path, err := r.writeToFile(&unstructuredList.Items[index]) if err != nil { log.WithError(err).Error("Error writing item to file") diff --git a/pkg/install/resources.go b/pkg/install/resources.go index d7014c22c4..b7b3407eb3 100644 --- a/pkg/install/resources.go +++ b/pkg/install/resources.go @@ -32,7 +32,11 @@ import ( velerov1api "github.com/vmware-tanzu/velero/pkg/apis/velero/v1" ) -const defaultServiceAccountName = "velero" +const ( + defaultServiceAccountName = "velero" + podSecurityLevel = "privileged" + podSecurityVersion = "latest" +) var ( DefaultVeleroPodCPURequest = "500m" @@ -148,8 +152,12 @@ func Namespace(namespace string) *corev1.Namespace { }, } - ns.Labels["pod-security.kubernetes.io/enforce"] = "privileged" - ns.Labels["pod-security.kubernetes.io/enforce-version"] = "latest" + ns.Labels["pod-security.kubernetes.io/enforce"] = podSecurityLevel + ns.Labels["pod-security.kubernetes.io/enforce-version"] = podSecurityVersion + ns.Labels["pod-security.kubernetes.io/audit"] = podSecurityLevel + ns.Labels["pod-security.kubernetes.io/audit-version"] = podSecurityVersion + ns.Labels["pod-security.kubernetes.io/warn"] = podSecurityLevel + ns.Labels["pod-security.kubernetes.io/warn-version"] = podSecurityVersion return ns } diff --git a/pkg/install/resources_test.go b/pkg/install/resources_test.go index 1b12a7a349..2722c26df5 100644 --- a/pkg/install/resources_test.go +++ b/pkg/install/resources_test.go @@ -47,6 +47,10 @@ func TestResources(t *testing.T) { // PSA(Pod Security Admission) and PSS(Pod Security Standards). assert.Equal(t, ns.Labels["pod-security.kubernetes.io/enforce"], "privileged") assert.Equal(t, ns.Labels["pod-security.kubernetes.io/enforce-version"], "latest") + assert.Equal(t, ns.Labels["pod-security.kubernetes.io/audit"], "privileged") + assert.Equal(t, ns.Labels["pod-security.kubernetes.io/audit-version"], "latest") + assert.Equal(t, ns.Labels["pod-security.kubernetes.io/warn"], "privileged") + assert.Equal(t, ns.Labels["pod-security.kubernetes.io/warn-version"], "latest") crb := ClusterRoleBinding(DefaultVeleroNamespace) // The CRB is a cluster-scoped resource