[Neo-report] r2685 jm - in /trunk/neo: lib/ tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Wed Mar 23 11:44:48 CET 2011
Author: jm
Date: Wed Mar 23 11:44:47 2011
New Revision: 2685
Log:
Simplify EventHandler by removing 'packet_dispatch_table'
Modified:
trunk/neo/lib/handler.py
trunk/neo/lib/logger.py
trunk/neo/lib/protocol.py
trunk/neo/tests/testConnection.py
trunk/neo/tests/testHandler.py
trunk/neo/tests/testProtocol.py
Modified: trunk/neo/lib/handler.py
==============================================================================
--- trunk/neo/lib/handler.py [iso-8859-1] (original)
+++ trunk/neo/lib/handler.py [iso-8859-1] Wed Mar 23 11:44:47 2011
@@ -26,7 +26,6 @@ class EventHandler(object):
def __init__(self, app):
self.app = app
- self.packet_dispatch_table = self.__initPacketDispatchTable()
self.error_dispatch_table = self.__initErrorDispatchTable()
def __repr__(self):
@@ -49,8 +48,8 @@ class EventHandler(object):
"""This is a helper method to handle various packet types."""
try:
try:
- method = self.packet_dispatch_table[packet.getType()]
- except KeyError:
+ method = getattr(self, packet.handler_method_name)
+ except AttributeError:
raise UnexpectedPacketError('no handler found')
args = packet.decode() or ()
conn.setPeerId(packet.getId())
@@ -133,259 +132,12 @@ class EventHandler(object):
def notify(self, conn, message):
neo.lib.logging.info('notification from %r: %s', conn, message)
- def requestIdentification(self, conn, node_type, uuid, address, name):
- raise UnexpectedPacketError
-
- def _requestIdentification(self, conn, protocol, node_type,
- uuid, address, name):
- self.requestIdentification(conn, node_type, uuid, address, name)
-
- def acceptIdentification(self, conn, node_type,
- uuid, num_partitions, num_replicas, your_uuid):
- raise UnexpectedPacketError
-
- def askPrimary(self, conn):
- raise UnexpectedPacketError
-
- def answerPrimary(self, conn, primary_uuid,
- known_master_list):
- raise UnexpectedPacketError
-
- def announcePrimary(self, con):
- raise UnexpectedPacketError
-
- def reelectPrimary(self, conn):
- raise UnexpectedPacketError
-
- def notifyNodeInformation(self, conn, node_list):
- raise UnexpectedPacketError
-
- def askLastIDs(self, conn):
- raise UnexpectedPacketError
-
- def answerLastIDs(self, conn, loid, ltid, lptid):
- raise UnexpectedPacketError
-
- def askPartitionTable(self, conn):
- raise UnexpectedPacketError
-
- def answerPartitionTable(self, conn, ptid, row_list):
- raise UnexpectedPacketError
-
- def sendPartitionTable(self, conn, ptid, row_list):
- raise UnexpectedPacketError
-
- def notifyPartitionChanges(self, conn, ptid, cell_list):
- raise UnexpectedPacketError
-
- def startOperation(self, conn):
- raise UnexpectedPacketError
-
- def stopOperation(self, conn):
- raise UnexpectedPacketError
-
- def askUnfinishedTransactions(self, conn):
- raise UnexpectedPacketError
-
- def answerUnfinishedTransactions(self, conn, max_tid, ttid_list):
- raise UnexpectedPacketError
-
- def askObjectPresent(self, conn, oid, tid):
- raise UnexpectedPacketError
-
- def answerObjectPresent(self, conn, oid, tid):
- raise UnexpectedPacketError
-
- def deleteTransaction(self, conn, tid, oid_list):
- raise UnexpectedPacketError
-
- def commitTransaction(self, conn, tid):
- raise UnexpectedPacketError
-
- def askBeginTransaction(self, conn, tid):
- raise UnexpectedPacketError
-
- def answerBeginTransaction(self, conn, ttid):
- raise UnexpectedPacketError
-
- def askNewOIDs(self, conn, num_oids):
- raise UnexpectedPacketError
-
- def answerNewOIDs(self, conn, num_oids):
- raise UnexpectedPacketError
-
- def askFinishTransaction(self, conn, ttid, oid_list):
- raise UnexpectedPacketError
-
- def answerTransactionFinished(self, conn, ttid, tid):
- raise UnexpectedPacketError
-
- def askLockInformation(self, conn, ttid, tid, oid_list):
- raise UnexpectedPacketError
-
- def answerInformationLocked(self, conn, ttid):
- raise UnexpectedPacketError
-
- def invalidateObjects(self, conn, tid, oid_list):
- raise UnexpectedPacketError
-
- def notifyUnlockInformation(self, conn, ttid):
- raise UnexpectedPacketError
-
- def notifyTransactionFinished(self, conn, ttid, max_tid):
- raise UnexpectedPacketError
-
- def askStoreObject(self, conn, oid, serial,
- compression, checksum, data, data_serial, ttid, unlock):
- raise UnexpectedPacketError
-
- def answerStoreObject(self, conn, conflicting, oid, serial):
- raise UnexpectedPacketError
-
- def abortTransaction(self, conn, ttid):
- raise UnexpectedPacketError
-
- def askStoreTransaction(self, conn, ttid, user, desc,
- ext, oid_list):
- raise UnexpectedPacketError
-
- def answerStoreTransaction(self, conn, ttid):
- raise UnexpectedPacketError
-
- def askObject(self, conn, oid, serial, ttid):
- raise UnexpectedPacketError
-
- def answerObject(self, conn, oid, serial_start,
- serial_end, compression, checksum, data, data_serial):
- raise UnexpectedPacketError
-
- def askTIDs(self, conn, first, last, partition):
- raise UnexpectedPacketError
-
- def answerTIDs(self, conn, tid_list):
- raise UnexpectedPacketError
-
- def askTIDsFrom(self, conn, min_tid, max_tid, length, partition):
- raise UnexpectedPacketError
-
- def answerTIDsFrom(self, conn, tid_list):
- raise UnexpectedPacketError
-
- def askTransactionInformation(self, conn, tid):
- raise UnexpectedPacketError
-
- def answerTransactionInformation(self, conn, tid,
- user, desc, ext, packed, oid_list):
- raise UnexpectedPacketError
-
- def askObjectHistory(self, conn, oid, first, last):
- raise UnexpectedPacketError
-
- def answerObjectHistory(self, conn, oid, history_list):
- raise UnexpectedPacketError
-
- def askObjectHistoryFrom(self, conn, oid, min_serial, max_serial, length,
- partition):
- raise UnexpectedPacketError
-
- def answerObjectHistoryFrom(self, conn, object_dict):
- raise UnexpectedPacketError
-
- def askPartitionList(self, conn, min_offset, max_offset, uuid):
- raise UnexpectedPacketError
-
- def answerPartitionList(self, conn, ptid, row_list):
- raise UnexpectedPacketError
-
- def askNodeList(self, conn, offset_list):
- raise UnexpectedPacketError
-
- def answerNodeList(self, conn, node_list):
- raise UnexpectedPacketError
-
- def setNodeState(self, conn, uuid, state, modify_partition_table):
- raise UnexpectedPacketError
-
- def addPendingNodes(self, conn, uuid_list):
- raise UnexpectedPacketError
-
- def askNodeInformation(self, conn):
- raise UnexpectedPacketError
-
- def answerNodeInformation(self, conn):
- raise UnexpectedPacketError
-
- def askClusterState(self, conn):
- raise UnexpectedPacketError
-
- def answerClusterState(self, conn, state):
- raise UnexpectedPacketError
-
- def setClusterState(self, conn, state):
- raise UnexpectedPacketError
-
- def notifyClusterInformation(self, conn, state):
- raise UnexpectedPacketError
-
- def notifyLastOID(self, conn, oid):
- raise UnexpectedPacketError
-
- def notifyReplicationDone(self, conn, offset):
- raise UnexpectedPacketError
-
- def askObjectUndoSerial(self, conn, ttid, ltid, undone_tid, oid_list):
- raise UnexpectedPacketError
-
- def answerObjectUndoSerial(self, conn, object_tid_dict):
- raise UnexpectedPacketError
-
- def askHasLock(self, conn, ttid, oid):
- raise UnexpectedPacketError
-
- def answerHasLock(self, conn, oid, status):
- raise UnexpectedPacketError
-
def askBarrier(self, conn):
conn.answer(Packets.AnswerBarrier())
def answerBarrier(self, conn):
pass
- def askPack(self, conn, tid):
- raise UnexpectedPacketError
-
- def answerPack(self, conn, status):
- raise UnexpectedPacketError
-
- def askCheckTIDRange(self, conn, min_tid, max_tid, length, partition):
- raise UnexpectedPacketError
-
- def answerCheckTIDRange(self, conn, min_tid, length, count, tid_checksum,
- max_tid):
- raise UnexpectedPacketError
-
- def askCheckSerialRange(self, conn, min_oid, min_serial, max_tid, length,
- partition):
- raise UnexpectedPacketError
-
- def answerCheckSerialRange(self, conn, min_oid, min_serial, length, count,
- oid_checksum, max_oid, serial_checksum, max_serial):
- raise UnexpectedPacketError
-
- def notifyReady(self, conn):
- raise UnexpectedPacketError
-
- def askLastTransaction(self, conn):
- raise UnexpectedPacketError
-
- def answerLastTransaction(self, conn, tid):
- raise UnexpectedPacketError
-
- def askCheckCurrentSerial(self, conn, ttid, serial, oid):
- raise UnexpectedPacketError
-
- answerCheckCurrentSerial = answerStoreObject
-
# Error packet handlers.
def error(self, conn, code, message):
@@ -426,96 +178,6 @@ class EventHandler(object):
# Fetch tables initialization
- def __initPacketDispatchTable(self):
- d = {}
-
- d[Packets.Error] = self.error
- d[Packets.Notify] = self.notify
- d[Packets.RequestIdentification] = self._requestIdentification
- d[Packets.AcceptIdentification] = self.acceptIdentification
- d[Packets.AskPrimary] = self.askPrimary
- d[Packets.AnswerPrimary] = self.answerPrimary
- d[Packets.AnnouncePrimary] = self.announcePrimary
- d[Packets.ReelectPrimary] = self.reelectPrimary
- d[Packets.NotifyNodeInformation] = self.notifyNodeInformation
- d[Packets.AskLastIDs] = self.askLastIDs
- d[Packets.AnswerLastIDs] = self.answerLastIDs
- d[Packets.AskPartitionTable] = self.askPartitionTable
- d[Packets.AnswerPartitionTable] = self.answerPartitionTable
- d[Packets.SendPartitionTable] = self.sendPartitionTable
- d[Packets.NotifyPartitionChanges] = self.notifyPartitionChanges
- d[Packets.StartOperation] = self.startOperation
- d[Packets.StopOperation] = self.stopOperation
- d[Packets.AskUnfinishedTransactions] = self.askUnfinishedTransactions
- d[Packets.AnswerUnfinishedTransactions] = \
- self.answerUnfinishedTransactions
- d[Packets.AskObjectPresent] = self.askObjectPresent
- d[Packets.AnswerObjectPresent] = self.answerObjectPresent
- d[Packets.DeleteTransaction] = self.deleteTransaction
- d[Packets.CommitTransaction] = self.commitTransaction
- d[Packets.AskBeginTransaction] = self.askBeginTransaction
- d[Packets.AnswerBeginTransaction] = self.answerBeginTransaction
- d[Packets.AskFinishTransaction] = self.askFinishTransaction
- d[Packets.AnswerTransactionFinished] = self.answerTransactionFinished
- d[Packets.AskLockInformation] = self.askLockInformation
- d[Packets.AnswerInformationLocked] = self.answerInformationLocked
- d[Packets.InvalidateObjects] = self.invalidateObjects
- d[Packets.NotifyUnlockInformation] = self.notifyUnlockInformation
- d[Packets.AskNewOIDs] = self.askNewOIDs
- d[Packets.AnswerNewOIDs] = self.answerNewOIDs
- d[Packets.AskStoreObject] = self.askStoreObject
- d[Packets.AnswerStoreObject] = self.answerStoreObject
- d[Packets.AbortTransaction] = self.abortTransaction
- d[Packets.AskStoreTransaction] = self.askStoreTransaction
- d[Packets.AnswerStoreTransaction] = self.answerStoreTransaction
- d[Packets.AskObject] = self.askObject
- d[Packets.AnswerObject] = self.answerObject
- d[Packets.AskTIDs] = self.askTIDs
- d[Packets.AnswerTIDs] = self.answerTIDs
- d[Packets.AskTIDsFrom] = self.askTIDsFrom
- d[Packets.AnswerTIDsFrom] = self.answerTIDsFrom
- d[Packets.AskTransactionInformation] = self.askTransactionInformation
- d[Packets.AnswerTransactionInformation] = \
- self.answerTransactionInformation
- d[Packets.AskObjectHistory] = self.askObjectHistory
- d[Packets.AnswerObjectHistory] = self.answerObjectHistory
- d[Packets.AskObjectHistoryFrom] = self.askObjectHistoryFrom
- d[Packets.AnswerObjectHistoryFrom] = self.answerObjectHistoryFrom
- d[Packets.AskPartitionList] = self.askPartitionList
- d[Packets.AnswerPartitionList] = self.answerPartitionList
- d[Packets.AskNodeList] = self.askNodeList
- d[Packets.AnswerNodeList] = self.answerNodeList
- d[Packets.SetNodeState] = self.setNodeState
- d[Packets.SetClusterState] = self.setClusterState
- d[Packets.AddPendingNodes] = self.addPendingNodes
- d[Packets.AskNodeInformation] = self.askNodeInformation
- d[Packets.AnswerNodeInformation] = self.answerNodeInformation
- d[Packets.AskClusterState] = self.askClusterState
- d[Packets.AnswerClusterState] = self.answerClusterState
- d[Packets.NotifyClusterInformation] = self.notifyClusterInformation
- d[Packets.NotifyLastOID] = self.notifyLastOID
- d[Packets.NotifyReplicationDone] = self.notifyReplicationDone
- d[Packets.AskObjectUndoSerial] = self.askObjectUndoSerial
- d[Packets.AnswerObjectUndoSerial] = self.answerObjectUndoSerial
- d[Packets.AskHasLock] = self.askHasLock
- d[Packets.AnswerHasLock] = self.answerHasLock
- d[Packets.AskBarrier] = self.askBarrier
- d[Packets.AnswerBarrier] = self.answerBarrier
- d[Packets.AskPack] = self.askPack
- d[Packets.AnswerPack] = self.answerPack
- d[Packets.AskCheckTIDRange] = self.askCheckTIDRange
- d[Packets.AnswerCheckTIDRange] = self.answerCheckTIDRange
- d[Packets.AskCheckSerialRange] = self.askCheckSerialRange
- d[Packets.AnswerCheckSerialRange] = self.answerCheckSerialRange
- d[Packets.NotifyReady] = self.notifyReady
- d[Packets.AskLastTransaction] = self.askLastTransaction
- d[Packets.AnswerLastTransaction] = self.answerLastTransaction
- d[Packets.AskCheckCurrentSerial] = self.askCheckCurrentSerial
- d[Packets.AnswerCheckCurrentSerial] = self.answerCheckCurrentSerial
- d[Packets.NotifyTransactionFinished] = self.notifyTransactionFinished
-
- return d
-
def __initErrorDispatchTable(self):
d = {}
Modified: trunk/neo/lib/logger.py
==============================================================================
--- trunk/neo/lib/logger.py [iso-8859-1] (original)
+++ trunk/neo/lib/logger.py [iso-8859-1] Wed Mar 23 11:44:47 2011
@@ -28,7 +28,6 @@ class PacketLogger(object):
def __init__(self):
_temp = EventHandler(None)
- self.packet_dispatch_table = _temp.packet_dispatch_table
self.error_dispatch_table = _temp.error_dispatch_table
self.enable(LOGGER_ENABLED)
@@ -38,7 +37,6 @@ class PacketLogger(object):
def _dispatch(self, conn, packet, direction):
"""This is a helper method to handle various packet types."""
# default log message
- klass = packet.getType()
uuid = dump(conn.getUUID())
ip, port = conn.getAddress()
packet_name = packet.__class__.__name__
@@ -47,8 +45,7 @@ class PacketLogger(object):
neo.lib.logging.debug('#0x%08x %-30s %s %s (%s:%d)', packet.getId(),
packet_name, direction, uuid, ip, port)
# look for custom packet logger
- logger = self.packet_dispatch_table.get(klass, None)
- logger = logger and getattr(self, logger.im_func.__name__, None)
+ logger = getattr(self, packet.handler_method_name, None)
if logger is None:
return
# enhanced log
Modified: trunk/neo/lib/protocol.py
==============================================================================
--- trunk/neo/lib/protocol.py [iso-8859-1] (original)
+++ trunk/neo/lib/protocol.py [iso-8859-1] Wed Mar 23 11:44:47 2011
@@ -18,7 +18,6 @@
import socket
import sys
import traceback
-from types import ClassType
from socket import inet_ntoa, inet_aton
from cStringIO import StringIO
from struct import Struct
@@ -673,6 +672,9 @@ class RequestIdentification(Packet):
args.insert(0, PROTOCOL_VERSION)
super(RequestIdentification, self).__init__(*args, **kw)
+ def decode(self):
+ return super(RequestIdentification, self).decode()[1:]
+
class PrimaryMaster(Packet):
"""
Ask a current primary master node. This must be the second message when
@@ -1355,7 +1357,7 @@ def register(code, request, ignore_when_
if answer in (Error, None):
return request
# build a class for the answer
- answer = ClassType('Answer%s' % (request.__name__, ), (Packet, ), {})
+ answer = type('Answer%s' % (request.__name__, ), (Packet, ), {})
answer._fmt = request._answer
# compute the answer code
code = code | RESPONSE_MASK
@@ -1384,14 +1386,16 @@ class ParserState(object):
def clear(self):
self.payload = None
-class PacketRegistry(dict):
+class Packets(dict):
"""
Packet registry that check packet code unicity and provide an index
"""
- def __init__(self):
- dict.__init__(self)
- # load packet classes
- self.update(StaticRegistry)
+ def __metaclass__(name, base, d):
+ for k, v in d.iteritems():
+ if isinstance(v, type) and issubclass(v, Packet):
+ v.handler_method_name = k[0].lower() + k[1:]
+ # this builds a "singleton"
+ return type('PacketRegistry', base, d)(StaticRegistry)
def parse(self, buf, state_container):
state = state_container.get()
@@ -1531,9 +1535,6 @@ class PacketRegistry(dict):
NotifyTransactionFinished = register(
0x003E, NotifyTransactionFinished)
-# build a "singleton"
-Packets = PacketRegistry()
-
def register_error(code):
def wrapper(registry, message=''):
return Error(code, message)
Modified: trunk/neo/tests/testConnection.py
==============================================================================
--- trunk/neo/tests/testConnection.py [iso-8859-1] (original)
+++ trunk/neo/tests/testConnection.py [iso-8859-1] Wed Mar 23 11:44:47 2011
@@ -373,6 +373,7 @@ class ConnectionTests(NeoUnitTestBase):
def test_07_Connection_addPacket(self):
# new packet
p = Mock({"encode" : "testdata"})
+ p.handler_method_name = 'testmethod'
bc = self._makeConnection()
self._checkWriteBuf(bc, '')
bc._addPacket(p)
Modified: trunk/neo/tests/testHandler.py
==============================================================================
--- trunk/neo/tests/testHandler.py [iso-8859-1] (original)
+++ trunk/neo/tests/testHandler.py [iso-8859-1] Wed Mar 23 11:44:47 2011
@@ -28,22 +28,17 @@ class HandlerTests(NeoUnitTestBase):
NeoUnitTestBase.setUp(self)
app = Mock()
self.handler = EventHandler(app)
- self.fake_type = 'FAKE_PACKET_TYPE'
def setFakeMethod(self, method):
- self.handler.packet_dispatch_table[self.fake_type] = method
+ self.handler.fake_method = method
def getFakePacket(self):
- return Mock({
- 'getType': self.fake_type,
+ p = Mock({
'decode': (),
'__repr__': 'Fake Packet',
})
-
- def checkFakeCalled(self):
- method = self.handler.packet_dispatch_table[self.fake_type]
- calls = method.getNamedCalls('__call__')
- self.assertEquals(len(calls), 1)
+ p.handler_method_name = 'fake_method'
+ return p
def test_dispatch(self):
conn = self.getFakeConnection()
Modified: trunk/neo/tests/testProtocol.py
==============================================================================
--- trunk/neo/tests/testProtocol.py [iso-8859-1] (original)
+++ trunk/neo/tests/testProtocol.py [iso-8859-1] Wed Mar 23 11:44:47 2011
@@ -73,7 +73,7 @@ class ProtocolTests(NeoUnitTestBase):
uuid = self.getNewUUID()
p = Packets.RequestIdentification(NodeTypes.CLIENT,
uuid, (self.local_ip, 9080), "unittest")
- (plow, phigh), node, p_uuid, (ip, port), name = p.decode()
+ node, p_uuid, (ip, port), name = p.decode()
self.assertEqual(node, NodeTypes.CLIENT)
self.assertEqual(p_uuid, uuid)
self.assertEqual(ip, self.local_ip)
@@ -85,7 +85,7 @@ class ProtocolTests(NeoUnitTestBase):
self.local_ip = IP_VERSION_FORMAT_DICT[socket.AF_INET6]
p = Packets.RequestIdentification(NodeTypes.CLIENT,
uuid, (self.local_ip, 9080), "unittest")
- (plow, phigh), node, p_uuid, (ip, port), name = p.decode()
+ node, p_uuid, (ip, port), name = p.decode()
self.assertEqual(node, NodeTypes.CLIENT)
self.assertEqual(p_uuid, uuid)
self.assertEqual(ip, self.local_ip)
More information about the Neo-report
mailing list