diff --git a/pkg/scalers/elasticsearch_scaler.go b/pkg/scalers/elasticsearch_scaler.go index 9158a60277d..44a27e8e463 100644 --- a/pkg/scalers/elasticsearch_scaler.go +++ b/pkg/scalers/elasticsearch_scaler.go @@ -33,9 +33,9 @@ type elasticsearchMetadata struct { Password string `keda:"name=password, order=authParams;resolvedEnv;triggerMetadata, optional"` CloudID string `keda:"name=cloudID, order=authParams;triggerMetadata, optional"` APIKey string `keda:"name=apiKey, order=authParams;triggerMetadata, optional"` - Index []string `keda:"name=index, order=authParams;triggerMetadata"` + Index []string `keda:"name=index, order=authParams;triggerMetadata, separator=;"` SearchTemplateName string `keda:"name=searchTemplateName, order=authParams;triggerMetadata"` - Parameters []string `keda:"name=parameters, order=triggerMetadata, optional"` + Parameters []string `keda:"name=parameters, order=triggerMetadata, optional, separator=;"` ValueLocation string `keda:"name=valueLocation, order=authParams;triggerMetadata"` TargetValue float64 `keda:"name=targetValue, order=authParams;triggerMetadata"` ActivationTargetValue float64 `keda:"name=activationTargetValue, order=triggerMetadata, default=0"` diff --git a/pkg/scalers/elasticsearch_scaler_test.go b/pkg/scalers/elasticsearch_scaler_test.go index 088d08ed0cc..95725065703 100644 --- a/pkg/scalers/elasticsearch_scaler_test.go +++ b/pkg/scalers/elasticsearch_scaler_test.go @@ -70,7 +70,7 @@ var testCases = []parseElasticsearchMetadataTestData{ name: "no index given", metadata: map[string]string{"addresses": "http://localhost:9200"}, authParams: map[string]string{"username": "admin"}, - expectedError: fmt.Errorf("missing required parameter"), + expectedError: fmt.Errorf("missing required parameter \"index\""), }, { name: "no searchTemplateName given", @@ -79,7 +79,7 @@ var testCases = []parseElasticsearchMetadataTestData{ "index": "index1", }, authParams: map[string]string{"username": "admin"}, - expectedError: fmt.Errorf("missing required parameter"), + expectedError: fmt.Errorf("missing required parameter \"searchTemplateName\""), }, { name: "no valueLocation given", @@ -89,7 +89,7 @@ var testCases = []parseElasticsearchMetadataTestData{ "searchTemplateName": "searchTemplateName", }, authParams: map[string]string{"username": "admin"}, - expectedError: fmt.Errorf("missing required parameter"), + expectedError: fmt.Errorf("missing required parameter \"valueLocation\""), }, { name: "no targetValue given", @@ -100,7 +100,7 @@ var testCases = []parseElasticsearchMetadataTestData{ "valueLocation": "toto", }, authParams: map[string]string{"username": "admin"}, - expectedError: fmt.Errorf("missing required parameter"), + expectedError: fmt.Errorf("missing required parameter \"targetValue\""), }, { name: "invalid targetValue", @@ -112,7 +112,7 @@ var testCases = []parseElasticsearchMetadataTestData{ "targetValue": "AA", }, authParams: map[string]string{"username": "admin"}, - expectedError: fmt.Errorf("unable to set param"), + expectedError: fmt.Errorf("unable to set param \"targetValue\""), }, { name: "invalid activationTargetValue", @@ -125,7 +125,7 @@ var testCases = []parseElasticsearchMetadataTestData{ "activationTargetValue": "AA", }, authParams: map[string]string{"username": "admin"}, - expectedError: fmt.Errorf("unable to set param"), + expectedError: fmt.Errorf("unable to set param \"activationTargetValue\""), }, { name: "all fields ok", diff --git a/pkg/scalers/scalersconfig/typed_config.go b/pkg/scalers/scalersconfig/typed_config.go index 570bc707d10..a2a9ec91a57 100644 --- a/pkg/scalers/scalersconfig/typed_config.go +++ b/pkg/scalers/scalersconfig/typed_config.go @@ -62,7 +62,7 @@ const ( // separators for map and slice elements const ( - elemSeparator = ",;" + elemSeparator = "," elemKeyValSeparator = "=" ) @@ -76,6 +76,7 @@ const ( enumTag = "enum" exclusiveSetTag = "exclusiveSet" rangeTag = "range" + separatorTag = "separator" ) // Params is a struct that represents the parameter list that can be used in the keda tag @@ -109,6 +110,9 @@ type Params struct { // RangeSeparator is the 'range' tag parameter defining the separator for range values RangeSeparator string + + // Separator is the tag parameter to define which separator will be used + Separator string } // IsNested is a function that returns true if the parameter is nested @@ -208,9 +212,11 @@ func (sc *ScalerConfig) setValue(field reflect.Value, params Params) error { enumMap[e] = true } missingMap := make(map[string]bool) - split := strings.FieldsFunc(valFromConfig, func(r rune) bool { - return strings.ContainsRune(elemSeparator, r) - }) + separator := elemSeparator + if params.Separator != "" { + separator = params.Separator + } + split := strings.Split(valFromConfig, separator) for _, s := range split { s := strings.TrimSpace(s) if !enumMap[s] { @@ -226,9 +232,11 @@ func (sc *ScalerConfig) setValue(field reflect.Value, params Params) error { for _, e := range params.ExclusiveSet { exclusiveMap[e] = true } - split := strings.FieldsFunc(valFromConfig, func(r rune) bool { - return strings.ContainsRune(elemSeparator, r) - }) + separator := elemSeparator + if params.Separator != "" { + separator = params.Separator + } + split := strings.Split(valFromConfig, separator) exclusiveCount := 0 for _, s := range split { s := strings.TrimSpace(s) @@ -280,9 +288,11 @@ func setConfigValueURLParams(params Params, valFromConfig string, field reflect. // setConfigValueMap is a function that sets the value of the map field func setConfigValueMap(params Params, valFromConfig string, field reflect.Value) error { field.Set(reflect.MakeMap(reflect.MapOf(field.Type().Key(), field.Type().Elem()))) - split := strings.FieldsFunc(valFromConfig, func(r rune) bool { - return strings.ContainsRune(elemSeparator, r) - }) + separator := elemSeparator + if params.Separator != "" { + separator = params.Separator + } + split := strings.Split(valFromConfig, separator) for _, s := range split { s := strings.TrimSpace(s) kv := strings.Split(s, elemKeyValSeparator) @@ -348,9 +358,11 @@ func setConfigValueRange(params Params, valFromConfig string, field reflect.Valu // setConfigValueSlice is a function that sets the value of the slice field func setConfigValueSlice(params Params, valFromConfig string, field reflect.Value) error { elemIfc := reflect.New(field.Type().Elem()).Interface() - split := strings.FieldsFunc(valFromConfig, func(r rune) bool { - return strings.ContainsRune(elemSeparator, r) - }) + separator := elemSeparator + if params.Separator != "" { + separator = params.Separator + } + split := strings.Split(valFromConfig, separator) for i, s := range split { s := strings.TrimSpace(s) if canRange(s, params.RangeSeparator, field) { @@ -481,6 +493,10 @@ func paramsFromTag(tag string, field reflect.StructField) (Params, error) { if len(tsplit) == 2 { params.RangeSeparator = strings.TrimSpace(tsplit[1]) } + case separatorTag: + if len(tsplit) > 1 { + params.Separator = strings.TrimSpace(tsplit[1]) + } case "": continue default: diff --git a/pkg/scalers/scalersconfig/typed_config_test.go b/pkg/scalers/scalersconfig/typed_config_test.go index 26b189c8dc5..996e45a1dd8 100644 --- a/pkg/scalers/scalersconfig/typed_config_test.go +++ b/pkg/scalers/scalersconfig/typed_config_test.go @@ -216,14 +216,16 @@ func TestSlice(t *testing.T) { sc := &ScalerConfig{ TriggerMetadata: map[string]string{ - "sliceVal": "1,2,3", - "sliceValWithSpaces": "1, 2, 3", + "sliceVal": "1,2,3", + "sliceValWithSpaces": "1, 2, 3", + "sliceValWithOtherSeparator": "1;2;3", }, } type testStruct struct { - SliceVal []int `keda:"name=sliceVal, order=triggerMetadata"` - SliceValWithSpaces []int `keda:"name=sliceValWithSpaces, order=triggerMetadata"` + SliceVal []int `keda:"name=sliceVal, order=triggerMetadata"` + SliceValWithSpaces []int `keda:"name=sliceValWithSpaces, order=triggerMetadata"` + SliceValWithOtherSeparator []int `keda:"name=sliceValWithOtherSeparator, order=triggerMetadata, separator=;"` } ts := testStruct{} @@ -237,6 +239,10 @@ func TestSlice(t *testing.T) { Expect(ts.SliceValWithSpaces[0]).To(Equal(1)) Expect(ts.SliceValWithSpaces[1]).To(Equal(2)) Expect(ts.SliceValWithSpaces[2]).To(Equal(3)) + Expect(ts.SliceValWithOtherSeparator).To(HaveLen(3)) + Expect(ts.SliceValWithOtherSeparator[0]).To(Equal(1)) + Expect(ts.SliceValWithOtherSeparator[1]).To(Equal(2)) + Expect(ts.SliceValWithOtherSeparator[2]).To(Equal(3)) } // TestEnum tests the enum type