blob: d09c2c6e990460451a9fae41eeda7c3a5628038a [file] [log] [blame]
"""license: Apache License 2.0, see LICENSE for more details."""
"""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.
"""
CREATED = 'CREATED'
DELETED = 'DELETED'
CHANGED = 'CHANGED'
CHILD = 'CHILD'
EVENT_TYPE_MAP = {
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 node from Zookeeper, the properties for
the node 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 node 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