Commit 523fce99 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #32781 from lukaszo/ready_ds

Automatic merge from submit-queue Add ReadyScheduled to DaemonSet status Fixes #25605 cc @bgrant0607 @mikedanese
parents b8b7f9ff 4ebe1f66
...@@ -29489,7 +29489,8 @@ ...@@ -29489,7 +29489,8 @@
"required": [ "required": [
"currentNumberScheduled", "currentNumberScheduled",
"numberMisscheduled", "numberMisscheduled",
"desiredNumberScheduled" "desiredNumberScheduled",
"numberReady"
], ],
"properties": { "properties": {
"currentNumberScheduled": { "currentNumberScheduled": {
...@@ -29506,6 +29507,11 @@ ...@@ -29506,6 +29507,11 @@
"description": "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", "description": "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",
"type": "integer", "type": "integer",
"format": "int32" "format": "int32"
},
"numberReady": {
"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",
"format": "int32"
} }
} }
}, },
......
...@@ -7144,7 +7144,8 @@ ...@@ -7144,7 +7144,8 @@
"required": [ "required": [
"currentNumberScheduled", "currentNumberScheduled",
"numberMisscheduled", "numberMisscheduled",
"desiredNumberScheduled" "desiredNumberScheduled",
"numberReady"
], ],
"properties": { "properties": {
"currentNumberScheduled": { "currentNumberScheduled": {
...@@ -7161,6 +7162,11 @@ ...@@ -7161,6 +7162,11 @@
"description": "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", "description": "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",
"type": "integer", "type": "integer",
"format": "int32" "format": "int32"
},
"numberReady": {
"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",
"format": "int32"
} }
} }
}, },
......
...@@ -9185,7 +9185,8 @@ ...@@ -9185,7 +9185,8 @@
"required": [ "required": [
"currentNumberScheduled", "currentNumberScheduled",
"numberMisscheduled", "numberMisscheduled",
"desiredNumberScheduled" "desiredNumberScheduled",
"numberReady"
], ],
"properties": { "properties": {
"currentNumberScheduled": { "currentNumberScheduled": {
...@@ -9202,6 +9203,11 @@ ...@@ -9202,6 +9203,11 @@
"type": "integer", "type": "integer",
"format": "int32", "format": "int32",
"description": "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" "description": "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": {
"type": "integer",
"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."
} }
} }
}, },
......
...@@ -536,6 +536,13 @@ span.icon > [class^="icon-"], span.icon > [class*=" icon-"] { cursor: default; } ...@@ -536,6 +536,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">numberReady</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">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.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">true</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">integer (int32)</p></td>
<td class="tableblock halign-left valign-top"></td>
</tr>
</tbody> </tbody>
</table> </table>
...@@ -6687,7 +6694,7 @@ Both these may change in the future. Incoming requests are matched against the h ...@@ -6687,7 +6694,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-10-07 14:07:17 UTC Last updated 2016-10-12 13:31:06 UTC
</div> </div>
</div> </div>
</body> </body>
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -385,6 +385,10 @@ type DaemonSetStatus struct { ...@@ -385,6 +385,10 @@ type DaemonSetStatus struct {
// DesiredNumberScheduled is the total number of nodes that should be running the daemon // DesiredNumberScheduled is the total number of nodes that should be running the daemon
// pod (including nodes correctly running the daemon pod). // pod (including nodes correctly running the daemon pod).
DesiredNumberScheduled int32 `json:"desiredNumberScheduled"` DesiredNumberScheduled int32 `json:"desiredNumberScheduled"`
// 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 int32 `json:"numberReady"`
} }
// +genclient=true // +genclient=true
......
...@@ -127,6 +127,10 @@ message DaemonSetStatus { ...@@ -127,6 +127,10 @@ message DaemonSetStatus {
// pod (including nodes correctly running the daemon pod). // pod (including nodes correctly running the daemon pod).
// More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md // More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md
optional int32 desiredNumberScheduled = 3; optional int32 desiredNumberScheduled = 3;
// 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.
optional int32 numberReady = 4;
} }
// 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.
...@@ -459,6 +459,10 @@ type DaemonSetStatus struct { ...@@ -459,6 +459,10 @@ type DaemonSetStatus struct {
// pod (including nodes correctly running the daemon pod). // pod (including nodes correctly running the daemon pod).
// More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md // More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md
DesiredNumberScheduled int32 `json:"desiredNumberScheduled" protobuf:"varint,3,opt,name=desiredNumberScheduled"` DesiredNumberScheduled int32 `json:"desiredNumberScheduled" protobuf:"varint,3,opt,name=desiredNumberScheduled"`
// 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 int32 `json:"numberReady" protobuf:"varint,4,opt,name=numberReady"`
} }
// +genclient=true // +genclient=true
......
...@@ -99,6 +99,7 @@ var map_DaemonSetStatus = map[string]string{ ...@@ -99,6 +99,7 @@ var map_DaemonSetStatus = map[string]string{
"currentNumberScheduled": "CurrentNumberScheduled is the number of nodes that are running at least 1 daemon pod and are supposed to run the daemon pod. More info: http://releases.k8s.io/HEAD/docs/admin/daemons.md", "currentNumberScheduled": "CurrentNumberScheduled is the number of nodes that are running at least 1 daemon pod and are 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", "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.",
} }
func (DaemonSetStatus) SwaggerDoc() map[string]string { func (DaemonSetStatus) SwaggerDoc() map[string]string {
......
...@@ -455,6 +455,7 @@ func autoConvert_v1beta1_DaemonSetStatus_To_extensions_DaemonSetStatus(in *Daemo ...@@ -455,6 +455,7 @@ func autoConvert_v1beta1_DaemonSetStatus_To_extensions_DaemonSetStatus(in *Daemo
out.CurrentNumberScheduled = in.CurrentNumberScheduled out.CurrentNumberScheduled = in.CurrentNumberScheduled
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady
return nil return nil
} }
...@@ -466,6 +467,7 @@ func autoConvert_extensions_DaemonSetStatus_To_v1beta1_DaemonSetStatus(in *exten ...@@ -466,6 +467,7 @@ func autoConvert_extensions_DaemonSetStatus_To_v1beta1_DaemonSetStatus(in *exten
out.CurrentNumberScheduled = in.CurrentNumberScheduled out.CurrentNumberScheduled = in.CurrentNumberScheduled
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady
return nil return nil
} }
......
...@@ -249,6 +249,7 @@ func DeepCopy_v1beta1_DaemonSetStatus(in interface{}, out interface{}, c *conver ...@@ -249,6 +249,7 @@ func DeepCopy_v1beta1_DaemonSetStatus(in interface{}, out interface{}, c *conver
out.CurrentNumberScheduled = in.CurrentNumberScheduled out.CurrentNumberScheduled = in.CurrentNumberScheduled
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady
return nil return nil
} }
} }
......
...@@ -44,6 +44,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -44,6 +44,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
CurrentNumberScheduled: 1, CurrentNumberScheduled: 1,
NumberMisscheduled: 2, NumberMisscheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1,
}, },
}, },
update: extensions.DaemonSet{ update: extensions.DaemonSet{
...@@ -52,6 +53,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -52,6 +53,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
CurrentNumberScheduled: 1, CurrentNumberScheduled: 1,
NumberMisscheduled: 1, NumberMisscheduled: 1,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1,
}, },
}, },
}, },
...@@ -76,6 +78,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -76,6 +78,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
CurrentNumberScheduled: 1, CurrentNumberScheduled: 1,
NumberMisscheduled: 2, NumberMisscheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1,
}, },
}, },
update: extensions.DaemonSet{ update: extensions.DaemonSet{
...@@ -88,6 +91,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) { ...@@ -88,6 +91,7 @@ func TestValidateDaemonSetStatusUpdate(t *testing.T) {
CurrentNumberScheduled: -1, CurrentNumberScheduled: -1,
NumberMisscheduled: -1, NumberMisscheduled: -1,
DesiredNumberScheduled: -3, DesiredNumberScheduled: -3,
NumberReady: -1,
}, },
}, },
}, },
......
...@@ -226,6 +226,7 @@ func DeepCopy_extensions_DaemonSetStatus(in interface{}, out interface{}, c *con ...@@ -226,6 +226,7 @@ func DeepCopy_extensions_DaemonSetStatus(in interface{}, out interface{}, c *con
out.CurrentNumberScheduled = in.CurrentNumberScheduled out.CurrentNumberScheduled = in.CurrentNumberScheduled
out.NumberMisscheduled = in.NumberMisscheduled out.NumberMisscheduled = in.NumberMisscheduled
out.DesiredNumberScheduled = in.DesiredNumberScheduled out.DesiredNumberScheduled = in.DesiredNumberScheduled
out.NumberReady = in.NumberReady
return nil return nil
} }
} }
......
...@@ -531,10 +531,11 @@ func (dsc *DaemonSetsController) manage(ds *extensions.DaemonSet) error { ...@@ -531,10 +531,11 @@ func (dsc *DaemonSetsController) manage(ds *extensions.DaemonSet) error {
return utilerrors.NewAggregate(errors) return utilerrors.NewAggregate(errors)
} }
func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds *extensions.DaemonSet, desiredNumberScheduled, currentNumberScheduled, numberMisscheduled int) error { func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds *extensions.DaemonSet, desiredNumberScheduled, currentNumberScheduled, numberMisscheduled, numberReady int) error {
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 {
return nil return nil
} }
...@@ -543,6 +544,7 @@ func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds ...@@ -543,6 +544,7 @@ func storeDaemonSetStatus(dsClient unversionedextensions.DaemonSetInterface, ds
ds.Status.DesiredNumberScheduled = int32(desiredNumberScheduled) ds.Status.DesiredNumberScheduled = int32(desiredNumberScheduled)
ds.Status.CurrentNumberScheduled = int32(currentNumberScheduled) ds.Status.CurrentNumberScheduled = int32(currentNumberScheduled)
ds.Status.NumberMisscheduled = int32(numberMisscheduled) ds.Status.NumberMisscheduled = int32(numberMisscheduled)
ds.Status.NumberReady = int32(numberReady)
if _, updateErr = dsClient.UpdateStatus(ds); updateErr == nil { if _, updateErr = dsClient.UpdateStatus(ds); updateErr == nil {
return nil return nil
...@@ -570,7 +572,7 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet) ...@@ -570,7 +572,7 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet)
return fmt.Errorf("couldn't get list of nodes when updating daemon set %#v: %v", ds, err) return fmt.Errorf("couldn't get list of nodes when updating daemon set %#v: %v", ds, err)
} }
var desiredNumberScheduled, currentNumberScheduled, numberMisscheduled int var desiredNumberScheduled, currentNumberScheduled, numberMisscheduled, numberReady int
for _, node := range nodeList.Items { for _, node := range nodeList.Items {
shouldRun := dsc.nodeShouldRunDaemonPod(&node, ds) shouldRun := dsc.nodeShouldRunDaemonPod(&node, ds)
...@@ -580,6 +582,12 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet) ...@@ -580,6 +582,12 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet)
desiredNumberScheduled++ desiredNumberScheduled++
if scheduled { if scheduled {
currentNumberScheduled++ currentNumberScheduled++
// Sort the daemon pods by creation time, so the the oldest is first.
daemonPods, _ := nodeToDaemonPods[node.Name]
sort.Sort(podByCreationTimestamp(daemonPods))
if api.IsPodReady(daemonPods[0]) {
numberReady++
}
} }
} else { } else {
if scheduled { if scheduled {
...@@ -588,7 +596,7 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet) ...@@ -588,7 +596,7 @@ func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *extensions.DaemonSet)
} }
} }
err = storeDaemonSetStatus(dsc.kubeClient.Extensions().DaemonSets(ds.Namespace), ds, desiredNumberScheduled, currentNumberScheduled, numberMisscheduled) err = storeDaemonSetStatus(dsc.kubeClient.Extensions().DaemonSets(ds.Namespace), ds, desiredNumberScheduled, currentNumberScheduled, numberMisscheduled, numberReady)
if err != nil { if err != nil {
return fmt.Errorf("error storing status for daemon set %#v: %v", ds, err) return fmt.Errorf("error storing status for daemon set %#v: %v", ds, err)
} }
......
...@@ -569,3 +569,29 @@ func TestNodeAffinityDaemonLaunchesPods(t *testing.T) { ...@@ -569,3 +569,29 @@ func TestNodeAffinityDaemonLaunchesPods(t *testing.T) {
manager.dsStore.Add(daemon) manager.dsStore.Add(daemon)
syncAndValidateDaemonSets(t, manager, daemon, podControl, 3, 0) syncAndValidateDaemonSets(t, manager, daemon, podControl, 3, 0)
} }
func TestNumberReadyStatus(t *testing.T) {
manager, podControl := newTestController()
addNodes(manager.nodeStore.Store, 0, 2, simpleNodeLabel)
addPods(manager.podStore.Indexer, "node-0", simpleDaemonSetLabel, 1)
addPods(manager.podStore.Indexer, "node-1", simpleDaemonSetLabel, 1)
daemon := newDaemonSet("foo")
manager.dsStore.Add(daemon)
syncAndValidateDaemonSets(t, manager, daemon, podControl, 0, 0)
if daemon.Status.NumberReady != 0 {
t.Errorf("Wrong daemon %s status: %v", daemon.Name, daemon.Status)
}
selector, _ := unversioned.LabelSelectorAsSelector(daemon.Spec.Selector)
daemonPods, _ := manager.podStore.Pods(daemon.Namespace).List(selector)
for _, pod := range daemonPods {
condition := api.PodCondition{Type: api.PodReady, Status: api.ConditionTrue}
pod.Status.Conditions = append(pod.Status.Conditions, condition)
}
syncAndValidateDaemonSets(t, manager, daemon, podControl, 0, 0)
if daemon.Status.NumberReady != 2 {
t.Errorf("Wrong daemon %s status: %v", daemon.Name, daemon.Status)
}
}
...@@ -3268,8 +3268,15 @@ var OpenAPIDefinitions *common.OpenAPIDefinitions = &common.OpenAPIDefinitions{ ...@@ -3268,8 +3268,15 @@ var OpenAPIDefinitions *common.OpenAPIDefinitions = &common.OpenAPIDefinitions{
Format: "int32", Format: "int32",
}, },
}, },
"numberReady": {
SchemaProps: spec.SchemaProps{
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: []string{"integer"},
Format: "int32",
},
},
}, },
Required: []string{"currentNumberScheduled", "numberMisscheduled", "desiredNumberScheduled"}, Required: []string{"currentNumberScheduled", "numberMisscheduled", "desiredNumberScheduled", "numberReady"},
}, },
}, },
Dependencies: []string{}, Dependencies: []string{},
...@@ -15499,8 +15506,15 @@ var OpenAPIDefinitions *common.OpenAPIDefinitions = &common.OpenAPIDefinitions{ ...@@ -15499,8 +15506,15 @@ var OpenAPIDefinitions *common.OpenAPIDefinitions = &common.OpenAPIDefinitions{
Format: "int32", Format: "int32",
}, },
}, },
"numberReady": {
SchemaProps: spec.SchemaProps{
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: []string{"integer"},
Format: "int32",
},
},
}, },
Required: []string{"currentNumberScheduled", "numberMisscheduled", "desiredNumberScheduled"}, Required: []string{"currentNumberScheduled", "numberMisscheduled", "desiredNumberScheduled", "numberReady"},
}, },
}, },
Dependencies: []string{}, Dependencies: []string{},
......
...@@ -472,7 +472,7 @@ var ( ...@@ -472,7 +472,7 @@ var (
petSetColumns = []string{"NAME", "DESIRED", "CURRENT", "AGE"} petSetColumns = []string{"NAME", "DESIRED", "CURRENT", "AGE"}
endpointColumns = []string{"NAME", "ENDPOINTS", "AGE"} endpointColumns = []string{"NAME", "ENDPOINTS", "AGE"}
nodeColumns = []string{"NAME", "STATUS", "AGE"} nodeColumns = []string{"NAME", "STATUS", "AGE"}
daemonSetColumns = []string{"NAME", "DESIRED", "CURRENT", "NODE-SELECTOR", "AGE"} daemonSetColumns = []string{"NAME", "DESIRED", "CURRENT", "READY", "NODE-SELECTOR", "AGE"}
eventColumns = []string{"LASTSEEN", "FIRSTSEEN", "COUNT", "NAME", "KIND", "SUBOBJECT", "TYPE", "REASON", "SOURCE", "MESSAGE"} eventColumns = []string{"LASTSEEN", "FIRSTSEEN", "COUNT", "NAME", "KIND", "SUBOBJECT", "TYPE", "REASON", "SOURCE", "MESSAGE"}
limitRangeColumns = []string{"NAME", "AGE"} limitRangeColumns = []string{"NAME", "AGE"}
resourceQuotaColumns = []string{"NAME", "AGE"} resourceQuotaColumns = []string{"NAME", "AGE"}
...@@ -1286,15 +1286,17 @@ func printDaemonSet(ds *extensions.DaemonSet, w io.Writer, options PrintOptions) ...@@ -1286,15 +1286,17 @@ func printDaemonSet(ds *extensions.DaemonSet, w io.Writer, options PrintOptions)
desiredScheduled := ds.Status.DesiredNumberScheduled desiredScheduled := ds.Status.DesiredNumberScheduled
currentScheduled := ds.Status.CurrentNumberScheduled currentScheduled := ds.Status.CurrentNumberScheduled
numberReady := ds.Status.NumberReady
selector, err := unversioned.LabelSelectorAsSelector(ds.Spec.Selector) selector, err := unversioned.LabelSelectorAsSelector(ds.Spec.Selector)
if err != nil { if err != nil {
// this shouldn't happen if LabelSelector passed validation // this shouldn't happen if LabelSelector passed validation
return err return err
} }
if _, err := fmt.Fprintf(w, "%s\t%d\t%d\t%s\t%s", if _, err := fmt.Fprintf(w, "%s\t%d\t%d\t%d\t%s\t%s",
name, name,
desiredScheduled, desiredScheduled,
currentScheduled, currentScheduled,
numberReady,
labels.FormatLabels(ds.Spec.Template.Spec.NodeSelector), labels.FormatLabels(ds.Spec.Template.Spec.NodeSelector),
translateTimestamp(ds.CreationTimestamp), translateTimestamp(ds.CreationTimestamp),
); err != nil { ); err != nil {
......
...@@ -1446,9 +1446,10 @@ func TestPrintDaemonSet(t *testing.T) { ...@@ -1446,9 +1446,10 @@ func TestPrintDaemonSet(t *testing.T) {
Status: extensions.DaemonSetStatus{ Status: extensions.DaemonSetStatus{
CurrentNumberScheduled: 2, CurrentNumberScheduled: 2,
DesiredNumberScheduled: 3, DesiredNumberScheduled: 3,
NumberReady: 1,
}, },
}, },
"test1\t3\t2\t<none>\t0s\n", "test1\t3\t2\t1\t<none>\t0s\n",
}, },
} }
......
...@@ -127,6 +127,8 @@ var _ = framework.KubeDescribe("Daemon set [Serial]", func() { ...@@ -127,6 +127,8 @@ var _ = framework.KubeDescribe("Daemon set [Serial]", func() {
Expect(err).NotTo(HaveOccurred()) Expect(err).NotTo(HaveOccurred())
err = wait.Poll(dsRetryPeriod, dsRetryTimeout, checkRunningOnAllNodes(f, label)) err = wait.Poll(dsRetryPeriod, dsRetryTimeout, checkRunningOnAllNodes(f, label))
Expect(err).NotTo(HaveOccurred(), "error waiting for daemon pod to start") Expect(err).NotTo(HaveOccurred(), "error waiting for daemon pod to start")
err = checkDaemonStatus(f, dsName)
Expect(err).NotTo(HaveOccurred())
By("Stop a daemon pod, check that the daemon pod is revived.") By("Stop a daemon pod, check that the daemon pod is revived.")
podClient := c.Pods(ns) podClient := c.Pods(ns)
...@@ -186,6 +188,8 @@ var _ = framework.KubeDescribe("Daemon set [Serial]", func() { ...@@ -186,6 +188,8 @@ var _ = framework.KubeDescribe("Daemon set [Serial]", func() {
Expect(len(daemonSetLabels)).To(Equal(1)) Expect(len(daemonSetLabels)).To(Equal(1))
err = wait.Poll(dsRetryPeriod, dsRetryTimeout, checkDaemonPodOnNodes(f, complexLabel, []string{newNode.Name})) err = wait.Poll(dsRetryPeriod, dsRetryTimeout, checkDaemonPodOnNodes(f, complexLabel, []string{newNode.Name}))
Expect(err).NotTo(HaveOccurred(), "error waiting for daemon pods to be running on new nodes") Expect(err).NotTo(HaveOccurred(), "error waiting for daemon pods to be running on new nodes")
err = checkDaemonStatus(f, dsName)
Expect(err).NotTo(HaveOccurred())
By("remove the node selector and wait for daemons to be unscheduled") By("remove the node selector and wait for daemons to be unscheduled")
_, err = setDaemonSetNodeLabels(c, nodeList.Items[0].Name, map[string]string{}) _, err = setDaemonSetNodeLabels(c, nodeList.Items[0].Name, map[string]string{})
...@@ -252,6 +256,8 @@ var _ = framework.KubeDescribe("Daemon set [Serial]", func() { ...@@ -252,6 +256,8 @@ var _ = framework.KubeDescribe("Daemon set [Serial]", func() {
Expect(len(daemonSetLabels)).To(Equal(1)) Expect(len(daemonSetLabels)).To(Equal(1))
err = wait.Poll(dsRetryPeriod, dsRetryTimeout, checkDaemonPodOnNodes(f, complexLabel, []string{newNode.Name})) err = wait.Poll(dsRetryPeriod, dsRetryTimeout, checkDaemonPodOnNodes(f, complexLabel, []string{newNode.Name}))
Expect(err).NotTo(HaveOccurred(), "error waiting for daemon pods to be running on new nodes") Expect(err).NotTo(HaveOccurred(), "error waiting for daemon pods to be running on new nodes")
err = checkDaemonStatus(f, dsName)
Expect(err).NotTo(HaveOccurred())
By("remove the node selector and wait for daemons to be unscheduled") By("remove the node selector and wait for daemons to be unscheduled")
_, err = setDaemonSetNodeLabels(c, nodeList.Items[0].Name, map[string]string{}) _, err = setDaemonSetNodeLabels(c, nodeList.Items[0].Name, map[string]string{})
...@@ -374,3 +380,15 @@ func checkRunningOnAllNodes(f *framework.Framework, selector map[string]string) ...@@ -374,3 +380,15 @@ func checkRunningOnAllNodes(f *framework.Framework, selector map[string]string)
func checkRunningOnNoNodes(f *framework.Framework, selector map[string]string) func() (bool, error) { func checkRunningOnNoNodes(f *framework.Framework, selector map[string]string) func() (bool, error) {
return checkDaemonPodOnNodes(f, selector, make([]string, 0)) return checkDaemonPodOnNodes(f, selector, make([]string, 0))
} }
func checkDaemonStatus(f *framework.Framework, dsName string) error {
ds, err := f.Client.DaemonSets(f.Namespace.Name).Get(dsName)
if err != nil {
return fmt.Errorf("Could not get daemon set from api.")
}
desired, scheduled, ready := ds.Status.DesiredNumberScheduled, ds.Status.CurrentNumberScheduled, ds.Status.NumberReady
if desired != scheduled && desired != ready {
return fmt.Errorf("Error in daemon status. DesiredScheduled: %d, CurrentScheduled: %d, Ready: %d", desired, scheduled, ready)
}
return nil
}
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