Skip terminal Pods with a deletion timestamp from the Daemonset sync (#118716)
* Skip terminal Pods with a deletion timestamp from the Daemonset sync Change-Id: I64a347a87c02ee2bd48be10e6fff380c8c81f742 * Review comments and fix integration test Change-Id: I3eb5ec62bce8b4b150726a1e9b2b517c4e993713 * Include deleted terminal pods in history Change-Id: I8b921157e6be1c809dd59f8035ec259ea4d96301
This commit is contained in:

committed by
GitHub

parent
6dbb1c6cf0
commit
a4519665fe
@@ -2739,75 +2739,128 @@ func TestDeleteUnscheduledPodForNotExistingNode(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetNodesToDaemonPods(t *testing.T) {
|
||||
for _, strategy := range updateStrategies() {
|
||||
ds := newDaemonSet("foo")
|
||||
ds.Spec.UpdateStrategy = *strategy
|
||||
ds2 := newDaemonSet("foo2")
|
||||
ds2.Spec.UpdateStrategy = *strategy
|
||||
_, ctx := ktesting.NewTestContext(t)
|
||||
manager, _, _, err := newTestController(ctx, ds, ds2)
|
||||
if err != nil {
|
||||
t.Fatalf("error creating DaemonSets controller: %v", err)
|
||||
}
|
||||
err = manager.dsStore.Add(ds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
err = manager.dsStore.Add(ds2)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
addNodes(manager.nodeStore, 0, 2, nil)
|
||||
|
||||
// These pods should be returned.
|
||||
wantedPods := []*v1.Pod{
|
||||
newPod("matching-owned-0-", "node-0", simpleDaemonSetLabel, ds),
|
||||
newPod("matching-orphan-0-", "node-0", simpleDaemonSetLabel, nil),
|
||||
newPod("matching-owned-1-", "node-1", simpleDaemonSetLabel, ds),
|
||||
newPod("matching-orphan-1-", "node-1", simpleDaemonSetLabel, nil),
|
||||
}
|
||||
failedPod := newPod("matching-owned-failed-pod-1-", "node-1", simpleDaemonSetLabel, ds)
|
||||
failedPod.Status = v1.PodStatus{Phase: v1.PodFailed}
|
||||
wantedPods = append(wantedPods, failedPod)
|
||||
for _, pod := range wantedPods {
|
||||
manager.podStore.Add(pod)
|
||||
}
|
||||
|
||||
// These pods should be ignored.
|
||||
ignoredPods := []*v1.Pod{
|
||||
newPod("non-matching-owned-0-", "node-0", simpleDaemonSetLabel2, ds),
|
||||
newPod("non-matching-orphan-1-", "node-1", simpleDaemonSetLabel2, nil),
|
||||
newPod("matching-owned-by-other-0-", "node-0", simpleDaemonSetLabel, ds2),
|
||||
}
|
||||
for _, pod := range ignoredPods {
|
||||
err = manager.podStore.Add(pod)
|
||||
ds := newDaemonSet("foo")
|
||||
ds2 := newDaemonSet("foo2")
|
||||
cases := map[string]struct {
|
||||
includeDeletedTerminal bool
|
||||
wantedPods []*v1.Pod
|
||||
ignoredPods []*v1.Pod
|
||||
}{
|
||||
"exclude deleted terminal pods": {
|
||||
wantedPods: []*v1.Pod{
|
||||
newPod("matching-owned-0-", "node-0", simpleDaemonSetLabel, ds),
|
||||
newPod("matching-orphan-0-", "node-0", simpleDaemonSetLabel, nil),
|
||||
newPod("matching-owned-1-", "node-1", simpleDaemonSetLabel, ds),
|
||||
newPod("matching-orphan-1-", "node-1", simpleDaemonSetLabel, nil),
|
||||
func() *v1.Pod {
|
||||
pod := newPod("matching-owned-succeeded-pod-0-", "node-0", simpleDaemonSetLabel, ds)
|
||||
pod.Status = v1.PodStatus{Phase: v1.PodSucceeded}
|
||||
return pod
|
||||
}(),
|
||||
func() *v1.Pod {
|
||||
pod := newPod("matching-owned-failed-pod-1-", "node-1", simpleDaemonSetLabel, ds)
|
||||
pod.Status = v1.PodStatus{Phase: v1.PodFailed}
|
||||
return pod
|
||||
}(),
|
||||
},
|
||||
ignoredPods: []*v1.Pod{
|
||||
newPod("non-matching-owned-0-", "node-0", simpleDaemonSetLabel2, ds),
|
||||
newPod("non-matching-orphan-1-", "node-1", simpleDaemonSetLabel2, nil),
|
||||
newPod("matching-owned-by-other-0-", "node-0", simpleDaemonSetLabel, ds2),
|
||||
func() *v1.Pod {
|
||||
pod := newPod("matching-owned-succeeded-deleted-pod-0-", "node-0", simpleDaemonSetLabel, ds)
|
||||
now := metav1.Now()
|
||||
pod.DeletionTimestamp = &now
|
||||
pod.Status = v1.PodStatus{Phase: v1.PodSucceeded}
|
||||
return pod
|
||||
}(),
|
||||
func() *v1.Pod {
|
||||
pod := newPod("matching-owned-failed-deleted-pod-1-", "node-1", simpleDaemonSetLabel, ds)
|
||||
now := metav1.Now()
|
||||
pod.DeletionTimestamp = &now
|
||||
pod.Status = v1.PodStatus{Phase: v1.PodFailed}
|
||||
return pod
|
||||
}(),
|
||||
},
|
||||
},
|
||||
"include deleted terminal pods": {
|
||||
includeDeletedTerminal: true,
|
||||
wantedPods: []*v1.Pod{
|
||||
newPod("matching-owned-0-", "node-0", simpleDaemonSetLabel, ds),
|
||||
newPod("matching-orphan-0-", "node-0", simpleDaemonSetLabel, nil),
|
||||
newPod("matching-owned-1-", "node-1", simpleDaemonSetLabel, ds),
|
||||
newPod("matching-orphan-1-", "node-1", simpleDaemonSetLabel, nil),
|
||||
func() *v1.Pod {
|
||||
pod := newPod("matching-owned-succeeded-pod-0-", "node-0", simpleDaemonSetLabel, ds)
|
||||
pod.Status = v1.PodStatus{Phase: v1.PodSucceeded}
|
||||
return pod
|
||||
}(),
|
||||
func() *v1.Pod {
|
||||
pod := newPod("matching-owned-failed-deleted-pod-1-", "node-1", simpleDaemonSetLabel, ds)
|
||||
now := metav1.Now()
|
||||
pod.DeletionTimestamp = &now
|
||||
pod.Status = v1.PodStatus{Phase: v1.PodFailed}
|
||||
return pod
|
||||
}(),
|
||||
},
|
||||
ignoredPods: []*v1.Pod{
|
||||
newPod("non-matching-owned-0-", "node-0", simpleDaemonSetLabel2, ds),
|
||||
newPod("non-matching-orphan-1-", "node-1", simpleDaemonSetLabel2, nil),
|
||||
newPod("matching-owned-by-other-0-", "node-0", simpleDaemonSetLabel, ds2),
|
||||
},
|
||||
},
|
||||
}
|
||||
for name, tc := range cases {
|
||||
t.Run(name, func(t *testing.T) {
|
||||
_, ctx := ktesting.NewTestContext(t)
|
||||
manager, _, _, err := newTestController(ctx, ds, ds2)
|
||||
if err != nil {
|
||||
t.Fatalf("error creating DaemonSets controller: %v", err)
|
||||
}
|
||||
err = manager.dsStore.Add(ds)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
err = manager.dsStore.Add(ds2)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
addNodes(manager.nodeStore, 0, 2, nil)
|
||||
|
||||
nodesToDaemonPods, err := manager.getNodesToDaemonPods(context.TODO(), ds)
|
||||
if err != nil {
|
||||
t.Fatalf("getNodesToDaemonPods() error: %v", err)
|
||||
}
|
||||
gotPods := map[string]bool{}
|
||||
for node, pods := range nodesToDaemonPods {
|
||||
for _, pod := range pods {
|
||||
if pod.Spec.NodeName != node {
|
||||
t.Errorf("pod %v grouped into %v but belongs in %v", pod.Name, node, pod.Spec.NodeName)
|
||||
for _, pod := range tc.wantedPods {
|
||||
manager.podStore.Add(pod)
|
||||
}
|
||||
|
||||
for _, pod := range tc.ignoredPods {
|
||||
err = manager.podStore.Add(pod)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
gotPods[pod.Name] = true
|
||||
}
|
||||
}
|
||||
for _, pod := range wantedPods {
|
||||
if !gotPods[pod.Name] {
|
||||
t.Errorf("expected pod %v but didn't get it", pod.Name)
|
||||
|
||||
nodesToDaemonPods, err := manager.getNodesToDaemonPods(context.TODO(), ds, tc.includeDeletedTerminal)
|
||||
if err != nil {
|
||||
t.Fatalf("getNodesToDaemonPods() error: %v", err)
|
||||
}
|
||||
delete(gotPods, pod.Name)
|
||||
}
|
||||
for podName := range gotPods {
|
||||
t.Errorf("unexpected pod %v was returned", podName)
|
||||
}
|
||||
gotPods := map[string]bool{}
|
||||
for node, pods := range nodesToDaemonPods {
|
||||
for _, pod := range pods {
|
||||
if pod.Spec.NodeName != node {
|
||||
t.Errorf("pod %v grouped into %v but belongs in %v", pod.Name, node, pod.Spec.NodeName)
|
||||
}
|
||||
gotPods[pod.Name] = true
|
||||
}
|
||||
}
|
||||
for _, pod := range tc.wantedPods {
|
||||
if !gotPods[pod.Name] {
|
||||
t.Errorf("expected pod %v but didn't get it", pod.Name)
|
||||
}
|
||||
delete(gotPods, pod.Name)
|
||||
}
|
||||
for podName := range gotPods {
|
||||
t.Errorf("unexpected pod %v was returned", podName)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user