Move TemplateGeneration to the Spec

This commit is contained in:
Łukasz Oleś 2017-02-23 16:02:06 +01:00
parent b59ecde587
commit 620310c12f
7 changed files with 22 additions and 19 deletions

View File

@ -441,6 +441,11 @@ type DaemonSetSpec struct {
// is ready). // is ready).
// +optional // +optional
MinReadySeconds int32 MinReadySeconds int32
// A sequence number representing a specific generation of the template.
// Populated by the system. It can be set only during the creation.
// +optional
TemplateGeneration int64
} }
// DaemonSetStatus represents the current status of a daemon set. // DaemonSetStatus represents the current status of a daemon set.
@ -505,11 +510,6 @@ type DaemonSet struct {
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
// +optional // +optional
Status DaemonSetStatus Status DaemonSetStatus
// A sequence number representing a specific generation of the template.
// Populated by the system. Read-only.
// +optional
TemplateGeneration int64
} }
const ( const (

View File

@ -440,6 +440,11 @@ type DaemonSetSpec struct {
// is ready). // is ready).
// +optional // +optional
MinReadySeconds int32 `json:"minReadySeconds,omitempty" protobuf:"varint,4,opt,name=minReadySeconds"` MinReadySeconds int32 `json:"minReadySeconds,omitempty" protobuf:"varint,4,opt,name=minReadySeconds"`
// A sequence number representing a specific generation of the template.
// Populated by the system. It can be set only during the creation.
// +optional
TemplateGeneration int64 `json:"templateGeneration,omitempty" protobuf:"varint,5,opt,name=templateGeneration"`
} }
// DaemonSetStatus represents the current status of a daemon set. // DaemonSetStatus represents the current status of a daemon set.
@ -507,11 +512,6 @@ type DaemonSet struct {
// More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status // More info: http://releases.k8s.io/HEAD/docs/devel/api-conventions.md#spec-and-status
// +optional // +optional
Status DaemonSetStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"` Status DaemonSetStatus `json:"status,omitempty" protobuf:"bytes,3,opt,name=status"`
// A sequence number representing a specific generation of the template.
// Populated by the system. Read-only.
// +optional
TemplateGeneration int64 `json:"templateGeneration,omitempty" protobuf:"varint,4,opt,name=templateGeneration"`
} }
const ( const (

View File

@ -145,6 +145,7 @@ func ValidateDaemonSetSpec(spec *extensions.DaemonSetSpec, fldPath *field.Path)
allErrs = append(allErrs, field.NotSupported(fldPath.Child("template", "spec", "restartPolicy"), spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)})) allErrs = append(allErrs, field.NotSupported(fldPath.Child("template", "spec", "restartPolicy"), spec.Template.Spec.RestartPolicy, []string{string(api.RestartPolicyAlways)}))
} }
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.MinReadySeconds), fldPath.Child("minReadySeconds"))...)
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(spec.TemplateGeneration), fldPath.Child("templateGeneration"))...)
allErrs = append(allErrs, ValidateDaemonSetUpdateStrategy(&spec.UpdateStrategy, fldPath.Child("updateStrategy"))...) allErrs = append(allErrs, ValidateDaemonSetUpdateStrategy(&spec.UpdateStrategy, fldPath.Child("updateStrategy"))...)
return allErrs return allErrs

View File

@ -576,7 +576,7 @@ func (dsc *DaemonSetsController) syncNodes(ds *extensions.DaemonSet, podsToDelet
glog.V(4).Infof("Nodes needing daemon pods for daemon set %s: %+v, creating %d", ds.Name, nodesNeedingDaemonPods, createDiff) glog.V(4).Infof("Nodes needing daemon pods for daemon set %s: %+v, creating %d", ds.Name, nodesNeedingDaemonPods, createDiff)
createWait := sync.WaitGroup{} createWait := sync.WaitGroup{}
createWait.Add(createDiff) createWait.Add(createDiff)
template := util.GetPodTemplateWithGeneration(ds.Spec.Template, ds.TemplateGeneration) template := util.GetPodTemplateWithGeneration(ds.Spec.Template, ds.Spec.TemplateGeneration)
for i := 0; i < createDiff; i++ { for i := 0; i < createDiff; i++ {
go func(ix int) { go func(ix int) {
defer createWait.Done() defer createWait.Done()
@ -695,7 +695,7 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet)
numberAvailable++ numberAvailable++
} }
} }
if util.IsPodUpdated(ds.TemplateGeneration, pod) { if util.IsPodUpdated(ds.Spec.TemplateGeneration, pod) {
updatedNumberScheduled++ updatedNumberScheduled++
} }
} }

View File

