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