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
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