""" peeringdb model / field validators """ import ipaddress from django.conf import settings from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from peeringdb_server.inet import network_is_pdb_valid import peeringdb_server.models def validate_prefix(prefix): """ validate ip prefix Arguments: - prefix: ipaddress.IPv4Network or an ipaddress.IPv6Network Raises: - ValidationError on failed validation Returns: - ipaddress.ip_network instance """ if isinstance(prefix, unicode): try: prefix = ipaddress.ip_network(prefix) except ValueError as exc: raise ValidationError(_("Invalid prefix: {}").format(prefix)) return prefix def validate_address_space(prefix): """ validate an ip prefix according to peeringdb specs Arguments: - prefix: ipaddress.IPv4Network or an ipaddress.IPv6Network Raises: - ValidationError on failed validation """ prefix = validate_prefix(prefix) if not network_is_pdb_valid(prefix): raise ValidationError(_("Address space invalid: {}").format(prefix)) prefixlen_min = getattr( settings, "DATA_QUALITY_MIN_PREFIXLEN_V{}".format(prefix.version) ) prefixlen_max = getattr( settings, "DATA_QUALITY_MAX_PREFIXLEN_V{}".format(prefix.version) ) if prefix.prefixlen < prefixlen_min: raise ValidationError( _("Maximum allowed prefix length is {}").format(prefixlen_min) ) elif prefix.prefixlen > prefixlen_max: raise ValidationError( _("Minimum allowed prefix length is {}").format(prefixlen_max) ) def validate_info_prefixes4(value): if value > settings.DATA_QUALITY_MAX_PREFIX_V4_LIMIT: raise ValidationError( _("Maximum value allowed {}").format( settings.DATA_QUALITY_MAX_PREFIX_V4_LIMIT ) ) if value < 0: raise ValidationError(_("Negative value not allowed")) def validate_info_prefixes6(value): if value > settings.DATA_QUALITY_MAX_PREFIX_V6_LIMIT: raise ValidationError( _("Maximum value allowed {}").format( settings.DATA_QUALITY_MAX_PREFIX_V6_LIMIT ) ) if value < 0: raise ValidationError(_("Negative value not allowed")) def validate_prefix_overlap(prefix): """ validate that a prefix does not overlap with another prefix on an already existing ixlan Arguments: - prefix: ipaddress.IPv4Network or an ipaddress.IPv6Network Raises: - ValidationError on failed validation """ prefix = validate_prefix(prefix) qs = peeringdb_server.models.IXLanPrefix.objects.filter( protocol="IPv{}".format(prefix.version), status="ok" ) qs = qs.exclude(prefix=prefix) for ixpfx in qs: if ixpfx.prefix.overlaps(prefix): raise ValidationError( _( "Prefix overlaps with {}'s prefix: {}".format( ixpfx.ixlan.ix.name, ixpfx.prefix ) ) )