88a9409f8e
Attempting NodeRpc (or streaming node rpc) for clients that do not support it causes it to hang indefinitely because while the TCP connection exists, the client will never respond.
143 lines
5.1 KiB
Go
143 lines
5.1 KiB
Go
package structs
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
errNoLeader = "No cluster leader"
|
|
errNoRegionPath = "No path to region"
|
|
errTokenNotFound = "ACL token not found"
|
|
errPermissionDenied = "Permission denied"
|
|
errNoNodeConn = "No path to node"
|
|
errUnknownMethod = "Unknown rpc method"
|
|
errUnknownNomadVersion = "Unable to determine Nomad version"
|
|
errNodeLacksRpc = "Node does not support RPC; requires 0.8 or later"
|
|
|
|
// Prefix based errors that are used to check if the error is of a given
|
|
// type. These errors should be created with the associated constructor.
|
|
ErrUnknownAllocationPrefix = "Unknown allocation"
|
|
ErrUnknownNodePrefix = "Unknown node"
|
|
ErrUnknownJobPrefix = "Unknown job"
|
|
ErrUnknownEvaluationPrefix = "Unknown evaluation"
|
|
ErrUnknownDeploymentPrefix = "Unknown deployment"
|
|
)
|
|
|
|
var (
|
|
ErrNoLeader = errors.New(errNoLeader)
|
|
ErrNoRegionPath = errors.New(errNoRegionPath)
|
|
ErrTokenNotFound = errors.New(errTokenNotFound)
|
|
ErrPermissionDenied = errors.New(errPermissionDenied)
|
|
ErrNoNodeConn = errors.New(errNoNodeConn)
|
|
ErrUnknownMethod = errors.New(errUnknownMethod)
|
|
ErrUnknownNomadVersion = errors.New(errUnknownNomadVersion)
|
|
ErrNodeLacksRpc = errors.New(errNodeLacksRpc)
|
|
)
|
|
|
|
// IsErrNoLeader returns whether the error is due to there being no leader.
|
|
func IsErrNoLeader(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errNoLeader)
|
|
}
|
|
|
|
// IsErrNoRegionPath returns whether the error is due to there being no path to
|
|
// the given region.
|
|
func IsErrNoRegionPath(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errNoRegionPath)
|
|
}
|
|
|
|
// IsErrTokenNotFound returns whether the error is due to the passed token not
|
|
// being resolvable.
|
|
func IsErrTokenNotFound(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errTokenNotFound)
|
|
}
|
|
|
|
// IsErrPermissionDenied returns whether the error is due to the operation not
|
|
// being allowed due to lack of permissions.
|
|
func IsErrPermissionDenied(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errPermissionDenied)
|
|
}
|
|
|
|
// IsErrNoNodeConn returns whether the error is due to there being no path to
|
|
// the given node.
|
|
func IsErrNoNodeConn(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errNoNodeConn)
|
|
}
|
|
|
|
// IsErrUnknownMethod returns whether the error is due to the operation not
|
|
// being allowed due to lack of permissions.
|
|
func IsErrUnknownMethod(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errUnknownMethod)
|
|
}
|
|
|
|
// NewErrUnknownAllocation returns a new error caused by the allocation being
|
|
// unknown.
|
|
func NewErrUnknownAllocation(allocID string) error {
|
|
return fmt.Errorf("%s %q", ErrUnknownAllocationPrefix, allocID)
|
|
}
|
|
|
|
// NewErrUnknownNode returns a new error caused by the node being unknown.
|
|
func NewErrUnknownNode(nodeID string) error {
|
|
return fmt.Errorf("%s %q", ErrUnknownNodePrefix, nodeID)
|
|
}
|
|
|
|
// NewErrUnknownJob returns a new error caused by the job being unknown.
|
|
func NewErrUnknownJob(jobID string) error {
|
|
return fmt.Errorf("%s %q", ErrUnknownJobPrefix, jobID)
|
|
}
|
|
|
|
// NewErrUnknownEvaluation returns a new error caused by the evaluation being
|
|
// unknown.
|
|
func NewErrUnknownEvaluation(evaluationID string) error {
|
|
return fmt.Errorf("%s %q", ErrUnknownEvaluationPrefix, evaluationID)
|
|
}
|
|
|
|
// NewErrUnknownDeployment returns a new error caused by the deployment being
|
|
// unknown.
|
|
func NewErrUnknownDeployment(deploymentID string) error {
|
|
return fmt.Errorf("%s %q", ErrUnknownDeploymentPrefix, deploymentID)
|
|
}
|
|
|
|
// IsErrUnknownAllocation returns whether the error is due to an unknown
|
|
// allocation.
|
|
func IsErrUnknownAllocation(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), ErrUnknownAllocationPrefix)
|
|
}
|
|
|
|
// IsErrUnknownNode returns whether the error is due to an unknown
|
|
// node.
|
|
func IsErrUnknownNode(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), ErrUnknownNodePrefix)
|
|
}
|
|
|
|
// IsErrUnknownJob returns whether the error is due to an unknown
|
|
// job.
|
|
func IsErrUnknownJob(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), ErrUnknownJobPrefix)
|
|
}
|
|
|
|
// IsErrUnknownEvaluation returns whether the error is due to an unknown
|
|
// evaluation.
|
|
func IsErrUnknownEvaluation(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), ErrUnknownEvaluationPrefix)
|
|
}
|
|
|
|
// IsErrUnknownDeployment returns whether the error is due to an unknown
|
|
// deployment.
|
|
func IsErrUnknownDeployment(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), ErrUnknownDeploymentPrefix)
|
|
}
|
|
|
|
// IsErrUnknownNomadVersion returns whether the error is due to Nomad being
|
|
// unable to determine the version of a node.
|
|
func IsErrUnknownNomadVersion(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errUnknownNomadVersion)
|
|
}
|
|
|
|
// IsErrNodeLacksRpc returns whether error is due to a Nomad server being
|
|
// unable to connect to a client node because the client is too old (pre-v0.8).
|
|
func IsErrNodeLacksRpc(err error) bool {
|
|
return err != nil && strings.Contains(err.Error(), errNodeLacksRpc)
|
|
}
|