vrfs.py 3.0 KB

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