コード例 #1
0
ファイル: prefix.py プロジェクト: skripkar/noc
 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])
コード例 #2
0
 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()
コード例 #3
0
 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
コード例 #4
0
ファイル: prefix.py プロジェクト: skripkar/noc
 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