| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  | from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation | 
					
						
							| 
									
										
										
										
											2021-11-02 13:15:23 -04:00
										 |  |  | from django.core.validators import MaxValueValidator, MinValueValidator | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  | from django.db import models | 
					
						
							|  |  |  | from django.urls import reverse | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  | from django.utils.translation import gettext_lazy as _ | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | from ipam.choices import * | 
					
						
							| 
									
										
										
										
											2021-11-02 13:15:23 -04:00
										 |  |  | from ipam.constants import * | 
					
						
							| 
									
										
										
										
											2023-11-16 12:12:51 -05:00
										 |  |  | from netbox.models import ChangeLoggedModel, PrimaryModel | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | __all__ = ( | 
					
						
							|  |  |  |     'FHRPGroup', | 
					
						
							|  |  |  |     'FHRPGroupAssignment', | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-11-04 08:28:09 -04:00
										 |  |  | class FHRPGroup(PrimaryModel): | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     """
 | 
					
						
							|  |  |  |     A grouping of next hope resolution protocol (FHRP) peers. (For instance, VRRP or HSRP.) | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     group_id = models.PositiveSmallIntegerField( | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  |         verbose_name=_('group ID') | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-09-20 16:03:55 -07:00
										 |  |  |     name = models.CharField( | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  |         verbose_name=_('name'), | 
					
						
							| 
									
										
										
										
											2022-09-20 16:03:55 -07:00
										 |  |  |         max_length=100, | 
					
						
							|  |  |  |         blank=True | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     protocol = models.CharField( | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  |         verbose_name=_('protocol'), | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |         max_length=50, | 
					
						
							|  |  |  |         choices=FHRPGroupProtocolChoices | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     auth_type = models.CharField( | 
					
						
							|  |  |  |         max_length=50, | 
					
						
							|  |  |  |         choices=FHRPGroupAuthTypeChoices, | 
					
						
							|  |  |  |         blank=True, | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  |         verbose_name=_('authentication type') | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  |     auth_key = models.CharField( | 
					
						
							|  |  |  |         max_length=255, | 
					
						
							|  |  |  |         blank=True, | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  |         verbose_name=_('authentication key') | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  |     ip_addresses = GenericRelation( | 
					
						
							|  |  |  |         to='ipam.IPAddress', | 
					
						
							|  |  |  |         content_type_field='assigned_object_type', | 
					
						
							|  |  |  |         object_id_field='assigned_object_id', | 
					
						
							| 
									
										
										
										
											2021-11-11 14:05:35 -05:00
										 |  |  |         related_query_name='fhrpgroup' | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-11 09:58:37 -04:00
										 |  |  |     clone_fields = ('protocol', 'auth_type', 'auth_key', 'description') | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     class Meta: | 
					
						
							|  |  |  |         ordering = ['protocol', 'group_id', 'pk'] | 
					
						
							| 
									
										
										
										
											2023-08-03 10:41:10 -04:00
										 |  |  |         verbose_name = _('FHRP group') | 
					
						
							|  |  |  |         verbose_name_plural = _('FHRP groups') | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2022-09-26 13:57:09 -07:00
										 |  |  |         name = '' | 
					
						
							|  |  |  |         if self.name: | 
					
						
							|  |  |  |             name = f'{self.name} ' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         name += f'{self.get_protocol_display()}: {self.group_id}' | 
					
						
							| 
									
										
										
										
											2021-11-19 11:34:59 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-18 14:19:57 -05:00
										 |  |  |         # Append the first assigned IP addresses (if any) to serve as an additional identifier | 
					
						
							| 
									
										
										
										
											2021-11-19 11:34:59 -05:00
										 |  |  |         if self.pk: | 
					
						
							| 
									
										
										
										
											2021-12-18 14:19:57 -05:00
										 |  |  |             ip_address = self.ip_addresses.first() | 
					
						
							|  |  |  |             if ip_address: | 
					
						
							|  |  |  |                 return f"{name} ({ip_address})" | 
					
						
							| 
									
										
										
										
											2021-11-19 11:34:59 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return name | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_absolute_url(self): | 
					
						
							|  |  |  |         return reverse('ipam:fhrpgroup', args=[self.pk]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-11 16:16:06 -05:00
										 |  |  | class FHRPGroupAssignment(ChangeLoggedModel): | 
					
						
							| 
									
										
										
										
											2021-11-02 15:10:02 -04:00
										 |  |  |     interface_type = models.ForeignKey( | 
					
						
							| 
									
										
										
										
											2023-11-16 12:12:51 -05:00
										 |  |  |         to='contenttypes.ContentType', | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |         on_delete=models.CASCADE | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-01-24 16:02:54 -05:00
										 |  |  |     interface_id = models.PositiveBigIntegerField() | 
					
						
							| 
									
										
										
										
											2021-11-02 15:10:02 -04:00
										 |  |  |     interface = GenericForeignKey( | 
					
						
							|  |  |  |         ct_field='interface_type', | 
					
						
							|  |  |  |         fk_field='interface_id' | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  |     group = models.ForeignKey( | 
					
						
							|  |  |  |         to='ipam.FHRPGroup', | 
					
						
							|  |  |  |         on_delete=models.CASCADE | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     priority = models.PositiveSmallIntegerField( | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  |         verbose_name=_('priority'), | 
					
						
							| 
									
										
										
										
											2021-11-02 13:15:23 -04:00
										 |  |  |         validators=( | 
					
						
							|  |  |  |             MinValueValidator(FHRPGROUPASSIGNMENT_PRIORITY_MIN), | 
					
						
							|  |  |  |             MaxValueValidator(FHRPGROUPASSIGNMENT_PRIORITY_MAX) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-09 17:08:28 -05:00
										 |  |  |     clone_fields = ('interface_type', 'interface_id') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-01 16:14:44 -04:00
										 |  |  |     class Meta: | 
					
						
							| 
									
										
										
										
											2021-11-04 11:17:10 -04:00
										 |  |  |         ordering = ('-priority', 'pk') | 
					
						
							| 
									
										
										
										
											2023-12-07 14:02:51 -05:00
										 |  |  |         indexes = ( | 
					
						
							|  |  |  |             models.Index(fields=('interface_type', 'interface_id')), | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2022-09-27 15:35:24 -04:00
										 |  |  |         constraints = ( | 
					
						
							|  |  |  |             models.UniqueConstraint( | 
					
						
							|  |  |  |                 fields=('interface_type', 'interface_id', 'group'), | 
					
						
							|  |  |  |                 name='%(app_label)s_%(class)s_unique_interface_group' | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-07-31 22:28:07 +07:00
										 |  |  |         verbose_name = _('FHRP group assignment') | 
					
						
							| 
									
										
										
										
											2023-08-03 10:41:10 -04:00
										 |  |  |         verbose_name_plural = _('FHRP group assignments') | 
					
						
							| 
									
										
										
										
											2021-11-02 14:08:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __str__(self): | 
					
						
							| 
									
										
										
										
											2021-11-02 15:10:02 -04:00
										 |  |  |         return f'{self.interface}: {self.group} ({self.priority})' | 
					
						
							| 
									
										
										
										
											2021-11-19 10:42:13 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_absolute_url(self): | 
					
						
							|  |  |  |         # Used primarily for redirection after creating a new assignment | 
					
						
							|  |  |  |         if self.interface: | 
					
						
							|  |  |  |             return self.interface.get_absolute_url() | 
					
						
							|  |  |  |         return None |