Skip to content
Open
Show file tree
Hide file tree
Changes from 2 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
1 change: 1 addition & 0 deletions cmd/create/autoscaler/cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ var _ = Describe("create autoscaler", func() {
VerifyJQ(`.resource_limits.cores.max`, 0.0),
))
args := &clusterautoscaler.AutoscalerArgs{}
args.ScaleDown.UtilizationThreshold = 0.5
args.LogVerbosity = 3
args.ResourceLimits.MaxNodesTotal = 20
runner := CreateAutoscalerRunner(args)
Expand Down
1 change: 1 addition & 0 deletions cmd/edit/autoscaler/cmd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ var _ = Describe("edit autoscaler", func() {
VerifyJQ(`.resource_limits.cores.max`, 30.0),
))
args := &clusterautoscaler.AutoscalerArgs{}
args.ScaleDown.UtilizationThreshold = 0.5
args.LogVerbosity = 1
args.ResourceLimits.MaxNodesTotal = 20
runner := EditAutoscalerRunner(args)
Expand Down
42 changes: 21 additions & 21 deletions pkg/clusterautoscaler/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ func AddClusterAutoscalerFlags(cmd *cobra.Command, prefix string) *AutoscalerArg
fmt.Sprintf("%s%s", prefix, scaleDownUtilizationThresholdFlag),
0.5,
fmt.Sprintf("Node utilization level, defined as sum of requested resources divided by capacity, "+
"below which a node can be considered for scale down. Value should be between 0 and 1. %s",
"below which a node can be considered for scale down. Value must be greater than 0 and less than 1. %s",
classicOnlyHelpMsg),
)

