From 6ec377181afc953aa22355046d65a2b4271cc840 Mon Sep 17 00:00:00 2001 From: Daniel Albuquerque Date: Tue, 13 Oct 2020 21:58:47 +0100 Subject: [PATCH] Change from exclude labels to include labels --- charts/flagger/README.md | 2 +- cmd/flagger/main.go | 8 +++--- pkg/canary/daemonset_controller.go | 20 +++++++-------- pkg/canary/deployment_controller.go | 20 +++++++-------- pkg/canary/factory.go | 38 ++++++++++++++--------------- pkg/canary/util.go | 12 +++------ pkg/canary/util_test.go | 35 +++++++++++++++++++------- 7 files changed, 74 insertions(+), 61 deletions(-) diff --git a/charts/flagger/README.md b/charts/flagger/README.md index b82e27c8..0c684acc 100644 --- a/charts/flagger/README.md +++ b/charts/flagger/README.md @@ -125,7 +125,7 @@ Parameter | Description | Default `serviceAccount.name` | The name of the service account to create or use. If not set and `serviceAccount.create` is `true`, a name is generated using the Flagger fullname | `""` `serviceAccount.annotations` | Annotations for service account | `{}` `ingressAnnotationsPrefix` | Annotations prefix for ingresses | `custom.ingress.kubernetes.io` -`excludedLabelsPrefixes` | List of prefixes of labels that are excluded when creating primary controllers | `"fluxcd,jenkins"` +`includeLabelPrefix` | List of prefixes of labels that are copied when creating primary deployments or daemonsets. Use * to include all | `""` `rbac.create` | If `true`, create and use RBAC resources | `true` `rbac.pspEnabled` | If `true`, create and use a restricted pod security policy | `false` `crd.create` | If `true`, create Flagger's CRDs (should be enabled for Helm v2 only) | `false` diff --git a/cmd/flagger/main.go b/cmd/flagger/main.go index 217d5b70..5267f08e 100644 --- a/cmd/flagger/main.go +++ b/cmd/flagger/main.go @@ -43,7 +43,7 @@ var ( logLevel string port string msteamsURL string - excludedLabelsPrefixes string + includeLabelPrefix string slackURL string slackUser string slackChannel string @@ -75,7 +75,7 @@ func init() { flag.StringVar(&slackChannel, "slack-channel", "", "Slack channel.") flag.StringVar(&eventWebhook, "event-webhook", "", "Webhook for publishing flagger events") flag.StringVar(&msteamsURL, "msteams-url", "", "MS Teams incoming webhook URL.") - flag.StringVar(&excludedLabelsPrefixes, "excluded-labels-prefixes", "fluxcd,jenkins", "List of prefixes of labels that are excluded when creating primary controllers.") + flag.StringVar(&includeLabelPrefix, "include-label-prefix", "", "List of prefixes of labels that are copied when creating primary deployments or daemonsets. Use * to include all.") flag.IntVar(&threadiness, "threadiness", 2, "Worker concurrency.") flag.BoolVar(&zapReplaceGlobals, "zap-replace-globals", false, "Whether to change the logging level of the global zap logger.") flag.StringVar(&zapEncoding, "zap-encoding", "json", "Zap logger encoding.") @@ -186,9 +186,9 @@ func main() { configTracker = &canary.NopTracker{} } - excludedLabelsPrefixesArray := strings.Split(excludedLabelsPrefixes, ",") + includeLabelPrefixArray := strings.Split(includeLabelPrefix, ",") - canaryFactory := canary.NewFactory(kubeClient, flaggerClient, configTracker, labels, excludedLabelsPrefixesArray, logger) + canaryFactory := canary.NewFactory(kubeClient, flaggerClient, configTracker, labels, includeLabelPrefixArray, logger) c := controller.NewController( kubeClient, diff --git a/pkg/canary/daemonset_controller.go b/pkg/canary/daemonset_controller.go index d7582845..faa35cd3 100644 --- a/pkg/canary/daemonset_controller.go +++ b/pkg/canary/daemonset_controller.go @@ -22,12 +22,12 @@ var ( // DaemonSetController is managing the operations for Kubernetes DaemonSet kind type DaemonSetController struct { - kubeClient kubernetes.Interface - flaggerClient clientset.Interface - logger *zap.SugaredLogger - configTracker Tracker - labels []string - excludedLabelsPrefixes []string + kubeClient kubernetes.Interface + flaggerClient clientset.Interface + logger *zap.SugaredLogger + configTracker Tracker + labels []string + includeLabelPrefix []string } func (c *DaemonSetController) ScaleToZero(cd *flaggerv1.Canary) error { @@ -77,7 +77,7 @@ func (c *DaemonSetController) ScaleFromZero(cd *flaggerv1.Canary) error { // Initialize creates the primary DaemonSet, scales down the canary DaemonSet, // and returns the pod selector label and container ports func (c *DaemonSetController) Initialize(cd *flaggerv1.Canary) (err error) { - err = c.createPrimaryDaemonSet(cd, c.excludedLabelsPrefixes) + err = c.createPrimaryDaemonSet(cd, c.includeLabelPrefix) if err != nil { return fmt.Errorf("createPrimaryDaemonSet failed: %w", err) } @@ -201,7 +201,7 @@ func (c *DaemonSetController) GetMetadata(cd *flaggerv1.Canary) (string, string, return label, labelValue, ports, nil } -func (c *DaemonSetController) createPrimaryDaemonSet(cd *flaggerv1.Canary, excludedLabelsPrefixes []string) error { +func (c *DaemonSetController) createPrimaryDaemonSet(cd *flaggerv1.Canary, includeLabelPrefix []string) error { targetName := cd.Spec.TargetRef.Name primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) @@ -217,7 +217,7 @@ func (c *DaemonSetController) createPrimaryDaemonSet(cd *flaggerv1.Canary, exclu } // Create the labels map but filter unwanted labels - labels := excludeLabelsByPrefix(canaryDae.Labels, excludedLabelsPrefixes) + labels := includeLabelsByPrefix(canaryDae.Labels, includeLabelPrefix) label, labelValue, err := c.getSelectorLabel(canaryDae) primaryLabelValue := fmt.Sprintf("%s-primary", labelValue) @@ -245,7 +245,7 @@ func (c *DaemonSetController) createPrimaryDaemonSet(cd *flaggerv1.Canary, exclu ObjectMeta: metav1.ObjectMeta{ Name: primaryName, Namespace: cd.Namespace, - Labels: labels, + Labels: makePrimaryLabels(labels, primaryLabelValue, label), OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(cd, schema.GroupVersionKind{ Group: flaggerv1.SchemeGroupVersion.Group, diff --git a/pkg/canary/deployment_controller.go b/pkg/canary/deployment_controller.go index f0fa37ef..030ae808 100644 --- a/pkg/canary/deployment_controller.go +++ b/pkg/canary/deployment_controller.go @@ -20,19 +20,19 @@ import ( // DeploymentController is managing the operations for Kubernetes Deployment kind type DeploymentController struct { - kubeClient kubernetes.Interface - flaggerClient clientset.Interface - logger *zap.SugaredLogger - configTracker Tracker - labels []string - excludedLabelsPrefixes []string + kubeClient kubernetes.Interface + flaggerClient clientset.Interface + logger *zap.SugaredLogger + configTracker Tracker + labels []string + includeLabelPrefix []string } // Initialize creates the primary deployment, hpa, // scales to zero the canary deployment and returns the pod selector label and container ports func (c *DeploymentController) Initialize(cd *flaggerv1.Canary) (err error) { primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) - if err := c.createPrimaryDeployment(cd, c.excludedLabelsPrefixes); err != nil { + if err := c.createPrimaryDeployment(cd, c.includeLabelPrefix); err != nil { return fmt.Errorf("createPrimaryDeployment failed: %w", err) } @@ -203,7 +203,7 @@ func (c *DeploymentController) GetMetadata(cd *flaggerv1.Canary) (string, string return label, labelValue, ports, nil } -func (c *DeploymentController) createPrimaryDeployment(cd *flaggerv1.Canary, excludedLabelsPrefixes []string) error { +func (c *DeploymentController) createPrimaryDeployment(cd *flaggerv1.Canary, includeLabelPrefix []string) error { targetName := cd.Spec.TargetRef.Name primaryName := fmt.Sprintf("%s-primary", cd.Spec.TargetRef.Name) @@ -213,7 +213,7 @@ func (c *DeploymentController) createPrimaryDeployment(cd *flaggerv1.Canary, exc } // Create the labels map but filter unwanted labels - labels := excludeLabelsByPrefix(canaryDep.Labels, excludedLabelsPrefixes) + labels := includeLabelsByPrefix(canaryDep.Labels, includeLabelPrefix) label, labelValue, err := c.getSelectorLabel(canaryDep) primaryLabelValue := fmt.Sprintf("%s-primary", labelValue) @@ -246,7 +246,7 @@ func (c *DeploymentController) createPrimaryDeployment(cd *flaggerv1.Canary, exc ObjectMeta: metav1.ObjectMeta{ Name: primaryName, Namespace: cd.Namespace, - Labels: labels, + Labels: makePrimaryLabels(labels, primaryLabelValue, label), OwnerReferences: []metav1.OwnerReference{ *metav1.NewControllerRef(cd, schema.GroupVersionKind{ Group: flaggerv1.SchemeGroupVersion.Group, diff --git a/pkg/canary/factory.go b/pkg/canary/factory.go index 99db8041..9c121b2b 100644 --- a/pkg/canary/factory.go +++ b/pkg/canary/factory.go @@ -8,38 +8,38 @@ import ( ) type Factory struct { - kubeClient kubernetes.Interface - flaggerClient clientset.Interface - logger *zap.SugaredLogger - configTracker Tracker - labels []string - excludedLabelsPrefixes []string + kubeClient kubernetes.Interface + flaggerClient clientset.Interface + logger *zap.SugaredLogger + configTracker Tracker + labels []string + includeLabelPrefix []string } func NewFactory(kubeClient kubernetes.Interface, flaggerClient clientset.Interface, configTracker Tracker, labels []string, - excludedLabelsPrefixes []string, + includeLabelPrefix []string, logger *zap.SugaredLogger) *Factory { return &Factory{ - kubeClient: kubeClient, - flaggerClient: flaggerClient, - logger: logger, - configTracker: configTracker, - labels: labels, - excludedLabelsPrefixes: excludedLabelsPrefixes, + kubeClient: kubeClient, + flaggerClient: flaggerClient, + logger: logger, + configTracker: configTracker, + labels: labels, + includeLabelPrefix: includeLabelPrefix, } } func (factory *Factory) Controller(kind string) Controller { deploymentCtrl := &DeploymentController{ - logger: factory.logger, - kubeClient: factory.kubeClient, - flaggerClient: factory.flaggerClient, - labels: factory.labels, - configTracker: factory.configTracker, - excludedLabelsPrefixes: factory.excludedLabelsPrefixes, + logger: factory.logger, + kubeClient: factory.kubeClient, + flaggerClient: factory.flaggerClient, + labels: factory.labels, + configTracker: factory.configTracker, + includeLabelPrefix: factory.includeLabelPrefix, } daemonSetCtrl := &DaemonSetController{ logger: factory.logger, diff --git a/pkg/canary/util.go b/pkg/canary/util.go index d3554a93..77b6fdfa 100644 --- a/pkg/canary/util.go +++ b/pkg/canary/util.go @@ -76,19 +76,15 @@ func makeAnnotations(annotations map[string]string) (map[string]string, error) { return res, nil } -func excludeLabelsByPrefix(labels map[string]string, excludedLabelsPrefixes []string) map[string]string { +func includeLabelsByPrefix(labels map[string]string, includeLabelPrefixes []string) map[string]string { filteredLabels := make(map[string]string) for key, value := range labels { - isPrefixExcluded := false - for _, excludeLabelPrefix := range excludedLabelsPrefixes { - if strings.HasPrefix(key, excludeLabelPrefix) { - isPrefixExcluded = true + for _, includeLabelPrefix := range includeLabelPrefixes { + if key == "*" || strings.HasPrefix(key, includeLabelPrefix) { + filteredLabels[key] = value break } } - if !isPrefixExcluded { - filteredLabels[key] = value - } } return filteredLabels diff --git a/pkg/canary/util_test.go b/pkg/canary/util_test.go index f4858f27..e8e36f01 100644 --- a/pkg/canary/util_test.go +++ b/pkg/canary/util_test.go @@ -6,20 +6,37 @@ import ( "github.com/stretchr/testify/assert" ) -func TestExcludeLabelsByPrefix(t *testing.T) { +func TestIncludeLabelsByPrefix(t *testing.T) { labels := map[string]string{ - "foo": "bar", - "jenkins": "foo", - "flux123": "bar", + "foo": "foo-value", + "bar": "bar-value", + "lorem": "ipsum", } - excludedLabelsPrefixes := []string{"jenkins", "flux"} + includeLabelPrefix := []string{"foo", "lor"} - filteredLabels := excludeLabelsByPrefix(labels, excludedLabelsPrefixes) + filteredLabels := includeLabelsByPrefix(labels, includeLabelPrefix) assert.Equal(t, filteredLabels, map[string]string{ - "foo": "bar", - // jenkins excluded - // and flux123 also excluded + "foo": "foo-value", + "lorem": "ipsum", + // bar excluded + }) +} + +func TestIncludeLabelsByPrefixWithWildcard(t *testing.T) { + labels := map[string]string{ + "foo": "foo-value", + "bar": "bar-value", + "lorem": "ipsum", + } + includeLabelPrefix := []string{"*"} + + filteredLabels := includeLabelsByPrefix(labels, includeLabelPrefix) + + assert.Equal(t, filteredLabels, map[string]string{ + "foo": "foo-value", + "bar": "bar-value", + "lorem": "ipsum", }) }