コード例 #1
0
    def test_worker_registers(self):
        DB = NetworkStateDB()
        host_id, addr = make_kasaya_id(True), "tcp://127.0.0.1:4000"
        DB.host_register(host_id, addr)

        wid1, svc1, addr1 = make_kasaya_id(), "srvc1", "tcp://127.0.0.1:5000"
        wid2, svc2, addr2 = make_kasaya_id(), "srvc2", "tcp://127.0.0.1:5001"
        wid3, svc3, addr3 = make_kasaya_id(), "srvc3", "tcp://127.0.0.1:5002"

        DB.worker_register( host_id, wid1, svc1, addr1, 100, online=True )
        DB.worker_register( host_id, wid2, svc2, addr2, 101, online=False )
        DB.worker_register( host_id, wid3, svc3, addr3 )

        self.assertDictEequal(
            DB.worker_get( wid1 ),
            { 'id'      : wid1,
              'host_id' : host_id,
              'service' : svc1,
              'addr'    : addr1,
              'pid'     : 100,
              'online'  : True })

        self.assertDictEequal(
            DB.worker_get( wid2 ),
            { 'id'      : wid2,
              'host_id' : host_id,
              'service' : svc2,
              'addr'    : addr2,
              'pid'     : 101,
              'online'  : False })

        self.assertDictEequal(
            DB.worker_get( wid3 ),
            { 'id'      : wid3,
              'host_id' : host_id,
              'service' : svc3,
              'addr'    : addr3,
              'pid'     : -1,
              'online'  : True })

        # selecting only online workers for service
        self.assertEqual( DB.choose_worker_for_service(svc1)['id'], wid1 )
        self.assertEqual( DB.choose_worker_for_service(svc2), None )
        self.assertEqual( DB.choose_worker_for_service(svc3)['id'], wid3 )

        # change worker state
        DB.worker_set_state( wid2, True )
        self.assertEqual( DB.choose_worker_for_service(svc2)['id'], wid2 )
        DB.worker_set_state( wid1, False )
        self.assertEqual( DB.choose_worker_for_service(svc1), None )
コード例 #2
0
    def test_timeouts(self):
        res = {'unreg': []}

        def func_reg(ID, service, address, pid):
            res['reg'] = (ID, service, address, pid)

        def func_unreg(ID):
            res['unreg'].append(ID)

        add_event_handler("worker-local-start", func_reg)
        add_event_handler("worker-local-stop", func_unreg)

        P = PingDB()
        w1 = (make_kasaya_id(), "foo", "tcp://127.0.0.1:1234", 789)
        w2 = (make_kasaya_id(), "baz", "tcp://127.0.0.1:1235", 790)

        P.ping_ex(*w1)
        P.ping_ex(*w2)
        gevent.sleep(0)

        # two pings
        self.assertEqual(len(P._pingdb), 2)
        set_value('WORKER_HEARTBEAT', 1)

        # check pings
        P.check_all()
        gevent.sleep(0)
        self.assertEqual(len(P._pingdb), 2)
        self.assertEqual(len(res['unreg']), 0)

        # timeout
        gevent.sleep(3)
        P.check_all()
        gevent.sleep(0)
        self.assertEqual(len(P._pingdb), 0)
        self.assertEqual(len(res['unreg']), 2)
        self.assertItemsEqual([w1[0], w2[0]], res['unreg'])

        # ping of life
        res['reg'] = None
        res['unreg'] = []
        P.ping_ex(*w1)
        P.ping_ex(*w2)
        gevent.sleep(3)
        P.ping(w1[0])
        P.check_all()
        gevent.sleep(0)
        self.assertItemsEqual([w2[0]], res['unreg'])
        self.assertEqual(len(res['unreg']), 1)
