From a47ad80bc94f6d33234f18bd8499283bdaceb335 Mon Sep 17 00:00:00 2001 From: Wojciech_Grazawski Date: Wed, 5 Aug 2026 09:53:01 +0200 Subject: [PATCH] feat(trait): Add metricType support to the KEDA trait triggers Add an optional trigger-level `metricType` field to the KEDA trait (`Utilization`, `AverageValue` or `Value`), mapping to KEDA's ScaleTriggers.metricType. Required by the cpu/memory scalers in KEDA v2.18+ where the deprecated metadata.type was removed. Regenerated CRDs, Helm CRDs and API docs. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../ROOT/partials/apis/camel-k-crds.adoc | 8 +++ helm/camel-k/crds/camel-k-crds.yaml | 72 +++++++++++++++++++ pkg/apis/camel/v1/trait/keda.go | 5 ++ pkg/apis/duck/keda/v1alpha1/duck_types.go | 6 +- ...camel.apache.org_integrationplatforms.yaml | 18 +++++ .../camel.apache.org_integrationprofiles.yaml | 18 +++++ .../bases/camel.apache.org_integrations.yaml | 18 +++++ .../crd/bases/camel.apache.org_pipes.yaml | 18 +++++ pkg/trait/keda.go | 5 +- pkg/trait/keda_test.go | 29 ++++++++ 10 files changed, 193 insertions(+), 4 deletions(-) diff --git a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc index 22f3ae244b..ac08ea3c13 100644 --- a/docs/modules/ROOT/partials/apis/camel-k-crds.adoc +++ b/docs/modules/ROOT/partials/apis/camel-k-crds.adoc @@ -8362,6 +8362,14 @@ string The autoscaler type. +|`metricType` + +string +| +*(Optional)* + +The metric type for this trigger, mapping to KEDA's trigger-level `metricType` +(`Utilization`, `AverageValue` or `Value`). + |`metadata` + map[string]string | diff --git a/helm/camel-k/crds/camel-k-crds.yaml b/helm/camel-k/crds/camel-k-crds.yaml index 9328938d33..6930c372cb 100644 --- a/helm/camel-k/crds/camel-k-crds.yaml +++ b/helm/camel-k/crds/camel-k-crds.yaml @@ -5015,6 +5015,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -7559,6 +7568,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -9997,6 +10015,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -12421,6 +12448,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -21707,6 +21743,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -24092,6 +24137,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -34744,6 +34798,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -37048,6 +37111,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different diff --git a/pkg/apis/camel/v1/trait/keda.go b/pkg/apis/camel/v1/trait/keda.go index b20b6a9745..a56bdf69b2 100644 --- a/pkg/apis/camel/v1/trait/keda.go +++ b/pkg/apis/camel/v1/trait/keda.go @@ -51,6 +51,11 @@ type KedaTrait struct { type KedaTrigger struct { // The autoscaler type. Type string `json:"type,omitempty" property:"type"` + // The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + // (`Utilization`, `AverageValue` or `Value`). + // +kubebuilder:validation:Enum=Utilization;AverageValue;Value + // +optional + MetricType string `json:"metricType,omitempty" property:"metric-type"` // The trigger metadata (see Keda documentation to learn how to fill for each type). Metadata map[string]string `json:"metadata,omitempty" property:"metadata"` // The secrets mapping to use. Keda allows the possibility to use values coming from different secrets. diff --git a/pkg/apis/duck/keda/v1alpha1/duck_types.go b/pkg/apis/duck/keda/v1alpha1/duck_types.go index 112e700dfc..e281578a5e 100644 --- a/pkg/apis/duck/keda/v1alpha1/duck_types.go +++ b/pkg/apis/duck/keda/v1alpha1/duck_types.go @@ -56,8 +56,10 @@ type ScaledObjectSpec struct { type ScaleTriggers struct { Type string `json:"type"` // +optional - Name string `json:"name,omitempty"` - Metadata map[string]string `json:"metadata"` + Name string `json:"name,omitempty"` + // +optional + MetricType string `json:"metricType,omitempty"` + Metadata map[string]string `json:"metadata"` // +optional AuthenticationRef *ScaledObjectAuthRef `json:"authenticationRef,omitempty"` // +optional diff --git a/pkg/resources/config/crd/bases/camel.apache.org_integrationplatforms.yaml b/pkg/resources/config/crd/bases/camel.apache.org_integrationplatforms.yaml index f1b0c2b264..791c2ec55d 100644 --- a/pkg/resources/config/crd/bases/camel.apache.org_integrationplatforms.yaml +++ b/pkg/resources/config/crd/bases/camel.apache.org_integrationplatforms.yaml @@ -1709,6 +1709,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -4253,6 +4262,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different diff --git a/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml b/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml index 80852a2e72..6925e9bfa8 100644 --- a/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml +++ b/pkg/resources/config/crd/bases/camel.apache.org_integrationprofiles.yaml @@ -1567,6 +1567,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -3991,6 +4000,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different diff --git a/pkg/resources/config/crd/bases/camel.apache.org_integrations.yaml b/pkg/resources/config/crd/bases/camel.apache.org_integrations.yaml index 710abc0dcc..1239847958 100644 --- a/pkg/resources/config/crd/bases/camel.apache.org_integrations.yaml +++ b/pkg/resources/config/crd/bases/camel.apache.org_integrations.yaml @@ -8418,6 +8418,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -10803,6 +10812,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different diff --git a/pkg/resources/config/crd/bases/camel.apache.org_pipes.yaml b/pkg/resources/config/crd/bases/camel.apache.org_pipes.yaml index 56e9c3e4e6..4a9c4e2ed1 100644 --- a/pkg/resources/config/crd/bases/camel.apache.org_pipes.yaml +++ b/pkg/resources/config/crd/bases/camel.apache.org_pipes.yaml @@ -8476,6 +8476,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different @@ -10780,6 +10789,15 @@ spec: description: The trigger metadata (see Keda documentation to learn how to fill for each type). type: object + metricType: + description: |- + The metric type for this trigger, mapping to KEDA's trigger-level `metricType` + (`Utilization`, `AverageValue` or `Value`). + enum: + - Utilization + - AverageValue + - Value + type: string secrets: description: The secrets mapping to use. Keda allows the possibility to use values coming from different diff --git a/pkg/trait/keda.go b/pkg/trait/keda.go index 66074e4b80..36ee9c6216 100644 --- a/pkg/trait/keda.go +++ b/pkg/trait/keda.go @@ -97,8 +97,9 @@ func (t *kedaTrait) populateTriggers(itName, itNamespace string) ([]v1alpha1.Sca triggers := make([]v1alpha1.ScaleTriggers, 0, len(t.Triggers)) for _, trigger := range t.Triggers { scaleTrigger := v1alpha1.ScaleTriggers{ - Type: trigger.Type, - Metadata: trigger.Metadata, + Type: trigger.Type, + MetricType: trigger.MetricType, + Metadata: trigger.Metadata, } if trigger.Secrets != nil { triggerAuth := populateTriggerAuth(trigger.Secrets, itName, itNamespace, trigger.Type) diff --git a/pkg/trait/keda_test.go b/pkg/trait/keda_test.go index 6ba20a8d40..606c315b89 100644 --- a/pkg/trait/keda_test.go +++ b/pkg/trait/keda_test.go @@ -57,6 +57,35 @@ func TestKeda(t *testing.T) { assert.Equal(t, "10", scaledObject.Spec.Triggers[0].Metadata["lagThreshold"]) } +func TestKedaMetricType(t *testing.T) { + environment := nominalEnv(t) + // A cpu trigger with a trigger-level metricType: KEDA v2.18+ requires this for + // the cpu/memory scalers (the deprecated metadata.type was removed). + environment.Integration.Spec.Traits.Keda.Triggers = []traitv1.KedaTrigger{ + { + Type: "cpu", + MetricType: "Utilization", + Metadata: map[string]string{ + "value": "70", + }, + }, + } + traitCatalog := environment.Catalog + + _, _, err := traitCatalog.apply(&environment) + + require.NoError(t, err) + assert.NotEmpty(t, environment.ExecutedTraits) + assert.NotNil(t, environment.GetTrait("keda")) + + scaledObject := getKedaScaledObject(environment.Resources) + require.NotNil(t, scaledObject) + require.Len(t, scaledObject.Spec.Triggers, 1) + assert.Equal(t, "cpu", scaledObject.Spec.Triggers[0].Type) + assert.Equal(t, "Utilization", scaledObject.Spec.Triggers[0].MetricType) + assert.Equal(t, "70", scaledObject.Spec.Triggers[0].Metadata["value"]) +} + func TestKedaAutoDiscovery(t *testing.T) { tests := []struct { name string