def sync_prefixes(self, prefixes): """ Apply prefixes to database :param prefixes: :return: """ # vpn_id -> [prefix, ] vrf_prefixes = defaultdict(list) for vpn_id, p in prefixes: vrf_prefixes[vpn_id] += [p] # build vpn_id -> VRF mapping self.logger.debug("Building VRF map") vrfs = {} for vpn_id in vrf_prefixes: vrf = VRF.get_by_vpn_id(vpn_id) if vrf: vrfs[vpn_id] = vrf missed_vpn_id = set(vrf_prefixes) - set(vrfs) if missed_vpn_id: self.logger.info("RD missed in VRF database and to be ignored: %s", ", ".join(missed_vpn_id)) # self.logger.debug("Getting prefixes to synchronize") for vpn_id in vrfs: vrf = vrfs[vpn_id] seen = set() for p in Prefix.objects.filter(vrf=vrf, prefix__in=vrf_prefixes[vpn_id]): norm_prefix = IP.expand(p.prefix) # Confirmed prefix, apply changes and touch prefix = prefixes[vpn_id, norm_prefix] self.apply_prefix_changes(p, prefix) seen.add(norm_prefix) for p in set(vrf_prefixes[vpn_id]) - seen: # New prefix, create self.create_prefix(prefixes[vpn_id, p])
def sync_addresses(self, addresses): """ Apply addresses to database :param addresses: :return: """ # vpn_id -> [address, ] vrf_addresses = defaultdict(list) for vpn_id, a in addresses: vrf_addresses[vpn_id] += [a] # build vpn_id -> VRF mapping self.logger.debug("Building VRF map") vrfs = {} for vpn_id in vrf_addresses: vrf = VRF.get_by_vpn_id(vpn_id) if vrf: vrfs[vpn_id] = vrf missed_vpn_id = set(vrf_addresses) - set(vrfs) if missed_vpn_id: self.logger.info( "VPN ID are missed in VRF database and to be ignored: %s", ", ".join(missed_vpn_id)) # self.logger.debug("Getting addresses to synchronize") for vpn_id in vrfs: vrf = vrfs[vpn_id] seen = set() for a in Address.objects.filter(vrf=vrf, address__in=vrf_addresses[vpn_id]): norm_address = IP.expand(a.address) # Confirmed address, apply changes and touch address = addresses[vpn_id, norm_address] self.apply_address_changes(a, address) seen.add(norm_address) for a in set(vrf_addresses[vpn_id]) - seen: # New address, create self.create_address(addresses[vpn_id, a]) # Detaching hanging addresses self.logger.debug("Checking for hanging addresses") for a in Address.objects.filter(managed_object=self.object): norm_address = IP.expand(a.address) address = addresses.get((a.vrf.vpn_id, norm_address)) if not address or address.source not in LOCAL_SRC: self.logger.info("Detaching %s:%s", a.vrf.name, a.address) a.managed_object = None a.save()
def apply_addresses(addresses, discovered_addresses): """ Apply list of discovered addresses to addresses dict :param addresses: dict of (vpn_id, address) => DiscoveredAddress :param discovered_addresses: List of [DiscoveredAddress] :returns: Resulted addresses """ for address in discovered_addresses: norm_address = IP.expand(address.address) old = addresses.get((address.vpn_id, norm_address)) if old: if AddressCheck.is_preferred(old.source, address.source): # New address is preferable, replace addresses[address.vpn_id, norm_address] = address else: # Not seen yet addresses[address.vpn_id, norm_address] = address return addresses
def apply_prefixes(prefixes, discovered_prefixes): """ Apply list of discovered prefixes to prefix dict :param prefixes: dict of (vpn_id, prefix) => DiscoveredAddress :param discovered_prefixes: List of [DiscoveredAddress] :returns: Resulted prefixes """ for prefix in discovered_prefixes: norm_prefix = IP.expand(prefix.prefix) old = prefixes.get((prefix.vpn_id, norm_prefix)) if old: if PrefixCheck.is_preferred(old.source, prefix.source): # New prefix is preferable, replace prefixes[prefix.vpn_id, norm_prefix] = prefix else: # Not seen yet prefixes[prefix.vpn_id, norm_prefix] = prefix return prefixes