diff --git a/pkg/apis/config/defaults.go b/pkg/apis/config/defaults.go index d3a724d7333..c3b06be5344 100644 --- a/pkg/apis/config/defaults.go +++ b/pkg/apis/config/defaults.go @@ -181,13 +181,11 @@ func getBrokerClasses(d *Defaults) map[string]*BrokerConfigSpec { // matchBrokerClass find the corresponding brokerConfig for a given brokerClass func matchBrokerClass(brokerClass string, brokerClasses map[string]*BrokerConfigSpec) *BrokerConfig { - for bClass, bCSpec := range brokerClasses { - if bClass == brokerClass { - var bConfig BrokerConfig - bConfig.KReference = bCSpec.Spec.Config - bConfig.Delivery = bCSpec.Spec.Delivery - return &bConfig - } + var bConfig BrokerConfig + if bCSpec, ok := brokerClasses[brokerClass]; ok { + bConfig.KReference = bCSpec.Spec.Config + bConfig.Delivery = bCSpec.Spec.Delivery + return &bConfig } return nil } diff --git a/pkg/apis/eventing/v1/broker_defaults_test.go b/pkg/apis/eventing/v1/broker_defaults_test.go index 4f341a68a44..630b608348f 100644 --- a/pkg/apis/eventing/v1/broker_defaults_test.go +++ b/pkg/apis/eventing/v1/broker_defaults_test.go @@ -34,7 +34,7 @@ import ( ) var ( - defaultConfig = &config.Config{ + defaultConfig1 = &config.Config{ Defaults: &config.Defaults{ // NamespaceDefaultsConfig are the default Broker Configs for each namespace. // Namespace is the key, the value is the KReference to the config. @@ -56,9 +56,9 @@ var ( APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -80,9 +80,9 @@ var ( APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(3), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("3s"), + Retry: pointer.Int32(3), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("3s"), }, }, }, @@ -103,9 +103,9 @@ var ( APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("linear")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -128,14 +128,56 @@ var ( APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(3), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(3), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), }, }, }, }, } + + defaultConfig2 = &config.Config{ + Defaults: &config.Defaults{ + // NamespaceDefaultsConfig are the default Broker Configs for each namespace. + // Namespace is the key, the value is the KReference to the config. + NamespaceDefaultsConfig: map[string]*config.ClassAndBrokerConfig{ + "mynamespace1": { + BrokerClass: "KafkaBroker", + BrokerConfig: &config.BrokerConfig{ + KReference: &duckv1.KReference{ + APIVersion: "v1", + Kind: "ConfigMap", + Namespace: "knative-eventing", + Name: "kafka-channel", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "default", + Name: "handle-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), + }, + }, + }, + "mynamespace2": { + BrokerClass: "RabbitmqBroker", + }, + "mynamespace3": { + BrokerClass: "KafkaBroker", + }, + }, + ClusterDefault: &config.ClassAndBrokerConfig{ + BrokerClass: eventing.MTChannelBrokerClassValue, + }, + }, + } ) func TestBrokerSetDefaults(t *testing.T) { @@ -166,9 +208,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(3), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(3), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -196,9 +238,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(3), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(3), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -242,9 +284,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(3), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(3), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -276,9 +318,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -310,9 +352,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("linear")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -344,9 +386,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(3), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("exponential")), - BackoffDelay: pointer.StringPtr("3s"), + Retry: pointer.Int32(3), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("3s"), }, }, }, @@ -369,9 +411,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("linear")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -399,9 +441,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("linear")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -424,9 +466,9 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("linear")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -454,9 +496,271 @@ func TestBrokerSetDefaults(t *testing.T) { APIVersion: "serving.knative.dev/v1", }, }, - Retry: pointer.Int32Ptr(5), - BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.StringPtr("linear")), - BackoffDelay: pointer.StringPtr("5s"), + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), + }, + }, + }, + }, + } + for n, tc := range testCases { + t.Run(n, func(t *testing.T) { + tc.initial.SetDefaults(config.ToContext(context.Background(), defaultConfig1)) + if diff := cmp.Diff(tc.expected, tc.initial); diff != "" { + t.Fatal("Unexpected defaults (-want, +got):", diff) + } + }) + } +} + +func TestMultiBrokerSetDefaults(t *testing.T) { + brokerClasses := make(map[string]*config.BrokerConfigSpec) + brokerSpec1 := &config.BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + APIVersion: "v1", + Namespace: "knative-eventing", + Name: "mt-test", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "default", + Name: "mt-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), + }, + } + brokerConfigSpec1 := &config.BrokerConfigSpec{ + Spec: brokerSpec1, + } + brokerSpec2 := &config.BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + APIVersion: "v1", + Namespace: "knative-eventing", + Name: "kafka-test", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "default", + Name: "kafka-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), + }, + } + brokerConfigSpec2 := &config.BrokerConfigSpec{ + Spec: brokerSpec2, + } + + brokerSpec3 := &config.BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + APIVersion: "v1", + Namespace: "knative-eventing", + Name: "rabbitmq-test", + }, + Delivery: nil, + } + brokerConfigSpec3 := &config.BrokerConfigSpec{ + Spec: brokerSpec3, + } + + brokerClasses["MTChannelBasedBroker"] = brokerConfigSpec1 + brokerClasses["KafkaBroker"] = brokerConfigSpec2 + brokerClasses["RabbitmqBroker"] = brokerConfigSpec3 + defaultConfig2.Defaults.ClusterDefault.BrokerClasses = brokerClasses + testCases := map[string]struct { + initial Broker + expected Broker + }{ + "use config, missing namespace, defaulted": { + initial: Broker{ + ObjectMeta: metav1.ObjectMeta{Namespace: "nsrandom"}, + Spec: BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + Name: "natss-channel", + APIVersion: "v1", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "rando", + Name: "handle-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), + }, + }, + }, + expected: Broker{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "nsrandom", + Annotations: map[string]string{ + eventing.BrokerClassKey: eventing.MTChannelBrokerClassValue, + }, + }, + Spec: BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + Namespace: "nsrandom", + Name: "natss-channel", + APIVersion: "v1", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "rando", + Name: "handle-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("linear")), + BackoffDelay: pointer.String("5s"), + }, + }, + }, + }, + + "no config, missing namespace, uses defaulted class and corresponding config": { + initial: Broker{ + ObjectMeta: metav1.ObjectMeta{Namespace: "random"}, + }, + expected: Broker{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "random", + Annotations: map[string]string{ + eventing.BrokerClassKey: eventing.MTChannelBrokerClassValue, + }, + }, + Spec: BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + APIVersion: "v1", + Namespace: "knative-eventing", + Name: "mt-test", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "default", + Name: "mt-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), + }, + }, + }, + }, + "no config, uses namespace broker class and config": { + initial: Broker{ + ObjectMeta: metav1.ObjectMeta{Namespace: "mynamespace1"}, + }, + expected: Broker{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "mynamespace1", + Annotations: map[string]string{ + eventing.BrokerClassKey: "KafkaBroker", + }, + }, + Spec: BrokerSpec{ + Config: &duckv1.KReference{ + APIVersion: "v1", + Kind: "ConfigMap", + Namespace: "knative-eventing", + Name: "kafka-channel", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "default", + Name: "handle-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), + }, + }, + }, + }, + "no config, uses mynamespace2's broker class and corresponding config, cluster class": { + initial: Broker{ + ObjectMeta: metav1.ObjectMeta{Namespace: "mynamespace2"}, + }, + expected: Broker{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "mynamespace2", + Annotations: map[string]string{ + eventing.BrokerClassKey: "RabbitmqBroker", + }, + }, + Spec: BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + APIVersion: "v1", + Namespace: "knative-eventing", + Name: "rabbitmq-test", + }, + Delivery: nil, + }, + }, + }, + "no config, uses mynamespace3's broker class and corresponding config, cluster class": { + initial: Broker{ + ObjectMeta: metav1.ObjectMeta{Namespace: "mynamespace3"}, + }, + expected: Broker{ + ObjectMeta: metav1.ObjectMeta{ + Namespace: "mynamespace3", + Annotations: map[string]string{ + eventing.BrokerClassKey: "KafkaBroker", + }, + }, + Spec: BrokerSpec{ + Config: &duckv1.KReference{ + Kind: "ConfigMap", + APIVersion: "v1", + Namespace: "knative-eventing", + Name: "kafka-test", + }, + Delivery: &eventingduckv1.DeliverySpec{ + DeadLetterSink: &duckv1.Destination{ + Ref: &duckv1.KReference{ + Kind: "Service", + Namespace: "default", + Name: "kafka-error", + APIVersion: "serving.knative.dev/v1", + }, + }, + Retry: pointer.Int32(5), + BackoffPolicy: (*eventingduckv1.BackoffPolicyType)(pointer.String("exponential")), + BackoffDelay: pointer.String("5s"), }, }, }, @@ -464,7 +768,7 @@ func TestBrokerSetDefaults(t *testing.T) { } for n, tc := range testCases { t.Run(n, func(t *testing.T) { - tc.initial.SetDefaults(config.ToContext(context.Background(), defaultConfig)) + tc.initial.SetDefaults(config.ToContext(context.Background(), defaultConfig2)) if diff := cmp.Diff(tc.expected, tc.initial); diff != "" { t.Fatal("Unexpected defaults (-want, +got):", diff) }