Commit f5a92cc1 authored by Brian Grant's avatar Brian Grant

Merge pull request #21865 from piosz/cluster-autoscaling-cleanup

Cluster autoscaling cleanup
parents b96d3be5 13a9f9f8
...@@ -47,8 +47,6 @@ func AddToScheme(scheme *runtime.Scheme) { ...@@ -47,8 +47,6 @@ func AddToScheme(scheme *runtime.Scheme) {
func addKnownTypes(scheme *runtime.Scheme) { func addKnownTypes(scheme *runtime.Scheme) {
// TODO this gets cleaned up when the types are fixed // TODO this gets cleaned up when the types are fixed
scheme.AddKnownTypes(SchemeGroupVersion, scheme.AddKnownTypes(SchemeGroupVersion,
&ClusterAutoscaler{},
&ClusterAutoscalerList{},
&Deployment{}, &Deployment{},
&DeploymentList{}, &DeploymentList{},
&DeploymentRollback{}, &DeploymentRollback{},
...@@ -75,8 +73,6 @@ func addKnownTypes(scheme *runtime.Scheme) { ...@@ -75,8 +73,6 @@ func addKnownTypes(scheme *runtime.Scheme) {
) )
} }
func (obj *ClusterAutoscaler) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *ClusterAutoscalerList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *Deployment) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } func (obj *Deployment) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *DeploymentList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } func (obj *DeploymentList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *DeploymentRollback) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } func (obj *DeploymentRollback) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
......
...@@ -768,67 +768,6 @@ type IngressBackend struct { ...@@ -768,67 +768,6 @@ type IngressBackend struct {
ServicePort intstr.IntOrString `json:"servicePort"` ServicePort intstr.IntOrString `json:"servicePort"`
} }
type NodeResource string
const (
// Percentage of node's CPUs that is currently used.
CpuConsumption NodeResource = "CpuConsumption"
// Percentage of node's CPUs that is currently requested for pods.
CpuRequest NodeResource = "CpuRequest"
// Percentage od node's memory that is currently used.
MemConsumption NodeResource = "MemConsumption"
// Percentage of node's CPUs that is currently requested for pods.
MemRequest NodeResource = "MemRequest"
)
// NodeUtilization describes what percentage of a particular resource is used on a node.
type NodeUtilization struct {
Resource NodeResource `json:"resource"`
// The accepted values are from 0 to 1.
Value float64 `json:"value"`
}
// Configuration of the Cluster Autoscaler
type ClusterAutoscalerSpec struct {
// Minimum number of nodes that the cluster should have.
MinNodes int `json:"minNodes"`
// Maximum number of nodes that the cluster should have.
MaxNodes int `json:"maxNodes"`
// Target average utilization of the cluster nodes. New nodes will be added if one of the
// targets is exceeded. Cluster size will be decreased if the current utilization is too low
// for all targets.
TargetUtilization []NodeUtilization `json:"target"`
}
type ClusterAutoscaler struct {
unversioned.TypeMeta `json:",inline"`
// Standard object's metadata.
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
// For now (experimental api) it is required that the name is set to "ClusterAutoscaler" and namespace is "default".
api.ObjectMeta `json:"metadata,omitempty"`
// Spec defines the desired behavior of this daemon set.
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
Spec ClusterAutoscalerSpec `json:"spec,omitempty"`
}
// There will be just one (or none) ClusterAutoscaler.
type ClusterAutoscalerList struct {
unversioned.TypeMeta `json:",inline"`
// Standard object's metadata.
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
unversioned.ListMeta `json:"metadata,omitempty"`
Items []ClusterAutoscaler `json:"items"`
}
// +genclient=true // +genclient=true
// ReplicaSet represents the configuration of a replica set. // ReplicaSet represents the configuration of a replica set.
......
...@@ -1030,55 +1030,6 @@ func deepCopy_v1beta1_CPUTargetUtilization(in CPUTargetUtilization, out *CPUTarg ...@@ -1030,55 +1030,6 @@ func deepCopy_v1beta1_CPUTargetUtilization(in CPUTargetUtilization, out *CPUTarg
return nil return nil
} }
func deepCopy_v1beta1_ClusterAutoscaler(in ClusterAutoscaler, out *ClusterAutoscaler, c *conversion.Cloner) error {
if err := deepCopy_unversioned_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err
}
if err := deepCopy_v1_ObjectMeta(in.ObjectMeta, &out.ObjectMeta, c); err != nil {
return err
}
if err := deepCopy_v1beta1_ClusterAutoscalerSpec(in.Spec, &out.Spec, c); err != nil {
return err
}
return nil
}
func deepCopy_v1beta1_ClusterAutoscalerList(in ClusterAutoscalerList, out *ClusterAutoscalerList, c *conversion.Cloner) error {
if err := deepCopy_unversioned_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err
}
if err := deepCopy_unversioned_ListMeta(in.ListMeta, &out.ListMeta, c); err != nil {
return err
}
if in.Items != nil {
out.Items = make([]ClusterAutoscaler, len(in.Items))
for i := range in.Items {
if err := deepCopy_v1beta1_ClusterAutoscaler(in.Items[i], &out.Items[i], c); err != nil {
return err
}
}
} else {
out.Items = nil
}
return nil
}
func deepCopy_v1beta1_ClusterAutoscalerSpec(in ClusterAutoscalerSpec, out *ClusterAutoscalerSpec, c *conversion.Cloner) error {
out.MinNodes = in.MinNodes
out.MaxNodes = in.MaxNodes
if in.TargetUtilization != nil {
out.TargetUtilization = make([]NodeUtilization, len(in.TargetUtilization))
for i := range in.TargetUtilization {
if err := deepCopy_v1beta1_NodeUtilization(in.TargetUtilization[i], &out.TargetUtilization[i], c); err != nil {
return err
}
}
} else {
out.TargetUtilization = nil
}
return nil
}
func deepCopy_v1beta1_DaemonSet(in DaemonSet, out *DaemonSet, c *conversion.Cloner) error { func deepCopy_v1beta1_DaemonSet(in DaemonSet, out *DaemonSet, c *conversion.Cloner) error {
if err := deepCopy_unversioned_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil { if err := deepCopy_unversioned_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err return err
...@@ -1663,12 +1614,6 @@ func deepCopy_v1beta1_ListOptions(in ListOptions, out *ListOptions, c *conversio ...@@ -1663,12 +1614,6 @@ func deepCopy_v1beta1_ListOptions(in ListOptions, out *ListOptions, c *conversio
return nil return nil
} }
func deepCopy_v1beta1_NodeUtilization(in NodeUtilization, out *NodeUtilization, c *conversion.Cloner) error {
out.Resource = in.Resource
out.Value = in.Value
return nil
}
func deepCopy_v1beta1_PodSecurityPolicy(in PodSecurityPolicy, out *PodSecurityPolicy, c *conversion.Cloner) error { func deepCopy_v1beta1_PodSecurityPolicy(in PodSecurityPolicy, out *PodSecurityPolicy, c *conversion.Cloner) error {
if err := deepCopy_unversioned_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil { if err := deepCopy_unversioned_TypeMeta(in.TypeMeta, &out.TypeMeta, c); err != nil {
return err return err
...@@ -2055,9 +2000,6 @@ func init() { ...@@ -2055,9 +2000,6 @@ func init() {
deepCopy_v1_VolumeSource, deepCopy_v1_VolumeSource,
deepCopy_v1beta1_APIVersion, deepCopy_v1beta1_APIVersion,
deepCopy_v1beta1_CPUTargetUtilization, deepCopy_v1beta1_CPUTargetUtilization,
deepCopy_v1beta1_ClusterAutoscaler,
deepCopy_v1beta1_ClusterAutoscalerList,
deepCopy_v1beta1_ClusterAutoscalerSpec,
deepCopy_v1beta1_DaemonSet, deepCopy_v1beta1_DaemonSet,
deepCopy_v1beta1_DaemonSetList, deepCopy_v1beta1_DaemonSetList,
deepCopy_v1beta1_DaemonSetSpec, deepCopy_v1beta1_DaemonSetSpec,
...@@ -2092,7 +2034,6 @@ func init() { ...@@ -2092,7 +2034,6 @@ func init() {
deepCopy_v1beta1_LabelSelector, deepCopy_v1beta1_LabelSelector,
deepCopy_v1beta1_LabelSelectorRequirement, deepCopy_v1beta1_LabelSelectorRequirement,
deepCopy_v1beta1_ListOptions, deepCopy_v1beta1_ListOptions,
deepCopy_v1beta1_NodeUtilization,
deepCopy_v1beta1_PodSecurityPolicy, deepCopy_v1beta1_PodSecurityPolicy,
deepCopy_v1beta1_PodSecurityPolicyList, deepCopy_v1beta1_PodSecurityPolicyList,
deepCopy_v1beta1_PodSecurityPolicySpec, deepCopy_v1beta1_PodSecurityPolicySpec,
......
...@@ -37,8 +37,6 @@ func AddToScheme(scheme *runtime.Scheme) { ...@@ -37,8 +37,6 @@ func AddToScheme(scheme *runtime.Scheme) {
// Adds the list of known types to api.Scheme. // Adds the list of known types to api.Scheme.
func addKnownTypes(scheme *runtime.Scheme) { func addKnownTypes(scheme *runtime.Scheme) {
scheme.AddKnownTypes(SchemeGroupVersion, scheme.AddKnownTypes(SchemeGroupVersion,
&ClusterAutoscaler{},
&ClusterAutoscalerList{},
&Deployment{}, &Deployment{},
&DeploymentList{}, &DeploymentList{},
&DeploymentRollback{}, &DeploymentRollback{},
...@@ -65,8 +63,6 @@ func addKnownTypes(scheme *runtime.Scheme) { ...@@ -65,8 +63,6 @@ func addKnownTypes(scheme *runtime.Scheme) {
) )
} }
func (obj *ClusterAutoscaler) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *ClusterAutoscalerList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *Deployment) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } func (obj *Deployment) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *DeploymentList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } func (obj *DeploymentList) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
func (obj *DeploymentRollback) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta } func (obj *DeploymentRollback) GetObjectKind() unversioned.ObjectKind { return &obj.TypeMeta }
......
...@@ -772,67 +772,6 @@ type IngressBackend struct { ...@@ -772,67 +772,6 @@ type IngressBackend struct {
ServicePort intstr.IntOrString `json:"servicePort"` ServicePort intstr.IntOrString `json:"servicePort"`
} }
type NodeResource string
const (
// Percentage of node's CPUs that is currently used.
CpuConsumption NodeResource = "CpuConsumption"
// Percentage of node's CPUs that is currently requested for pods.
CpuRequest NodeResource = "CpuRequest"
// Percentage od node's memory that is currently used.
MemConsumption NodeResource = "MemConsumption"
// Percentage of node's CPUs that is currently requested for pods.
MemRequest NodeResource = "MemRequest"
)
// NodeUtilization describes what percentage of a particular resource is used on a node.
type NodeUtilization struct {
Resource NodeResource `json:"resource"`
// The accepted values are from 0 to 1.
Value float64 `json:"value"`
}
// Configuration of the Cluster Autoscaler
type ClusterAutoscalerSpec struct {
// Minimum number of nodes that the cluster should have.
MinNodes int32 `json:"minNodes"`
// Maximum number of nodes that the cluster should have.
MaxNodes int32 `json:"maxNodes"`
// Target average utilization of the cluster nodes. New nodes will be added if one of the
// targets is exceeded. Cluster size will be decreased if the current utilization is too low
// for all targets.
TargetUtilization []NodeUtilization `json:"target"`
}
type ClusterAutoscaler struct {
unversioned.TypeMeta `json:",inline"`
// Standard object's metadata.
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
// For now (experimental api) it is required that the name is set to "ClusterAutoscaler" and namespace is "default".
v1.ObjectMeta `json:"metadata,omitempty"`
// Spec defines the desired behavior of this daemon set.
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
Spec ClusterAutoscalerSpec `json:"spec,omitempty"`
}
// There will be just one (or none) ClusterAutoscaler.
type ClusterAutoscalerList struct {
unversioned.TypeMeta `json:",inline"`
// Standard object's metadata.
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata
unversioned.ListMeta `json:"metadata,omitempty"`
Items []ClusterAutoscaler `json:"items"`
}
// ExportOptions is the query options to the standard REST get call. // ExportOptions is the query options to the standard REST get call.
type ExportOptions struct { type ExportOptions struct {
unversioned.TypeMeta `json:",inline"` unversioned.TypeMeta `json:",inline"`
......
...@@ -45,35 +45,6 @@ func (CPUTargetUtilization) SwaggerDoc() map[string]string { ...@@ -45,35 +45,6 @@ func (CPUTargetUtilization) SwaggerDoc() map[string]string {
return map_CPUTargetUtilization return map_CPUTargetUtilization
} }
var map_ClusterAutoscaler = map[string]string{
"metadata": "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata For now (experimental api) it is required that the name is set to \"ClusterAutoscaler\" and namespace is \"default\".",
"spec": "Spec defines the desired behavior of this daemon set. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status",
}
func (ClusterAutoscaler) SwaggerDoc() map[string]string {
return map_ClusterAutoscaler
}
var map_ClusterAutoscalerList = map[string]string{
"": "There will be just one (or none) ClusterAutoscaler.",
"metadata": "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata",
}
func (ClusterAutoscalerList) SwaggerDoc() map[string]string {
return map_ClusterAutoscalerList
}
var map_ClusterAutoscalerSpec = map[string]string{
"": "Configuration of the Cluster Autoscaler",
"minNodes": "Minimum number of nodes that the cluster should have.",
"maxNodes": "Maximum number of nodes that the cluster should have.",
"target": "Target average utilization of the cluster nodes. New nodes will be added if one of the targets is exceeded. Cluster size will be decreased if the current utilization is too low for all targets.",
}
func (ClusterAutoscalerSpec) SwaggerDoc() map[string]string {
return map_ClusterAutoscalerSpec
}
var map_CustomMetricCurrentStatus = map[string]string{ var map_CustomMetricCurrentStatus = map[string]string{
"name": "Custom Metric name.", "name": "Custom Metric name.",
"value": "Custom Metric value (average).", "value": "Custom Metric value (average).",
...@@ -476,15 +447,6 @@ func (ListOptions) SwaggerDoc() map[string]string { ...@@ -476,15 +447,6 @@ func (ListOptions) SwaggerDoc() map[string]string {
return map_ListOptions return map_ListOptions
} }
var map_NodeUtilization = map[string]string{
"": "NodeUtilization describes what percentage of a particular resource is used on a node.",
"value": "The accepted values are from 0 to 1.",
}
func (NodeUtilization) SwaggerDoc() map[string]string {
return map_NodeUtilization
}
var map_PodSecurityPolicy = map[string]string{ var map_PodSecurityPolicy = map[string]string{
"": "Pod Security Policy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.", "": "Pod Security Policy governs the ability to make requests that affect the Security Context that will be applied to a pod and container.",
"metadata": "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata", "metadata": "Standard object's metadata. More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#metadata",
......
...@@ -648,43 +648,6 @@ func validateIngressBackend(backend *extensions.IngressBackend, fldPath *field.P ...@@ -648,43 +648,6 @@ func validateIngressBackend(backend *extensions.IngressBackend, fldPath *field.P
return allErrs return allErrs
} }
func validateClusterAutoscalerSpec(spec extensions.ClusterAutoscalerSpec, fldPath *field.Path) field.ErrorList {
allErrs := field.ErrorList{}
if spec.MinNodes < 0 {
allErrs = append(allErrs, field.Invalid(fldPath.Child("minNodes"), spec.MinNodes, "must be greater than or equal to 0"))
}
if spec.MaxNodes < spec.MinNodes {
allErrs = append(allErrs, field.Invalid(fldPath.Child("maxNodes"), spec.MaxNodes, "must be greater than or equal to `minNodes`"))
}
if len(spec.TargetUtilization) == 0 {
allErrs = append(allErrs, field.Required(fldPath.Child("targetUtilization"), ""))
}
for _, target := range spec.TargetUtilization {
if len(target.Resource) == 0 {
allErrs = append(allErrs, field.Required(fldPath.Child("targetUtilization", "resource"), ""))
}
if target.Value <= 0 {
allErrs = append(allErrs, field.Invalid(fldPath.Child("targetUtilization", "value"), target.Value, "must be greater than 0"))
}
if target.Value > 1 {
allErrs = append(allErrs, field.Invalid(fldPath.Child("targetUtilization", "value"), target.Value, "must be less than or equal to 1"))
}
}
return allErrs
}
func ValidateClusterAutoscaler(autoscaler *extensions.ClusterAutoscaler) field.ErrorList {
allErrs := field.ErrorList{}
if autoscaler.Name != "ClusterAutoscaler" {
allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "name"), autoscaler.Name, "must be 'ClusterAutoscaler'"))
}
if autoscaler.Namespace != api.NamespaceDefault {
allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "namespace"), autoscaler.Namespace, "must be 'default'"))
}
allErrs = append(allErrs, validateClusterAutoscalerSpec(autoscaler.Spec, field.NewPath("spec"))...)
return allErrs
}
func ValidateScale(scale *extensions.Scale) field.ErrorList { func ValidateScale(scale *extensions.Scale) field.ErrorList {
allErrs := field.ErrorList{} allErrs := field.ErrorList{}
allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&scale.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...) allErrs = append(allErrs, apivalidation.ValidateObjectMeta(&scale.ObjectMeta, true, apivalidation.NameIsDNSSubdomain, field.NewPath("metadata"))...)
......
...@@ -1358,120 +1358,6 @@ func TestValidateIngressStatusUpdate(t *testing.T) { ...@@ -1358,120 +1358,6 @@ func TestValidateIngressStatusUpdate(t *testing.T) {
} }
} }
func TestValidateClusterAutoscaler(t *testing.T) {
successCases := []extensions.ClusterAutoscaler{
{
ObjectMeta: api.ObjectMeta{
Name: "ClusterAutoscaler",
Namespace: api.NamespaceDefault,
},
Spec: extensions.ClusterAutoscalerSpec{
MinNodes: 1,
MaxNodes: 5,
TargetUtilization: []extensions.NodeUtilization{
{
Resource: extensions.CpuRequest,
Value: 0.7,
},
},
},
},
}
for _, successCase := range successCases {
if errs := ValidateClusterAutoscaler(&successCase); len(errs) != 0 {
t.Errorf("expected success: %v", errs)
}
}
errorCases := map[string]extensions.ClusterAutoscaler{
"must be 'ClusterAutoscaler'": {
ObjectMeta: api.ObjectMeta{
Name: "TestClusterAutoscaler",
Namespace: api.NamespaceDefault,
},
Spec: extensions.ClusterAutoscalerSpec{
MinNodes: 1,
MaxNodes: 5,
TargetUtilization: []extensions.NodeUtilization{
{
Resource: extensions.CpuRequest,
Value: 0.7,
},
},
},
},
"must be 'default'": {
ObjectMeta: api.ObjectMeta{
Name: "ClusterAutoscaler",
Namespace: "test",
},
Spec: extensions.ClusterAutoscalerSpec{
MinNodes: 1,
MaxNodes: 5,
TargetUtilization: []extensions.NodeUtilization{
{
Resource: extensions.CpuRequest,
Value: 0.7,
},
},
},
},
`must be greater than or equal to 0`: {
ObjectMeta: api.ObjectMeta{
Name: "ClusterAutoscaler",
Namespace: api.NamespaceDefault,
},
Spec: extensions.ClusterAutoscalerSpec{
MinNodes: -1,
MaxNodes: 5,
TargetUtilization: []extensions.NodeUtilization{
{
Resource: extensions.CpuRequest,
Value: 0.7,
},
},
},
},
"must be greater than or equal to `minNodes`": {
ObjectMeta: api.ObjectMeta{
Name: "ClusterAutoscaler",
Namespace: api.NamespaceDefault,
},
Spec: extensions.ClusterAutoscalerSpec{
MinNodes: 10,
MaxNodes: 5,
TargetUtilization: []extensions.NodeUtilization{
{
Resource: extensions.CpuRequest,
Value: 0.7,
},
},
},
},
"Required value": {
ObjectMeta: api.ObjectMeta{
Name: "ClusterAutoscaler",
Namespace: api.NamespaceDefault,
},
Spec: extensions.ClusterAutoscalerSpec{
MinNodes: 1,
MaxNodes: 5,
TargetUtilization: []extensions.NodeUtilization{},
},
},
}
for k, v := range errorCases {
errs := ValidateClusterAutoscaler(&v)
if len(errs) == 0 {
t.Errorf("[%s] expected failure", k)
} else if !strings.Contains(errs[0].Error(), k) {
t.Errorf("unexpected error: %v, expected: %q", errs[0], k)
}
}
}
func TestValidateScale(t *testing.T) { func TestValidateScale(t *testing.T) {
successCases := []extensions.Scale{ successCases := []extensions.Scale{
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment