vrfs.py 2.7 KB

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