218 lines
5.9 KiB
Go
218 lines
5.9 KiB
Go
|
package zk
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
protocolVersion = 0
|
||
|
|
||
|
DefaultPort = 2181
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
opNotify = 0
|
||
|
opCreate = 1
|
||
|
opDelete = 2
|
||
|
opExists = 3
|
||
|
opGetData = 4
|
||
|
opSetData = 5
|
||
|
opGetAcl = 6
|
||
|
opSetAcl = 7
|
||
|
opGetChildren = 8
|
||
|
opSync = 9
|
||
|
opPing = 11
|
||
|
opGetChildren2 = 12
|
||
|
opCheck = 13
|
||
|
opMulti = 14
|
||
|
opClose = -11
|
||
|
opSetAuth = 100
|
||
|
opSetWatches = 101
|
||
|
// Not in protocol, used internally
|
||
|
opWatcherEvent = -2
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
EventNodeCreated = EventType(1)
|
||
|
EventNodeDeleted = EventType(2)
|
||
|
EventNodeDataChanged = EventType(3)
|
||
|
EventNodeChildrenChanged = EventType(4)
|
||
|
|
||
|
EventSession = EventType(-1)
|
||
|
EventNotWatching = EventType(-2)
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
eventNames = map[EventType]string{
|
||
|
EventNodeCreated: "EventNodeCreated",
|
||
|
EventNodeDeleted: "EventNodeDeleted",
|
||
|
EventNodeDataChanged: "EventNodeDataChanged",
|
||
|
EventNodeChildrenChanged: "EventNodeChildrenChanged",
|
||
|
EventSession: "EventSession",
|
||
|
EventNotWatching: "EventNotWatching",
|
||
|
}
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
StateUnknown = State(-1)
|
||
|
StateDisconnected = State(0)
|
||
|
StateConnecting = State(1)
|
||
|
StateSyncConnected = State(3)
|
||
|
StateAuthFailed = State(4)
|
||
|
StateConnectedReadOnly = State(5)
|
||
|
StateSaslAuthenticated = State(6)
|
||
|
StateExpired = State(-112)
|
||
|
// StateAuthFailed = State(-113)
|
||
|
|
||
|
StateConnected = State(100)
|
||
|
StateHasSession = State(101)
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
FlagEphemeral = 1
|
||
|
FlagSequence = 2
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
stateNames = map[State]string{
|
||
|
StateUnknown: "StateUnknown",
|
||
|
StateDisconnected: "StateDisconnected",
|
||
|
StateSyncConnected: "StateSyncConnected",
|
||
|
StateConnectedReadOnly: "StateConnectedReadOnly",
|
||
|
StateSaslAuthenticated: "StateSaslAuthenticated",
|
||
|
StateExpired: "StateExpired",
|
||
|
StateAuthFailed: "StateAuthFailed",
|
||
|
StateConnecting: "StateConnecting",
|
||
|
StateConnected: "StateConnected",
|
||
|
StateHasSession: "StateHasSession",
|
||
|
}
|
||
|
)
|
||
|
|
||
|
type State int32
|
||
|
|
||
|
func (s State) String() string {
|
||
|
if name := stateNames[s]; name != "" {
|
||
|
return name
|
||
|
}
|
||
|
return "Unknown"
|
||
|
}
|
||
|
|
||
|
type ErrCode int32
|
||
|
|
||
|
var (
|
||
|
ErrConnectionClosed = errors.New("zk: connection closed")
|
||
|
ErrUnknown = errors.New("zk: unknown error")
|
||
|
ErrAPIError = errors.New("zk: api error")
|
||
|
ErrNoNode = errors.New("zk: node does not exist")
|
||
|
ErrNoAuth = errors.New("zk: not authenticated")
|
||
|
ErrBadVersion = errors.New("zk: version conflict")
|
||
|
ErrNoChildrenForEphemerals = errors.New("zk: ephemeral nodes may not have children")
|
||
|
ErrNodeExists = errors.New("zk: node already exists")
|
||
|
ErrNotEmpty = errors.New("zk: node has children")
|
||
|
ErrSessionExpired = errors.New("zk: session has been expired by the server")
|
||
|
ErrInvalidACL = errors.New("zk: invalid ACL specified")
|
||
|
ErrAuthFailed = errors.New("zk: client authentication failed")
|
||
|
ErrClosing = errors.New("zk: zookeeper is closing")
|
||
|
ErrNothing = errors.New("zk: no server responsees to process")
|
||
|
ErrSessionMoved = errors.New("zk: session moved to another server, so operation is ignored")
|
||
|
|
||
|
// ErrInvalidCallback = errors.New("zk: invalid callback specified")
|
||
|
errCodeToError = map[ErrCode]error{
|
||
|
0: nil,
|
||
|
errAPIError: ErrAPIError,
|
||
|
errNoNode: ErrNoNode,
|
||
|
errNoAuth: ErrNoAuth,
|
||
|
errBadVersion: ErrBadVersion,
|
||
|
errNoChildrenForEphemerals: ErrNoChildrenForEphemerals,
|
||
|
errNodeExists: ErrNodeExists,
|
||
|
errNotEmpty: ErrNotEmpty,
|
||
|
errSessionExpired: ErrSessionExpired,
|
||
|
// errInvalidCallback: ErrInvalidCallback,
|
||
|
errInvalidAcl: ErrInvalidACL,
|
||
|
errAuthFailed: ErrAuthFailed,
|
||
|
errClosing: ErrClosing,
|
||
|
errNothing: ErrNothing,
|
||
|
errSessionMoved: ErrSessionMoved,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
func (e ErrCode) toError() error {
|
||
|
if err, ok := errCodeToError[e]; ok {
|
||
|
return err
|
||
|
}
|
||
|
return ErrUnknown
|
||
|
}
|
||
|
|
||
|
const (
|
||
|
errOk = 0
|
||
|
// System and server-side errors
|
||
|
errSystemError = -1
|
||
|
errRuntimeInconsistency = -2
|
||
|
errDataInconsistency = -3
|
||
|
errConnectionLoss = -4
|
||
|
errMarshallingError = -5
|
||
|
errUnimplemented = -6
|
||
|
errOperationTimeout = -7
|
||
|
errBadArguments = -8
|
||
|
errInvalidState = -9
|
||
|
// API errors
|
||
|
errAPIError = ErrCode(-100)
|
||
|
errNoNode = ErrCode(-101) // *
|
||
|
errNoAuth = ErrCode(-102)
|
||
|
errBadVersion = ErrCode(-103) // *
|
||
|
errNoChildrenForEphemerals = ErrCode(-108)
|
||
|
errNodeExists = ErrCode(-110) // *
|
||
|
errNotEmpty = ErrCode(-111)
|
||
|
errSessionExpired = ErrCode(-112)
|
||
|
errInvalidCallback = ErrCode(-113)
|
||
|
errInvalidAcl = ErrCode(-114)
|
||
|
errAuthFailed = ErrCode(-115)
|
||
|
errClosing = ErrCode(-116)
|
||
|
errNothing = ErrCode(-117)
|
||
|
errSessionMoved = ErrCode(-118)
|
||
|
)
|
||
|
|
||
|
// Constants for ACL permissions
|
||
|
const (
|
||
|
PermRead = 1 << iota
|
||
|
PermWrite
|
||
|
PermCreate
|
||
|
PermDelete
|
||
|
PermAdmin
|
||
|
PermAll = 0x1f
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
emptyPassword = []byte{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||
|
opNames = map[int32]string{
|
||
|
opNotify: "notify",
|
||
|
opCreate: "create",
|
||
|
opDelete: "delete",
|
||
|
opExists: "exists",
|
||
|
opGetData: "getData",
|
||
|
opSetData: "setData",
|
||
|
opGetAcl: "getACL",
|
||
|
opSetAcl: "setACL",
|
||
|
opGetChildren: "getChildren",
|
||
|
opSync: "sync",
|
||
|
opPing: "ping",
|
||
|
opGetChildren2: "getChildren2",
|
||
|
opCheck: "check",
|
||
|
opMulti: "multi",
|
||
|
opClose: "close",
|
||
|
opSetAuth: "setAuth",
|
||
|
opSetWatches: "setWatches",
|
||
|
|
||
|
opWatcherEvent: "watcherEvent",
|
||
|
}
|
||
|
)
|
||
|
|
||
|
type EventType int32
|
||
|
|
||
|
func (t EventType) String() string {
|
||
|
if name := eventNames[t]; name != "" {
|
||
|
return name
|
||
|
}
|
||
|
return "Unknown"
|
||
|
}
|