From 9e7b70964e46d51ad64e3e5659647bfa58c1d7b8 Mon Sep 17 00:00:00 2001 From: avihuly Date: Thu, 5 Jan 2023 14:28:08 +0200 Subject: [PATCH] Added wildcard label vaule option --- README.md | 2 ++ internal/pkg/controller/controller.go | 42 +++++++++++----------- internal/pkg/controller/controller_test.go | 19 ++++++++++ 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 51f25c17..05b2d81a 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,8 @@ metadata: test: true ... ``` +If you want to select namespace only by the key of the label use ```*``` as the value. +For example, for ```--namespace-selector=select-this:*``` all namespaces with label-key "select-this" will be selected regardless of the labels value ### Vanilla kustomize diff --git a/internal/pkg/controller/controller.go b/internal/pkg/controller/controller.go index a923d0ed..49c3350f 100644 --- a/internal/pkg/controller/controller.go +++ b/internal/pkg/controller/controller.go @@ -104,30 +104,30 @@ func (c *Controller) resourceInNamespaceSelector(raw interface{}) bool { switch object := raw.(type) { case *v1.ConfigMap: - namespace, err := c.client.CoreV1().Namespaces().Get(context.Background(), object.ObjectMeta.Namespace, metav1.GetOptions{}) - if err != nil { - logrus.Warn(err) - return false - } - - for selectorKey, selectorVal := range c.namespaceSelector { - namespaceLabelVal, namespaceLabelKeyExists := namespace.ObjectMeta.Labels[selectorKey] - if !namespaceLabelKeyExists || selectorVal != namespaceLabelVal { - return false - } - } + return c.matchLabels(object.ObjectMeta.Namespace) case *v1.Secret: - namespace, err := c.client.CoreV1().Namespaces().Get(context.Background(), object.ObjectMeta.Namespace, metav1.GetOptions{}) - if err != nil { - logrus.Warn(err) - return false + return c.matchLabels(object.ObjectMeta.Namespace) + } + return true +} + +func (c *Controller) matchLabels(resourceNamespace string) bool { + namespace, err := c.client.CoreV1().Namespaces().Get(context.Background(), resourceNamespace, metav1.GetOptions{}) + if err != nil { + logrus.Warn(err) + return false + } + + for selectorKey, selectorVal := range c.namespaceSelector { + + namespaceLabelVal, namespaceLabelKeyExists := namespace.ObjectMeta.Labels[selectorKey] + + if namespaceLabelKeyExists && selectorVal == "*" { + continue } - for selectorKey, selectorVal := range c.namespaceSelector { - namespaceLabelVal, namespaceLabelKeyExists := namespace.ObjectMeta.Labels[selectorKey] - if !namespaceLabelKeyExists || selectorVal != namespaceLabelVal { - return false - } + if !namespaceLabelKeyExists || selectorVal != namespaceLabelVal { + return false } } return true diff --git a/internal/pkg/controller/controller_test.go b/internal/pkg/controller/controller_test.go index f8d6ee34..6b9179bc 100644 --- a/internal/pkg/controller/controller_test.go +++ b/internal/pkg/controller/controller_test.go @@ -2381,6 +2381,25 @@ func TestController_resourceInNamespaceSelector(t *testing.T) { raw: testutil.GetSecret("not-selected-namespace", "secret", "test"), }, want: false, + }, { + name: "TestSecretResourceInNamespaceSelectorWiledcardValue", + fields: fields{ + namespaceSelector: util.Map{ + "select": "*", + }, + namespace: v1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: "selected-namespace", + Labels: map[string]string{ + "select": "this", + }, + }, + }, + }, + args: args{ + raw: testutil.GetSecret("selected-namespace", "secret", "test"), + }, + want: true, }, }