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.
253 lines
6.3 KiB
253 lines
6.3 KiB
"""Kazoo State and Event objects"""
|
|
from collections import namedtuple
|
|
|
|
|
|
class KazooState(object):
|
|
"""High level connection state values
|
|
|
|
States inspired by Netflix Curator.
|
|
|
|
.. attribute:: SUSPENDED
|
|
|
|
The connection has been lost but may be recovered. We should
|
|
operate in a "safe mode" until then. When the connection is
|
|
resumed, it may be discovered that the session expired. A
|
|
client should not assume that locks are valid during this
|
|
time.
|
|
|
|
.. attribute:: CONNECTED
|
|
|
|
The connection is alive and well.
|
|
|
|
.. attribute:: LOST
|
|
|
|
The connection has been confirmed dead. Any ephemeral nodes
|
|
will need to be recreated upon re-establishing a connection.
|
|
If locks were acquired or recipes using ephemeral nodes are in
|
|
use, they can be considered lost as well.
|
|
|
|
"""
|
|
|
|
SUSPENDED = "SUSPENDED"
|
|
CONNECTED = "CONNECTED"
|
|
LOST = "LOST"
|
|
|
|
|
|
class KeeperState(object):
|
|
"""Zookeeper State
|
|
|
|
Represents the Zookeeper state. Watch functions will receive a
|
|
:class:`KeeperState` attribute as their state argument.
|
|
|
|
.. attribute:: AUTH_FAILED
|
|
|
|
Authentication has failed, this is an unrecoverable error.
|
|
|
|
.. attribute:: CONNECTED
|
|
|
|
Zookeeper is connected.
|
|
|
|
.. attribute:: CONNECTED_RO
|
|
|
|
Zookeeper is connected in read-only state.
|
|
|
|
.. attribute:: CONNECTING
|
|
|
|
Zookeeper is currently attempting to establish a connection.
|
|
|
|
.. attribute:: EXPIRED_SESSION
|
|
|
|
The prior session was invalid, all prior ephemeral nodes are
|
|
gone.
|
|
|
|
"""
|
|
|
|
AUTH_FAILED = "AUTH_FAILED"
|
|
CONNECTED = "CONNECTED"
|
|
CONNECTED_RO = "CONNECTED_RO"
|
|
CONNECTING = "CONNECTING"
|
|
CLOSED = "CLOSED"
|
|
EXPIRED_SESSION = "EXPIRED_SESSION"
|
|
|
|
|
|
class EventType(object):
|
|
"""Zookeeper Event
|
|
|
|
Represents a Zookeeper event. Events trigger watch functions which
|
|
will receive a :class:`EventType` attribute as their event
|
|
argument.
|
|
|
|
.. attribute:: CREATED
|
|
|
|
A node has been created.
|
|
|
|
.. attribute:: DELETED
|
|
|
|
A node has been deleted.
|
|
|
|
.. attribute:: CHANGED
|
|
|
|
The data for a node has changed.
|
|
|
|
.. attribute:: CHILD
|
|
|
|
The children under a node have changed (a child was added or
|
|
removed). This event does not indicate the data for a child
|
|
node has changed, which must have its own watch established.
|
|
|
|
.. attribute:: NONE
|
|
|
|
The connection state has been altered.
|
|
|
|
"""
|
|
|
|
CREATED = "CREATED"
|
|
DELETED = "DELETED"
|
|
CHANGED = "CHANGED"
|
|
CHILD = "CHILD"
|
|
NONE = "NONE"
|
|
|
|
|
|
EVENT_TYPE_MAP = {
|
|
-1: EventType.NONE,
|
|
1: EventType.CREATED,
|
|
2: EventType.DELETED,
|
|
3: EventType.CHANGED,
|
|
4: EventType.CHILD,
|
|
}
|
|
|
|
|
|
class WatchedEvent(namedtuple("WatchedEvent", ("type", "state", "path"))):
|
|
"""A change on ZooKeeper that a Watcher is able to respond to.
|
|
|
|
The :class:`WatchedEvent` includes exactly what happened, the
|
|
current state of ZooKeeper, and the path of the node that was
|
|
involved in the event. An instance of :class:`WatchedEvent` will be
|
|
passed to registered watch functions.
|
|
|
|
.. attribute:: type
|
|
|
|
A :class:`EventType` attribute indicating the event type.
|
|
|
|
.. attribute:: state
|
|
|
|
A :class:`KeeperState` attribute indicating the Zookeeper
|
|
state.
|
|
|
|
.. attribute:: path
|
|
|
|
The path of the node for the watch event.
|
|
|
|
"""
|
|
|
|
|
|
class Callback(namedtuple("Callback", ("type", "func", "args"))):
|
|
"""A callback that is handed to a handler for dispatch
|
|
|
|
:param type: Type of the callback, currently is only 'watch'
|
|
:param func: Callback function
|
|
:param args: Argument list for the callback function
|
|
|
|
"""
|
|
|
|
|
|
class ZnodeStat(
|
|
namedtuple(
|
|
"ZnodeStat",
|
|
"czxid mzxid ctime mtime version"
|
|
" cversion aversion ephemeralOwner dataLength"
|
|
" numChildren pzxid",
|
|
)
|
|
):
|
|
"""A ZnodeStat structure with convenience properties
|
|
|
|
When getting the value of a znode from Zookeeper, the properties for
|
|
the znode known as a "Stat structure" will be retrieved. The
|
|
:class:`ZnodeStat` object provides access to the standard Stat
|
|
properties and additional properties that are more readable and use
|
|
Python time semantics (seconds since epoch instead of ms).
|
|
|
|
.. note::
|
|
|
|
The original Zookeeper Stat name is in parens next to the name
|
|
when it differs from the convenience attribute. These are **not
|
|
functions**, just attributes.
|
|
|
|
.. attribute:: creation_transaction_id (czxid)
|
|
|
|
The transaction id of the change that caused this znode to be
|
|
created.
|
|
|
|
.. attribute:: last_modified_transaction_id (mzxid)
|
|
|
|
The transaction id of the change that last modified this znode.
|
|
|
|
.. attribute:: created (ctime)
|
|
|
|
The time in seconds from epoch when this znode was created.
|
|
(ctime is in milliseconds)
|
|
|
|
.. attribute:: last_modified (mtime)
|
|
|
|
The time in seconds from epoch when this znode was last
|
|
modified. (mtime is in milliseconds)
|
|
|
|
.. attribute:: version
|
|
|
|
The number of changes to the data of this znode.
|
|
|
|
.. attribute:: acl_version (aversion)
|
|
|
|
The number of changes to the ACL of this znode.
|
|
|
|
.. attribute:: owner_session_id (ephemeralOwner)
|
|
|
|
The session id of the owner of this znode if the znode is an
|
|
ephemeral node. If it is not an ephemeral node, it will be
|
|
`None`. (ephemeralOwner will be 0 if it is not ephemeral)
|
|
|
|
.. attribute:: data_length (dataLength)
|
|
|
|
The length of the data field of this znode.
|
|
|
|
.. attribute:: children_count (numChildren)
|
|
|
|
The number of children of this znode.
|
|
|
|
"""
|
|
|
|
@property
|
|
def acl_version(self):
|
|
return self.aversion
|
|
|
|
@property
|
|
def children_version(self):
|
|
return self.cversion
|
|
|
|
@property
|
|
def created(self):
|
|
return self.ctime / 1000.0
|
|
|
|
@property
|
|
def last_modified(self):
|
|
return self.mtime / 1000.0
|
|
|
|
@property
|
|
def owner_session_id(self):
|
|
return self.ephemeralOwner or None
|
|
|
|
@property
|
|
def creation_transaction_id(self):
|
|
return self.czxid
|
|
|
|
@property
|
|
def last_modified_transaction_id(self):
|
|
return self.mzxid
|
|
|
|
@property
|
|
def data_length(self):
|
|
return self.dataLength
|
|
|
|
@property
|
|
def children_count(self):
|
|
return self.numChildren
|