def get_available_peers(self): # Not linked to PeeringDB, cannot determine peers if not self.peeringdb_id: return None # Get the IX LAN we are belonging to api = PeeringDB() network_ixlan = api.get_ix_network(self.peeringdb_id) # Get all peering sessions currently existing existing_sessions = self.get_peering_sessions() ipv4_sessions = [] ipv6_sessions = [] for session in existing_sessions: ip = ipaddress.ip_address(session.ip_address) if ip.version == 6: ipv6_sessions.append(str(ip)) elif ip.version == 4: ipv4_sessions.append(str(ip)) else: self.logger.debug('peering session with strange ip: %s', ip) # Find all peers belonging to the same IX and order them by ASN # Exclude our own ASN and already existing sessions return PeerRecord.objects.all().filter( Q(network_ixlan__ix_id=network_ixlan.ixlan_id) & ~Q(network__asn=settings.MY_ASN) & (~Q(network_ixlan__ipaddr6__in=ipv6_sessions) | ~Q(network_ixlan__ipaddr4__in=ipv4_sessions))).order_by( 'network__asn')
def get_available_peers(self): peers = [] # Not linked to PeeringDB, cannot determine peers if not self.peeringdb_id: return peers # Get the LAN that we are attached to and retrieve the peers api = PeeringDB() lan = api.get_ix_network(self.peeringdb_id) peeringdb_peers = api.get_peers_for_ix(lan.ix_id) known_peerings = [] # Grab all addresses we are connected to for session in self.peeringsession_set.all(): known_peerings.append(ipaddress.ip_address(session.ip_address)) # Check if peers addresses are in the list of addresses we are already # connected to. for peeringdb_peer in peeringdb_peers: peeringdb_peer['has_ipv6'] = True if peeringdb_peer[ 'network_ixlan'].ipaddr6 else None peeringdb_peer['has_ipv4'] = True if peeringdb_peer[ 'network_ixlan'].ipaddr4 else None peeringdb_peer['peering6'] = peeringdb_peer[ 'has_ipv6'] and ipaddress.ip_address( peeringdb_peer['network_ixlan'].ipaddr6) in known_peerings peeringdb_peer['peering4'] = peeringdb_peer[ 'has_ipv4'] and ipaddress.ip_address( peeringdb_peer['network_ixlan'].ipaddr4) in known_peerings peeringdb_peer['internet_exchange'] = self peers.append(peeringdb_peer) return peers