2018-02-27 00:28:10 +00:00
|
|
|
package nomad
|
|
|
|
|
|
|
|
import "github.com/hashicorp/nomad/nomad/structs"
|
|
|
|
|
|
|
|
// drainerShim implements the drainer.RaftApplier interface required by the
|
|
|
|
// NodeDrainer.
|
|
|
|
type drainerShim struct {
|
|
|
|
s *Server
|
|
|
|
}
|
|
|
|
|
|
|
|
func (d drainerShim) NodeDrainComplete(nodeID string) error {
|
|
|
|
args := &structs.NodeUpdateDrainRequest{
|
|
|
|
NodeID: nodeID,
|
|
|
|
Drain: false,
|
|
|
|
WriteRequest: structs.WriteRequest{Region: d.s.config.Region},
|
|
|
|
}
|
|
|
|
|
2018-02-27 23:18:32 +00:00
|
|
|
resp, _, err := d.s.raftApply(structs.NodeUpdateDrainRequestType, args)
|
|
|
|
return d.convertApplyErrors(resp, err)
|
2018-02-27 00:28:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (d drainerShim) AllocUpdateDesiredTransition(allocs map[string]*structs.DesiredTransition, evals []*structs.Evaluation) error {
|
|
|
|
args := &structs.AllocUpdateDesiredTransitionRequest{
|
|
|
|
Allocs: allocs,
|
|
|
|
Evals: evals,
|
|
|
|
WriteRequest: structs.WriteRequest{Region: d.s.config.Region},
|
|
|
|
}
|
2018-02-27 23:18:32 +00:00
|
|
|
resp, _, err := d.s.raftApply(structs.AllocUpdateDesiredTransitionRequestType, args)
|
|
|
|
return d.convertApplyErrors(resp, err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// convertApplyErrors parses the results of a raftApply and returns the index at
|
|
|
|
// which it was applied and any error that occurred. Raft Apply returns two
|
|
|
|
// separate errors, Raft library errors and user returned errors from the FSM.
|
|
|
|
// This helper, joins the errors by inspecting the applyResponse for an error.
|
|
|
|
//
|
|
|
|
// Similar to deployment watcher's convertApplyErrors
|
|
|
|
func (d drainerShim) convertApplyErrors(applyResp interface{}, err error) error {
|
|
|
|
if applyResp != nil {
|
|
|
|
if fsmErr, ok := applyResp.(error); ok && fsmErr != nil {
|
|
|
|
return fsmErr
|
|
|
|
}
|
|
|
|
}
|
2018-02-27 00:28:10 +00:00
|
|
|
return err
|
|
|
|
}
|