From 4d6fee74d0860eb5a592639ead76eb7b5eba4fa0 Mon Sep 17 00:00:00 2001 From: Paul Weil Date: Thu, 19 May 2016 17:16:34 -0400 Subject: [PATCH] daemonset handle DeletedFinalStateUnknown --- pkg/controller/daemon/controller.go | 24 +++++++++++++++++++----- pkg/controller/daemon/controller_test.go | 12 ++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/pkg/controller/daemon/controller.go b/pkg/controller/daemon/controller.go index 53eb03f73cc..ca7935b6e84 100644 --- a/pkg/controller/daemon/controller.go +++ b/pkg/controller/daemon/controller.go @@ -168,11 +168,7 @@ func NewDaemonSetsController(podInformer framework.SharedIndexInformer, kubeClie glog.V(4).Infof("Updating daemon set %s", oldDS.Name) dsc.enqueueDaemonSet(curDS) }, - DeleteFunc: func(obj interface{}) { - ds := obj.(*extensions.DaemonSet) - glog.V(4).Infof("Deleting daemon set %s", ds.Name) - dsc.enqueueDaemonSet(ds) - }, + DeleteFunc: dsc.deleteDaemonset, }, ) @@ -217,6 +213,24 @@ func NewDaemonSetsControllerFromClient(kubeClient clientset.Interface, resyncPer return dsc } +func (dsc *DaemonSetsController) deleteDaemonset(obj interface{}) { + ds, ok := obj.(*extensions.DaemonSet) + if !ok { + tombstone, ok := obj.(cache.DeletedFinalStateUnknown) + if !ok { + glog.Errorf("Couldn't get object from tombstone %+v", obj) + return + } + ds, ok = tombstone.Obj.(*extensions.DaemonSet) + if !ok { + glog.Errorf("Tombstone contained object that is not a DaemonSet %+v", obj) + return + } + } + glog.V(4).Infof("Deleting daemon set %s", ds.Name) + dsc.enqueueDaemonSet(ds) +} + // Run begins watching and syncing daemon sets. func (dsc *DaemonSetsController) Run(workers int, stopCh <-chan struct{}) { defer utilruntime.HandleCrash() diff --git a/pkg/controller/daemon/controller_test.go b/pkg/controller/daemon/controller_test.go index c7efe750b73..c21d746d345 100644 --- a/pkg/controller/daemon/controller_test.go +++ b/pkg/controller/daemon/controller_test.go @@ -158,6 +158,18 @@ func syncAndValidateDaemonSets(t *testing.T, manager *DaemonSetsController, ds * validateSyncDaemonSets(t, podControl, expectedCreates, expectedDeletes) } +func TestDeleteFinalStateUnknown(t *testing.T) { + manager, _ := newTestController() + addNodes(manager.nodeStore.Store, 0, 1, nil) + ds := newDaemonSet("foo") + // DeletedFinalStateUnknown should queue the embedded DS if found. + manager.deleteDaemonset(cache.DeletedFinalStateUnknown{Key: "foo", Obj: ds}) + enqueuedKey, _ := manager.queue.Get() + if enqueuedKey.(string) != "default/foo" { + t.Errorf("expected delete of DeletedFinalStateUnknown to enqueue the daemonset but found: %#v", enqueuedKey) + } +} + // DaemonSets without node selectors should launch pods on every node. func TestSimpleDaemonSetLaunchesPods(t *testing.T) { manager, podControl := newTestController()