Skip to content

Commit

Permalink
Merge pull request #98 from arangodb/shutdown-cleanout
Browse files Browse the repository at this point in the history
Added API functions for shutting down a server and cleaning it out
  • Loading branch information
ewoutp authored Mar 19, 2018
2 parents 76f2dac + e17336d commit b7ca9ee
Show file tree
Hide file tree
Showing 4 changed files with 98 additions and 0 deletions.
3 changes: 3 additions & 0 deletions client_server_admin.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ type ClientServerAdmin interface {
// This call needs a client that uses JWT authentication.
// This call needs ArangoDB 3.3 and up.
SetServerMode(ctx context.Context, mode ServerMode) error

// Shutdown a specific server, optionally removing it from its cluster.
Shutdown(ctx context.Context, removeFromCluster bool) error
}

type ServerMode string
Expand Down
19 changes: 19 additions & 0 deletions client_server_admin_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,22 @@ func (c *client) SetServerMode(ctx context.Context, mode ServerMode) error {
}
return nil
}

// Shutdown a specific server, optionally removing it from its cluster.
func (c *client) Shutdown(ctx context.Context, removeFromCluster bool) error {
req, err := c.conn.NewRequest("DELETE", "_admin/shutdown")
if err != nil {
return WithStack(err)
}
if removeFromCluster {
req.SetQuery("remove_from_cluster", "1")
}
resp, err := c.conn.Do(ctx, req)
if err != nil {
return WithStack(err)
}
if err := resp.CheckStatus(200); err != nil {
return WithStack(err)
}
return nil
}
6 changes: 6 additions & 0 deletions cluster.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,12 @@ type Cluster interface {
// MoveShard moves a single shard of the given collection from server `fromServer` to
// server `toServer`.
MoveShard(ctx context.Context, col Collection, shard ShardID, fromServer, toServer ServerID) error

// CleanOutServer triggers activities to clean out a DBServer.
CleanOutServer(ctx context.Context, serverID string) error

// IsCleanedOut checks if the dbserver with given ID has been cleaned out.
IsCleanedOut(ctx context.Context, serverID string) (bool, error)
}

// ServerID identifies an arangod server in a cluster.
Expand Down
70 changes: 70 additions & 0 deletions cluster_impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,3 +118,73 @@ func (c *cluster) MoveShard(ctx context.Context, col Collection, shard ShardID,
}
return nil
}

type cleanOutServerRequest struct {
Server string `json:"server"`
}

// CleanOutServer triggers activities to clean out a DBServers.
func (c *cluster) CleanOutServer(ctx context.Context, serverID string) error {
req, err := c.conn.NewRequest("POST", "_admin/cluster/cleanOutServer")
if err != nil {
return WithStack(err)
}
input := cleanOutServerRequest{
Server: serverID,
}
if _, err := req.SetBody(input); err != nil {
return WithStack(err)
}
applyContextSettings(ctx, req)
resp, err := c.conn.Do(ctx, req)
if err != nil {
return WithStack(err)
}
if err := resp.CheckStatus(200, 202); err != nil {
return WithStack(err)
}
return nil
}

// IsCleanedOut checks if the dbserver with given ID has been cleaned out.
func (c *cluster) IsCleanedOut(ctx context.Context, serverID string) (bool, error) {
r, err := c.NumberOfServers(ctx)
if err != nil {
return false, WithStack(err)
}
for _, id := range r.CleanedServerIDs {
if id == serverID {
return true, nil
}
}
return false, nil
}

// NumberOfServersResponse holds the data returned from a NumberOfServer request.
type NumberOfServersResponse struct {
NoCoordinators int `json:"numberOfCoordinators,omitempty"`
NoDBServers int `json:"numberOfDBServers,omitempty"`
CleanedServerIDs []string `json:"cleanedServers,omitempty"`
}

// NumberOfServers returns the number of coordinator & dbservers in a clusters and the
// ID's of cleaned out servers.
func (c *cluster) NumberOfServers(ctx context.Context) (NumberOfServersResponse, error) {
req, err := c.conn.NewRequest("GET", "_admin/cluster/numberOfServers")
if err != nil {
return NumberOfServersResponse{}, WithStack(err)
}
applyContextSettings(ctx, req)
resp, err := c.conn.Do(ctx, req)
if err != nil {
return NumberOfServersResponse{}, WithStack(err)
}
if err := resp.CheckStatus(200); err != nil {
return NumberOfServersResponse{}, WithStack(err)
}
var result NumberOfServersResponse
if err := resp.ParseBody("", &result); err != nil {
return NumberOfServersResponse{}, WithStack(err)
}
return result, nil
}

0 comments on commit b7ca9ee

Please sign in to comment.