Skip to content

Commit 5cf3f8b

Browse files
committed
Fix DS expectations on recreate
1 parent 0e2220b commit 5cf3f8b

File tree

5 files changed

+963
-195
lines changed

5 files changed

+963
-195
lines changed

pkg/controller/daemon/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ go_test(
5555
name = "go_default_test",
5656
srcs = [
5757
"daemon_controller_test.go",
58+
"init_test.go",
5859
"update_test.go",
5960
],
6061
embed = [":go_default_library"],
@@ -74,6 +75,7 @@ go_test(
7475
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
7576
"//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
7677
"//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library",
78+
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
7779
"//staging/src/k8s.io/apiserver/pkg/storage/names:go_default_library",
7880
"//staging/src/k8s.io/client-go/informers:go_default_library",
7981
"//staging/src/k8s.io/client-go/kubernetes/fake:go_default_library",
@@ -82,6 +84,7 @@ go_test(
8284
"//staging/src/k8s.io/client-go/tools/record:go_default_library",
8385
"//staging/src/k8s.io/client-go/util/flowcontrol:go_default_library",
8486
"//staging/src/k8s.io/client-go/util/workqueue:go_default_library",
87+
"//vendor/k8s.io/klog/v2:go_default_library",
8588
],
8689
)
8790

pkg/controller/daemon/daemon_controller.go

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,8 @@ func NewDaemonSetsController(
163163
}
164164

165165
daemonSetInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
166-
AddFunc: func(obj interface{}) {
167-
ds := obj.(*apps.DaemonSet)
168-
klog.V(4).Infof("Adding daemon set %s", ds.Name)
169-
dsc.enqueueDaemonSet(ds)
170-
},
171-
UpdateFunc: func(old, cur interface{}) {
172-
oldDS := old.(*apps.DaemonSet)
173-
curDS := cur.(*apps.DaemonSet)
174-
klog.V(4).Infof("Updating daemon set %s", oldDS.Name)
175-
dsc.enqueueDaemonSet(curDS)
176-
},
166+
AddFunc: dsc.addDaemonset,
167+
UpdateFunc: dsc.updateDaemonset,
177168
DeleteFunc: dsc.deleteDaemonset,
178169
})
179170
dsc.dsLister = daemonSetInformer.Lister()
@@ -231,22 +222,59 @@ func indexByPodNodeName(obj interface{}) ([]string, error) {
231222
return []string{pod.Spec.NodeName}, nil
232223
}
233224

225+
func (dsc *DaemonSetsController) addDaemonset(obj interface{}) {
226+
ds := obj.(*apps.DaemonSet)
227+
klog.V(4).Infof("Adding daemon set %s", ds.Name)
228+
dsc.enqueueDaemonSet(ds)
229+
}
230+
231+
func (dsc *DaemonSetsController) updateDaemonset(cur, old interface{}) {
232+
oldDS := old.(*apps.DaemonSet)
233+
curDS := cur.(*apps.DaemonSet)
234+
235+
// TODO: make a KEP and fix informers to always call the delete event handler on re-create
236+
if curDS.UID != oldDS.UID {
237+
key, err := controller.KeyFunc(oldDS)
238+
if err != nil {
239+
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", oldDS, err))
240+
return
241+
}
242+
dsc.deleteDaemonset(cache.DeletedFinalStateUnknown{
243+
Key: key,
244+
Obj: oldDS,
245+
})
246+
}
247+
248+
klog.V(4).Infof("Updating daemon set %s", oldDS.Name)
249+
dsc.enqueueDaemonSet(curDS)
250+
}
251+
234252
func (dsc *DaemonSetsController) deleteDaemonset(obj interface{}) {
235253
ds, ok := obj.(*apps.DaemonSet)
236254
if !ok {
237255
tombstone, ok := obj.(cache.DeletedFinalStateUnknown)
238256
if !ok {
239-
utilruntime.HandleError(fmt.Errorf("Couldn't get object from tombstone %#v", obj))
257+
utilruntime.HandleError(fmt.Errorf("couldn't get object from tombstone %#v", obj))
240258
return
241259
}
242260
ds, ok = tombstone.Obj.(*apps.DaemonSet)
243261
if !ok {
244-
utilruntime.HandleError(fmt.Errorf("Tombstone contained object that is not a DaemonSet %#v", obj))
262+
utilruntime.HandleError(fmt.Errorf("tombstone contained object that is not a DaemonSet %#v", obj))
245263
return
246264
}
247265
}
248266
klog.V(4).Infof("Deleting daemon set %s", ds.Name)
249-
dsc.enqueueDaemonSet(ds)
267+
268+
key, err := controller.KeyFunc(ds)
269+
if err != nil {
270+
utilruntime.HandleError(fmt.Errorf("couldn't get key for object %#v: %v", ds, err))
271+
return
272+
}
273+
274+
// Delete expectations for the DaemonSet so if we create a new one with the same name it starts clean
275+
dsc.expectations.DeleteExpectations(key)
276+
277+
dsc.queue.Add(key)
250278
}
251279

252280
// Run begins watching and syncing daemon sets.

0 commit comments

Comments
 (0)