diff --git a/pkg/controller/node/node_controller_test.go b/pkg/controller/node/node_controller_test.go index 6a89bd6b76..0eb2aa1516 100644 --- a/pkg/controller/node/node_controller_test.go +++ b/pkg/controller/node/node_controller_test.go @@ -452,13 +452,13 @@ func TestGetCandidateMachines(t *testing.T) { expected: []*corev1.Node{newNodeWithReady("node-3", "v0", "v0", corev1.ConditionTrue)}, }, { //progress on old stuck node - progress: 1, + progress: 0, nodes: []*corev1.Node{ newNodeWithReady("node-0", "v1", "v1", corev1.ConditionTrue), newNodeWithReady("node-1", "v0.1", "v0.2", corev1.ConditionFalse), newNodeWithReady("node-2", "v0", "v0", corev1.ConditionTrue), }, - expected: []*corev1.Node{newNodeWithReady("node-1", "v0.1", "v0.2", corev1.ConditionFalse)}, + expected: []*corev1.Node{}, }} for idx, test := range tests { diff --git a/pkg/controller/node/status.go b/pkg/controller/node/status.go index 75c1647783..0db72cd25f 100644 --- a/pkg/controller/node/status.go +++ b/pkg/controller/node/status.go @@ -177,6 +177,7 @@ func isNodeReady(node *corev1.Node) bool { return true } +// TODO(runcom): drop currentConfig arg func getUnavailableMachines(currentConfig string, nodes []*corev1.Node) []*corev1.Node { var unavail []*corev1.Node for _, node := range nodes { @@ -191,9 +192,14 @@ func getUnavailableMachines(currentConfig string, nodes []*corev1.Node) []*corev if !ok || cconfig == "" { continue } + dstate, ok := node.Annotations[daemonconsts.MachineConfigDaemonStateAnnotationKey] + if !ok || dstate == "" { + continue + } nodeNotReady := !isNodeReady(node) - if dconfig == currentConfig && (dconfig != cconfig || nodeNotReady) { + // we want to be able to roll back if a bad MC caused an unreconcilable state + if (dconfig != cconfig || nodeNotReady) && dstate != daemonconsts.MachineConfigDaemonStateUnreconcilable { unavail = append(unavail, node) glog.V(2).Infof("Node %s unavailable: different configs (desired: %s, current %s) or node not ready %v", node.Name, dconfig, cconfig, nodeNotReady) } diff --git a/pkg/controller/node/status_test.go b/pkg/controller/node/status_test.go index e437ccd1e6..4a588ee293 100644 --- a/pkg/controller/node/status_test.go +++ b/pkg/controller/node/status_test.go @@ -239,7 +239,10 @@ func TestGetUnavailableMachines(t *testing.T) { newNodeWithReady("node-2", "v0", "v2", corev1.ConditionTrue), }, currentConfig: "v2", - unavail: []*corev1.Node{newNodeWithReady("node-2", "v0", "v2", corev1.ConditionTrue)}, + unavail: []*corev1.Node{ + newNodeWithReady("node-0", "v0", "v1", corev1.ConditionTrue), + newNodeWithReady("node-2", "v0", "v2", corev1.ConditionTrue), + }, }, { // 1 node updated, 1 updating, 1 updating but not v2 and is not ready nodes: []*corev1.Node{ @@ -248,7 +251,10 @@ func TestGetUnavailableMachines(t *testing.T) { newNodeWithReady("node-2", "v0", "v2", corev1.ConditionTrue), }, currentConfig: "v2", - unavail: []*corev1.Node{newNodeWithReady("node-2", "v0", "v2", corev1.ConditionTrue)}, + unavail: []*corev1.Node{ + newNodeWithReady("node-0", "v0", "v1", corev1.ConditionFalse), + newNodeWithReady("node-2", "v0", "v2", corev1.ConditionTrue), + }, }, { // 2 node updated, 1 updating nodes: []*corev1.Node{