Skip to content

Deprecate type setting CPU/MEM and tls setting IBMMQ #6698

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,9 @@ New deprecation(s):

### Breaking Changes

- TODO ([#XXX](https://github.com/kedacore/keda/issues/XXX))
- **General**: Remove Prometheus webhook prommetrics deprecations ([#6698](https://github.com/kedacore/keda/pull/6698))
- **CPU Memory scaler**: The 'type' setting is deprecated and removed, use 'metricType' instead ([#6698](https://github.com/kedacore/keda/pull/6698))
- **IBM MQ scaler**: The 'tls' setting is deprecated and removed, use 'unsafeSsl' instead ([#6698](https://github.com/kedacore/keda/pull/6698))

### Other

Expand Down
22 changes: 0 additions & 22 deletions pkg/metricscollector/webhook/webhook_prommetrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,6 @@ const (
)

var (
scaledObjectValidatingTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: DefaultPromMetricsNamespace,
Subsystem: "webhook",
Name: "scaled_object_validation_total",
Help: "DEPRECATED - will be removed in 2.16 - Use `scaled_object_validations_total` instead.",
},
[]string{"namespace", "action"},
)
scaledObjectValidationsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: DefaultPromMetricsNamespace,
Expand All @@ -44,15 +35,6 @@ var (
},
[]string{"namespace", "action"},
)
scaledObjectValidatingErrors = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: DefaultPromMetricsNamespace,
Subsystem: "webhook",
Name: "scaled_object_validation_errors",
Help: "DEPRECATED - will be removed in 2.16 - Use `scaled_object_validation_errors_total` instead.",
},
[]string{"namespace", "action", "reason"},
)
scaledObjectValidationErrorsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: DefaultPromMetricsNamespace,
Expand All @@ -65,22 +47,18 @@ var (
)

func init() {
metrics.Registry.MustRegister(scaledObjectValidatingTotal)
metrics.Registry.MustRegister(scaledObjectValidationsTotal)
metrics.Registry.MustRegister(scaledObjectValidatingErrors)
metrics.Registry.MustRegister(scaledObjectValidationErrorsTotal)
}

// RecordScaledObjectValidatingTotal counts the number of ScaledObject validations
func RecordScaledObjectValidatingTotal(namespace, action string) {
labels := prometheus.Labels{"namespace": namespace, "action": action}
scaledObjectValidatingTotal.With(labels).Inc()
scaledObjectValidationsTotal.With(labels).Inc()
}

// RecordScaledObjectValidatingErrors counts the number of ScaledObject validating errors
func RecordScaledObjectValidatingErrors(namespace, action, reason string) {
labels := prometheus.Labels{"namespace": namespace, "action": action, "reason": reason}
scaledObjectValidatingErrors.With(labels).Inc()
scaledObjectValidationErrorsTotal.With(labels).Inc()
}
14 changes: 1 addition & 13 deletions pkg/scalers/cpu_memory_scaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type cpuMemoryScaler struct {
}

type cpuMemoryMetadata struct {
Type string `keda:"name=type, order=triggerMetadata, enum=Utilization;AverageValue, optional, deprecatedAnnounce=The 'type' setting is DEPRECATED and will be removed in v2.18 - Use 'metricType' instead."`
Type string `keda:"name=type, order=triggerMetadata, enum=Utilization;AverageValue, optional, deprecated=The 'type' setting is DEPRECATED and is removed in v2.18 - Use 'metricType' instead."`
Value string `keda:"name=value, order=triggerMetadata"`
ContainerName string `keda:"name=containerName, order=triggerMetadata, optional"`
AverageValue *resource.Quantity
Expand Down Expand Up @@ -58,18 +58,6 @@ func parseResourceMetadata(config *scalersconfig.ScalerConfig) (cpuMemoryMetadat
meta.MetricType = config.MetricType
}

// This is deprecated and can be removed later
if meta.Type != "" {
switch meta.Type {
case "AverageValue":
meta.MetricType = v2.AverageValueMetricType
case "Utilization":
meta.MetricType = v2.UtilizationMetricType
default:
return meta, fmt.Errorf("unknown metric type: %s, allowed values are 'Utilization' or 'AverageValue'", meta.Type)
}
}

switch meta.MetricType {
case v2.AverageValueMetricType:
averageValueQuantity := resource.MustParse(meta.Value)
Expand Down
40 changes: 4 additions & 36 deletions pkg/scalers/cpu_memory_scaler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,20 @@ type parseCPUMemoryMetadataTestData struct {
}

var validCPUMemoryMetadata = map[string]string{
"type": "Utilization",
"value": "50",
}
var validContainerCPUMemoryMetadata = map[string]string{
"type": "Utilization",
"value": "50",
"containerName": "foo",
}

var testCPUMemoryMetadata = []parseCPUMemoryMetadataTestData{
{"", map[string]string{}, true},
{"", validCPUMemoryMetadata, false},
{"", validContainerCPUMemoryMetadata, false},
{"", map[string]string{"type": "Utilization", "value": "50"}, false},
{v2.UtilizationMetricType, map[string]string{"value": "50"}, false},
{"", map[string]string{"type": "AverageValue", "value": "50"}, false},
{v2.AverageValueMetricType, map[string]string{"value": "50"}, false},
{"", map[string]string{"type": "Value", "value": "50"}, true},
{v2.ValueMetricType, map[string]string{"value": "50"}, true},
{"", map[string]string{"type": "AverageValue"}, true},
{"", map[string]string{"type": "xxx", "value": "50"}, true},
{"", map[string]string{"value": ""}, true},
{"", map[string]string{}, true},
}

func TestCPUMemoryParseMetadata(t *testing.T) {
Expand All @@ -58,34 +51,22 @@ func TestCPUMemoryParseMetadata(t *testing.T) {
}

func TestGetMetricSpecForScaling(t *testing.T) {
// Using trigger.metadata.type field for type
config := &scalersconfig.ScalerConfig{
TriggerMetadata: validCPUMemoryMetadata,
MetricType: v2.UtilizationMetricType,
}
scaler, _ := NewCPUMemoryScaler(v1.ResourceCPU, config)
metricSpec := scaler.GetMetricSpecForScaling(context.Background())

assert.Equal(t, metricSpec[0].Type, v2.ResourceMetricSourceType)
assert.Equal(t, metricSpec[0].Resource.Name, v1.ResourceCPU)
assert.Equal(t, metricSpec[0].Resource.Target.Type, v2.UtilizationMetricType)

// Using trigger.metricType field for type
config = &scalersconfig.ScalerConfig{
TriggerMetadata: map[string]string{"value": "50"},
MetricType: v2.UtilizationMetricType,
}
scaler, _ = NewCPUMemoryScaler(v1.ResourceCPU, config)
metricSpec = scaler.GetMetricSpecForScaling(context.Background())

assert.Equal(t, metricSpec[0].Type, v2.ResourceMetricSourceType)
assert.Equal(t, metricSpec[0].Resource.Name, v1.ResourceCPU)
assert.Equal(t, metricSpec[0].Resource.Target.Type, v2.UtilizationMetricType)
}

func TestGetContainerMetricSpecForScaling(t *testing.T) {
// Using trigger.metadata.type field for type
config := &scalersconfig.ScalerConfig{
TriggerMetadata: validContainerCPUMemoryMetadata,
MetricType: v2.UtilizationMetricType,
}
scaler, _ := NewCPUMemoryScaler(v1.ResourceCPU, config)
metricSpec := scaler.GetMetricSpecForScaling(context.Background())
Expand All @@ -94,17 +75,4 @@ func TestGetContainerMetricSpecForScaling(t *testing.T) {
assert.Equal(t, metricSpec[0].ContainerResource.Name, v1.ResourceCPU)
assert.Equal(t, metricSpec[0].ContainerResource.Target.Type, v2.UtilizationMetricType)
assert.Equal(t, metricSpec[0].ContainerResource.Container, validContainerCPUMemoryMetadata["containerName"])

// Using trigger.metricType field for type
config = &scalersconfig.ScalerConfig{
TriggerMetadata: map[string]string{"value": "50", "containerName": "bar"},
MetricType: v2.UtilizationMetricType,
}
scaler, _ = NewCPUMemoryScaler(v1.ResourceCPU, config)
metricSpec = scaler.GetMetricSpecForScaling(context.Background())

assert.Equal(t, metricSpec[0].Type, v2.ContainerResourceMetricSourceType)
assert.Equal(t, metricSpec[0].ContainerResource.Name, v1.ResourceCPU)
assert.Equal(t, metricSpec[0].ContainerResource.Target.Type, v2.UtilizationMetricType)
assert.Equal(t, metricSpec[0].ContainerResource.Container, "bar")
}
12 changes: 1 addition & 11 deletions pkg/scalers/ibmmq_scaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ type ibmmqMetadata struct {
Username string `keda:"name=username, order=authParams;resolvedEnv;triggerMetadata"`
Password string `keda:"name=password, order=authParams;resolvedEnv;triggerMetadata"`
UnsafeSsl bool `keda:"name=unsafeSsl, order=triggerMetadata, default=false"`
TLS bool `keda:"name=tls, order=triggerMetadata, default=false, deprecatedAnnounce=The 'tls' setting is DEPRECATED and will be removed in v2.18 - Use 'unsafeSsl' instead"`
TLS bool `keda:"name=tls, order=triggerMetadata, default=false, deprecated=The 'tls' setting is DEPRECATED and is removed in v2.18 - Use 'unsafeSsl' instead"`
CA string `keda:"name=ca, order=authParams, optional"`
Cert string `keda:"name=cert, order=authParams, optional"`
Key string `keda:"name=key, order=authParams, optional"`
Expand Down Expand Up @@ -76,11 +76,6 @@ func (m *ibmmqMetadata) Validate() error {
return fmt.Errorf("both cert and key must be provided when using TLS")
}

// TODO: DEPRECATED to be removed in v2.18
if m.TLS && m.UnsafeSsl {
return fmt.Errorf("'tls' and 'unsafeSsl' are both specified. Please use only 'unsafeSsl'")
}

return nil
}

Expand All @@ -97,11 +92,6 @@ func NewIBMMQScaler(config *scalersconfig.ScalerConfig) (Scaler, error) {
return nil, fmt.Errorf("error parsing IBM MQ metadata: %w", err)
}

// TODO: DEPRECATED to be removed in v2.18
if meta.TLS {
meta.UnsafeSsl = meta.TLS
}

httpClient := kedautil.CreateHTTPClient(config.GlobalHTTPTimeout, meta.UnsafeSsl)

if meta.Cert != "" && meta.Key != "" {
Expand Down
12 changes: 2 additions & 10 deletions pkg/scalers/scalersconfig/typed_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,14 +138,6 @@ func (p Params) IsDeprecated() bool {
return p.Deprecated != ""
}

// DeprecatedMessage is a function that returns the optional deprecated message if the parameter is deprecated
func (p Params) DeprecatedMessage() string {
if p.Deprecated == deprecatedTag {
return ""
}
return fmt.Sprintf(": %s", p.Deprecated)
}

// TypedConfig is a function that is used to unmarshal the TriggerMetadata, ResolvedEnv and AuthParams
// populating the provided typedConfig where structure fields along with complementary field tags define
// declaratively the parsing rules
Expand Down Expand Up @@ -202,11 +194,11 @@ func (sc *ScalerConfig) parseTypedConfig(typedConfig any, parentOptional bool) e
func (sc *ScalerConfig) setValue(field reflect.Value, params Params) error {
valFromConfig, exists := sc.configParamValue(params)
if exists && params.IsDeprecated() {
return fmt.Errorf("parameter %q is deprecated%v", params.Name(), params.DeprecatedMessage())
return fmt.Errorf("scaler %s info: %s", sc.TriggerType, params.Deprecated)
}
if exists && params.DeprecatedAnnounce != "" {
if sc.Recorder != nil {
message := fmt.Sprintf("Scaler %s info: %s", sc.TriggerType, params.DeprecatedAnnounce)
message := fmt.Sprintf("scaler %s info: %s", sc.TriggerType, params.DeprecatedAnnounce)
fmt.Print(message)
sc.Recorder.Event(sc.ScaledObject, corev1.EventTypeNormal, eventreason.KEDAScalersInfo, message)
}
Expand Down
73 changes: 35 additions & 38 deletions pkg/scalers/scalersconfig/typed_config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -137,31 +137,56 @@ func TestMissing(t *testing.T) {
Expect(err).To(MatchError(`missing required parameter "stringVal" in [triggerMetadata]`))
}

// TestDeprecated tests the deprecated tag
func TestDeprecated(t *testing.T) {
// TestDeprecatedAnnounce tests the deprecatedAnnounce tag
func TestDeprecatedAnnounce(t *testing.T) {
RegisterTestingT(t)

// Create a mock recorder to capture the event
mockRecorder := &MockEventRecorder{}

sc := &ScalerConfig{
TriggerMetadata: map[string]string{
"stringVal": "value1",
"oldParam": "value1",
},
Recorder: mockRecorder,
TriggerType: "testScaler",
}

type testStruct struct {
StringVal string `keda:"name=stringVal, order=triggerMetadata, deprecated=deprecated"`
OldParam string `keda:"name=oldParam, order=triggerMetadata, deprecatedAnnounce=This parameter is deprecated and will be removed in - Use newParam instead"`
}

ts := testStruct{}
err := sc.TypedConfig(&ts)
Expect(err).To(MatchError(`parameter "stringVal" is deprecated`))
Expect(err).To(BeNil())
Expect(ts.OldParam).To(Equal("value1"))

sc2 := &ScalerConfig{
TriggerMetadata: map[string]string{},
// Verify that the deprecation event was recorded
Expect(mockRecorder.EventCalled).To(BeTrue())
Expect(mockRecorder.Message).To(Equal("scaler testScaler info: This parameter is deprecated and will be removed in - Use newParam instead"))
}

// TestDeprecated tests the deprecated tag
func TestDeprecated(t *testing.T) {
RegisterTestingT(t)

mockRecorder := &MockEventRecorder{}

sc := &ScalerConfig{
TriggerMetadata: map[string]string{
"oldParam": "value1",
},
Recorder: mockRecorder,
TriggerType: "testScaler",
}

ts2 := testStruct{}
err = sc2.TypedConfig(&ts2)
Expect(err).To(BeNil())
type testStruct struct {
OldParam string `keda:"name=oldParam, order=triggerMetadata, deprecated=This parameter is deprecated and is removed - Use newParam instead"`
}

ts := testStruct{}
err := sc.TypedConfig(&ts)
Expect(err).To(MatchError("scaler testScaler info: This parameter is deprecated and is removed - Use newParam instead"))
}

// TestDefaultValue tests the default tag
Expand Down Expand Up @@ -585,34 +610,6 @@ func TestMultiName(t *testing.T) {
Expect(ts.Property).To(Equal("bbb"))
}

// TestDeprecatedAnnounce tests the deprecatedAnnounce tag
func TestDeprecatedAnnounce(t *testing.T) {
RegisterTestingT(t)

// Create a mock recorder to capture the event
mockRecorder := &MockEventRecorder{}

sc := &ScalerConfig{
TriggerMetadata: map[string]string{
"oldParam": "value1",
},
Recorder: mockRecorder,
}

type testStruct struct {
OldParam string `keda:"name=oldParam, order=triggerMetadata, deprecatedAnnounce=This parameter is deprecated. Use newParam instead"`
}

ts := testStruct{}
err := sc.TypedConfig(&ts)
Expect(err).To(BeNil())
Expect(ts.OldParam).To(Equal("value1"))

// Verify that the deprecation event was recorded
Expect(mockRecorder.EventCalled).To(BeTrue())
Expect(mockRecorder.Message).To(Equal("Scaler info: This parameter is deprecated. Use newParam instead"))
}

// MockEventRecorder is a mock implementation of record.EventRecorder
type MockEventRecorder struct {
EventCalled bool
Expand Down
Loading