From 1385d49a5a1bd1065ee68025f0887df340265a64 Mon Sep 17 00:00:00 2001 From: kartik-579 Date: Thu, 18 Nov 2021 15:44:40 +0530 Subject: [PATCH 1/6] fixed template validation bug --- util/ValidatorHelper.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/util/ValidatorHelper.go b/util/ValidatorHelper.go index 278989cc6b..a993292ff9 100644 --- a/util/ValidatorHelper.go +++ b/util/ValidatorHelper.go @@ -119,6 +119,9 @@ func ParseFloat(str string) (float64, error) { } func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { + if dat == nil{ + return true, nil + } limit, ok := dat["resources"].(map[string]interface{})["limits"].(map[string]interface{}) if !ok { return false, errors.New("resources.limits is required") @@ -216,6 +219,9 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { } func AutoScale(dat map[string]interface{}) (bool, error) { + if dat == nil{ + return true, nil + } autoscaleEnabled, ok := dat["autoscaling"].(map[string]interface{})["enabled"] if !ok { return true, nil @@ -331,6 +337,9 @@ var ( ) func (f CpuChecker) IsFormat(input interface{}) bool { + if input == nil{ + return true + } asString, ok := input.(string) if !ok { return false @@ -346,6 +355,9 @@ func (f CpuChecker) IsFormat(input interface{}) bool { } func (f MemoryChecker) IsFormat(input interface{}) bool { + if input ==nil{ + return true + } asString, ok := input.(string) if !ok { return false From 92ceb6eb1204d4cafc78c743775008ccad7cc2e4 Mon Sep 17 00:00:00 2001 From: kartik-579 Date: Thu, 18 Nov 2021 15:45:52 +0530 Subject: [PATCH 2/6] wip --- util/ValidatorHelper.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util/ValidatorHelper.go b/util/ValidatorHelper.go index a993292ff9..6b052bc4b6 100644 --- a/util/ValidatorHelper.go +++ b/util/ValidatorHelper.go @@ -338,7 +338,7 @@ var ( func (f CpuChecker) IsFormat(input interface{}) bool { if input == nil{ - return true + return false } asString, ok := input.(string) if !ok { @@ -356,7 +356,7 @@ func (f CpuChecker) IsFormat(input interface{}) bool { func (f MemoryChecker) IsFormat(input interface{}) bool { if input ==nil{ - return true + return false } asString, ok := input.(string) if !ok { From 32e5f8968af391c5eb8ed5e82269422b08a63f3b Mon Sep 17 00:00:00 2001 From: kartik-579 Date: Thu, 18 Nov 2021 16:30:08 +0530 Subject: [PATCH 3/6] review changes --- util/ValidatorHelper.go | 88 +++++++++++++++++++++++++++-------------- 1 file changed, 58 insertions(+), 30 deletions(-) diff --git a/util/ValidatorHelper.go b/util/ValidatorHelper.go index 6b052bc4b6..67a3c3ea62 100644 --- a/util/ValidatorHelper.go +++ b/util/ValidatorHelper.go @@ -20,6 +20,34 @@ type resourceParser struct { var memoryParser *resourceParser var cpuParser *resourceParser +func getResourcesLimitsKeys(envoyProxy bool) []string { + if envoyProxy { + return []string{"envoyproxy", "resources", "limits"} + } else { + return []string{"resources", "limits"} + } +} +func getResourcesRequestsKeys(envoyProxy bool) []string { + if envoyProxy { + return []string{"envoyproxy", "resources", "requests"} + } else { + return []string{"resources", "requests"} + } +} + +func validateResourcesAssignment(dat map[string]interface{}, validationKeys []string) (validatedMap map[string]interface{},validationSuccessful bool) { + var test map[string]interface{} + test = dat + for _, validationKey := range validationKeys { + if test[validationKey] != nil { + test = test[validationKey].(map[string]interface{}) + } else { + return nil,false + } + } + return test,true +} + func MemoryToNumber(memory string) (float64, error) { if memoryParser == nil { pattern := "(\\d*e?\\d*)(Ei?|Pi?|Ti?|Gi?|Mi?|Ki?|$)" @@ -119,15 +147,15 @@ func ParseFloat(str string) (float64, error) { } func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { - if dat == nil{ + if dat == nil { return true, nil } - limit, ok := dat["resources"].(map[string]interface{})["limits"].(map[string]interface{}) - if !ok { - return false, errors.New("resources.limits is required") + limit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(false)) + if !validationSuccessful { + return false, errors.New("resources.limits is required") } - envoproxyLimit, ok := dat["envoyproxy"].(map[string]interface{})["resources"].(map[string]interface{})["limits"].(map[string]interface{}) - if !ok { + envoproxyLimit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(true)) + if !validationSuccessful { return false, errors.New("envoproxy.resources.limits is required") } checkCPUlimit, ok := limit["cpu"] @@ -146,12 +174,12 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { if !ok { return false, errors.New("envoyproxy.resources.limits.memory is required") } - request, ok := dat["resources"].(map[string]interface{})["requests"].(map[string]interface{}) - if !ok { + request, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(false)) + if !validationSuccessful { return true, nil } - envoproxyRequest, ok := dat["envoyproxy"].(map[string]interface{})["resources"].(map[string]interface{})["requests"].(map[string]interface{}) - if !ok { + envoproxyRequest, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(true)) + if !validationSuccessful { return true, nil } checkCPURequests, ok := request["cpu"] @@ -205,13 +233,13 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { return false, err } - if (envoproxyCPULimit < envoproxyCPURequest){ + if envoproxyCPULimit < envoproxyCPURequest { return false, errors.New("envoyproxy.resources.limits.cpu must be greater than or equal to envoyproxy.resources.requests.cpu") - }else if (envoproxyMemoryLimit < envoproxyMemoryRequest){ + } else if envoproxyMemoryLimit < envoproxyMemoryRequest { return false, errors.New("envoyproxy.resources.limits.memory must be greater than or equal to envoyproxy.resources.requests.memory") - }else if (cpuLimit < cpuRequest) { + } else if cpuLimit < cpuRequest { return false, errors.New("resources.limits.cpu must be greater than or equal to resources.requests.cpu") - }else if (memoryLimit < memoryRequest) { + } else if memoryLimit < memoryRequest { return false, errors.New("resources.limits.memory must be greater than or equal to resources.requests.memory") } return true, nil @@ -219,7 +247,7 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { } func AutoScale(dat map[string]interface{}) (bool, error) { - if dat == nil{ + if dat == nil { return true, nil } autoscaleEnabled, ok := dat["autoscaling"].(map[string]interface{})["enabled"] @@ -227,12 +255,12 @@ func AutoScale(dat map[string]interface{}) (bool, error) { return true, nil } if autoscaleEnabled.(bool) { - limit, ok := dat["resources"].(map[string]interface{})["limits"].(map[string]interface{}) - if !ok { + limit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(false)) + if !validationSuccessful { return false, errors.New("resources.limits is required") } - envoproxyLimit, ok := dat["envoyproxy"].(map[string]interface{})["resources"].(map[string]interface{})["limits"].(map[string]interface{}) - if !ok { + envoproxyLimit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(true)) + if !validationSuccessful { return false, errors.New("envoproxy.resources.limits is required") } checkCPUlimit, ok := limit["cpu"] @@ -251,12 +279,12 @@ func AutoScale(dat map[string]interface{}) (bool, error) { if !ok { return false, errors.New("envoyproxy.resources.limits.memory is required") } - request, ok := dat["resources"].(map[string]interface{})["requests"].(map[string]interface{}) - if !ok { + request, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(false)) + if !validationSuccessful { return false, errors.New("resources.requests is required") } - envoproxyRequest, ok := dat["envoyproxy"].(map[string]interface{})["resources"].(map[string]interface{})["requests"].(map[string]interface{}) - if !ok { + envoproxyRequest, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(true)) + if !validationSuccessful { return false, errors.New("envoyproxy.resources.requests is required") } checkCPURequests, ok := request["cpu"] @@ -310,15 +338,15 @@ func AutoScale(dat map[string]interface{}) (bool, error) { return false, err } - if (envoproxyCPULimit < envoproxyCPURequest){ + if envoproxyCPULimit < envoproxyCPURequest { return false, errors.New("envoyproxy.resources.limits.cpu must be greater than or equal to envoyproxy.resources.requests.cpu") - }else if (envoproxyMemoryLimit < envoproxyMemoryRequest){ + } else if envoproxyMemoryLimit < envoproxyMemoryRequest { return false, errors.New("envoyproxy.resources.limits.memory must be greater than or equal to envoyproxy.resources.requests.memory") - }else if (cpuLimit < cpuRequest) { + } else if cpuLimit < cpuRequest { return false, errors.New("resources.limits.cpu must be greater than or equal to resources.requests.cpu") - }else if (memoryLimit < memoryRequest) { + } else if memoryLimit < memoryRequest { return false, errors.New("resources.limits.memory must be greater than or equal to resources.requests.memory") - }else { + } else { return true, nil } } else { @@ -337,7 +365,7 @@ var ( ) func (f CpuChecker) IsFormat(input interface{}) bool { - if input == nil{ + if input == nil { return false } asString, ok := input.(string) @@ -355,7 +383,7 @@ func (f CpuChecker) IsFormat(input interface{}) bool { } func (f MemoryChecker) IsFormat(input interface{}) bool { - if input ==nil{ + if input == nil { return false } asString, ok := input.(string) From 74c11f681e9c4f47cac984e6a7d22adbe98d707c Mon Sep 17 00:00:00 2001 From: kartik-579 Date: Thu, 18 Nov 2021 17:20:51 +0530 Subject: [PATCH 4/6] review changes --- util/ValidateHelper_test.go | 32 ++++++++++++++++++++++++ util/ValidatorHelper.go | 50 ++++++++++--------------------------- util/helper_test.go | 16 ++++++------ 3 files changed, 53 insertions(+), 45 deletions(-) create mode 100644 util/ValidateHelper_test.go diff --git a/util/ValidateHelper_test.go b/util/ValidateHelper_test.go new file mode 100644 index 0000000000..b74392f210 --- /dev/null +++ b/util/ValidateHelper_test.go @@ -0,0 +1,32 @@ +package util + +import "testing" + +func TestCompareLimit(t *testing.T) { + var dat map[string]interface{} + var err error + + //first test case + dat = nil + _, err = CompareLimitsRequests(dat) + if err != nil { + t.Errorf("CompareLimitsRequests(nil) gives err = %s, want = nil", err) + } + + //second test case + var limits interface{} + dat = map[string]interface{}{"resources": limits} + _, err = CompareLimitsRequests(dat) + if err != nil { + t.Errorf("CompareLimitsRequests(nil) gives err = %s, want = nil", err) + } + + //third test case + var resources interface{} + resources = map[string]interface{}{"resources": limits} + dat = map[string]interface{}{"envoyproxy": resources} + _, err = CompareLimitsRequests(dat) + if err != nil { + t.Errorf("CompareLimitsRequests(nil) gives err = %s, want = nil", err) + } +} diff --git a/util/ValidatorHelper.go b/util/ValidatorHelper.go index 67a3c3ea62..dda624ed81 100644 --- a/util/ValidatorHelper.go +++ b/util/ValidatorHelper.go @@ -35,17 +35,17 @@ func getResourcesRequestsKeys(envoyProxy bool) []string { } } -func validateResourcesAssignment(dat map[string]interface{}, validationKeys []string) (validatedMap map[string]interface{},validationSuccessful bool) { +func validateAndBuildResourcesAssignment(dat map[string]interface{}, validationKeys []string) (validatedMap map[string]interface{}) { var test map[string]interface{} test = dat for _, validationKey := range validationKeys { if test[validationKey] != nil { test = test[validationKey].(map[string]interface{}) } else { - return nil,false + return map[string]interface{}{"cpu": "0", "memory": "0"} } } - return test,true + return test } func MemoryToNumber(memory string) (float64, error) { @@ -150,14 +150,8 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { if dat == nil { return true, nil } - limit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(false)) - if !validationSuccessful { - return false, errors.New("resources.limits is required") - } - envoproxyLimit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(true)) - if !validationSuccessful { - return false, errors.New("envoproxy.resources.limits is required") - } + limit := validateAndBuildResourcesAssignment(dat, getResourcesLimitsKeys(false)) + envoproxyLimit := validateAndBuildResourcesAssignment(dat, getResourcesLimitsKeys(true)) checkCPUlimit, ok := limit["cpu"] if !ok { return false, errors.New("resources.limits.cpu is required") @@ -174,14 +168,8 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { if !ok { return false, errors.New("envoyproxy.resources.limits.memory is required") } - request, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(false)) - if !validationSuccessful { - return true, nil - } - envoproxyRequest, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(true)) - if !validationSuccessful { - return true, nil - } + request := validateAndBuildResourcesAssignment(dat, getResourcesRequestsKeys(false)) + envoproxyRequest := validateAndBuildResourcesAssignment(dat, getResourcesRequestsKeys(true)) checkCPURequests, ok := request["cpu"] if !ok { return true, nil @@ -233,7 +221,7 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { return false, err } - if envoproxyCPULimit < envoproxyCPURequest { + if envoproxyCPULimit < envoproxyCPURequest && envoproxyCPULimit != 0 { return false, errors.New("envoyproxy.resources.limits.cpu must be greater than or equal to envoyproxy.resources.requests.cpu") } else if envoproxyMemoryLimit < envoproxyMemoryRequest { return false, errors.New("envoyproxy.resources.limits.memory must be greater than or equal to envoyproxy.resources.requests.memory") @@ -255,14 +243,8 @@ func AutoScale(dat map[string]interface{}) (bool, error) { return true, nil } if autoscaleEnabled.(bool) { - limit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(false)) - if !validationSuccessful { - return false, errors.New("resources.limits is required") - } - envoproxyLimit, validationSuccessful := validateResourcesAssignment(dat, getResourcesLimitsKeys(true)) - if !validationSuccessful { - return false, errors.New("envoproxy.resources.limits is required") - } + limit := validateAndBuildResourcesAssignment(dat, getResourcesLimitsKeys(false)) + envoproxyLimit := validateAndBuildResourcesAssignment(dat, getResourcesLimitsKeys(true)) checkCPUlimit, ok := limit["cpu"] if !ok { return false, errors.New("resources.limits.cpu is required") @@ -279,14 +261,8 @@ func AutoScale(dat map[string]interface{}) (bool, error) { if !ok { return false, errors.New("envoyproxy.resources.limits.memory is required") } - request, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(false)) - if !validationSuccessful { - return false, errors.New("resources.requests is required") - } - envoproxyRequest, validationSuccessful := validateResourcesAssignment(dat, getResourcesRequestsKeys(true)) - if !validationSuccessful { - return false, errors.New("envoyproxy.resources.requests is required") - } + request := validateAndBuildResourcesAssignment(dat, getResourcesRequestsKeys(false)) + envoproxyRequest := validateAndBuildResourcesAssignment(dat, getResourcesRequestsKeys(true)) checkCPURequests, ok := request["cpu"] if !ok { return false, errors.New("resources.requests.cpu is required") @@ -338,7 +314,7 @@ func AutoScale(dat map[string]interface{}) (bool, error) { return false, err } - if envoproxyCPULimit < envoproxyCPURequest { + if envoproxyCPULimit < envoproxyCPURequest && envoproxyCPULimit != 0 { return false, errors.New("envoyproxy.resources.limits.cpu must be greater than or equal to envoyproxy.resources.requests.cpu") } else if envoproxyMemoryLimit < envoproxyMemoryRequest { return false, errors.New("envoyproxy.resources.limits.memory must be greater than or equal to envoyproxy.resources.requests.memory") diff --git a/util/helper_test.go b/util/helper_test.go index 9c9d023324..435b230192 100644 --- a/util/helper_test.go +++ b/util/helper_test.go @@ -16,14 +16,14 @@ func TestAutoscale(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Autoscale(tt.args.dat) - if (err != nil) != tt.wantErr { - t.Errorf("Autoscale() error = %v, wantErr %v", err, tt.wantErr) - return - } - if got != tt.want { - t.Errorf("Autoscale() got = %v, want %v", got, tt.want) - } + //got, err := Autoscale(tt.args.dat) + //if (err != nil) != tt.wantErr { + // t.Errorf("Autoscale() error = %v, wantErr %v", err, tt.wantErr) + // return + //} + //if got != tt.want { + // t.Errorf("Autoscale() got = %v, want %v", got, tt.want) + //} }) } } From b1e49b3abb60cb1b0a05157e821a27704dfb71dc Mon Sep 17 00:00:00 2001 From: Prashant Ghildiyal Date: Thu, 18 Nov 2021 18:12:13 +0530 Subject: [PATCH 5/6] Added test cases for cpu and memory and fixed bug --- util/ValidateHelper_test.go | 32 --------------- util/ValidatorHelper.go | 7 ++-- util/ValidatorHelper_test.go | 75 ++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 36 deletions(-) delete mode 100644 util/ValidateHelper_test.go create mode 100644 util/ValidatorHelper_test.go diff --git a/util/ValidateHelper_test.go b/util/ValidateHelper_test.go deleted file mode 100644 index b74392f210..0000000000 --- a/util/ValidateHelper_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package util - -import "testing" - -func TestCompareLimit(t *testing.T) { - var dat map[string]interface{} - var err error - - //first test case - dat = nil - _, err = CompareLimitsRequests(dat) - if err != nil { - t.Errorf("CompareLimitsRequests(nil) gives err = %s, want = nil", err) - } - - //second test case - var limits interface{} - dat = map[string]interface{}{"resources": limits} - _, err = CompareLimitsRequests(dat) - if err != nil { - t.Errorf("CompareLimitsRequests(nil) gives err = %s, want = nil", err) - } - - //third test case - var resources interface{} - resources = map[string]interface{}{"resources": limits} - dat = map[string]interface{}{"envoyproxy": resources} - _, err = CompareLimitsRequests(dat) - if err != nil { - t.Errorf("CompareLimitsRequests(nil) gives err = %s, want = nil", err) - } -} diff --git a/util/ValidatorHelper.go b/util/ValidatorHelper.go index dda624ed81..17c7c9e128 100644 --- a/util/ValidatorHelper.go +++ b/util/ValidatorHelper.go @@ -220,14 +220,13 @@ func CompareLimitsRequests(dat map[string]interface{}) (bool, error) { if err != nil { return false, err } - if envoproxyCPULimit < envoproxyCPURequest && envoproxyCPULimit != 0 { return false, errors.New("envoyproxy.resources.limits.cpu must be greater than or equal to envoyproxy.resources.requests.cpu") - } else if envoproxyMemoryLimit < envoproxyMemoryRequest { + } else if envoproxyMemoryLimit < envoproxyMemoryRequest && envoproxyMemoryLimit != 0 { return false, errors.New("envoyproxy.resources.limits.memory must be greater than or equal to envoyproxy.resources.requests.memory") - } else if cpuLimit < cpuRequest { + } else if cpuLimit < cpuRequest && cpuLimit != 0 { return false, errors.New("resources.limits.cpu must be greater than or equal to resources.requests.cpu") - } else if memoryLimit < memoryRequest { + } else if memoryLimit < memoryRequest && memoryLimit != 0 { return false, errors.New("resources.limits.memory must be greater than or equal to resources.requests.memory") } return true, nil diff --git a/util/ValidatorHelper_test.go b/util/ValidatorHelper_test.go new file mode 100644 index 0000000000..8cb3413b35 --- /dev/null +++ b/util/ValidatorHelper_test.go @@ -0,0 +1,75 @@ +package util + +import "testing" + +func TestCompareLimitsRequests(t *testing.T) { + requests := "requests" + limits := "limits" + resources := "resources" + cpu := "cpu" + memory := "memory" + type args struct { + dat map[string]interface{} + } + tests := []struct { + name string + args args + want bool + wantErr bool + }{ + { + name: "empty base object", + args: args{dat: nil}, + want: true, + wantErr: false, + }, + { + name: "empty resources object", + args: args{dat: map[string]interface{}{resources: nil}}, + want: true, + wantErr: false, + }, + { + name: "empty resources requests limits object", + args: args{dat: map[string]interface{}{resources: map[string]interface{}{limits: nil, requests: nil}}}, + want: true, + wantErr: false, + }, + { + name: "non-empty resources limits object", + args: args{dat: map[string]interface{}{resources: map[string]interface{}{limits: map[string]interface{}{cpu: "10Gi", memory: ".1" }, requests: nil}}}, + want: true, + wantErr: false, + }, + { + name: "non-empty resources requests object", + args: args{dat: map[string]interface{}{resources: map[string]interface{}{limits: nil, requests: map[string]interface{}{cpu: "10Gi", memory: ".1" }}}}, + want: true, + wantErr: false, + }, + { + name: "non-empty and equal resources limits and requests object", + args: args{dat: map[string]interface{}{resources: map[string]interface{}{limits: map[string]interface{}{cpu: "10Gi", memory: ".1" }, requests: map[string]interface{}{cpu: "10Gi", memory: ".1" }}}}, + want: true, + wantErr: false, + }, + { + name: "negative: non-empty and not equal resources limits and requests object", + args: args{dat: map[string]interface{}{resources: map[string]interface{}{limits: map[string]interface{}{cpu: "10Gi", memory: ".1" }, requests: map[string]interface{}{cpu: "11Gi", memory: ".15" }}}}, + want: false, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := CompareLimitsRequests(tt.args.dat) + if (err != nil) != tt.wantErr { + t.Errorf("CompareLimitsRequests() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("CompareLimitsRequests() got = %v, want %v", got, tt.want) + } + }) + } +} From 9bee78408ec4fbe52e6a4fb22642860c3e1c5523 Mon Sep 17 00:00:00 2001 From: kartik-579 Date: Thu, 18 Nov 2021 18:54:20 +0530 Subject: [PATCH 6/6] review changes --- util/ValidatorHelper.go | 100 +++++------------------------------ util/ValidatorHelper_test.go | 71 +++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 86 deletions(-) diff --git a/util/ValidatorHelper.go b/util/ValidatorHelper.go index 17c7c9e128..c278d6b760 100644 --- a/util/ValidatorHelper.go +++ b/util/ValidatorHelper.go @@ -237,98 +237,26 @@ func AutoScale(dat map[string]interface{}) (bool, error) { if dat == nil { return true, nil } - autoscaleEnabled, ok := dat["autoscaling"].(map[string]interface{})["enabled"] - if !ok { - return true, nil - } - if autoscaleEnabled.(bool) { - limit := validateAndBuildResourcesAssignment(dat, getResourcesLimitsKeys(false)) - envoproxyLimit := validateAndBuildResourcesAssignment(dat, getResourcesLimitsKeys(true)) - checkCPUlimit, ok := limit["cpu"] - if !ok { - return false, errors.New("resources.limits.cpu is required") - } - checkMemorylimit, ok := limit["memory"] - if !ok { - return false, errors.New("resources.limits.memory is required") - } - checkEnvoproxyCPUlimit, ok := envoproxyLimit["cpu"] - if !ok { - return false, errors.New("envoyproxy.resources.limits.cpu is required") - } - checkEnvoproxyMemorylimit, ok := envoproxyLimit["memory"] - if !ok { - return false, errors.New("envoyproxy.resources.limits.memory is required") - } - request := validateAndBuildResourcesAssignment(dat, getResourcesRequestsKeys(false)) - envoproxyRequest := validateAndBuildResourcesAssignment(dat, getResourcesRequestsKeys(true)) - checkCPURequests, ok := request["cpu"] - if !ok { - return false, errors.New("resources.requests.cpu is required") - } - checkMemoryRequests, ok := request["memory"] - if !ok { - return false, errors.New("resources.requests.memory is required") - } - checkEnvoproxyCPURequests, ok := envoproxyRequest["cpu"] - if !ok { - return false, errors.New("envoyproxy.resources.requests.cpu is required") - } - checkEnvoproxyMemoryRequests, ok := envoproxyRequest["memory"] + if dat["autoscaling"]!=nil { + autoScaleEnabled, ok := dat["autoscaling"].(map[string]interface{})["enabled"] if !ok { - return false, errors.New("envoyproxy.resources.requests.memory is required") - } - - cpuLimit, err := CpuToNumber(checkCPUlimit.(string)) - if err != nil { - return false, err - } - memoryLimit, err := MemoryToNumber(checkMemorylimit.(string)) - if err != nil { - return false, err - } - cpuRequest, err := CpuToNumber(checkCPURequests.(string)) - if err != nil { - return false, err - } - memoryRequest, err := MemoryToNumber(checkMemoryRequests.(string)) - if err != nil { - return false, err - } - - envoproxyCPULimit, err := CpuToNumber(checkEnvoproxyCPUlimit.(string)) - if err != nil { - return false, err - } - envoproxyMemoryLimit, err := MemoryToNumber(checkEnvoproxyMemorylimit.(string)) - if err != nil { - return false, err - } - envoproxyCPURequest, err := CpuToNumber(checkEnvoproxyCPURequests.(string)) - if err != nil { - return false, err - } - envoproxyMemoryRequest, err := MemoryToNumber(checkEnvoproxyMemoryRequests.(string)) - if err != nil { - return false, err - } - - if envoproxyCPULimit < envoproxyCPURequest && envoproxyCPULimit != 0 { - return false, errors.New("envoyproxy.resources.limits.cpu must be greater than or equal to envoyproxy.resources.requests.cpu") - } else if envoproxyMemoryLimit < envoproxyMemoryRequest { - return false, errors.New("envoyproxy.resources.limits.memory must be greater than or equal to envoyproxy.resources.requests.memory") - } else if cpuLimit < cpuRequest { - return false, errors.New("resources.limits.cpu must be greater than or equal to resources.requests.cpu") - } else if memoryLimit < memoryRequest { - return false, errors.New("resources.limits.memory must be greater than or equal to resources.requests.memory") - } else { return true, nil } - } else { - return true, nil + if autoScaleEnabled.(bool) { + minReplicas, okMin := dat["autoscaling"].(map[string]interface{})["MinReplicas"] + maxReplicas, okMax := dat["autoscaling"].(map[string]interface{})["MaxReplicas"] + if !okMin || !okMax{ + return false, errors.New("autoscaling.MinReplicas and autoscaling.MaxReplicas are mandatory fields") + } + if minReplicas.(int) > maxReplicas.(int){ + return false, errors.New("autoscaling.MinReplicas can not be greater than autoscaling.MaxReplicas") + } + } } + return true,nil } + var ( CpuUnitChecker, _ = regexp.Compile("^([0-9.]+)m$") NoCpuUnitChecker, _ = regexp.Compile("^([0-9.]+)$") diff --git a/util/ValidatorHelper_test.go b/util/ValidatorHelper_test.go index 8cb3413b35..2e9c15727f 100644 --- a/util/ValidatorHelper_test.go +++ b/util/ValidatorHelper_test.go @@ -73,3 +73,74 @@ func TestCompareLimitsRequests(t *testing.T) { }) } } + +func TestAutoScale(t *testing.T) { + autoScaling := "autoscaling" + minReplicas := "MinReplicas" + maxReplicas := "MaxReplicas" + enabled := "enabled" + type args struct { + dat map[string]interface{} + } + tests := []struct { + name string + args args + want bool + wantErr bool + }{ + { + name: "empty base object", + args: args{dat: nil}, + want: true, + wantErr: false, + }, + { + name: "empty autoscaling object", + args: args{dat: map[string]interface{}{autoScaling: nil}}, + want: true, + wantErr: false, + }, + { + name: "negative : non-empty autoscaling empty enabled minReplicas maxReplicas object", + args: args{dat: map[string]interface{}{autoScaling: map[string]interface{}{}}}, + want: true, + wantErr: false, + }, + { + name: "non-empty autoscaling enabled minReplicas maxReplicas object", + args: args{dat: map[string]interface{}{autoScaling: map[string]interface{}{enabled: false,minReplicas: 10, maxReplicas:11}}}, + want: true, + wantErr: false, + }, + { + name: "non-empty autoscaling enabled minReplicas empty maxReplicas object", + args: args{dat: map[string]interface{}{autoScaling: map[string]interface{}{enabled: false,minReplicas: 11}}}, + want: true, + wantErr: false, + }, + { + name: "non-empty autoscaling minReplicas maxReplicas object empty enabled", + args: args{dat: map[string]interface{}{autoScaling: map[string]interface{}{minReplicas: 10, maxReplicas:11}}}, + want: true, + wantErr: false, + }, + { + name: "negative: non-empty and greater minReplicas than maxReplicas object", + args: args{dat: map[string]interface{}{autoScaling: map[string]interface{}{enabled: true, minReplicas: 10, maxReplicas:9}}}, + want: false, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := AutoScale(tt.args.dat) + if (err != nil) != tt.wantErr { + t.Errorf("AutoScale() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("AutoScale() got = %v, want %v", got, tt.want) + } + }) + } +} \ No newline at end of file