@ -1022,7 +1022,7 @@ func TestDaemonSetUpdatesPods(t *testing.T) {
ds.Spec.UpdateStrategy.Type = extensions.RollingUpdateDaemonSetStrategyType ds.Spec.UpdateStrategy.Type = extensions.RollingUpdateDaemonSetStrategyType
intStr := intstr.FromInt(maxUnavailable) intStr := intstr.FromInt(maxUnavailable)
ds.Spec.UpdateStrategy.RollingUpdate = &extensions.RollingUpdateDaemonSet{MaxUnavailable: &intStr} ds.Spec.UpdateStrategy.RollingUpdate = &extensions.RollingUpdateDaemonSet{MaxUnavailable: &intStr}
ds.TemplateGeneration++ ds.Spec.TemplateGeneration++
manager.dsStore.Update(ds) manager.dsStore.Update(ds)
clearExpectations(t, manager, ds, podControl) clearExpectations(t, manager, ds, podControl)
@ -1061,7 +1061,7 @@ func TestDaemonSetUpdatesWhenNewPosIsNotReady(t *testing.T) {
ds.Spec.UpdateStrategy.Type = extensions.RollingUpdateDaemonSetStrategyType ds.Spec.UpdateStrategy.Type = extensions.RollingUpdateDaemonSetStrategyType
intStr := intstr.FromInt(maxUnavailable) intStr := intstr.FromInt(maxUnavailable)
ds.Spec.UpdateStrategy.RollingUpdate = &extensions.RollingUpdateDaemonSet{MaxUnavailable: &intStr} ds.Spec.UpdateStrategy.RollingUpdate = &extensions.RollingUpdateDaemonSet{MaxUnavailable: &intStr}
ds.TemplateGeneration++ ds.Spec.TemplateGeneration++
manager.dsStore.Update(ds) manager.dsStore.Update(ds)
// new pods are not ready numUnavailable == maxUnavailable // new pods are not ready numUnavailable == maxUnavailable
@ -1087,7 +1087,7 @@ func TestDaemonSetUpdatesAllOldPodsNotReady(t *testing.T) {
ds.Spec.UpdateStrategy.Type = extensions.RollingUpdateDaemonSetStrategyType ds.Spec.UpdateStrategy.Type = extensions.RollingUpdateDaemonSetStrategyType
intStr := intstr.FromInt(maxUnavailable) intStr := intstr.FromInt(maxUnavailable)
ds.Spec.UpdateStrategy.RollingUpdate = &extensions.RollingUpdateDaemonSet{MaxUnavailable: &intStr} ds.Spec.UpdateStrategy.RollingUpdate = &extensions.RollingUpdateDaemonSet{MaxUnavailable: &intStr}
ds.TemplateGeneration++ ds.Spec.TemplateGeneration++
manager.dsStore.Update(ds) manager.dsStore.Update(ds)
// all old pods are unavailable so should be removed // all old pods are unavailable so should be removed

View File

@ -80,7 +80,7 @@ func (dsc *DaemonSetsController) getAllDaemonSetPods(ds *extensions.DaemonSet) (
return newPods, oldPods, fmt.Errorf("Couldn't get list of pods for daemon set %#v: %v", ds, err) return newPods, oldPods, fmt.Errorf("Couldn't get list of pods for daemon set %#v: %v", ds, err)
} }
for _, pod := range daemonPods { for _, pod := range daemonPods {
if util.IsPodUpdated(ds.TemplateGeneration, pod) { if util.IsPodUpdated(ds.Spec.TemplateGeneration, pod) {
newPods = append(newPods, pod) newPods = append(newPods, pod)
} else { } else {
oldPods = append(oldPods, pod) oldPods = append(oldPods, pod)

View File

@ -53,7 +53,9 @@ func (daemonSetStrategy) PrepareForCreate(ctx genericapirequest.Context, obj run
daemonSet.Status = extensions.DaemonSetStatus{} daemonSet.Status = extensions.DaemonSetStatus{}
daemonSet.Generation = 1 daemonSet.Generation = 1
daemonSet.TemplateGeneration = 1 if daemonSet.Spec.TemplateGeneration < 1 {
daemonSet.Spec.TemplateGeneration = 1
}
} }
// PrepareForUpdate clears fields that are not allowed to be set by end users on update. // PrepareForUpdate clears fields that are not allowed to be set by end users on update.
@ -65,7 +67,7 @@ func (daemonSetStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, ol
newDaemonSet.Status = oldDaemonSet.Status newDaemonSet.Status = oldDaemonSet.Status
// update is not allowed to set TemplateGeneration // update is not allowed to set TemplateGeneration
newDaemonSet.TemplateGeneration = oldDaemonSet.TemplateGeneration newDaemonSet.Spec.TemplateGeneration = oldDaemonSet.Spec.TemplateGeneration
// Any changes to the spec increment the generation number, any changes to the // Any changes to the spec increment the generation number, any changes to the
// status should reflect the generation number of the corresponding object. We push // status should reflect the generation number of the corresponding object. We push
@ -79,7 +81,7 @@ func (daemonSetStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, ol
// TODO: Any changes to a part of the object that represents desired state (labels, // TODO: Any changes to a part of the object that represents desired state (labels,
// annotations etc) should also increment the generation. // annotations etc) should also increment the generation.
if !reflect.DeepEqual(oldDaemonSet.Spec.Template, newDaemonSet.Spec.Template) { if !reflect.DeepEqual(oldDaemonSet.Spec.Template, newDaemonSet.Spec.Template) {
newDaemonSet.TemplateGeneration = oldDaemonSet.TemplateGeneration + 1 newDaemonSet.Spec.TemplateGeneration = oldDaemonSet.Spec.TemplateGeneration + 1
newDaemonSet.Generation = oldDaemonSet.Generation + 1 newDaemonSet.Generation = oldDaemonSet.Generation + 1
return return
} }