Skip to content

Commit

Permalink
give feedback to CLI user on forceleave command if node does not exist (
Browse files Browse the repository at this point in the history
  • Loading branch information
s-mang authored Dec 2, 2019
1 parent 11f6904 commit aed5cb7
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 5 deletions.
15 changes: 15 additions & 0 deletions agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -1782,6 +1782,9 @@ func (a *Agent) JoinWAN(addrs []string) (n int, err error) {
// ForceLeave is used to remove a failed node from the cluster
func (a *Agent) ForceLeave(node string, prune bool) (err error) {
a.logger.Printf("[INFO] agent: Force leaving node: %v", node)
if ok := a.IsMember(node); !ok {
return fmt.Errorf("agent: No node found with name '%s'", node)
}
err = a.delegate.RemoveFailedNode(node, prune)
if err != nil {
a.logger.Printf("[WARN] agent: Failed to remove node: %v", err)
Expand All @@ -1807,6 +1810,18 @@ func (a *Agent) WANMembers() []serf.Member {
return nil
}

// IsMember is used to check if a node with the given nodeName
// is a member
func (a *Agent) IsMember(nodeName string) bool {
for _, m := range a.LANMembers() {
if m.Name == nodeName {
return true
}
}

return false
}

// StartSync is called once Services and Checks are registered.
// This is called to prevent a race between clients and the anti-entropy routines
func (a *Agent) StartSync() {
Expand Down
8 changes: 5 additions & 3 deletions agent/agent_endpoint_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1632,23 +1632,25 @@ func TestAgent_ForceLeave_ACLDeny(t *testing.T) {
defer a.Shutdown()
testrpc.WaitForLeader(t, a.RPC, "dc1")

uri := fmt.Sprintf("/v1/agent/force-leave/%s", a.Config.NodeName)

t.Run("no token", func(t *testing.T) {
req, _ := http.NewRequest("PUT", "/v1/agent/force-leave/nope", nil)
req, _ := http.NewRequest("PUT", uri, nil)
if _, err := a.srv.AgentForceLeave(nil, req); !acl.IsErrPermissionDenied(err) {
t.Fatalf("err: %v", err)
}
})

t.Run("agent master token", func(t *testing.T) {
req, _ := http.NewRequest("PUT", "/v1/agent/force-leave/nope?token=towel", nil)
req, _ := http.NewRequest("PUT", uri+"?token=towel", nil)
if _, err := a.srv.AgentForceLeave(nil, req); err != nil {
t.Fatalf("err: %v", err)
}
})

t.Run("read-only token", func(t *testing.T) {
ro := makeReadOnlyAgentACL(t, a.srv)
req, _ := http.NewRequest("PUT", fmt.Sprintf("/v1/agent/force-leave/nope?token=%s", ro), nil)
req, _ := http.NewRequest("PUT", fmt.Sprintf(uri+"?token=%s", ro), nil)
if _, err := a.srv.AgentForceLeave(nil, req); !acl.IsErrPermissionDenied(err) {
t.Fatalf("err: %v", err)
}
Expand Down
4 changes: 2 additions & 2 deletions api/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1073,7 +1073,7 @@ func TestAPI_AgentForceLeave(t *testing.T) {
agent := c.Agent()

// Eject somebody
err := agent.ForceLeave("foo")
err := agent.ForceLeave(s.Config.NodeName)
if err != nil {
t.Fatalf("err: %v", err)
}
Expand All @@ -1087,7 +1087,7 @@ func TestAPI_AgentForceLeavePrune(t *testing.T) {
agent := c.Agent()

// Eject somebody
err := agent.ForceLeavePrune("foo")
err := agent.ForceLeavePrune(s.Config.NodeName)
if err != nil {
t.Fatalf("err: %v", err)
}
Expand Down
18 changes: 18 additions & 0 deletions command/forceleave/forceleave_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,24 @@ func TestForceLeaveCommand(t *testing.T) {
})
}

func TestForceLeaveCommand_NoNodeWithName(t *testing.T) {
t.Parallel()
a1 := agent.NewTestAgent(t, t.Name(), ``)
defer a1.Shutdown()

ui := cli.NewMockUi()
c := New(ui)
args := []string{
"-http-addr=" + a1.HTTPAddr(),
"garbage-name",
}

code := c.Run(args)
if code != 1 {
t.Fatalf("bad: %d. %#v", code, ui.ErrorWriter.String())
}
}

func TestForceLeaveCommand_prune(t *testing.T) {
t.Parallel()
a1 := agent.NewTestAgent(t, t.Name()+"-a1", ``)
Expand Down

0 comments on commit aed5cb7

Please sign in to comment.