示例#1
0
def process_cascade_request(message):
    ctr_increment('cascades processed')

    cascade_requests = RAMCollection('cascade requests')

    try:
        if len(cascade_requests.find_objuuids(
                cscuuid=message['cscuuid'])) == 0:
            cascade_request = cascade_requests.get_object()
            cascade_request.object = message
            cascade_request.set()

            if len(message['ftags']) > 0:
                if len(list(set(message['ftags'])
                            & set(get_tag_values()))) > 0:
                    Thread(target=forward_cascade_request,
                           args=(message, )).start()
            else:
                Thread(target=forward_cascade_request,
                       args=(message, )).start()

            if len(message['etags']) > 0:
                if len(list(set(message['etags'])
                            & set(get_tag_values()))) > 0:
                    Thread(target=execute_cascade_request,
                           args=(message, )).start()
            else:
                Thread(target=execute_cascade_request,
                       args=(message, )).start()
    except:
        pass
示例#2
0
def create_route(agtuuid, gtwuuid, weight, timestamp=None):
    collection = RAMCollection('routes')

    routes = collection.find(agtuuid=agtuuid, gtwuuid=gtwuuid)

    if len(routes) > 1:
        for route in routes:
            route.destroy()

        route = collection.get_object()
        route.object = {
            'gtwuuid': gtwuuid,
            'agtuuid': agtuuid,
            'weight': weight
        }
        route.set()
    elif len(routes) == 1:
        route = routes[0]
        if route.object['weight'] > weight:
            route.object['weight'] = weight
            route.set()
    else:
        route = collection.get_object()
        route.object = {
            'gtwuuid': gtwuuid,
            'agtuuid': agtuuid,
            'weight': weight
        }
        route.set()
示例#3
0
def init_peers():
    ram_peers = RAMCollection('peers')
    peers = SQLCollection('peers')

    for objuuid in peers.list_objuuids():
        ram_peer = ram_peers.get_object(objuuid)
        ram_peer.object = peers.get_object(objuuid).object
        ram_peer.set()
示例#4
0
def pop_cascade_responses(cscuuid):
    responses = RAMCollection('cascade responses')

    response_objects = []

    for objuuid in responses.find_objuuids(cscuuid=cscuuid):
        response = responses.get_object(objuuid)

        response_objects.append(response.object)
        response.destroy()

    return response_objects
示例#5
0
def age_routes(v):
    routes = RAMCollection('routes')

    for route in routes.find():
        try:
            if route.object['weight'] > MAX_WEIGHT:
                route.destroy()
            else:
                route.object['weight'] = route.object['weight'] + v
                route.set()
        except:
            route.destroy()
示例#6
0
def process_route_advertisement(advertisement):
    peers = RAMCollection('peers')
    routes = RAMCollection('routes')

    ignored_peers = [cherrypy.config.get('agtuuid')]
    for peer in peers.find():
        try:
            ignored_peers.append(peer.object['agtuuid'])
        except:
            pass

    for route in advertisement['routes']:
        try:
            if route['agtuuid'] not in ignored_peers:
                create_route(route['agtuuid'], advertisement['agtuuid'],
                             route['weight'] + 1)
        except:
            pass

    prune()
示例#7
0
def prune():
    requests = RAMCollection('cascade requests')
    responses = RAMCollection('cascade responses')

    cscuuids = []

    for objuuid in requests.list_objuuids():
        request = requests.get_object(objuuid)

        try:
            if time() - request.object['timestamp'] > ASYNC_CASCADE_TIMEOUT:
                request.destroy()
            else:
                cscuuids.append(request.object['cscuuid'])
        except:
            request.destroy()

    for objuuid in responses.list_objuuids():
        response = responses.get_object(objuuid)

        try:
            if response.object['cscuuid'] not in cscuuids:
                response.destroy()
        except:
            response.destroy()
示例#8
0
def create_route_advertisement():
    prune()

    routes = RAMCollection('routes')
    peers = RAMCollection('peers')

    advertisement = {}
    advertisement['type'] = 'route advertisement'
    advertisement['agtuuid'] = cherrypy.config.get('agtuuid')
    advertisement['routes'] = []

    for route in routes.find():
        try:
            if 'agtuuid' not in route.object:
                raise Exception('Invalid Route')

            if 'weight' not in route.object:
                raise Exception('Invalid Route')

            temp = {}
            temp['agtuuid'] = route.object['agtuuid']
            temp['weight'] = route.object['weight']
            temp['gtwuuid'] = cherrypy.config.get('agtuuid')

            advertisement['routes'].append(temp)
        except:
            route.destroy()

    for peer in peers.find():
        try:
            temp = {}
            temp['agtuuid'] = peer.object['agtuuid']
            temp['weight'] = 0
            temp['gtwuuid'] = cherrypy.config.get('agtuuid')

            advertisement['routes'].append(temp)
        except:
            peer.destroy()

    return advertisement
