22 _suites = [
'all',
'cma']
24 sys.path.append(
"../cma")
25 sys.path.append(
"/usr/local/lib/python2.7/dist-packages")
26 from py2neo
import neo4j
28 from testify.utils
import turtle
30 from frameinfo
import *
31 from AssimCclasses
import *
32 import gc, sys, time, collections, os
33 from cmadb
import CMAdb
34 from packetlistener
import PacketListener
35 from messagedispatcher
import MessageDispatcher
36 from dispatchtarget
import DispatchSTARTUP, DispatchHBDEAD, DispatchJSDISCOVERY, DispatchSWDISCOVER
37 from hbring
import HbRing
38 from droneinfo
import DroneInfo
40 from cmadb
import CMAdb
43 WorstDanglingCount = 0
44 CheckForDanglingClasses =
True
56 if t1 < 1000: t1 = 1000
65 CheckForDanglingClasses=
False
73 global CheckForDanglingClasses
74 global WorstDanglingCount
77 CMAdb.TheOneRing =
None
83 if count > WorstDanglingCount
and CheckForDanglingClasses:
84 WorstDanglingCount = count
86 raise AssertionError,
"Dangling C-class objects - %d still around" % count
90 netdiscoveryformat=
'''
92 "discovertype": "netconfig",
93 "description": "IP Network Configuration",
94 "source": "netconfig",
98 "address": "00:1b:fc:1b:%02x:%02x",
105 "ipaddrs": { "%s/16": {"brd":"10.20.255.255", "scope":"global", "name":"eth0"}}
108 "address": "00:00:00:00:00:00",
111 "operstate": "unknown",
112 "ipaddrs": { "127.0.0.1/8": {"scope":"host"}, "::1/128": {"scope":"host"}}
123 byte2 = int(hostnumber / 65536)
124 byte3 = int((hostnumber / 256) % 256)
125 byte4 = hostnumber % 256
126 return pyNetAddr([byte1,byte2,byte3,byte4],1984)
129 return 'drone%06d' % hostnumber
132 byte3 = int(hostnumber / 256)
133 byte4 = hostnumber % 256
146 'deadtime': 10*1000000,
147 'warntime': 3*1000000,
155 droneipstr = str(droneip)
157 drone=DroneInfo.find(designation)
158 self.assertTrue(drone
is not None)
160 ipnodes = drone.node.get_related_nodes(neo4j.Direction.INCOMING,
'iphost')
161 self.assertEqual(len(ipnodes), 1)
163 ipnodeaddr = ipnode[
'name']
164 ipnodeaddrfoo = ipnodeaddr +
'/16'
165 json = drone[
'JSON_netconfig']
167 jsdata = jsobj[
'data']
168 eth0obj = jsdata[
'eth0']
170 eth0addrs = eth0obj[
'ipaddrs']
171 self.assertTrue(eth0addrs.has_key(ipnodeaddrfoo))
173 self.assertEqual(eth0obj[
'default_gw'], 1)
176 self.assertEqual(len(jsobj.keys()), 5)
178 self.assertEqual(jsobj[
'host'], designation)
183 for ring
in drone.ringmemberships.values():
186 if len(ring.memberlist) == 1:
188 elif len(ring.memberlist) == 2:
195 self.assertEqual(ring.members[drone.designation].designation, drone.designation)
196 self.assertEqual(len(ring.members), len(ring.memberlist))
197 if drone.status !=
'dead':
199 self.assertTrue(ringcount >= 1)
201 self.assertEqual(len(drone.ringmemberships),1)
204 self.assertEqual(len(drone.ringpeers), peercount)
207 toaddr = packetreturn[0]
208 sentfs = packetreturn[1]
212 self.assertEqual(sentfs.get_framesettype(), FrameSetTypes.SETCONFIG)
214 self.assertEqual(toaddr,droneip)
216 configlen = len(configinit)-1
217 expectedlen = 2 * configlen + 4
218 self.assertEqual(expectedlen, len(sentfs))
221 'Verify that each ring has its neighbor pairs set up properly'
223 ring = HbRing.ringnames[ringname]
227 for drone
in ring.members():
228 ringmembers[drone.node[
'name']] =
None
229 for drone
in ring.membersfromlist():
230 listmembers[drone.node[
'name']] =
None
231 for drone
in listmembers.keys():
232 self.assertTrue(drone
in ringmembers)
233 for drone
in ringmembers.keys():
234 self.assertTrue(drone
in listmembers)
239 dronetype = CMAdb.cdb.nodetypetbl[
'Drone']
240 droneobjs = dronetype.get_related_nodes(neo4j.Direction.INCOMING,
'IS_A')
241 numdrones = len(droneobjs)
242 for droneid
in range(0,numdrones):
243 audit.auditadrone(droneid+1)
247 for ring
in HbRing.ringnames:
248 audit.auditaRing(ring)
251 '''A pyNetIOudp replacement for testing. It is given a list of packets to be 'read' and in turn
252 saves all the packets it 'writes' for us to inspect.
254 def __init__(self, addrframesetpairs, sleepatend=0):
255 if isinstance(addrframesetpairs, tuple):
256 addrframesetpairs = addrframesetpairs
273 raise StopIteration(
'End of Packets')
280 if not isinstance(fslist, collections.Sequence):
294 def _sendaframeset(self, dest, fslist):
297 self.packetswritten.append((dest,fslist))
302 def mcastjoin(self, addr):
return True
305 def dumppackets(self):
308 print '%s (%s)' % (packet[0], packet[1])
313 'Get EOF with empty input'
314 if BuildListOnly:
return
317 CMAdb.initglobal(io,
True)
319 self.assertRaises(StopIteration, io.recvframesets)
323 'Read a single packet'
324 if BuildListOnly:
return
329 framesets=((otherguy, (strframe1,)),)
331 CMAdb.initglobal(io,
True)
332 gottenfs = io.recvframesets()
333 self.assertEqual(len(gottenfs), 2)
334 self.assertEqual(gottenfs, framesets[0])
335 self.assertRaises(StopIteration, io.recvframesets)
338 'Read a packet and write it back out'
339 if BuildListOnly:
return
344 framesets=((otherguy, (strframe1,)),)
346 CMAdb.initglobal(io,
True)
347 fslist = io.recvframesets()
348 self.assertEqual(len(fslist), 2)
349 self.assertEqual(fslist, framesets[0])
350 io.sendframesets(fslist[0], fslist[1])
351 self.assertEqual(len(io.packetswritten), 1)
352 self.assertEqual(len(io.packetswritten), len(framesets))
353 self.assertRaises(StopIteration, io.recvframesets)
361 '''A semi-interesting test: We send a STARTUP message and get back a
362 SETCONFIG message with lots of good stuff in it.'''
363 if BuildListOnly:
return
369 discoveryframe=
pyCstringFrame(FrameTypes.JSDISCOVER, dronediscovery)
371 fs.append(designationframe)
372 fs.append(discoveryframe)
373 fsin = ((droneip, (fs,)),)
375 CMAdb.initglobal(io,
True)
377 disp = MessageDispatcher({FrameSetTypes.STARTUP: DispatchSTARTUP()})
380 listener = PacketListener(config, disp, io=io)
382 self.assertRaises(StopIteration, listener.listen)
385 self.assertEqual(len(io.packetswritten), 2)
388 AUDITS().auditSETCONFIG(io.packetswritten[0], droneid, configinit)
392 '''A very interesting test: We send a STARTUP message and get back a
393 SETCONFIG message and then send back a bunch of discovery requests.'''
398 for droneid
in range(1,MaxDrone+1):
403 discoveryframe=
pyCstringFrame(FrameTypes.JSDISCOVER, dronediscovery)
405 fs.append(designationframe)
406 fs.append(discoveryframe)
407 fsin.append((droneip, (fs,)))
411 for droneid
in range(2,maxdrones+1):
413 deadframe=
pyIpPortFrame(FrameTypes.IPPORT, addrstring=droneip)
416 fsin.append((addrone, (fs,)))
418 CMAdb.initglobal(io,
True)
419 disp = MessageDispatcher( {
420 FrameSetTypes.STARTUP: DispatchSTARTUP(),
421 FrameSetTypes.HBDEAD: DispatchHBDEAD(),
424 listener = PacketListener(config, disp, io=io)
428 except StopIteration
as foo:
434 droneroot = CMAdb.cdb.nodetypetbl[
'Drone']
435 Dronerels = droneroot.get_relationships(neo4j.Direction.INCOMING,
'IS_A')
436 self.assertEqual(len(Dronerels), maxdrones)
441 for dronerel
in Dronerels:
442 drone1 = DroneInfo(dronerel.start_node)
443 if drone1.node[
'status'] !=
'dead': livecount += 1
444 drone1rels = drone1.node.get_relationships()
445 for rel
in drone1rels:
447 if reltype.startswith(HbRing.memberprefix):
449 if reltype.startswith(HbRing.nextprefix):
451 self.assertEqual(partnercount, 0)
452 self.assertEqual(livecount, 1)
453 self.assertEqual(ringcount, 1)
458 print "The CMA read %d packets." % io.packetsread
459 print "The CMA wrote %d packets." % io.writecount
467 if __name__ ==
"__main__":