vrfs.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from django.db import models
  2. from django.urls import reverse
  3. from django.utils.translation import gettext as _
  4. from ipam.constants import *
  5. from netbox.models import PrimaryModel
  6. __all__ = (
  7. 'RouteTarget',
  8. 'VRF',
  9. )
  10. class VRF(PrimaryModel):
  11. """
  12. A virtual routing and forwarding (VRF) table represents a discrete layer three forwarding domain (e.g. a routing
  13. table). Prefixes and IPAddresses can optionally be assigned to VRFs. (Prefixes and IPAddresses not assigned to a VRF
  14. are said to exist in the "global" table.)
  15. """
  16. name = models.CharField(
  17. max_length=100
  18. )
  19. rd = models.CharField(
  20. max_length=VRF_RD_MAX_LENGTH,
  21. unique=True,
  22. blank=True,
  23. null=True,
  24. verbose_name='Route distinguisher',
  25. help_text=_('Unique route distinguisher (as defined in RFC 4364)')
  26. )
  27. tenant = models.ForeignKey(
  28. to='tenancy.Tenant',
  29. on_delete=models.PROTECT,
  30. related_name='vrfs',
  31. blank=True,
  32. null=True
  33. )
  34. enforce_unique = models.BooleanField(
  35. default=True,
  36. verbose_name='Enforce unique space',
  37. help_text=_('Prevent duplicate prefixes/IP addresses within this VRF')
  38. )
  39. import_targets = models.ManyToManyField(
  40. to='ipam.RouteTarget',
  41. related_name='importing_vrfs',
  42. blank=True
  43. )
  44. export_targets = models.ManyToManyField(
  45. to='ipam.RouteTarget',
  46. related_name='exporting_vrfs',
  47. blank=True
  48. )
  49. clone_fields = (
  50. 'tenant', 'enforce_unique', 'description',
  51. )
  52. class Meta:
  53. ordering = ('name', 'rd', 'pk') # (name, rd) may be non-unique
  54. verbose_name = 'VRF'
  55. verbose_name_plural = 'VRFs'
  56. def __str__(self):
  57. if self.rd:
  58. return f'{self.name} ({self.rd})'
  59. return self.name
  60. def get_absolute_url(self):
  61. return reverse('ipam:vrf', args=[self.pk])
  62. class RouteTarget(PrimaryModel):
  63. """
  64. A BGP extended community used to control the redistribution of routes among VRFs, as defined in RFC 4364.
  65. """
  66. name = models.CharField(
  67. max_length=VRF_RD_MAX_LENGTH, # Same format options as VRF RD (RFC 4360 section 4)
  68. unique=True,
  69. help_text=_('Route target value (formatted in accordance with RFC 4360)')
  70. )
  71. tenant = models.ForeignKey(
  72. to='tenancy.Tenant',
  73. on_delete=models.PROTECT,
  74. related_name='route_targets',
  75. blank=True,
  76. null=True
  77. )
  78. class Meta:
  79. ordering = ['name']
  80. def __str__(self):
  81. return self.name
  82. def get_absolute_url(self):
  83. return reverse('ipam:routetarget', args=[self.pk])