You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.0 KiB
152 lines
4.0 KiB
//
|
|
// DISCLAIMER
|
|
//
|
|
// Copyright 2018 ArangoDB GmbH, Cologne, Germany
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
// Copyright holder is ArangoDB GmbH, Cologne, Germany
|
|
//
|
|
// Author Ewout Prangsma
|
|
//
|
|
|
|
package driver
|
|
|
|
import (
|
|
"context"
|
|
)
|
|
|
|
// Version returns version information from the connected database server.
|
|
func (c *client) Version(ctx context.Context) (VersionInfo, error) {
|
|
req, err := c.conn.NewRequest("GET", "_api/version")
|
|
if err != nil {
|
|
return VersionInfo{}, WithStack(err)
|
|
}
|
|
applyContextSettings(ctx, req)
|
|
resp, err := c.conn.Do(ctx, req)
|
|
if err != nil {
|
|
return VersionInfo{}, WithStack(err)
|
|
}
|
|
if err := resp.CheckStatus(200); err != nil {
|
|
return VersionInfo{}, WithStack(err)
|
|
}
|
|
var data VersionInfo
|
|
if err := resp.ParseBody("", &data); err != nil {
|
|
return VersionInfo{}, WithStack(err)
|
|
}
|
|
return data, nil
|
|
}
|
|
|
|
// roleResponse contains the response body of the `/admin/server/role` api.
|
|
type roleResponse struct {
|
|
// Role of the server within a cluster
|
|
Role string `json:"role,omitempty"`
|
|
Mode string `json:"mode,omitempty"`
|
|
ArangoError
|
|
}
|
|
|
|
// asServerRole converts the response into a ServerRole
|
|
func (r roleResponse) asServerRole(ctx context.Context, c *client) (ServerRole, error) {
|
|
switch r.Role {
|
|
case "SINGLE":
|
|
switch r.Mode {
|
|
case "resilient":
|
|
if err := c.echo(ctx); IsNoLeader(err) {
|
|
return ServerRoleSinglePassive, nil
|
|
} else if err != nil {
|
|
return ServerRoleUndefined, WithStack(err)
|
|
}
|
|
return ServerRoleSingleActive, nil
|
|
default:
|
|
return ServerRoleSingle, nil
|
|
}
|
|
case "PRIMARY":
|
|
return ServerRoleDBServer, nil
|
|
case "COORDINATOR":
|
|
return ServerRoleCoordinator, nil
|
|
case "AGENT":
|
|
return ServerRoleAgent, nil
|
|
case "UNDEFINED":
|
|
return ServerRoleUndefined, nil
|
|
default:
|
|
return ServerRoleUndefined, nil
|
|
}
|
|
}
|
|
|
|
// ServerRole returns the role of the server that answers the request.
|
|
func (c *client) ServerRole(ctx context.Context) (ServerRole, error) {
|
|
req, err := c.conn.NewRequest("GET", "_admin/server/role")
|
|
if err != nil {
|
|
return ServerRoleUndefined, WithStack(err)
|
|
}
|
|
applyContextSettings(ctx, req)
|
|
resp, err := c.conn.Do(ctx, req)
|
|
if err != nil {
|
|
return ServerRoleUndefined, WithStack(err)
|
|
}
|
|
if err := resp.CheckStatus(200); err != nil {
|
|
return ServerRoleUndefined, WithStack(err)
|
|
}
|
|
var data roleResponse
|
|
if err := resp.ParseBody("", &data); err != nil {
|
|
return ServerRoleUndefined, WithStack(err)
|
|
}
|
|
role, err := data.asServerRole(ctx, c)
|
|
if err != nil {
|
|
return ServerRoleUndefined, WithStack(err)
|
|
}
|
|
return role, nil
|
|
}
|
|
|
|
type idResponse struct {
|
|
ID string `json:"id,omitempty"`
|
|
}
|
|
|
|
// Gets the ID of this server in the cluster.
|
|
// An error is returned when calling this to a server that is not part of a cluster.
|
|
func (c *client) ServerID(ctx context.Context) (string, error) {
|
|
req, err := c.conn.NewRequest("GET", "_admin/server/id")
|
|
if 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); err != nil {
|
|
return "", WithStack(err)
|
|
}
|
|
var data idResponse
|
|
if err := resp.ParseBody("", &data); err != nil {
|
|
return "", WithStack(err)
|
|
}
|
|
return data.ID, nil
|
|
}
|
|
|
|
// clusterEndpoints returns the endpoints of a cluster.
|
|
func (c *client) echo(ctx context.Context) error {
|
|
req, err := c.conn.NewRequest("GET", "_admin/echo")
|
|
if 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); err != nil {
|
|
return WithStack(err)
|
|
}
|
|
return nil
|
|
}
|
|
|