diff --git a/pkg/controller/daemon/daemoncontroller.go b/pkg/controller/daemon/daemoncontroller.go index 02247f3b8ba..3a528de59a8 100644 --- a/pkg/controller/daemon/daemoncontroller.go +++ b/pkg/controller/daemon/daemoncontroller.go @@ -713,6 +713,16 @@ func (dsc *DaemonSetsController) nodeShouldRunDaemonPod(node *api.Node, ds *exte for _, r := range reasons { glog.V(2).Infof("GeneralPredicates failed on pod %s for reason: %v", newPod.Name, r.GetReason()) } + if !fit { + return false + } + fit, reasons, err = predicates.PodToleratesNodeTaints(newPod, predicates.PredicateMetadata(newPod, nil), nodeInfo) + if err != nil { + glog.Warningf("PodToleratesNodeTaints failed on pod %s due to unexpected error: %v", newPod.Name, err) + } + for _, r := range reasons { + glog.V(2).Infof("PodToleratesNodeTaints failed on pod %s for reason: %v", newPod.Name, r.GetReason()) + } return fit } diff --git a/pkg/controller/daemon/daemoncontroller_test.go b/pkg/controller/daemon/daemoncontroller_test.go index eec7dbe5c86..ae641ab53d2 100644 --- a/pkg/controller/daemon/daemoncontroller_test.go +++ b/pkg/controller/daemon/daemoncontroller_test.go @@ -583,3 +583,31 @@ func TestNodeAffinityDaemonLaunchesPods(t *testing.T) { manager.dsStore.Add(daemon) syncAndValidateDaemonSets(t, manager, daemon, podControl, 3, 0) } + +func TestNodeTaintDaemonDoesntLaunchIntolerantPods(t *testing.T) { + manager, podControl := newTestController() + node := newNode("", nil) + node.ObjectMeta.Annotations = map[string]string{ + api.TaintsAnnotationKey: `[{"key":"dedictated","value":"master","effect":"NoSchedule"}]`, + } + manager.nodeStore.Store.Add(node) + daemon := newDaemonSet("foo") + manager.dsStore.Add(daemon) + syncAndValidateDaemonSets(t, manager, daemon, podControl, 0, 0) +} + +func TestNodeTaintDaemonLaunchesTolerantPods(t *testing.T) { + manager, podControl := newTestController() + node := newNode("", nil) + node.ObjectMeta.Annotations = map[string]string{ + api.TaintsAnnotationKey: `[{"key":"dedictated","value":"master","effect":"NoSchedule"}]`, + } + manager.nodeStore.Store.Add(node) + daemon := newDaemonSet("foo") + daemon.Spec.Template.ObjectMeta.Annotations = map[string]string{ + api.TolerationsAnnotationKey: `[{"key":"dedictated","operator":"Equal","value":"master"}]`, + } + + manager.dsStore.Add(daemon) + syncAndValidateDaemonSets(t, manager, daemon, podControl, 1, 0) +}