Experimental Cluster Autoscaler configuration object
This commit is contained in:
@@ -501,3 +501,40 @@ func validateIngressBackend(backend *experimental.IngressBackend) errs.Validatio
|
||||
}
|
||||
return allErrs
|
||||
}
|
||||
|
||||
func validateClusterAutoscalerSpec(spec experimental.ClusterAutoscalerSpec) errs.ValidationErrorList {
|
||||
allErrs := errs.ValidationErrorList{}
|
||||
if spec.MinNodes < 0 {
|
||||
allErrs = append(allErrs, errs.NewFieldInvalid("minNodes", spec.MinNodes, `must be non-negative`))
|
||||
}
|
||||
if spec.MaxNodes < spec.MinNodes {
|
||||
allErrs = append(allErrs, errs.NewFieldInvalid("maxNodes", spec.MaxNodes, `must be bigger or equal to minNodes`))
|
||||
}
|
||||
if len(spec.TargetUtilization) == 0 {
|
||||
allErrs = append(allErrs, errs.NewFieldRequired("targetUtilization"))
|
||||
}
|
||||
for _, target := range spec.TargetUtilization {
|
||||
if len(target.Resource) == 0 {
|
||||
allErrs = append(allErrs, errs.NewFieldRequired("targetUtilization.resource"))
|
||||
}
|
||||
if target.Value <= 0 {
|
||||
allErrs = append(allErrs, errs.NewFieldInvalid("targetUtilization.value", target.Value, "must be greater than 0"))
|
||||
}
|
||||
if target.Value > 1 {
|
||||
allErrs = append(allErrs, errs.NewFieldInvalid("targetUtilization.value", target.Value, "must be less or equal 1"))
|
||||
}
|
||||
}
|
||||
return allErrs
|
||||
}
|
||||
|
||||
func ValidateClusterAutoscaler(autoscaler *experimental.ClusterAutoscaler) errs.ValidationErrorList {
|
||||
allErrs := errs.ValidationErrorList{}
|
||||
if autoscaler.Name != "ClusterAutoscaler" {
|
||||
allErrs = append(allErrs, errs.NewFieldInvalid("name", autoscaler.Name, `name must be ClusterAutoscaler`))
|
||||
}
|
||||
if autoscaler.Namespace != api.NamespaceDefault {
|
||||
allErrs = append(allErrs, errs.NewFieldInvalid("namespace", autoscaler.Namespace, `namespace must be default`))
|
||||
}
|
||||
allErrs = append(allErrs, validateClusterAutoscalerSpec(autoscaler.Spec)...)
|
||||
return allErrs
|
||||
}
|
||||
|
||||
@@ -950,3 +950,117 @@ func TestValidateIngress(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidateClusterAutoscaler(t *testing.T) {
|
||||
successCases := []experimental.ClusterAutoscaler{
|
||||
{
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "ClusterAutoscaler",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: experimental.ClusterAutoscalerSpec{
|
||||
MinNodes: 1,
|
||||
MaxNodes: 5,
|
||||
TargetUtilization: []experimental.NodeUtilization{
|
||||
{
|
||||
Resource: experimental.CpuRequest,
|
||||
Value: 0.7,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
for _, successCase := range successCases {
|
||||
if errs := ValidateClusterAutoscaler(&successCase); len(errs) != 0 {
|
||||
t.Errorf("expected success: %v", errs)
|
||||
}
|
||||
}
|
||||
|
||||
errorCases := map[string]experimental.ClusterAutoscaler{
|
||||
"name must be ClusterAutoscaler": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "TestClusterAutoscaler",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: experimental.ClusterAutoscalerSpec{
|
||||
MinNodes: 1,
|
||||
MaxNodes: 5,
|
||||
TargetUtilization: []experimental.NodeUtilization{
|
||||
{
|
||||
Resource: experimental.CpuRequest,
|
||||
Value: 0.7,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"namespace must be default": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "ClusterAutoscaler",
|
||||
Namespace: "test",
|
||||
},
|
||||
Spec: experimental.ClusterAutoscalerSpec{
|
||||
MinNodes: 1,
|
||||
MaxNodes: 5,
|
||||
TargetUtilization: []experimental.NodeUtilization{
|
||||
{
|
||||
Resource: experimental.CpuRequest,
|
||||
Value: 0.7,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
`must be non-negative`: {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "ClusterAutoscaler",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: experimental.ClusterAutoscalerSpec{
|
||||
MinNodes: -1,
|
||||
MaxNodes: 5,
|
||||
TargetUtilization: []experimental.NodeUtilization{
|
||||
{
|
||||
Resource: experimental.CpuRequest,
|
||||
Value: 0.7,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
`must be bigger or equal to minNodes`: {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "ClusterAutoscaler",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: experimental.ClusterAutoscalerSpec{
|
||||
MinNodes: 10,
|
||||
MaxNodes: 5,
|
||||
TargetUtilization: []experimental.NodeUtilization{
|
||||
{
|
||||
Resource: experimental.CpuRequest,
|
||||
Value: 0.7,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
"required value": {
|
||||
ObjectMeta: api.ObjectMeta{
|
||||
Name: "ClusterAutoscaler",
|
||||
Namespace: api.NamespaceDefault,
|
||||
},
|
||||
Spec: experimental.ClusterAutoscalerSpec{
|
||||
MinNodes: 1,
|
||||
MaxNodes: 5,
|
||||
TargetUtilization: []experimental.NodeUtilization{},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for k, v := range errorCases {
|
||||
errs := ValidateClusterAutoscaler(&v)
|
||||
if len(errs) == 0 {
|
||||
t.Errorf("expected failure for %s", k)
|
||||
} else if !strings.Contains(errs[0].Error(), k) {
|
||||
t.Errorf("unexpected error: %v, expected: %s", errs[0], k)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user