Ejemplo n.º 1
0
def get_layer2_traffic(location_or_room_id=None):
    """Fetches traffic data for layer 2"""
    start = datetime.now()

    # TODO: Handle missing?
    if location_or_room_id is None or not location_or_room_id:
        interfaces = Interface.objects.filter(
            to_netbox__isnull=False).select_related('netbox', 'to_netbox',
                                                    'to_interface__netbox')
    else:
        room = Room.objects.filter(id=location_or_room_id)
        if room.exists():
            location = Room.objects.get(id=location_or_room_id)
        else:
            location = Location.objects.get(id=location_or_room_id)
            # Sanity check: Does the room exist?
            # Fetch interfaces for devices in that room
        interfaces = Interface.objects.filter(
            to_netbox__isnull=False,
            netbox__room__location=location).select_related(
                'netbox', 'to_netbox', 'to_interface__netbox')

    edges = set([(interface.netbox_id, interface.to_netbox_id)
                 for interface in interfaces])

    traffic = []
    traffic_cache = get_traffic_for(get_traffic_interfaces(edges, interfaces))

    for source, target in edges:
        edge_interfaces = interfaces.filter(netbox_id=source,
                                            to_netbox_id=target)
        edge_traffic = []
        for interface in edge_interfaces:
            to_interface = interface.to_interface
            data = get_traffic_data((interface, to_interface),
                                    traffic_cache).to_json()
            data.update({
                'source_ifname':
                interface.ifname if interface else '',
                'target_ifname':
                to_interface.ifname if to_interface else ''
            })
            edge_traffic.append(data)
        traffic.append({
            'source': source,
            'target': target,
            'edges': edge_traffic,
        })

    _logger.debug('Time used: %s', datetime.now() - start)
    return traffic
Ejemplo n.º 2
0
Archivo: graph.py Proyecto: Uninett/nav
def get_layer2_traffic(location_or_room_id=None):
    """Fetches traffic data for layer 2"""
    start = datetime.now()

    # TODO: Handle missing?
    if location_or_room_id is None or not location_or_room_id:
        interfaces = Interface.objects.filter(
            to_netbox__isnull=False).select_related('netbox', 'to_netbox',
                                                    'to_interface__netbox')
    else:
        interfaces = Interface.objects.filter(
            to_netbox__isnull=False, ).select_related('netbox', 'to_netbox',
                                                      'to_interface__netbox')

        try:
            room = Room.objects.get(id=location_or_room_id)
        except Room.DoesNotExist:
            location = Location.objects.get(id=location_or_room_id)
            interfaces = interfaces.filter(netbox__room__location=location)
        else:
            interfaces = interfaces.filter(netbox__room=room)

    edges = defaultdict(set)
    for interface in interfaces:
        edges[(interface.netbox_id, interface.to_netbox_id)].add(interface)

    _logger.debug(
        "Produced %d edges from %d interfaces in %s",
        len(edges),
        len(interfaces),
        datetime.now() - start,
    )

    complete_interface_set = set(interfaces) | set(
        ifc.to_interface for ifc in interfaces if ifc.to_interface)
    traffic_cache = get_traffic_for(complete_interface_set)
    _logger.debug('Traffic cache built. Time used so far: %s',
                  datetime.now() - start)

    traffic = []
    for (source, target), edge_interfaces in edges.items():
        edge_traffic = []
        for interface in edge_interfaces:
            to_interface = interface.to_interface
            data = get_traffic_data((interface, to_interface),
                                    traffic_cache).to_json()
            data.update({
                'source_ifname':
                interface.ifname if interface else '',
                'target_ifname':
                to_interface.ifname if to_interface else '',
            })
            edge_traffic.append(data)
        traffic.append({
            'source': source,
            'target': target,
            'edges': edge_traffic,
        })

    _logger.debug('Total time used: %s', datetime.now() - start)
    return traffic