|
@@ -89,6 +89,8 @@ class VRF(CreatedUpdatedModel, CustomFieldModel):
|
|
|
description = models.CharField(max_length=100, blank=True)
|
|
description = models.CharField(max_length=100, blank=True)
|
|
|
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
|
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
|
|
|
|
|
|
|
|
|
+ csv_headers = ['name', 'rd', 'tenant', 'enforce_unique', 'description']
|
|
|
|
|
+
|
|
|
class Meta:
|
|
class Meta:
|
|
|
ordering = ['name']
|
|
ordering = ['name']
|
|
|
verbose_name = 'VRF'
|
|
verbose_name = 'VRF'
|
|
@@ -146,6 +148,8 @@ class Aggregate(CreatedUpdatedModel, CustomFieldModel):
|
|
|
description = models.CharField(max_length=100, blank=True)
|
|
description = models.CharField(max_length=100, blank=True)
|
|
|
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
|
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
|
|
|
|
|
|
|
|
|
+ csv_headers = ['prefix', 'rir', 'date_added', 'description']
|
|
|
|
|
+
|
|
|
class Meta:
|
|
class Meta:
|
|
|
ordering = ['family', 'prefix']
|
|
ordering = ['family', 'prefix']
|
|
|
|
|
|
|
@@ -200,7 +204,7 @@ class Aggregate(CreatedUpdatedModel, CustomFieldModel):
|
|
|
|
|
|
|
|
def get_utilization(self):
|
|
def get_utilization(self):
|
|
|
"""
|
|
"""
|
|
|
- Determine the utilization rate of the aggregate prefix and return it as a percentage.
|
|
|
|
|
|
|
+ Determine the prefix utilization of the aggregate and return it as a percentage.
|
|
|
"""
|
|
"""
|
|
|
child_prefixes = Prefix.objects.filter(prefix__net_contained_or_equal=str(self.prefix))
|
|
child_prefixes = Prefix.objects.filter(prefix__net_contained_or_equal=str(self.prefix))
|
|
|
# Remove overlapping prefixes from list of children
|
|
# Remove overlapping prefixes from list of children
|
|
@@ -297,6 +301,10 @@ class Prefix(CreatedUpdatedModel, CustomFieldModel):
|
|
|
|
|
|
|
|
objects = PrefixQuerySet.as_manager()
|
|
objects = PrefixQuerySet.as_manager()
|
|
|
|
|
|
|
|
|
|
+ csv_headers = [
|
|
|
|
|
+ 'prefix', 'vrf', 'tenant', 'site', 'vlan_group', 'vlan_vid', 'status', 'role', 'is_pool', 'description',
|
|
|
|
|
+ ]
|
|
|
|
|
+
|
|
|
class Meta:
|
|
class Meta:
|
|
|
ordering = ['vrf', 'family', 'prefix']
|
|
ordering = ['vrf', 'family', 'prefix']
|
|
|
verbose_name_plural = 'prefixes'
|
|
verbose_name_plural = 'prefixes'
|
|
@@ -307,9 +315,6 @@ class Prefix(CreatedUpdatedModel, CustomFieldModel):
|
|
|
def get_absolute_url(self):
|
|
def get_absolute_url(self):
|
|
|
return reverse('ipam:prefix', args=[self.pk])
|
|
return reverse('ipam:prefix', args=[self.pk])
|
|
|
|
|
|
|
|
- def get_duplicates(self):
|
|
|
|
|
- return Prefix.objects.filter(vrf=self.vrf, prefix=str(self.prefix)).exclude(pk=self.pk)
|
|
|
|
|
-
|
|
|
|
|
def clean(self):
|
|
def clean(self):
|
|
|
|
|
|
|
|
if self.prefix:
|
|
if self.prefix:
|
|
@@ -357,6 +362,22 @@ class Prefix(CreatedUpdatedModel, CustomFieldModel):
|
|
|
self.description,
|
|
self.description,
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
|
|
+ def get_status_class(self):
|
|
|
|
|
+ return STATUS_CHOICE_CLASSES[self.status]
|
|
|
|
|
+
|
|
|
|
|
+ def get_duplicates(self):
|
|
|
|
|
+ return Prefix.objects.filter(vrf=self.vrf, prefix=str(self.prefix)).exclude(pk=self.pk)
|
|
|
|
|
+
|
|
|
|
|
+ def get_utilization(self):
|
|
|
|
|
+ """
|
|
|
|
|
+ Determine the utilization of the prefix and return it as a percentage.
|
|
|
|
|
+ """
|
|
|
|
|
+ child_count = IPAddress.objects.filter(address__net_contained_or_equal=str(self.prefix), vrf=self.vrf).count()
|
|
|
|
|
+ prefix_size = self.prefix.size
|
|
|
|
|
+ if self.family == 4 and self.prefix.prefixlen < 31 and not self.is_pool:
|
|
|
|
|
+ prefix_size -= 2
|
|
|
|
|
+ return int(float(child_count) / prefix_size * 100)
|
|
|
|
|
+
|
|
|
@property
|
|
@property
|
|
|
def new_subnet(self):
|
|
def new_subnet(self):
|
|
|
if self.family == 4:
|
|
if self.family == 4:
|
|
@@ -368,9 +389,6 @@ class Prefix(CreatedUpdatedModel, CustomFieldModel):
|
|
|
return IPNetwork('{}/{}'.format(self.prefix.network, self.prefix.prefixlen + 1))
|
|
return IPNetwork('{}/{}'.format(self.prefix.network, self.prefix.prefixlen + 1))
|
|
|
return None
|
|
return None
|
|
|
|
|
|
|
|
- def get_status_class(self):
|
|
|
|
|
- return STATUS_CHOICE_CLASSES[self.status]
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
class IPAddressManager(models.Manager):
|
|
class IPAddressManager(models.Manager):
|
|
|
|
|
|
|
@@ -414,6 +432,8 @@ class IPAddress(CreatedUpdatedModel, CustomFieldModel):
|
|
|
|
|
|
|
|
objects = IPAddressManager()
|
|
objects = IPAddressManager()
|
|
|
|
|
|
|
|
|
|
+ csv_headers = ['address', 'vrf', 'tenant', 'status', 'device', 'interface_name', 'is_primary', 'description']
|
|
|
|
|
+
|
|
|
class Meta:
|
|
class Meta:
|
|
|
ordering = ['family', 'address']
|
|
ordering = ['family', 'address']
|
|
|
verbose_name = 'IP address'
|
|
verbose_name = 'IP address'
|
|
@@ -452,11 +472,12 @@ class IPAddress(CreatedUpdatedModel, CustomFieldModel):
|
|
|
def to_csv(self):
|
|
def to_csv(self):
|
|
|
|
|
|
|
|
# Determine if this IP is primary for a Device
|
|
# Determine if this IP is primary for a Device
|
|
|
- is_primary = False
|
|
|
|
|
if self.family == 4 and getattr(self, 'primary_ip4_for', False):
|
|
if self.family == 4 and getattr(self, 'primary_ip4_for', False):
|
|
|
is_primary = True
|
|
is_primary = True
|
|
|
elif self.family == 6 and getattr(self, 'primary_ip6_for', False):
|
|
elif self.family == 6 and getattr(self, 'primary_ip6_for', False):
|
|
|
is_primary = True
|
|
is_primary = True
|
|
|
|
|
+ else:
|
|
|
|
|
+ is_primary = False
|
|
|
|
|
|
|
|
return csv_format([
|
|
return csv_format([
|
|
|
self.address,
|
|
self.address,
|
|
@@ -527,6 +548,8 @@ class VLAN(CreatedUpdatedModel, CustomFieldModel):
|
|
|
description = models.CharField(max_length=100, blank=True)
|
|
description = models.CharField(max_length=100, blank=True)
|
|
|
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
|
custom_field_values = GenericRelation(CustomFieldValue, content_type_field='obj_type', object_id_field='obj_id')
|
|
|
|
|
|
|
|
|
|
+ csv_headers = ['site', 'group_name', 'vid', 'name', 'tenant', 'status', 'role', 'description']
|
|
|
|
|
+
|
|
|
class Meta:
|
|
class Meta:
|
|
|
ordering = ['site', 'group', 'vid']
|
|
ordering = ['site', 'group', 'vid']
|
|
|
unique_together = [
|
|
unique_together = [
|