diff --git a/pkg/api/v1/types.go b/pkg/api/v1/types.go index 23f0865190d..d28e82ce530 100644 --- a/pkg/api/v1/types.go +++ b/pkg/api/v1/types.go @@ -953,7 +953,7 @@ type PodTemplateList struct { // ReplicationControllerSpec is the specification of a replication controller. type ReplicationControllerSpec struct { - // Replicas is the number of desired replicas. + // Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. Replicas *int `json:"replicas,omitempty" description:"number of replicas desired; defaults to 1"` // Selector is a label query over pods that should match the Replicas count. diff --git a/pkg/api/v1beta3/conversion.go b/pkg/api/v1beta3/conversion.go index 13ecd4411f2..759c9fc0c10 100644 --- a/pkg/api/v1beta3/conversion.go +++ b/pkg/api/v1beta3/conversion.go @@ -41,6 +41,8 @@ func addConversionFuncs() { convert_api_StatusDetails_To_v1beta3_StatusDetails, convert_v1beta3_StatusCause_To_api_StatusCause, convert_api_StatusCause_To_v1beta3_StatusCause, + convert_api_ReplicationControllerSpec_To_v1beta3_ReplicationControllerSpec, + convert_v1beta3_ReplicationControllerSpec_To_api_ReplicationControllerSpec, ) if err != nil { // If one of the conversion functions is malformed, detect it immediately. @@ -726,3 +728,51 @@ func convert_api_StatusCause_To_v1beta3_StatusCause(in *api.StatusCause, out *St out.Field = in.Field return nil } + +func convert_api_ReplicationControllerSpec_To_v1beta3_ReplicationControllerSpec(in *api.ReplicationControllerSpec, out *ReplicationControllerSpec, s conversion.Scope) error { + if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { + defaulting.(func(*api.ReplicationControllerSpec))(in) + } + out.Replicas = &in.Replicas + if in.Selector != nil { + out.Selector = make(map[string]string) + for key, val := range in.Selector { + out.Selector[key] = val + } + } else { + out.Selector = nil + } + if in.Template != nil { + out.Template = new(PodTemplateSpec) + if err := convert_api_PodTemplateSpec_To_v1beta3_PodTemplateSpec(in.Template, out.Template, s); err != nil { + return err + } + } else { + out.Template = nil + } + return nil +} + +func convert_v1beta3_ReplicationControllerSpec_To_api_ReplicationControllerSpec(in *ReplicationControllerSpec, out *api.ReplicationControllerSpec, s conversion.Scope) error { + if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { + defaulting.(func(*ReplicationControllerSpec))(in) + } + out.Replicas = *in.Replicas + if in.Selector != nil { + out.Selector = make(map[string]string) + for key, val := range in.Selector { + out.Selector[key] = val + } + } else { + out.Selector = nil + } + if in.Template != nil { + out.Template = new(api.PodTemplateSpec) + if err := convert_v1beta3_PodTemplateSpec_To_api_PodTemplateSpec(in.Template, out.Template, s); err != nil { + return err + } + } else { + out.Template = nil + } + return nil +} diff --git a/pkg/api/v1beta3/conversion_generated.go b/pkg/api/v1beta3/conversion_generated.go index 73be8ca7618..61627f7c9df 100644 --- a/pkg/api/v1beta3/conversion_generated.go +++ b/pkg/api/v1beta3/conversion_generated.go @@ -1536,30 +1536,6 @@ func convert_api_ReplicationControllerList_To_v1beta3_ReplicationControllerList( return nil } -func convert_api_ReplicationControllerSpec_To_v1beta3_ReplicationControllerSpec(in *api.ReplicationControllerSpec, out *ReplicationControllerSpec, s conversion.Scope) error { - if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { - defaulting.(func(*api.ReplicationControllerSpec))(in) - } - out.Replicas = in.Replicas - if in.Selector != nil { - out.Selector = make(map[string]string) - for key, val := range in.Selector { - out.Selector[key] = val - } - } else { - out.Selector = nil - } - if in.Template != nil { - out.Template = new(PodTemplateSpec) - if err := convert_api_PodTemplateSpec_To_v1beta3_PodTemplateSpec(in.Template, out.Template, s); err != nil { - return err - } - } else { - out.Template = nil - } - return nil -} - func convert_api_ReplicationControllerStatus_To_v1beta3_ReplicationControllerStatus(in *api.ReplicationControllerStatus, out *ReplicationControllerStatus, s conversion.Scope) error { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { defaulting.(func(*api.ReplicationControllerStatus))(in) @@ -3601,30 +3577,6 @@ func convert_v1beta3_ReplicationControllerList_To_api_ReplicationControllerList( return nil } -func convert_v1beta3_ReplicationControllerSpec_To_api_ReplicationControllerSpec(in *ReplicationControllerSpec, out *api.ReplicationControllerSpec, s conversion.Scope) error { - if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { - defaulting.(func(*ReplicationControllerSpec))(in) - } - out.Replicas = in.Replicas - if in.Selector != nil { - out.Selector = make(map[string]string) - for key, val := range in.Selector { - out.Selector[key] = val - } - } else { - out.Selector = nil - } - if in.Template != nil { - out.Template = new(api.PodTemplateSpec) - if err := convert_v1beta3_PodTemplateSpec_To_api_PodTemplateSpec(in.Template, out.Template, s); err != nil { - return err - } - } else { - out.Template = nil - } - return nil -} - func convert_v1beta3_ReplicationControllerStatus_To_api_ReplicationControllerStatus(in *ReplicationControllerStatus, out *api.ReplicationControllerStatus, s conversion.Scope) error { if defaulting, found := s.DefaultingInterface(reflect.TypeOf(*in)); found { defaulting.(func(*ReplicationControllerStatus))(in) @@ -4238,7 +4190,6 @@ func init() { convert_api_RBDVolumeSource_To_v1beta3_RBDVolumeSource, convert_api_RangeAllocation_To_v1beta3_RangeAllocation, convert_api_ReplicationControllerList_To_v1beta3_ReplicationControllerList, - convert_api_ReplicationControllerSpec_To_v1beta3_ReplicationControllerSpec, convert_api_ReplicationControllerStatus_To_v1beta3_ReplicationControllerStatus, convert_api_ReplicationController_To_v1beta3_ReplicationController, convert_api_ResourceQuotaList_To_v1beta3_ResourceQuotaList, @@ -4345,7 +4296,6 @@ func init() { convert_v1beta3_RBDVolumeSource_To_api_RBDVolumeSource, convert_v1beta3_RangeAllocation_To_api_RangeAllocation, convert_v1beta3_ReplicationControllerList_To_api_ReplicationControllerList, - convert_v1beta3_ReplicationControllerSpec_To_api_ReplicationControllerSpec, convert_v1beta3_ReplicationControllerStatus_To_api_ReplicationControllerStatus, convert_v1beta3_ReplicationController_To_api_ReplicationController, convert_v1beta3_ResourceQuotaList_To_api_ResourceQuotaList, diff --git a/pkg/api/v1beta3/deep_copy_generated.go b/pkg/api/v1beta3/deep_copy_generated.go index ef17355939f..67f493f6b41 100644 --- a/pkg/api/v1beta3/deep_copy_generated.go +++ b/pkg/api/v1beta3/deep_copy_generated.go @@ -1513,7 +1513,12 @@ func deepCopy_v1beta3_ReplicationControllerList(in ReplicationControllerList, ou } func deepCopy_v1beta3_ReplicationControllerSpec(in ReplicationControllerSpec, out *ReplicationControllerSpec, c *conversion.Cloner) error { - out.Replicas = in.Replicas + if in.Replicas != nil { + out.Replicas = new(int) + *out.Replicas = *in.Replicas + } else { + out.Replicas = nil + } if in.Selector != nil { out.Selector = make(map[string]string) for key, val := range in.Selector { diff --git a/pkg/api/v1beta3/defaults.go b/pkg/api/v1beta3/defaults.go index 5e8793d3318..c7d78bef3e5 100644 --- a/pkg/api/v1beta3/defaults.go +++ b/pkg/api/v1beta3/defaults.go @@ -40,6 +40,10 @@ func addDefaultingFuncs() { obj.Labels = labels } } + if obj.Spec.Replicas == nil { + obj.Spec.Replicas = new(int) + *obj.Spec.Replicas = 0 + } }, func(obj *Volume) { if util.AllPtrFieldsNil(&obj.VolumeSource) { diff --git a/pkg/api/v1beta3/types.go b/pkg/api/v1beta3/types.go index efe404203c3..fcb367a6b8a 100644 --- a/pkg/api/v1beta3/types.go +++ b/pkg/api/v1beta3/types.go @@ -957,8 +957,8 @@ type PodTemplateList struct { // ReplicationControllerSpec is the specification of a replication controller. type ReplicationControllerSpec struct { - // Replicas is the number of desired replicas. - Replicas int `json:"replicas,omitempty" description:"number of replicas desired"` + // Replicas is the number of desired replicas. This is a pointer to distinguish between explicit zero and unspecified. + Replicas *int `json:"replicas,omitempty" description:"number of replicas desired"` // Selector is a label query over pods that should match the Replicas count. // If Selector is empty, it is defaulted to the labels present on the Pod template.