Skip to content

Commit

Permalink
Make seperator configurable
Browse files Browse the repository at this point in the history
Signed-off-by: Rick Brouwer <rickbrouwer@gmail.com>
  • Loading branch information
rickbrouwer committed Sep 5, 2024
1 parent c8d137f commit 51a1765
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 25 deletions.
4 changes: 2 additions & 2 deletions pkg/scalers/elasticsearch_scaler.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"`
Expand Down
12 changes: 6 additions & 6 deletions pkg/scalers/elasticsearch_scaler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down
42 changes: 29 additions & 13 deletions pkg/scalers/scalersconfig/typed_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ const (

// separators for map and slice elements
const (
elemSeparator = ",;"
elemSeparator = ","
elemKeyValSeparator = "="
)

Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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] {
Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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:
Expand Down
14 changes: 10 additions & 4 deletions pkg/scalers/scalersconfig/typed_config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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{}
Expand All @@ -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
Expand Down

0 comments on commit 51a1765

Please sign in to comment.