mirror of
https://github.com/fluxcd/flagger.git
synced 2026-04-15 06:57:34 +00:00
Change from exclude labels to include labels
This commit is contained in:
@@ -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
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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",
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user