handle empty node case

This commit is contained in:
Alex Dadgar
2018-03-07 15:16:45 -08:00
committed by Michael Schurter
parent c0354223c2
commit fb40e8babe
2 changed files with 58 additions and 2 deletions

View File

@@ -186,3 +186,46 @@ func TestDrainer_Simple_ServiceOnly(t *testing.T) {
t.Fatalf("err: %v", err)
})
}
func TestDrainer_DrainEmptyNode(t *testing.T) {
t.Parallel()
require := require.New(t)
s1 := TestServer(t, nil)
defer s1.Shutdown()
codec := rpcClient(t, s1)
testutil.WaitForLeader(t, s1.RPC)
// Create a node
n1 := mock.Node()
nodeReg := &structs.NodeRegisterRequest{
Node: n1,
WriteRequest: structs.WriteRequest{Region: "global"},
}
var nodeResp structs.NodeUpdateResponse
require.Nil(msgpackrpc.CallWithCodec(codec, "Node.Register", nodeReg, &nodeResp))
// Drain the node
drainReq := &structs.NodeUpdateDrainRequest{
NodeID: n1.ID,
DrainStrategy: &structs.DrainStrategy{
DrainSpec: structs.DrainSpec{
Deadline: 10 * time.Minute,
},
},
WriteRequest: structs.WriteRequest{Region: "global"},
}
var drainResp structs.NodeDrainUpdateResponse
require.Nil(msgpackrpc.CallWithCodec(codec, "Node.UpdateDrain", drainReq, &drainResp))
// Check that the node drain is removed
state := s1.State()
testutil.WaitForResult(func() (bool, error) {
node, err := state.NodeByID(nil, n1.ID)
if err != nil {
return false, err
}
return node.DrainStrategy == nil, fmt.Errorf("has drain strategy still set")
}, func(err error) {
t.Fatalf("err: %v", err)
})
}

View File

@@ -78,9 +78,22 @@ func (n *NodeDrainer) Update(node *structs.Node) {
n.jobWatcher.RegisterJob(job)
}
// TODO we need to check if the node is done such that if an operator drains
// a node with nothing on it we unset drain
// Check if the node is done such that if an operator drains a node with
// nothing on it we unset drain
done, err := draining.IsDone()
if err != nil {
n.logger.Printf("[ERR] nomad.drain: failed to check if node %q is done draining: %v", node.ID, err)
return
}
if done {
index, err := n.raft.NodeDrainComplete(node.ID)
if err != nil {
n.logger.Printf("[ERR] nomad.drain: failed to unset drain for node %q: %v", node.ID, err)
} else {
n.logger.Printf("[INFO] nomad.drain: node %q completed draining at index %d", node.ID, index)
}
}
}
// nodeDrainWatcher is used to watch nodes that are entering, leaving or