コード例 #3
0
    def test_host_up_and_down(self):
        DB = NetworkStateDB()
        ID, addr = make_kasaya_id(True), "tcp://192.168.1.2:4000"

        # adding host
        res = DB.host_register(ID, addr)
        self.assertEqual(res, True)
        res = DB.host_register(ID, addr)
        self.assertEqual(res, False)

        # listing hosts
        lst = list( DB.host_list() )
        self.assertEqual( len(lst), 1 )
        self.assertEqual( lst[0]['id'], ID )
        self.assertEqual( lst[0]['hostname'], None )
        self.assertEqual( lst[0]['addr'], addr )

        # get host by ID
        h = DB.host_addr_by_id(ID)
        self.assertEqual( h, addr )

        # unregister
        DB.host_unregister(ID)

        # check unregistering result
        lst = list( DB.host_list() )
        self.assertEqual( len(lst), 0 )
        h = DB.host_addr_by_id(ID)
        self.assertEqual( h, None )

        # register 10 hosts
        for n in range(10,20):
            ID, hn, addr = make_kasaya_id(True), "host_%i" % n, "tcp://192.168.1.%i:4000" % n
            res = DB.host_register(ID, addr)
            self.assertEqual(res, True)
            res = DB.host_register(ID, addr)
            self.assertEqual(res, False)

        # is there 10 hosts on list?
        lst = list( DB.host_list() )
        self.assertEqual( len(lst), 10 )

        # check host query
        for n in range(10,20):
            DB.host_addr_by_id(ID)
        DB.close()
コード例 #4
0
    def test_ping_pong(self):
        res = {}

        def func_reg(ID, service, address, pid):
            res['reg'] = (ID, service, address, pid)
            #print ("reg", res)#ID, service, address, pid)

        def func_unreg(ID):
            res['unr'] = ID

        add_event_handler("worker-local-start", func_reg)
        add_event_handler("worker-local-stop", func_unreg)

        P = PingDB()
        w1 = make_kasaya_id()
        res['unr'] = None

        # simple ping will not add worker to db
        P.ping(w1)
        self.assertEqual(len(P._pingdb), 0)

        P.ping_ex(w1, "foo", "tcp://127.0.0.1:1234", 567)
        gevent.sleep(0)
        self.assertEqual(len(P._pingdb), 1)
        # has been notification function triggered?
        self.assertItemsEqual(res['reg'],
                              [w1, 'foo', 'tcp://127.0.0.1:1234', 567])
        # dont call unregister
        self.assertEqual(res['unr'], None)

        # bad ping data
        res['reg'] = None
        P.ping_ex(w1, "bar", "tcp://127.0.0.1:1234", 567)
        gevent.sleep(0)
        self.assertEqual(res['reg'], None)
        self.assertEqual(res['unr'], w1)

        self.assertEqual(len(P._pingdb), 0)
コード例 #5
0
    def test_host_with_workers(self):
        _hosts = []

        DB = NetworkStateDB()
        svce = ("mail","sms","bubbles","spam")
        # create hosts
        for n in range(6):
            ip = '192.168.1.%i' % n
            HID, hn, addr = make_kasaya_id(True), "host_%i" % n, "tcp://%s:4000" % ip
            _hosts.append(HID)
            DB.host_register(HID, addr)

            # make workers
            for w in range(10):
                WID = make_kasaya_id(False) # worker id
                addr="tcp://%s:%i" % (ip, 5000+w)
                DB.worker_register(HID, WID, random.choice(svce), addr, n+((w+1)*100) )

        # check hosts
        hlst = list( DB.host_list() )
        self.assertItemsEqual(  [ x['id'] for x in hlst ] , _hosts )

        # check existance of workers in hosts
        for h in hlst:
            itms=0
            wids = []
            haddr = h['addr'].rsplit(":",1)[0]

            for w in DB.worker_list(h['id']):
                itms+=1
                waddr = w['addr'].rsplit(":",1)[0]
                self.assertEqual( waddr, haddr )
                # is this worker listed only one
                assert w['id'] not in wids, "Worker has been listed before!"
                wids.append(w['id'])

            # how many workers was on the list
            self.assertEqual(itms, 10)

        removed = []
        # check unregistering workers
        for h in DB.host_list():
            remove = False
            by_id = False
            for w in DB.worker_list(h['id']):
                # remove this worker
                if remove:
                    w['hid'] = h['id']
                    removed.append(w)
                    if by_id:
                        DB.worker_unregister(ID=w['id'])
                    else:
                        DB.worker_unregister(address=w['addr'])
                    by_id = not by_id
                remove = not remove

        # check removef workers
        for i in removed:
            w = DB.worker_get(i['id'])
            self.assertEqual(w,None, "Worker should be removed but still exists in database")

        # random worker choice
        for s in svce:
            for n in range(10):
                w = DB.choose_worker_for_service(s)
                wrkr = DB.worker_get(w['id'])
                self.assertEqual( wrkr['service'], s )

        # unknown service
        w = DB.choose_worker_for_service("foobar")
        self.assertEqual(w, None)
コード例 #6
0
 def __init__(self, is_host=False):
     self.ID = make_kasaya_id(host=is_host)