mirror of
https://github.com/kemko/nomad.git
synced 2026-01-07 10:55:42 +03:00
handle empty node case
This commit is contained in:
committed by
Michael Schurter
parent
c0354223c2
commit
fb40e8babe
@@ -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)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user