示例#9
0
def pull_messages(agtuuid):
    agtuuids = []
    agtuuids.append(agtuuid)

    routes = RAMCollection('routes')

    routes_dict = {}

    for rteuuid in routes.list_objuuids():
        route = routes.get_object(rteuuid)

        try:
            if route.object['agtuuid'] in routes_dict:
                if float(routes_dict[route.object['agtuuid']]['weight']) > \
                   float(route.object['weight']):
                    routes_dict[route.object['agtuuid']] = {
                        'weight': route.object['weight'],
                        'gtwuuid': route.object['gtwuuid']
                    }
            else:
                routes_dict[route.object['agtuuid']] = {
                    'weight': route.object['weight'],
                    'gtwuuid': route.object['gtwuuid']
                }
        except:
            route.destroy()

    for k, v in routes_dict.items():
        try:
            if v['gtwuuid'] == agtuuid:
                agtuuids.append(k)
        except:
            pass

    messages = []
    for agtuuid in agtuuids:
        messages += pop_messages(dest=agtuuid)

    return messages
示例#10
0
def push_message(message):
    ctr_increment('messages pushed')
    ctr_increment('messages queued')
    message_lock.acquire()

    if 'timestamp' not in message:
        message['timestamp'] = time()

    messages = Collection('messages')
    new_message = messages.get_object()
    new_message.object = message
    new_message.set()

    message_lock.release()
示例#11
0
def pop_messages(**kargs):
    message_lock.acquire()

    message_list = []
    messages = Collection('messages')

    for message in messages.find(**kargs):
        message_list.append(message.object)
        message.destroy()
        ctr_increment('messages popped')
        ctr_decrement('messages queued')

    message_lock.release()

    return message_list
示例#12
0
def worker():
    register_timer(name='message_worker', target=worker, timeout=60).start()

    message_lock.acquire()

    messages = Collection('messages')

    for message in messages.find():
        try:
            if time() - message.object['timestamp'] > MESSAGE_TIMEOUT:
                message.destroy()

                ctr_increment('messages expired')
                ctr_decrement('messages queued')
        except:
            message.destroy()

    message_lock.release()
示例#13
0
def prune():
    routes = RAMCollection('routes')
    peers = RAMCollection('peers')

    peer_agtuuids = []

    for peer in peers.find():
        try:
            if 'destroy time' in peer.object:
                if peer.object['destroy time'] < time():
                    peer.destroy()
                else:
                    peer_agtuuids.append(peer.object['agtuuid'])
            else:
                peer_agtuuids.append(peer.object['agtuuid'])
        except:
            peer.destroy()

    peers = SQLCollection('peers')

    for peer in peers.find():
        try:
            if 'destroy time' in peer.object:
                if peer.object['destroy time'] < time():
                    peer.destroy()
                else:
                    peer_agtuuids.append(peer.object['agtuuid'])
            else:
                peer_agtuuids.append(peer.object['agtuuid'])
        except:
            peer.destroy()

    for route in routes.find():
        try:
            if (len(peers.find(agtuuid=route.object['agtuuid'])) > 0 or
                    route.object['agtuuid'] == cherrypy.config.get('agtuuid')
                    or route.object['gtwuuid'] not in peer_agtuuids):
                route.destroy()
        except:
            route.destroy()
示例#14
0
def service_cascade_request(message):
    ctr_increment('cascades serviced')

    cascade_response = RAMCollection('cascade responses').get_object()
    cascade_response.object = message
    cascade_response.set()
示例#15
0
        try:
            if time() - request.object['timestamp'] > ASYNC_CASCADE_TIMEOUT:
                request.destroy()
            else:
                cscuuids.append(request.object['cscuuid'])
        except:
            request.destroy()

    for objuuid in responses.list_objuuids():
        response = responses.get_object(objuuid)

        try:
            if response.object['cscuuid'] not in cscuuids:
                response.destroy()
        except:
            response.destroy()


def worker():
    register_timer(name='cascade_worker', target=worker, timeout=60).start()

    prune()


collection = RAMCollection('cascade requests')
collection.create_attribute('cscuuid', "['cscuuid']")

collection = RAMCollection('cascade responses')
collection.create_attribute('cscuuid', "['cscuuid']")

Thread(target=worker).start()
示例#16
0
    message_lock.release()

    return message_list


def worker():
    register_timer(name='message_worker', target=worker, timeout=60).start()

    message_lock.acquire()

    messages = Collection('messages')

    for message in messages.find():
        try:
            if time() - message.object['timestamp'] > MESSAGE_TIMEOUT:
                message.destroy()

                ctr_increment('messages expired')
                ctr_decrement('messages queued')
        except:
            message.destroy()

    message_lock.release()


collection = Collection('messages')
collection.create_attribute('dest', "['dest']")
collection.create_attribute('type', "['type']")

Thread(target=worker).start()
示例#17
0
def get_routes():
    route_list = []
    routes = RAMCollection('routes')
    for route in routes.find():
        route_list.append(route.object)
    return route_list
示例#18
0
def get_peers():
    peer_list = []
    peers = RAMCollection('peers')
    for peer in peers.find():
        peer_list.append(peer.object)
    return peer_list