Expand Down Expand Up @@ -365,7 +365,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.NonNegativeInt32Validator(result.LogVerbosity); err != nil {
return nil, fmt.Errorf("Error validating log-verbosity: %s", err)
return nil, fmt.Errorf("error validating log-verbosity: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, balancingIgnoredLabelsFlag)) {
Expand All @@ -387,7 +387,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.ValidateBalancingIgnoredLabels(strings.Join(result.BalancingIgnoredLabels, ",")); err != nil {
return nil, fmt.Errorf("Error validating balancing-ignored-labels: %s", err)
return nil, fmt.Errorf("error validating balancing-ignored-labels: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, ignoreDaemonsetsUtilizationFlag)) {
Expand Down Expand Up @@ -436,7 +436,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.NonNegativeInt32Validator(result.MaxPodGracePeriod); err != nil {
return nil, fmt.Errorf("Error validating max-pod-grace-period: %s", err)
return nil, fmt.Errorf("error validating max-pod-grace-period: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, podPriorityThresholdFlag)) {
Expand Down Expand Up @@ -470,7 +470,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.NonNegativeInt32Validator(result.ResourceLimits.MaxNodesTotal); err != nil {
return nil, fmt.Errorf("Error validating max-nodes-total: %s", err)
return nil, fmt.Errorf("error validating max-nodes-total: %s", err)
}

if autoscalerValidationArgs != nil && !autoscalerValidationArgs.IsHostedCp {
Expand All @@ -489,7 +489,7 @@ func GetAutoscalerOptions(
}
}
if err = ocm.NonNegativeInt32Validator(result.ResourceLimits.Cores.Min); err != nil {
return nil, fmt.Errorf("Error validating min-cores: %s", err)
return nil, fmt.Errorf("error validating min-cores: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, maxCoresFlag)) {
Expand All @@ -508,11 +508,11 @@ func GetAutoscalerOptions(
}
}
if err := ocm.NonNegativeInt32Validator(result.ResourceLimits.Cores.Max); err != nil {
return nil, fmt.Errorf("Error validating max-cores: %s", err)
return nil, fmt.Errorf("error validating max-cores: %s", err)
}

if err := getValidMaxRangeValidator(result.ResourceLimits.Cores.Min)(result.ResourceLimits.Cores.Max); err != nil {
return nil, fmt.Errorf("Error validating cores range: %s", err)
return nil, fmt.Errorf("error validating cores range: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, minMemoryFlag)) {
Expand All @@ -530,7 +530,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.NonNegativeInt32Validator(result.ResourceLimits.Memory.Min); err != nil {
return nil, fmt.Errorf("Error validating min-memory: %s", err)
return nil, fmt.Errorf("error validating min-memory: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, maxMemoryFlag)) {
Expand All @@ -549,11 +549,11 @@ func GetAutoscalerOptions(
}
}
if err := ocm.NonNegativeInt32Validator(result.ResourceLimits.Memory.Max); err != nil {
return nil, fmt.Errorf("Error validating max-memory: %s", err)
return nil, fmt.Errorf("error validating max-memory: %s", err)
}

if err := getValidMaxRangeValidator(result.ResourceLimits.Memory.Min)(result.ResourceLimits.Memory.Max); err != nil {
return nil, fmt.Errorf("Error validating memory range: %s", err)
return nil, fmt.Errorf("error validating memory range: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, gpuLimitFlag)) {
Expand Down Expand Up @@ -622,7 +622,7 @@ func GetAutoscalerOptions(
}

if err := getValidMaxRangeValidator(gpuLimit.Range.Min)(gpuLimit.Range.Max); err != nil {
return nil, fmt.Errorf("Error validating GPU range: %s", err)
return nil, fmt.Errorf("error validating GPU range: %s", err)
}
}

Expand Down Expand Up @@ -656,7 +656,7 @@ func GetAutoscalerOptions(
}

if err := ocm.PositiveDurationStringValidator(result.ScaleDown.UnneededTime); err != nil {
return nil, fmt.Errorf("Error validating unneeded-time: %s", err)
return nil, fmt.Errorf("error validating unneeded-time: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, scaleDownUtilizationThresholdFlag)) {
Expand All @@ -674,7 +674,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.PercentageValidator(result.ScaleDown.UtilizationThreshold); err != nil {
return nil, fmt.Errorf("Error validating utilization-threshold: %s", err)
return nil, fmt.Errorf("error validating utilization-threshold: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, scaleDownDelayAfterAddFlag)) {
Expand All @@ -692,7 +692,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.PositiveDurationStringValidator(result.ScaleDown.DelayAfterAdd); err != nil {
return nil, fmt.Errorf("Error validating delay-after-add: %s", err)
return nil, fmt.Errorf("error validating delay-after-add: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, scaleDownDelayAfterDeleteFlag)) {
Expand All @@ -710,7 +710,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.PositiveDurationStringValidator(result.ScaleDown.DelayAfterDelete); err != nil {
return nil, fmt.Errorf("Error validating delay-after-delete: %s", err)
return nil, fmt.Errorf("error validating delay-after-delete: %s", err)
}

if interactive.Enabled() && !cmd.Changed(fmt.Sprintf("%s%s", prefix, scaleDownDelayAfterFailureFlag)) {
Expand All @@ -728,7 +728,7 @@ func GetAutoscalerOptions(
}
}
if err := ocm.PositiveDurationStringValidator(result.ScaleDown.DelayAfterFailure); err != nil {
return nil, fmt.Errorf("Error validating delay-after-failure: %s", err)
return nil, fmt.Errorf("error validating delay-after-failure: %s", err)
}
}

Expand Down Expand Up @@ -867,12 +867,12 @@ func parseGPULimit(s string) (ocm.GPULimit, error) {

gpuLimitMin, err := strconv.Atoi(parameters[1])
if err != nil {
return ocm.GPULimit{}, fmt.Errorf("Failed parsing '%s' into an integer: %s", parameters[1], err)
return ocm.GPULimit{}, fmt.Errorf("failed parsing '%s' into an integer: %s", parameters[1], err)
}

gpuLimitMax, err := strconv.Atoi(parameters[2])
if err != nil {
return ocm.GPULimit{}, fmt.Errorf("Failed parsing '%s' into an integer: %s", parameters[2], err)
return ocm.GPULimit{}, fmt.Errorf("failed parsing '%s' into an integer: %s", parameters[2], err)
}

return ocm.GPULimit{Type: parameters[0], Range: ocm.ResourceRange{Min: gpuLimitMin, Max: gpuLimitMax}}, nil
Expand All @@ -888,11 +888,11 @@ func getValidMaxRangeValidator(min int) func(interface{}) error {

max, err := strconv.Atoi(fmt.Sprintf("%v", val))
if err != nil {
return fmt.Errorf("Failed parsing '%v' to an integer number.", val)
return fmt.Errorf("failed parsing '%v' to an integer number", val)
}

if max < min {
return fmt.Errorf("max value must be greater or equal than min value %d.", min)
return fmt.Errorf("max value must be greater or equal than min value %d", min)
}

return nil
Expand Down
17 changes: 9 additions & 8 deletions pkg/ocm/validators.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ocm

import (
"fmt"
"math"
"strconv"
"time"

Expand All @@ -14,7 +15,7 @@ func Int32Validator(val interface{}) error {
}
_, err := strconv.ParseInt(fmt.Sprintf("%v", val), 10, 32)
if err != nil {
return fmt.Errorf("Should provide an integer number between -2147483648 to 2147483647.")
return fmt.Errorf("should provide an integer number between -2147483648 to 2147483647")
}
return nil
}
Expand All @@ -25,11 +26,11 @@ func NonNegativeInt32Validator(val interface{}) error {
}
number, err := strconv.ParseInt(fmt.Sprintf("%v", val), 10, 32)
if err != nil {
return fmt.Errorf("Should provide an integer number between 0 to 2147483647.")
return fmt.Errorf("should provide an integer number between 0 to 2147483647")
}

if number < 0 {
return fmt.Errorf("Number must be greater or equal to zero.")
return fmt.Errorf("number must be greater or equal to zero")
}

return nil
Expand All @@ -42,7 +43,7 @@ func PositiveDurationStringValidator(val interface{}) error {
input, ok := val.(string)

if !ok {
return fmt.Errorf("Can only validate strings, got %v", val)
return fmt.Errorf("can only validate strings, got %v", val)
}

duration, err := time.ParseDuration(input)
Expand All @@ -52,7 +53,7 @@ func PositiveDurationStringValidator(val interface{}) error {
}

if duration < 0 {
return fmt.Errorf("Only positive durations are allowed, got '%v'", val)
return fmt.Errorf("only positive durations are allowed, got '%v'", val)
}

return nil
Expand All @@ -65,11 +66,11 @@ func PercentageValidator(val interface{}) error {

number, err := strconv.ParseFloat(fmt.Sprintf("%v", val), commonUtils.MaxByteSize)
if err != nil {
return fmt.Errorf("Failed parsing '%v' into a floating-point number.", val)
return fmt.Errorf("failed parsing '%v' into a floating-point number", val)
}

if number > 1 || number < 0 {
return fmt.Errorf("Expecting a floating-point number between 0 and 1.")
if number >= 1 || number <= 0 || math.IsNaN(number) {
return fmt.Errorf("expecting a floating-point number greater than 0 and less than 1, got %v", number)
}

return nil
Expand Down
12 changes: 12 additions & 0 deletions pkg/ocm/validators_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,18 @@ var _ = Describe("Input Validators", Ordered, func() {
Expect(PercentageValidator("-0.1")).ToNot(BeNil())
})

It("raises an error if got exactly 0", func() {
Expect(PercentageValidator("0")).ToNot(BeNil())
})

It("raises an error if got exactly 1", func() {
Expect(PercentageValidator("1")).ToNot(BeNil())
Comment thread
olucasfreitas marked this conversation as resolved.
})

It("raises an error if got NaN", func() {
Expect(PercentageValidator("NaN")).ToNot(BeNil())
})

It("successfully parses a valid percentage value", func() {
Expect(PercentageValidator("0.4")).To(BeNil())
})
Expand Down
Loading