Commit 8088ea42 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #39157 from lukaszo/ds-generation

Automatic merge from submit-queue DaemonSet ObservedGeneration Extracting ObserverdGeneration part from #31693. It also implements #7328 for DaemonSets. cc @kargakis
parents ed5a2365 a36a9787
...@@ -35046,6 +35046,11 @@ ...@@ -35046,6 +35046,11 @@
"description": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.", "description": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.",
"type": "integer", "type": "integer",
"format": "int32" "format": "int32"
},
"observedGeneration": {
"description": "ObservedGeneration is the most recent generation observed by the daemon set controller.",
"type": "integer",
"format": "int64"
} }
} }
}, },
...@@ -8636,6 +8636,11 @@ ...@@ -8636,6 +8636,11 @@
"type": "integer", "type": "integer",
"format": "int32", "format": "int32",
"description": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready." "description": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready."
},
"observedGeneration": {
"type": "integer",
"format": "int64",
"description": "ObservedGeneration is the most recent generation observed by the daemon set controller."
} }
} }
}, },
......
...@@ -654,6 +654,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } ...@@ -654,6 +654,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; }
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int32)</p></td> <td class="tableblock halign-left valign-top"><p class="tableblock">integer (int32)</p></td>
<td class="tableblock halign-left valign-top"></td> <td class="tableblock halign-left valign-top"></td>
</tr> </tr>
<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock">observedGeneration</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">ObservedGeneration is the most recent generation observed by the daemon set controller.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">false</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int64)</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody> </tbody>
</table> </table>
...@@ -6926,7 +6933,7 @@ Both these may change in the future. Incoming requests are matched against the h ...@@ -6926,7 +6933,7 @@ Both these may change in the future. Incoming requests are matched against the h
</div> </div>
<div id="footer"> <div id="footer">
<div id="footer-text"> <div id="footer-text">
Last updated 2016-12-21 12:26:48 UTC Last updated 2017-01-02 13:56:15 UTC
</div> </div>
</div> </div>
</body> </body>
......
...@@ -11452,6 +11452,11 @@ ...@@ -11452,6 +11452,11 @@
"description": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.", "description": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.",
"type": "integer", "type": "integer",
"format": "int32" "format": "int32"
},
"observedGeneration": {
"description": "ObservedGeneration is the most recent generation observed by the daemon set controller.",
"type": "integer",
"format": "int64"
} }
} }
}, },
......
...@@ -478,6 +478,10 @@ type DaemonSetStatus struct { ...@@ -478,6 +478,10 @@ type DaemonSetStatus struct {
// NumberReady is the number of nodes that should be running the daemon pod and have one // NumberReady is the number of nodes that should be running the daemon pod and have one
// or more of the daemon pod running and ready. // or more of the daemon pod running and ready.
NumberReady int32 NumberReady int32
// ObservedGeneration is the most recent generation observed by the daemon set controller.
// +optional
ObservedGeneration int64
} }
// +genclient=true // +genclient=true
......
...@@ -138,6 +138,10 @@ message DaemonSetStatus { ...@@ -138,6 +138,10 @@ message DaemonSetStatus {
// NumberReady is the number of nodes that should be running the daemon pod and have one // NumberReady is the number of nodes that should be running the daemon pod and have one
// or more of the daemon pod running and ready. // or more of the daemon pod running and ready.
optional int32 numberReady = 4; optional int32 numberReady = 4;
// ObservedGeneration is the most recent generation observed by the daemon set controller.
// +optional
optional int64 observedGeneration = 5;
} }
// Deployment enables declarative updates for Pods and ReplicaSets. // Deployment enables declarative updates for Pods and ReplicaSets.
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -568,6 +568,10 @@ type DaemonSetStatus struct { ...@@ -568,6 +568,10 @@ type DaemonSetStatus struct {
// NumberReady is the number of nodes that should be running the daemon pod and have one // NumberReady is the number of nodes that should be running the daemon pod and have one
// or more of the daemon pod running and ready. // or more of the daemon pod running and ready.
NumberReady int32 `json:"numberReady" protobuf:"varint,4,opt,name=numberReady"` NumberReady int32 `json:"numberReady" protobuf:"varint,4,opt,name=numberReady"`
// ObservedGeneration is the most recent generation observed by the daemon set controller.
// +optional
ObservedGeneration int64 `json:"observedGeneration,omitempty" protobuf:"varint,5,opt,name=observedGeneration"`
} }
// +genclient=true // +genclient=true
......
...@@ -100,6 +100,7 @@ var map_DaemonSetStatus = map[string]string{ ...@@ -100,6 +100,7 @@ var map_DaemonSetStatus = map[string]string{
"numberMisscheduled": "NumberMisscheduled is the number of nodes that are running the daemon pod, but are not supposed to run the daemon pod. More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md", "numberMisscheduled": "NumberMisscheduled is the number of nodes that are running the daemon pod, but are not supposed to run the daemon pod. More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md",
"desiredNumberScheduled": "DesiredNumberScheduled is the total number of nodes that should be running the daemon pod (including nodes correctly running the daemon pod). More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md", "desiredNumberScheduled": "DesiredNumberScheduled is the total number of nodes that should be running the daemon pod (including nodes correctly running the daemon pod). More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md",
"numberReady": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.", "numberReady": "NumberReady is the number of nodes that should be running the daemon pod and have one or more of the daemon pod running and ready.",
"observedGeneration": "ObservedGeneration is the most recent generation observed by the daemon set controller.",
} }
func (DaemonSetStatus) SwaggerDoc() map[string]string { func (DaemonSetStatus) SwaggerDoc() map[string]string {
......
...@@ -362,6 +362,7 @@ func autoConvert_v1beta1_DaemonSetStatus_To_extensions_DaemonSetStatus(in *Daemo ...@@ -362,6 +362,7 @@ func autoConvert_v1beta1_DaemonSetStatus_To_extensions_DaemonSetStatus(in *Daemo
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady out.NumberReady = in.NumberReady
out.ObservedGeneration = in.ObservedGeneration
return nil return nil
} }
...@@ -374,6 +375,7 @@ func autoConvert_extensions_DaemonSetStatus_To_v1beta1_DaemonSetStatus(in *exten ...@@ -374,6 +375,7 @@ func autoConvert_extensions_DaemonSetStatus_To_v1beta1_DaemonSetStatus(in *exten
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady out.NumberReady = in.NumberReady
out.ObservedGeneration = in.ObservedGeneration
return nil return nil
} }
......
...@@ -243,6 +243,7 @@ func DeepCopy_v1beta1_DaemonSetStatus(in interface{}, out interface{}, c *conver ...@@ -243,6 +243,7 @@ func DeepCopy_v1beta1_DaemonSetStatus(in interface{}, out interface{}, c *conver
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady out.NumberReady = in.NumberReady
out.ObservedGeneration = in.ObservedGeneration
return nil return nil
} }
} }
......
...@@ -109,6 +109,7 @@ func validateDaemonSetStatus(status *extensions.DaemonSetStatus, fldPath *field. ...@@ -109,6 +109,7 @@ func validateDaemonSetStatus(status *extensions.DaemonSetStatus, fldPath *field.
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberMisscheduled), fldPath.Child("numberMisscheduled"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberMisscheduled), fldPath.Child("numberMisscheduled"))...)
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.DesiredNumberScheduled), fldPath.Child("desiredNumberScheduled"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.DesiredNumberScheduled), fldPath.Child("desiredNumberScheduled"))...)
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberReady), fldPath.Child("numberReady"))...) allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(int64(status.NumberReady), fldPath.Child("numberReady"))...)
allErrs = append(allErrs, apivalidation.ValidateNonnegativeField(status.ObservedGeneration, fldPath.Child("observedGeneration"))...)
return allErrs return allErrs
} }
......
...@@ -80,6 +80,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -80,6 +80,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 2, NumberMisscheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
update: extensions.DaemonSet{ update: extensions.DaemonSet{
...@@ -93,6 +94,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -93,6 +94,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: -1, NumberMisscheduled: -1,
DesiredNumberScheduled: -3, DesiredNumberScheduled: -3,
NumberReady: -1, NumberReady: -1,
ObservedGeneration: -3,
}, },
}, },
}, },
...@@ -108,6 +110,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -108,6 +110,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 2, NumberMisscheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
update: extensions.DaemonSet{ update: extensions.DaemonSet{
...@@ -121,6 +124,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -121,6 +124,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 1, NumberMisscheduled: 1,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
}, },
...@@ -136,6 +140,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -136,6 +140,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 2, NumberMisscheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
update: extensions.DaemonSet{ update: extensions.DaemonSet{
...@@ -149,6 +154,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -149,6 +154,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: -1, NumberMisscheduled: -1,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
}, },
...@@ -164,6 +170,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -164,6 +170,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 2, NumberMisscheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
update: extensions.DaemonSet{ update: extensions.DaemonSet{
...@@ -177,6 +184,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -177,6 +184,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 1, NumberMisscheduled: 1,
DesiredNumberScheduled: -3, DesiredNumberScheduled: -3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
}, },
...@@ -192,6 +200,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -192,6 +200,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 2, NumberMisscheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1, NumberReady: 1,
ObservedGeneration: 3,
}, },
}, },
update: extensions.DaemonSet{ update: extensions.DaemonSet{
...@@ -205,6 +214,37 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -205,6 +214,37 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
NumberMisscheduled: 1, NumberMisscheduled: 1,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: -1, NumberReady: -1,
ObservedGeneration: 3,
},
},
},
"negative ObservedGeneration": {
old: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{
Name: "abc",
Namespace: api.NamespaceDefault,
ResourceVersion: "10",
},
Status: extensions.DaemonSetStatus{
CurrentNumberScheduled: 1,
NumberMisscheduled: 2,
DesiredNumberScheduled: 3,
NumberReady: 1,
ObservedGeneration: 3,
},
},
update: extensions.DaemonSet{
ObjectMeta: api.ObjectMeta{
Name: "abc",
Namespace: api.NamespaceDefault,
ResourceVersion: "10",
},
Status: extensions.DaemonSetStatus{
CurrentNumberScheduled: 1,
NumberMisscheduled: 1,
DesiredNumberScheduled: 3,
NumberReady: 1,
ObservedGeneration: -3,
}, },
}, },
}, },
......
...@@ -228,6 +228,7 @@ func DeepCopy_extensions_DaemonSetStatus(in interface{}, out interface{}, c *con ...@@ -228,6 +228,7 @@ func DeepCopy_extensions_DaemonSetStatus(in interface{}, out interface{}, c *con
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady out.NumberReady = in.NumberReady
out.ObservedGeneration = in.ObservedGeneration
return nil return nil
} }
} }
......
...@@ -540,7 +540,8 @@ func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds ...@@ -540,7 +540,8 @@ func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds
if int(ds.Status.DesiredNumberScheduled) == desiredNumberScheduled && if int(ds.Status.DesiredNumberScheduled) == desiredNumberScheduled &&
int(ds.Status.CurrentNumberScheduled) == currentNumberScheduled && int(ds.Status.CurrentNumberScheduled) == currentNumberScheduled &&
int(ds.Status.NumberMisscheduled) == numberMisscheduled && int(ds.Status.NumberMisscheduled) == numberMisscheduled &&
int(ds.Status.NumberReady) == numberReady { int(ds.Status.NumberReady) == numberReady &&
ds.Status.ObservedGeneration >= ds.Generation {
return nil return nil
} }
...@@ -553,6 +554,7 @@ func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds ...@@ -553,6 +554,7 @@ func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds
var updateErr, getErr error var updateErr, getErr error
for i := 0; i < StatusUpdateRetries; i++ { for i := 0; i < StatusUpdateRetries; i++ {
toUpdate.Status.ObservedGeneration = ds.Generation
toUpdate.Status.DesiredNumberScheduled = int32(desiredNumberScheduled) toUpdate.Status.DesiredNumberScheduled = int32(desiredNumberScheduled)
toUpdate.Status.CurrentNumberScheduled = int32(currentNumberScheduled) toUpdate.Status.CurrentNumberScheduled = int32(currentNumberScheduled)
toUpdate.Status.NumberMisscheduled = int32(numberMisscheduled) toUpdate.Status.NumberMisscheduled = int32(numberMisscheduled)
......
...@@ -609,3 +609,28 @@ func TestNumberReadyStatus(t *testing.T) { ...@@ -609,3 +609,28 @@ func TestNumberReadyStatus(t *testing.T) {
t.Errorf("Wrong daemon %s status: %v", updated.Name, updated.Status) t.Errorf("Wrong daemon %s status: %v", updated.Name, updated.Status)
} }
} }
func TestObservedGeneration(t *testing.T) {
daemon := newDaemonSet("foo")
daemon.Generation = 1
manager, podControl, clientset := newTestController()
var updated *extensions.DaemonSet
clientset.PrependReactor("update", "daemonsets", func(action core.Action) (handled bool, ret runtime.Object, err error) {
if action.GetSubresource() != "status" {
return false, nil, nil
}
if u, ok := action.(core.UpdateAction); ok {
updated = u.GetObject().(*extensions.DaemonSet)
}
return false, nil, nil
})
addNodes(manager.nodeStore.Store, 0, 1, simpleNodeLabel)
addPods(manager.podStore.Indexer, "node-0", simpleDaemonSetLabel, 1)
manager.dsStore.Add(daemon)
syncAndValidateDaemonSets(t, manager, daemon, podControl, 0, 0)
if updated.Status.ObservedGeneration != daemon.Generation {
t.Errorf("Wrong ObservedGeneration for daemon %s in status. Expected %d, got %d", updated.Name, daemon.Generation, updated.Status.ObservedGeneration)
}
}
...@@ -10014,6 +10014,13 @@ var OpenAPIDefinitions *common.OpenAPIDefinitions = &common.OpenAPIDefinitions{ ...@@ -10014,6 +10014,13 @@ var OpenAPIDefinitions *common.OpenAPIDefinitions = &common.OpenAPIDefinitions{
Format: "int32", Format: "int32",
}, },
}, },
"observedGeneration": {
SchemaProps: spec.SchemaProps{
Description: "ObservedGeneration is the most recent generation observed by the daemon set controller.",
Type: []string{"integer"},
Format: "int64",
},
},
}, },
Required: []string{"currentNumberScheduled", "numberMisscheduled", "desiredNumberScheduled", "numberReady"}, Required: []string{"currentNumberScheduled", "numberMisscheduled", "desiredNumberScheduled", "numberReady"},
}, },
......
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