Change from exclude labels to include labels

This commit is contained in:
Daniel Albuquerque
2020-10-13 21:58:47 +01:00
parent 23e59168af
commit 6ec377181a
7 changed files with 74 additions and 61 deletions
+1 -1
View File
@@ -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`
+4 -4
View File
@@ -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,
+10 -10
View File
@@ -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,
+10 -10
View File
@@ -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,
+19 -19
View File
@@ -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,
+4 -8
View File
@@ -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
+26 -9
View File
@@ -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",
})
}