mirror of https://github.com/k3s-io/k3s
Adding defaults to Deployment
parent
f7123ac8c6
commit
30a58321e8
|
@ -17,6 +17,7 @@ limitations under the License.
|
||||||
package testing
|
package testing
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
@ -120,8 +121,23 @@ func FuzzerFor(t *testing.T, version string, src rand.Source) *fuzz.Fuzzer {
|
||||||
c.FuzzNoCustom(j) // fuzz self without calling this function again
|
c.FuzzNoCustom(j) // fuzz self without calling this function again
|
||||||
//j.TemplateRef = nil // this is required for round trip
|
//j.TemplateRef = nil // this is required for round trip
|
||||||
},
|
},
|
||||||
func(j *expapi.DaemonSpec, c fuzz.Continue) {
|
func(j *expapi.DeploymentStrategy, c fuzz.Continue) {
|
||||||
c.FuzzNoCustom(j) // fuzz self without calling this function again
|
c.FuzzNoCustom(j) // fuzz self without calling this function again
|
||||||
|
// Ensure that strategyType is one of valid values.
|
||||||
|
strategyTypes := []expapi.DeploymentType{expapi.DeploymentRecreate, expapi.DeploymentRollingUpdate}
|
||||||
|
j.Type = strategyTypes[c.Rand.Intn(len(strategyTypes))]
|
||||||
|
if j.Type != expapi.DeploymentRollingUpdate {
|
||||||
|
j.RollingUpdate = nil
|
||||||
|
} else {
|
||||||
|
rollingUpdate := expapi.RollingUpdateDeployment{}
|
||||||
|
if c.RandBool() {
|
||||||
|
rollingUpdate.MaxUnavailable = util.NewIntOrStringFromInt(int(c.RandUint64()))
|
||||||
|
rollingUpdate.MaxSurge = util.NewIntOrStringFromInt(int(c.RandUint64()))
|
||||||
|
} else {
|
||||||
|
rollingUpdate.MaxSurge = util.NewIntOrStringFromString(fmt.Sprintf("%d%%", c.RandUint64()))
|
||||||
|
}
|
||||||
|
j.RollingUpdate = &rollingUpdate
|
||||||
|
}
|
||||||
},
|
},
|
||||||
func(j *api.List, c fuzz.Continue) {
|
func(j *api.List, c fuzz.Continue) {
|
||||||
c.FuzzNoCustom(j) // fuzz self without calling this function again
|
c.FuzzNoCustom(j) // fuzz self without calling this function again
|
||||||
|
|
|
@ -822,12 +822,7 @@ func deepCopy_expapi_DeploymentSpec(in DeploymentSpec, out *DeploymentSpec, c *c
|
||||||
if err := deepCopy_expapi_DeploymentStrategy(in.Strategy, &out.Strategy, c); err != nil {
|
if err := deepCopy_expapi_DeploymentStrategy(in.Strategy, &out.Strategy, c); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if in.UniqueLabelKey != nil {
|
out.UniqueLabelKey = in.UniqueLabelKey
|
||||||
out.UniqueLabelKey = new(string)
|
|
||||||
*out.UniqueLabelKey = *in.UniqueLabelKey
|
|
||||||
} else {
|
|
||||||
out.UniqueLabelKey = nil
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -199,7 +199,7 @@ type DeploymentSpec struct {
|
||||||
// not add any selector and label. If unspecified, system uses
|
// not add any selector and label. If unspecified, system uses
|
||||||
// "deployment.kubernetes.io/podTemplateHash".
|
// "deployment.kubernetes.io/podTemplateHash".
|
||||||
// Value of this key is hash of DeploymentSpec.PodTemplateSpec.
|
// Value of this key is hash of DeploymentSpec.PodTemplateSpec.
|
||||||
UniqueLabelKey *string `json:"uniqueLabel,omitempty"`
|
UniqueLabelKey string `json:"uniqueLabelKey,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeploymentStrategy struct {
|
type DeploymentStrategy struct {
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
v1 "k8s.io/kubernetes/pkg/api/v1"
|
v1 "k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/conversion"
|
"k8s.io/kubernetes/pkg/conversion"
|
||||||
"k8s.io/kubernetes/pkg/expapi"
|
"k8s.io/kubernetes/pkg/expapi"
|
||||||
|
"k8s.io/kubernetes/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func addConversionFuncs() {
|
func addConversionFuncs() {
|
||||||
|
@ -32,7 +33,10 @@ func addConversionFuncs() {
|
||||||
convert_v1_PodSpec_To_api_PodSpec,
|
convert_v1_PodSpec_To_api_PodSpec,
|
||||||
convert_expapi_DeploymentSpec_To_v1_DeploymentSpec,
|
convert_expapi_DeploymentSpec_To_v1_DeploymentSpec,
|
||||||
convert_v1_DeploymentSpec_To_expapi_DeploymentSpec,
|
convert_v1_DeploymentSpec_To_expapi_DeploymentSpec,
|
||||||
|
convert_expapi_DeploymentStrategy_To_v1_DeploymentStrategy,
|
||||||
convert_v1_DeploymentStrategy_To_expapi_DeploymentStrategy,
|
convert_v1_DeploymentStrategy_To_expapi_DeploymentStrategy,
|
||||||
|
convert_expapi_RollingUpdateDeployment_To_v1_RollingUpdateDeployment,
|
||||||
|
convert_v1_RollingUpdateDeployment_To_expapi_RollingUpdateDeployment,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// If one of the conversion functions is malformed, detect it immediately.
|
// If one of the conversion functions is malformed, detect it immediately.
|
||||||
|
@ -199,12 +203,8 @@ func convert_expapi_DeploymentSpec_To_v1_DeploymentSpec(in *expapi.DeploymentSpe
|
||||||
if err := convert_expapi_DeploymentStrategy_To_v1_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
|
if err := convert_expapi_DeploymentStrategy_To_v1_DeploymentStrategy(&in.Strategy, &out.Strategy, s); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if in.UniqueLabelKey != nil {
|
|
||||||
out.UniqueLabelKey = new(string)
|
out.UniqueLabelKey = new(string)
|
||||||
*out.UniqueLabelKey = *in.UniqueLabelKey
|
*out.UniqueLabelKey = in.UniqueLabelKey
|
||||||
} else {
|
|
||||||
out.UniqueLabelKey = nil
|
|
||||||
}
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,10 +235,23 @@ func convert_v1_DeploymentSpec_To_expapi_DeploymentSpec(in *DeploymentSpec, out
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if in.UniqueLabelKey != nil {
|
if in.UniqueLabelKey != nil {
|
||||||
out.UniqueLabelKey = new(string)
|
out.UniqueLabelKey = *in.UniqueLabelKey
|
||||||
*out.UniqueLabelKey = *in.UniqueLabelKey
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convert_expapi_DeploymentStrategy_To_v1_DeploymentStrategy(in *expapi.DeploymentStrategy, out *DeploymentStrategy, s conversion.Scope) error {
|
||||||
|
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
||||||
|
defaulting.(func(*expapi.DeploymentStrategy))(in)
|
||||||
|
}
|
||||||
|
out.Type = DeploymentType(in.Type)
|
||||||
|
if in.RollingUpdate != nil {
|
||||||
|
out.RollingUpdate = new(RollingUpdateDeployment)
|
||||||
|
if err := convert_expapi_RollingUpdateDeployment_To_v1_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
out.UniqueLabelKey = nil
|
out.RollingUpdate = nil
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -258,3 +271,37 @@ func convert_v1_DeploymentStrategy_To_expapi_DeploymentStrategy(in *DeploymentSt
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func convert_expapi_RollingUpdateDeployment_To_v1_RollingUpdateDeployment(in *expapi.RollingUpdateDeployment, out *RollingUpdateDeployment, s conversion.Scope) error {
|
||||||
|
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
||||||
|
defaulting.(func(*expapi.RollingUpdateDeployment))(in)
|
||||||
|
}
|
||||||
|
if out.MaxUnavailable == nil {
|
||||||
|
out.MaxUnavailable = &util.IntOrString{}
|
||||||
|
}
|
||||||
|
if err := s.Convert(&in.MaxUnavailable, out.MaxUnavailable, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if out.MaxSurge == nil {
|
||||||
|
out.MaxSurge = &util.IntOrString{}
|
||||||
|
}
|
||||||
|
if err := s.Convert(&in.MaxSurge, out.MaxSurge, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.MinReadySeconds = in.MinReadySeconds
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func convert_v1_RollingUpdateDeployment_To_expapi_RollingUpdateDeployment(in *RollingUpdateDeployment, out *expapi.RollingUpdateDeployment, s conversion.Scope) error {
|
||||||
|
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
||||||
|
defaulting.(func(*RollingUpdateDeployment))(in)
|
||||||
|
}
|
||||||
|
if err := s.Convert(in.MaxUnavailable, &out.MaxUnavailable, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if err := s.Convert(in.MaxSurge, &out.MaxSurge, 0); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
out.MinReadySeconds = in.MinReadySeconds
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -1557,22 +1557,6 @@ func convert_expapi_DeploymentStatus_To_v1_DeploymentStatus(in *expapi.Deploymen
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func convert_expapi_DeploymentStrategy_To_v1_DeploymentStrategy(in *expapi.DeploymentStrategy, out *DeploymentStrategy, s conversion.Scope) error {
|
|
||||||
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
|
||||||
defaulting.(func(*expapi.DeploymentStrategy))(in)
|
|
||||||
}
|
|
||||||
out.Type = DeploymentType(in.Type)
|
|
||||||
if in.RollingUpdate != nil {
|
|
||||||
out.RollingUpdate = new(RollingUpdateDeployment)
|
|
||||||
if err := convert_expapi_RollingUpdateDeployment_To_v1_RollingUpdateDeployment(in.RollingUpdate, out.RollingUpdate, s); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
out.RollingUpdate = nil
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func convert_expapi_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler(in *expapi.HorizontalPodAutoscaler, out *HorizontalPodAutoscaler, s conversion.Scope) error {
|
func convert_expapi_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler(in *expapi.HorizontalPodAutoscaler, out *HorizontalPodAutoscaler, s conversion.Scope) error {
|
||||||
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
||||||
defaulting.(func(*expapi.HorizontalPodAutoscaler))(in)
|
defaulting.(func(*expapi.HorizontalPodAutoscaler))(in)
|
||||||
|
@ -1685,20 +1669,6 @@ func convert_expapi_ResourceConsumption_To_v1_ResourceConsumption(in *expapi.Res
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func convert_expapi_RollingUpdateDeployment_To_v1_RollingUpdateDeployment(in *expapi.RollingUpdateDeployment, out *RollingUpdateDeployment, s conversion.Scope) error {
|
|
||||||
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
|
||||||
defaulting.(func(*expapi.RollingUpdateDeployment))(in)
|
|
||||||
}
|
|
||||||
if err := s.Convert(&in.MaxUnavailable, &out.MaxUnavailable, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := s.Convert(&in.MaxSurge, &out.MaxSurge, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
out.MinReadySeconds = in.MinReadySeconds
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func convert_expapi_Scale_To_v1_Scale(in *expapi.Scale, out *Scale, s conversion.Scope) error {
|
func convert_expapi_Scale_To_v1_Scale(in *expapi.Scale, out *Scale, s conversion.Scope) error {
|
||||||
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
||||||
defaulting.(func(*expapi.Scale))(in)
|
defaulting.(func(*expapi.Scale))(in)
|
||||||
|
@ -2048,20 +2018,6 @@ func convert_v1_ResourceConsumption_To_expapi_ResourceConsumption(in *ResourceCo
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func convert_v1_RollingUpdateDeployment_To_expapi_RollingUpdateDeployment(in *RollingUpdateDeployment, out *expapi.RollingUpdateDeployment, s conversion.Scope) error {
|
|
||||||
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
|
||||||
defaulting.(func(*RollingUpdateDeployment))(in)
|
|
||||||
}
|
|
||||||
if err := s.Convert(&in.MaxUnavailable, &out.MaxUnavailable, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
if err := s.Convert(&in.MaxSurge, &out.MaxSurge, 0); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
out.MinReadySeconds = in.MinReadySeconds
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func convert_v1_Scale_To_expapi_Scale(in *Scale, out *expapi.Scale, s conversion.Scope) error {
|
func convert_v1_Scale_To_expapi_Scale(in *Scale, out *expapi.Scale, s conversion.Scope) error {
|
||||||
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found {
|
||||||
defaulting.(func(*Scale))(in)
|
defaulting.(func(*Scale))(in)
|
||||||
|
@ -2208,7 +2164,6 @@ func init() {
|
||||||
convert_expapi_Daemon_To_v1_Daemon,
|
convert_expapi_Daemon_To_v1_Daemon,
|
||||||
convert_expapi_DeploymentList_To_v1_DeploymentList,
|
convert_expapi_DeploymentList_To_v1_DeploymentList,
|
||||||
convert_expapi_DeploymentStatus_To_v1_DeploymentStatus,
|
convert_expapi_DeploymentStatus_To_v1_DeploymentStatus,
|
||||||
convert_expapi_DeploymentStrategy_To_v1_DeploymentStrategy,
|
|
||||||
convert_expapi_Deployment_To_v1_Deployment,
|
convert_expapi_Deployment_To_v1_Deployment,
|
||||||
convert_expapi_HorizontalPodAutoscalerList_To_v1_HorizontalPodAutoscalerList,
|
convert_expapi_HorizontalPodAutoscalerList_To_v1_HorizontalPodAutoscalerList,
|
||||||
convert_expapi_HorizontalPodAutoscalerSpec_To_v1_HorizontalPodAutoscalerSpec,
|
convert_expapi_HorizontalPodAutoscalerSpec_To_v1_HorizontalPodAutoscalerSpec,
|
||||||
|
@ -2216,7 +2171,6 @@ func init() {
|
||||||
convert_expapi_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler,
|
convert_expapi_HorizontalPodAutoscaler_To_v1_HorizontalPodAutoscaler,
|
||||||
convert_expapi_ReplicationControllerDummy_To_v1_ReplicationControllerDummy,
|
convert_expapi_ReplicationControllerDummy_To_v1_ReplicationControllerDummy,
|
||||||
convert_expapi_ResourceConsumption_To_v1_ResourceConsumption,
|
convert_expapi_ResourceConsumption_To_v1_ResourceConsumption,
|
||||||
convert_expapi_RollingUpdateDeployment_To_v1_RollingUpdateDeployment,
|
|
||||||
convert_expapi_ScaleSpec_To_v1_ScaleSpec,
|
convert_expapi_ScaleSpec_To_v1_ScaleSpec,
|
||||||
convert_expapi_ScaleStatus_To_v1_ScaleStatus,
|
convert_expapi_ScaleStatus_To_v1_ScaleStatus,
|
||||||
convert_expapi_Scale_To_v1_Scale,
|
convert_expapi_Scale_To_v1_Scale,
|
||||||
|
@ -2264,7 +2218,6 @@ func init() {
|
||||||
convert_v1_ReplicationControllerDummy_To_expapi_ReplicationControllerDummy,
|
convert_v1_ReplicationControllerDummy_To_expapi_ReplicationControllerDummy,
|
||||||
convert_v1_ResourceConsumption_To_expapi_ResourceConsumption,
|
convert_v1_ResourceConsumption_To_expapi_ResourceConsumption,
|
||||||
convert_v1_ResourceRequirements_To_api_ResourceRequirements,
|
convert_v1_ResourceRequirements_To_api_ResourceRequirements,
|
||||||
convert_v1_RollingUpdateDeployment_To_expapi_RollingUpdateDeployment,
|
|
||||||
convert_v1_SELinuxOptions_To_api_SELinuxOptions,
|
convert_v1_SELinuxOptions_To_api_SELinuxOptions,
|
||||||
convert_v1_ScaleSpec_To_expapi_ScaleSpec,
|
convert_v1_ScaleSpec_To_expapi_ScaleSpec,
|
||||||
convert_v1_ScaleStatus_To_expapi_ScaleStatus,
|
convert_v1_ScaleStatus_To_expapi_ScaleStatus,
|
||||||
|
|
|
@ -953,12 +953,22 @@ func deepCopy_v1_ResourceConsumption(in ResourceConsumption, out *ResourceConsum
|
||||||
}
|
}
|
||||||
|
|
||||||
func deepCopy_v1_RollingUpdateDeployment(in RollingUpdateDeployment, out *RollingUpdateDeployment, c *conversion.Cloner) error {
|
func deepCopy_v1_RollingUpdateDeployment(in RollingUpdateDeployment, out *RollingUpdateDeployment, c *conversion.Cloner) error {
|
||||||
if err := deepCopy_util_IntOrString(in.MaxUnavailable, &out.MaxUnavailable, c); err != nil {
|
if in.MaxUnavailable != nil {
|
||||||
|
out.MaxUnavailable = new(util.IntOrString)
|
||||||
|
if err := deepCopy_util_IntOrString(*in.MaxUnavailable, out.MaxUnavailable, c); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := deepCopy_util_IntOrString(in.MaxSurge, &out.MaxSurge, c); err != nil {
|
} else {
|
||||||
|
out.MaxUnavailable = nil
|
||||||
|
}
|
||||||
|
if in.MaxSurge != nil {
|
||||||
|
out.MaxSurge = new(util.IntOrString)
|
||||||
|
if err := deepCopy_util_IntOrString(*in.MaxSurge, out.MaxSurge, c); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
out.MaxSurge = nil
|
||||||
|
}
|
||||||
out.MinReadySeconds = in.MinReadySeconds
|
out.MinReadySeconds = in.MinReadySeconds
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,10 @@ limitations under the License.
|
||||||
|
|
||||||
package v1
|
package v1
|
||||||
|
|
||||||
import "k8s.io/kubernetes/pkg/api"
|
import (
|
||||||
|
"k8s.io/kubernetes/pkg/api"
|
||||||
|
"k8s.io/kubernetes/pkg/util"
|
||||||
|
)
|
||||||
|
|
||||||
func addDefaultingFuncs() {
|
func addDefaultingFuncs() {
|
||||||
api.Scheme.AddDefaultingFuncs(
|
api.Scheme.AddDefaultingFuncs(
|
||||||
|
@ -40,5 +43,37 @@ func addDefaultingFuncs() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
func(obj *Deployment) {
|
||||||
|
// Set DeploymentSpec.Replicas to 1 if it is not set.
|
||||||
|
if obj.Spec.Replicas == nil {
|
||||||
|
obj.Spec.Replicas = new(int)
|
||||||
|
*obj.Spec.Replicas = 1
|
||||||
|
}
|
||||||
|
strategy := &obj.Spec.Strategy
|
||||||
|
// Set default DeploymentType as RollingUpdate.
|
||||||
|
if strategy.Type == "" {
|
||||||
|
strategy.Type = DeploymentRollingUpdate
|
||||||
|
}
|
||||||
|
if strategy.Type == DeploymentRollingUpdate {
|
||||||
|
if strategy.RollingUpdate == nil {
|
||||||
|
rollingUpdate := RollingUpdateDeployment{}
|
||||||
|
strategy.RollingUpdate = &rollingUpdate
|
||||||
|
}
|
||||||
|
if strategy.RollingUpdate.MaxUnavailable == nil {
|
||||||
|
// Set default MaxUnavailable as 1 by default.
|
||||||
|
maxUnavailable := util.NewIntOrStringFromInt(1)
|
||||||
|
strategy.RollingUpdate.MaxUnavailable = &maxUnavailable
|
||||||
|
}
|
||||||
|
if strategy.RollingUpdate.MaxSurge == nil {
|
||||||
|
// Set default MaxSurge as 1 by default.
|
||||||
|
maxSurge := util.NewIntOrStringFromInt(1)
|
||||||
|
strategy.RollingUpdate.MaxSurge = &maxSurge
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if obj.Spec.UniqueLabelKey == nil {
|
||||||
|
obj.Spec.UniqueLabelKey = new(string)
|
||||||
|
*obj.Spec.UniqueLabelKey = "deployment.kubernetes.io/podTemplateHash"
|
||||||
|
}
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ import (
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
"k8s.io/kubernetes/pkg/runtime"
|
"k8s.io/kubernetes/pkg/runtime"
|
||||||
|
"k8s.io/kubernetes/pkg/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSetDefaultDaemon(t *testing.T) {
|
func TestSetDefaultDaemon(t *testing.T) {
|
||||||
|
@ -83,6 +84,111 @@ func TestSetDefaultDaemon(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSetDefaultDeployment(t *testing.T) {
|
||||||
|
defaultIntOrString := util.NewIntOrStringFromInt(1)
|
||||||
|
differentIntOrString := util.NewIntOrStringFromInt(5)
|
||||||
|
deploymentLabelKey := "deployment.kubernetes.io/podTemplateHash"
|
||||||
|
tests := []struct {
|
||||||
|
original *Deployment
|
||||||
|
expected *Deployment
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
original: &Deployment{},
|
||||||
|
expected: &Deployment{
|
||||||
|
Spec: DeploymentSpec{
|
||||||
|
Replicas: newInt(1),
|
||||||
|
Strategy: DeploymentStrategy{
|
||||||
|
Type: DeploymentRollingUpdate,
|
||||||
|
RollingUpdate: &RollingUpdateDeployment{
|
||||||
|
MaxSurge: &defaultIntOrString,
|
||||||
|
MaxUnavailable: &defaultIntOrString,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
UniqueLabelKey: newString(deploymentLabelKey),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
original: &Deployment{
|
||||||
|
Spec: DeploymentSpec{
|
||||||
|
Replicas: newInt(5),
|
||||||
|
Strategy: DeploymentStrategy{
|
||||||
|
RollingUpdate: &RollingUpdateDeployment{
|
||||||
|
MaxSurge: &differentIntOrString,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &Deployment{
|
||||||
|
Spec: DeploymentSpec{
|
||||||
|
Replicas: newInt(5),
|
||||||
|
Strategy: DeploymentStrategy{
|
||||||
|
Type: DeploymentRollingUpdate,
|
||||||
|
RollingUpdate: &RollingUpdateDeployment{
|
||||||
|
MaxSurge: &differentIntOrString,
|
||||||
|
MaxUnavailable: &defaultIntOrString,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
UniqueLabelKey: newString(deploymentLabelKey),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
original: &Deployment{
|
||||||
|
Spec: DeploymentSpec{
|
||||||
|
Replicas: newInt(5),
|
||||||
|
Strategy: DeploymentStrategy{
|
||||||
|
Type: DeploymentRecreate,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &Deployment{
|
||||||
|
Spec: DeploymentSpec{
|
||||||
|
Replicas: newInt(5),
|
||||||
|
Strategy: DeploymentStrategy{
|
||||||
|
Type: DeploymentRecreate,
|
||||||
|
},
|
||||||
|
UniqueLabelKey: newString(deploymentLabelKey),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
original: &Deployment{
|
||||||
|
Spec: DeploymentSpec{
|
||||||
|
Replicas: newInt(5),
|
||||||
|
Strategy: DeploymentStrategy{
|
||||||
|
Type: DeploymentRecreate,
|
||||||
|
},
|
||||||
|
UniqueLabelKey: newString("customDeploymentKey"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: &Deployment{
|
||||||
|
Spec: DeploymentSpec{
|
||||||
|
Replicas: newInt(5),
|
||||||
|
Strategy: DeploymentStrategy{
|
||||||
|
Type: DeploymentRecreate,
|
||||||
|
},
|
||||||
|
UniqueLabelKey: newString("customDeploymentKey"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
original := test.original
|
||||||
|
expected := test.expected
|
||||||
|
obj2 := roundTrip(t, runtime.Object(original))
|
||||||
|
got, ok := obj2.(*Deployment)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("unexpected object: %v", got)
|
||||||
|
t.FailNow()
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(got.Spec, expected.Spec) {
|
||||||
|
t.Errorf("got different than expected: %v, %v", got, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func roundTrip(t *testing.T, obj runtime.Object) runtime.Object {
|
func roundTrip(t *testing.T, obj runtime.Object) runtime.Object {
|
||||||
data, err := v1.Codec.Encode(obj)
|
data, err := v1.Codec.Encode(obj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -102,3 +208,15 @@ func roundTrip(t *testing.T, obj runtime.Object) runtime.Object {
|
||||||
}
|
}
|
||||||
return obj3
|
return obj3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newInt(val int) *int {
|
||||||
|
p := new(int)
|
||||||
|
*p = val
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func newString(val string) *string {
|
||||||
|
p := new(string)
|
||||||
|
*p = val
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
|
@ -186,7 +186,7 @@ type DeploymentSpec struct {
|
||||||
// not add any selector and label. If unspecified, system uses
|
// not add any selector and label. If unspecified, system uses
|
||||||
// "deployment.kubernetes.io/podTemplateHash".
|
// "deployment.kubernetes.io/podTemplateHash".
|
||||||
// Value of this key is hash of DeploymentSpec.PodTemplateSpec.
|
// Value of this key is hash of DeploymentSpec.PodTemplateSpec.
|
||||||
UniqueLabelKey *string `json:"uniqueLabel,omitempty" description:"key of the label that is added to existing pods to distinguish them from new ones; deployment.kubernetes.io/podTemplateHash is used by default; value of this label is hash of pod template spec; no label is added if this is set to empty string"`
|
UniqueLabelKey *string `json:"uniqueLabelKey,omitempty" description:"key of the label that is added to existing pods to distinguish them from new ones; deployment.kubernetes.io/podTemplateHash is used by default; value of this label is hash of pod template spec; no label is added if this is set to empty string"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type DeploymentStrategy struct {
|
type DeploymentStrategy struct {
|
||||||
|
@ -222,7 +222,7 @@ type RollingUpdateDeployment struct {
|
||||||
// can be scaled down further, followed by scaling up the new RC, ensuring
|
// can be scaled down further, followed by scaling up the new RC, ensuring
|
||||||
// that at least 70% of original number of pods are available at all times
|
// that at least 70% of original number of pods are available at all times
|
||||||
// during the update.
|
// during the update.
|
||||||
MaxUnavailable util.IntOrString `json:"maxUnavailable,omitempty" description:"max number of pods that can be unavailable during the update; value can be an absolute number or a percentage of total pods at start of update"`
|
MaxUnavailable *util.IntOrString `json:"maxUnavailable,omitempty" description:"max number of pods that can be unavailable during the update; value can be an absolute number or a percentage of total pods at start of update"`
|
||||||
|
|
||||||
// The maximum number of pods that can be scheduled above the original number of
|
// The maximum number of pods that can be scheduled above the original number of
|
||||||
// pods.
|
// pods.
|
||||||
|
@ -234,7 +234,7 @@ type RollingUpdateDeployment struct {
|
||||||
// immediately when the rolling update starts. Once old pods have been killed,
|
// immediately when the rolling update starts. Once old pods have been killed,
|
||||||
// new RC can be scaled up further, ensuring that total number of pods running
|
// new RC can be scaled up further, ensuring that total number of pods running
|
||||||
// at any time during the update is atmost 130% of original pods.
|
// at any time during the update is atmost 130% of original pods.
|
||||||
MaxSurge util.IntOrString `json:"maxSurge,omitempty" description:"max number of pods that can be scheduled above the original number of pods; value can be an absolute number or a percentage of total pods at start of update"`
|
MaxSurge *util.IntOrString `json:"maxSurge,omitempty" description:"max number of pods that can be scheduled above the original number of pods; value can be an absolute number or a percentage of total pods at start of update"`
|
||||||
|
|
||||||
// Minimum number of seconds for which a newly created pod should be ready
|
// Minimum number of seconds for which a newly created pod should be ready
|
||||||
// without any of its container crashing, for it to be considered available.
|
// without any of its container crashing, for it to be considered available.
|
||||||
|
|
|
@ -238,9 +238,7 @@ func ValidateDeploymentSpec(spec *expapi.DeploymentSpec) errs.ValidationErrorLis
|
||||||
allErrs = append(allErrs, apivalidation.ValidatePositiveField(int64(spec.Replicas), "replicas")...)
|
allErrs = append(allErrs, apivalidation.ValidatePositiveField(int64(spec.Replicas), "replicas")...)
|
||||||
allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpecForRC(spec.Template, spec.Selector, spec.Replicas, "template")...)
|
allErrs = append(allErrs, apivalidation.ValidatePodTemplateSpecForRC(spec.Template, spec.Selector, spec.Replicas, "template")...)
|
||||||
allErrs = append(allErrs, ValidateDeploymentStrategy(&spec.Strategy, "strategy")...)
|
allErrs = append(allErrs, ValidateDeploymentStrategy(&spec.Strategy, "strategy")...)
|
||||||
if spec.UniqueLabelKey != nil {
|
allErrs = append(allErrs, apivalidation.ValidateLabelName(spec.UniqueLabelKey, "uniqueLabel")...)
|
||||||
allErrs = append(allErrs, apivalidation.ValidateLabelName(*spec.UniqueLabelKey, "uniqueLabel")...)
|
|
||||||
}
|
|
||||||
return allErrs
|
return allErrs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -572,6 +572,7 @@ func validDeployment() *expapi.Deployment {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
UniqueLabelKey: "my-label",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -606,8 +607,7 @@ func TestValidateDeployment(t *testing.T) {
|
||||||
|
|
||||||
// invalid unique label key.
|
// invalid unique label key.
|
||||||
invalidUniqueLabelDeployment := validDeployment()
|
invalidUniqueLabelDeployment := validDeployment()
|
||||||
invalidUniqueLabel := "abc/def/ghi"
|
invalidUniqueLabelDeployment.Spec.UniqueLabelKey = "abc/def/ghi"
|
||||||
invalidUniqueLabelDeployment.Spec.UniqueLabelKey = &invalidUniqueLabel
|
|
||||||
errorCases["spec.uniqueLabel: invalid value"] = invalidUniqueLabelDeployment
|
errorCases["spec.uniqueLabel: invalid value"] = invalidUniqueLabelDeployment
|
||||||
|
|
||||||
// rollingUpdate should be nil for recreate.
|
// rollingUpdate should be nil for recreate.
|
||||||
|
|
|
@ -69,6 +69,7 @@ func validNewDeployment() *expapi.Deployment {
|
||||||
DNSPolicy: api.DNSClusterFirst,
|
DNSPolicy: api.DNSClusterFirst,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
UniqueLabelKey: "my-label",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,6 +172,9 @@ func (intstr IntOrString) MarshalJSON() ([]byte, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (intstr *IntOrString) Fuzz(c fuzz.Continue) {
|
func (intstr *IntOrString) Fuzz(c fuzz.Continue) {
|
||||||
|
if intstr == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
if c.RandBool() {
|
if c.RandBool() {
|
||||||
intstr.Kind = IntstrInt
|
intstr.Kind = IntstrInt
|
||||||
c.Fuzz(&intstr.IntVal)
|
c.Fuzz(&intstr.IntVal)
|
||||||
|
|
Loading…
Reference in New Issue