Exemple #1
0
 def create_vpn(self, vpn):
     """
     Create new vpn
     :param vpn: DiscoveredVPN instance
     :return:
     """
     if not self.has_vpn_permission(vpn):
         self.logger.debug(
             "Do not creating rd=%s vpn_id=%s name=%s Disabled by policy",
             vpn.rd, vpn.vpn_id, vpn.name)
         metrics["vpn_creation_denied"] += 1
         return
     name = self.get_vpn_name(vpn)
     # Check for naming clash
     if VRF.objects.filter(name=name).exists():
         # Naming clash
         old_name = name
         name = self.get_unique_vpn_name(vpn)
         self.logger.info(
             "Name '%s' is already exists with other vpn_id. Rename to '%s'",
             old_name, name)
         metrics["vpn_name_clash"] += 1
     #
     p = VRF(name=name,
             rd=vpn.rd,
             vpn_id=vpn.vpn_id,
             profile=vpn.profile,
             source=vpn.source)
     self.logger.info("Creating vpn %s: name=%s rd=%s profile=%s source=%s",
                      p.vpn_id, p.name, p.rd, p.profile.name, p.source)
     p.save()
     p.fire_event("seen")
     metrics["vpn_created"] += 1
Exemple #2
0
    def get_or_create(self, object, name, rd):
        """
        :param object:
        :param name:
        :param rd:
        :return:
        """
        def set_cache(vrf):
            self.cache_vrf_by_rd[vrf.rd] = vrf
            self.cache_vrf_by_name[vrf.name] = vrf
            return vrf

        if name == "default":
            if object.vrf:
                # Use object's VRF is set
                return object.vrf
            # Get default VRF
            try:
                return self.cache_vrf_by_name["default"]
            except KeyError:
                return set_cache(VRF.get_global())
        # Non-default VRF
        if not rd:
            rd = VRF.generate_rd(name)
        # Lookup RD cache
        try:
            return self.cache_vrf_by_rd[rd]
        except KeyError:
            pass
        # Lookup database
        try:
            return set_cache(VRF.objects.get(rd=rd))
        except VRF.DoesNotExist:
            pass
        # VRF Not found, create
        # Generate unique VRF in case of names clash
        vrf_name = name
        if VRF.objects.filter(name=vrf_name).exists():
            # Name clash, generate new name by appending RD
            vrf_name += "_%s" % rd
            self.info(
                object,
                "Conflicting names for VRF %s. Using fallback name %s" %
                (name, vrf_name))
        # Create VRF
        vrf = VRF(name=vrf_name, rd=rd, vrf_group=VRF.get_global().vrf_group)
        vrf.save()
        return set_cache(vrf)