1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00
Files
netbox-community-netbox/netbox/ipam/views.py

876 lines
27 KiB
Python
Raw Normal View History

from django.db.models import Prefetch
from django.db.models.expressions import RawSQL
from django.shortcuts import get_object_or_404, redirect, render
2016-03-01 11:23:03 -05:00
from dcim.models import Device, Interface
2020-11-11 16:07:38 -05:00
from netbox.views import generic
from utilities.tables import paginate_table
from utilities.utils import count_related
2020-06-24 09:52:22 -04:00
from virtualization.models import VirtualMachine, VMInterface
2021-04-29 16:38:56 -04:00
from . import filtersets, forms, tables
from .constants import *
2020-09-24 11:25:52 -04:00
from .models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Service, VLAN, VLANGroup, VRF
2020-06-26 11:56:30 -04:00
from .utils import add_available_ipaddresses, add_available_prefixes, add_available_vlans
2016-03-01 11:23:03 -05:00
#
# VRFs
#
2020-11-11 16:07:38 -05:00
class VRFListView(generic.ObjectListView):
queryset = VRF.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VRFFilterSet
filterset_form = forms.VRFFilterForm
2016-05-18 16:20:30 -04:00
table = tables.VRFTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFView(generic.ObjectView):
queryset = VRF.objects.all()
2016-03-01 11:23:03 -05:00
def get_extra_context(self, request, instance):
prefix_count = Prefix.objects.restrict(request.user, 'view').filter(vrf=instance).count()
ipaddress_count = IPAddress.objects.restrict(request.user, 'view').filter(vrf=instance).count()
import_targets_table = tables.RouteTargetTable(
instance.import_targets.prefetch_related('tenant'),
orderable=False
)
export_targets_table = tables.RouteTargetTable(
instance.export_targets.prefetch_related('tenant'),
orderable=False
)
return {
'prefix_count': prefix_count,
'ipaddress_count': ipaddress_count,
'import_targets_table': import_targets_table,
'export_targets_table': export_targets_table,
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFEditView(generic.ObjectEditView):
queryset = VRF.objects.all()
model_form = forms.VRFForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFDeleteView(generic.ObjectDeleteView):
queryset = VRF.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = VRF.objects.all()
model_form = forms.VRFCSVForm
2016-05-18 16:20:30 -04:00
table = tables.VRFTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFBulkEditView(generic.BulkEditView):
queryset = VRF.objects.prefetch_related('tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.VRFFilterSet
table = tables.VRFTable
2016-05-18 16:20:30 -04:00
form = forms.VRFBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VRFBulkDeleteView(generic.BulkDeleteView):
queryset = VRF.objects.prefetch_related('tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.VRFFilterSet
table = tables.VRFTable
2016-03-01 11:23:03 -05:00
2020-09-24 11:25:52 -04:00
#
# Route targets
#
2020-11-11 16:07:38 -05:00
class RouteTargetListView(generic.ObjectListView):
queryset = RouteTarget.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.RouteTargetFilterSet
2020-09-24 11:25:52 -04:00
filterset_form = forms.RouteTargetFilterForm
table = tables.RouteTargetTable
2020-11-11 16:07:38 -05:00
class RouteTargetView(generic.ObjectView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
def get_extra_context(self, request, instance):
importing_vrfs_table = tables.VRFTable(
instance.importing_vrfs.prefetch_related('tenant'),
orderable=False
)
exporting_vrfs_table = tables.VRFTable(
instance.exporting_vrfs.prefetch_related('tenant'),
orderable=False
)
return {
'importing_vrfs_table': importing_vrfs_table,
'exporting_vrfs_table': exporting_vrfs_table,
}
2020-09-24 11:25:52 -04:00
2020-11-11 16:07:38 -05:00
class RouteTargetEditView(generic.ObjectEditView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
model_form = forms.RouteTargetForm
2020-11-11 16:07:38 -05:00
class RouteTargetDeleteView(generic.ObjectDeleteView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
2020-11-11 16:07:38 -05:00
class RouteTargetBulkImportView(generic.BulkImportView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.all()
model_form = forms.RouteTargetCSVForm
table = tables.RouteTargetTable
2020-11-11 16:07:38 -05:00
class RouteTargetBulkEditView(generic.BulkEditView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.prefetch_related('tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.RouteTargetFilterSet
2020-09-24 11:25:52 -04:00
table = tables.RouteTargetTable
form = forms.RouteTargetBulkEditForm
2020-11-11 16:07:38 -05:00
class RouteTargetBulkDeleteView(generic.BulkDeleteView):
2020-09-24 11:25:52 -04:00
queryset = RouteTarget.objects.prefetch_related('tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.RouteTargetFilterSet
2020-09-24 11:25:52 -04:00
table = tables.RouteTargetTable
2016-05-16 13:04:45 -04:00
#
# RIRs
#
2020-11-11 16:07:38 -05:00
class RIRListView(generic.ObjectListView):
queryset = RIR.objects.annotate(
aggregate_count=count_related(Aggregate, 'rir')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.RIRFilterSet
filterset_form = forms.RIRFilterForm
table = tables.RIRTable
2016-05-16 13:04:45 -04:00
template_name = 'ipam/rir_list.html'
class RIRView(generic.ObjectView):
queryset = RIR.objects.all()
def get_extra_context(self, request, instance):
aggregates = Aggregate.objects.restrict(request.user, 'view').filter(
rir=instance
)
aggregates_table = tables.AggregateTable(aggregates)
aggregates_table.columns.hide('rir')
paginate_table(aggregates_table, request)
return {
'aggregates_table': aggregates_table,
}
2020-11-11 16:07:38 -05:00
class RIREditView(generic.ObjectEditView):
queryset = RIR.objects.all()
model_form = forms.RIRForm
2016-05-16 13:04:45 -04:00
2020-11-11 16:07:38 -05:00
class RIRDeleteView(generic.ObjectDeleteView):
queryset = RIR.objects.all()
2020-11-11 16:07:38 -05:00
class RIRBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = RIR.objects.all()
model_form = forms.RIRCSVForm
table = tables.RIRTable
class RIRBulkEditView(generic.BulkEditView):
queryset = RIR.objects.annotate(
aggregate_count=count_related(Aggregate, 'rir')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.RIRFilterSet
table = tables.RIRTable
form = forms.RIRBulkEditForm
2020-11-11 16:07:38 -05:00
class RIRBulkDeleteView(generic.BulkDeleteView):
queryset = RIR.objects.annotate(
aggregate_count=count_related(Aggregate, 'rir')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.RIRFilterSet
table = tables.RIRTable
2016-05-16 13:04:45 -04:00
2016-03-01 11:23:03 -05:00
#
# Aggregates
#
2020-11-11 16:07:38 -05:00
class AggregateListView(generic.ObjectListView):
queryset = Aggregate.objects.annotate(
child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.AggregateFilterSet
filterset_form = forms.AggregateFilterForm
table = tables.AggregateDetailTable
template_name = 'ipam/aggregate_list.html'
2016-03-01 11:23:03 -05:00
def extra_context(self):
ipv4_total = 0
ipv6_total = 0
for aggregate in self.queryset:
if aggregate.prefix.version == 6:
# Report equivalent /64s for IPv6 to keep things sane
ipv6_total += int(aggregate.prefix.size / 2 ** 64)
else:
ipv4_total += aggregate.prefix.size
return {
'ipv4_total': ipv4_total,
'ipv6_total': ipv6_total,
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateView(generic.ObjectView):
queryset = Aggregate.objects.all()
def get_extra_context(self, request, instance):
# Find all child prefixes contained by this aggregate
2020-06-01 11:43:49 -04:00
child_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
prefix__net_contained_or_equal=str(instance.prefix)
).prefetch_related(
'site', 'role'
).order_by(
'prefix'
2021-05-24 16:51:05 -04:00
)
# Add available prefixes to the table if requested
2020-01-07 17:58:30 +00:00
if request.GET.get('show_available', 'true') == 'true':
child_prefixes = add_available_prefixes(instance.prefix, child_prefixes)
2016-03-01 11:23:03 -05:00
prefix_table = tables.PrefixDetailTable(child_prefixes)
if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
prefix_table.columns.show('pk')
paginate_table(prefix_table, request)
2016-03-01 11:23:03 -05:00
# Compile permissions list for rendering the object table
permissions = {
'add': request.user.has_perm('ipam.add_prefix'),
'change': request.user.has_perm('ipam.change_prefix'),
'delete': request.user.has_perm('ipam.delete_prefix'),
}
return {
'prefix_table': prefix_table,
'permissions': permissions,
2020-01-07 17:58:30 +00:00
'show_available': request.GET.get('show_available', 'true') == 'true',
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateEditView(generic.ObjectEditView):
queryset = Aggregate.objects.all()
model_form = forms.AggregateForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateDeleteView(generic.ObjectDeleteView):
queryset = Aggregate.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = Aggregate.objects.all()
model_form = forms.AggregateCSVForm
2016-05-18 16:20:30 -04:00
table = tables.AggregateTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateBulkEditView(generic.BulkEditView):
queryset = Aggregate.objects.prefetch_related('rir')
2021-04-29 16:38:56 -04:00
filterset = filtersets.AggregateFilterSet
table = tables.AggregateTable
2016-05-18 16:20:30 -04:00
form = forms.AggregateBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class AggregateBulkDeleteView(generic.BulkDeleteView):
queryset = Aggregate.objects.prefetch_related('rir')
2021-04-29 16:38:56 -04:00
filterset = filtersets.AggregateFilterSet
table = tables.AggregateTable
2016-03-01 11:23:03 -05:00
2016-05-17 15:04:16 -04:00
#
# Prefix/VLAN roles
#
2020-11-11 16:07:38 -05:00
class RoleListView(generic.ObjectListView):
queryset = Role.objects.annotate(
prefix_count=count_related(Prefix, 'role'),
vlan_count=count_related(VLAN, 'role')
)
2016-05-18 16:20:30 -04:00
table = tables.RoleTable
2016-05-17 15:04:16 -04:00
class RoleView(generic.ObjectView):
queryset = Role.objects.all()
def get_extra_context(self, request, instance):
prefixes = Prefix.objects.restrict(request.user, 'view').filter(
role=instance
)
prefixes_table = tables.PrefixTable(prefixes)
prefixes_table.columns.hide('role')
paginate_table(prefixes_table, request)
return {
'prefixes_table': prefixes_table,
}
2020-11-11 16:07:38 -05:00
class RoleEditView(generic.ObjectEditView):
queryset = Role.objects.all()
model_form = forms.RoleForm
2016-05-17 15:04:16 -04:00
2020-11-11 16:07:38 -05:00
class RoleDeleteView(generic.ObjectDeleteView):
queryset = Role.objects.all()
2020-11-11 16:07:38 -05:00
class RoleBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = Role.objects.all()
model_form = forms.RoleCSVForm
table = tables.RoleTable
class RoleBulkEditView(generic.BulkEditView):
queryset = Role.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.RoleFilterSet
table = tables.RoleTable
form = forms.RoleBulkEditForm
2020-11-11 16:07:38 -05:00
class RoleBulkDeleteView(generic.BulkDeleteView):
queryset = Role.objects.all()
table = tables.RoleTable
2016-05-17 15:04:16 -04:00
2016-03-01 11:23:03 -05:00
#
# Prefixes
#
2020-11-11 16:07:38 -05:00
class PrefixListView(generic.ObjectListView):
2021-05-24 16:51:05 -04:00
queryset = Prefix.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.PrefixFilterSet
filterset_form = forms.PrefixFilterForm
table = tables.PrefixDetailTable
template_name = 'ipam/prefix_list.html'
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixView(generic.ObjectView):
queryset = Prefix.objects.prefetch_related('vrf', 'site__region', 'tenant__group', 'vlan__group', 'role')
def get_extra_context(self, request, instance):
try:
2020-06-01 11:43:49 -04:00
aggregate = Aggregate.objects.restrict(request.user, 'view').get(
prefix__net_contains_or_equals=str(instance.prefix)
2020-06-01 11:43:49 -04:00
)
except Aggregate.DoesNotExist:
aggregate = None
# Parent prefixes table
2020-06-01 11:43:49 -04:00
parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
Q(vrf=instance.vrf) | Q(vrf__isnull=True)
).filter(
prefix__net_contains=str(instance.prefix)
).prefetch_related(
'site', 'role'
2021-05-24 16:51:05 -04:00
)
parent_prefix_table = tables.PrefixTable(list(parent_prefixes), orderable=False)
parent_prefix_table.exclude = ('vrf',)
# Duplicate prefixes table
2020-06-01 11:43:49 -04:00
duplicate_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
vrf=instance.vrf, prefix=str(instance.prefix)
).exclude(
pk=instance.pk
).prefetch_related(
'site', 'role'
)
duplicate_prefix_table = tables.PrefixTable(list(duplicate_prefixes), orderable=False)
duplicate_prefix_table.exclude = ('vrf',)
return {
'aggregate': aggregate,
'parent_prefix_table': parent_prefix_table,
'duplicate_prefix_table': duplicate_prefix_table,
}
2020-11-11 16:07:38 -05:00
class PrefixPrefixesView(generic.ObjectView):
queryset = Prefix.objects.all()
template_name = 'ipam/prefix/prefixes.html'
def get_extra_context(self, request, instance):
# Child prefixes table
child_prefixes = instance.get_child_prefixes().restrict(request.user, 'view').prefetch_related(
'site', 'vlan', 'role',
2021-05-24 16:51:05 -04:00
)
# Add available prefixes to the table if requested
2020-01-07 17:58:30 +00:00
if child_prefixes and request.GET.get('show_available', 'true') == 'true':
child_prefixes = add_available_prefixes(instance.prefix, child_prefixes)
prefix_table = tables.PrefixDetailTable(child_prefixes)
if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
prefix_table.columns.show('pk')
paginate_table(prefix_table, request)
# Compile permissions list for rendering the object table
permissions = {
'add': request.user.has_perm('ipam.add_prefix'),
'change': request.user.has_perm('ipam.change_prefix'),
'delete': request.user.has_perm('ipam.delete_prefix'),
}
bulk_querystring = 'vrf_id={}&within={}'.format(instance.vrf.pk if instance.vrf else '0', instance.prefix)
return {
'first_available_prefix': instance.get_first_available_prefix(),
'prefix_table': prefix_table,
'permissions': permissions,
'bulk_querystring': bulk_querystring,
'active_tab': 'prefixes',
2020-01-07 17:58:30 +00:00
'show_available': request.GET.get('show_available', 'true') == 'true',
}
2020-11-11 16:07:38 -05:00
class PrefixIPAddressesView(generic.ObjectView):
queryset = Prefix.objects.all()
template_name = 'ipam/prefix/ip_addresses.html'
def get_extra_context(self, request, instance):
# Find all IPAddresses belonging to this Prefix
ipaddresses = instance.get_child_ips().restrict(request.user, 'view').prefetch_related(
2020-06-22 14:46:25 -04:00
'vrf', 'primary_ip4_for', 'primary_ip6_for'
)
# Add available IP addresses to the table if requested
2020-01-07 17:58:30 +00:00
if request.GET.get('show_available', 'true') == 'true':
ipaddresses = add_available_ipaddresses(instance.prefix, ipaddresses, instance.is_pool)
ip_table = tables.IPAddressTable(ipaddresses)
if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
ip_table.columns.show('pk')
paginate_table(ip_table, request)
# Compile permissions list for rendering the object table
permissions = {
'add': request.user.has_perm('ipam.add_ipaddress'),
'change': request.user.has_perm('ipam.change_ipaddress'),
'delete': request.user.has_perm('ipam.delete_ipaddress'),
}
bulk_querystring = 'vrf_id={}&parent={}'.format(instance.vrf.pk if instance.vrf else '0', instance.prefix)
return {
'first_available_ip': instance.get_first_available_ip(),
'ip_table': ip_table,
'permissions': permissions,
'bulk_querystring': bulk_querystring,
'active_tab': 'ip-addresses',
2020-01-07 17:58:30 +00:00
'show_available': request.GET.get('show_available', 'true') == 'true',
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixEditView(generic.ObjectEditView):
queryset = Prefix.objects.all()
model_form = forms.PrefixForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixDeleteView(generic.ObjectDeleteView):
queryset = Prefix.objects.all()
template_name = 'ipam/prefix_delete.html'
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixBulkImportView(generic.BulkImportView):
queryset = Prefix.objects.all()
model_form = forms.PrefixCSVForm
2016-05-18 16:20:30 -04:00
table = tables.PrefixTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixBulkEditView(generic.BulkEditView):
queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
2021-04-29 16:38:56 -04:00
filterset = filtersets.PrefixFilterSet
table = tables.PrefixTable
2016-05-18 16:20:30 -04:00
form = forms.PrefixBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class PrefixBulkDeleteView(generic.BulkDeleteView):
queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
2021-04-29 16:38:56 -04:00
filterset = filtersets.PrefixFilterSet
table = tables.PrefixTable
2016-03-01 11:23:03 -05:00
#
# IP addresses
#
2020-11-11 16:07:38 -05:00
class IPAddressListView(generic.ObjectListView):
queryset = IPAddress.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.IPAddressFilterSet
filterset_form = forms.IPAddressFilterForm
table = tables.IPAddressDetailTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressView(generic.ObjectView):
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
def get_extra_context(self, request, instance):
2020-06-23 16:39:43 -04:00
# Parent prefixes table
parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
vrf=instance.vrf,
prefix__net_contains=str(instance.address.ip)
2020-06-23 16:39:43 -04:00
).prefetch_related(
'site', 'role'
)
parent_prefixes_table = tables.PrefixTable(list(parent_prefixes), orderable=False)
parent_prefixes_table.exclude = ('vrf',)
# Duplicate IPs table
duplicate_ips = IPAddress.objects.restrict(request.user, 'view').filter(
vrf=instance.vrf,
address=str(instance.address)
2020-06-23 16:39:43 -04:00
).exclude(
pk=instance.pk
2020-06-23 16:39:43 -04:00
).prefetch_related(
'nat_inside'
)
# Exclude anycast IPs if this IP is anycast
if instance.role == IPAddressRoleChoices.ROLE_ANYCAST:
2020-06-23 16:39:43 -04:00
duplicate_ips = duplicate_ips.exclude(role=IPAddressRoleChoices.ROLE_ANYCAST)
# Limit to a maximum of 10 duplicates displayed here
duplicate_ips_table = tables.IPAddressTable(duplicate_ips[:10], orderable=False)
2020-06-23 16:39:43 -04:00
# Related IP table
related_ips = IPAddress.objects.restrict(request.user, 'view').exclude(
address=str(instance.address)
2020-06-23 16:39:43 -04:00
).filter(
vrf=instance.vrf, address__net_contained_or_equal=str(instance.address)
2020-06-23 16:39:43 -04:00
)
related_ips_table = tables.IPAddressTable(related_ips, orderable=False)
paginate_table(related_ips_table, request)
2020-06-23 16:39:43 -04:00
return {
2020-06-23 16:39:43 -04:00
'parent_prefixes_table': parent_prefixes_table,
'duplicate_ips_table': duplicate_ips_table,
'more_duplicate_ips': duplicate_ips.count() > 10,
2020-06-23 16:39:43 -04:00
'related_ips_table': related_ips_table,
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressEditView(generic.ObjectEditView):
queryset = IPAddress.objects.all()
model_form = forms.IPAddressForm
template_name = 'ipam/ipaddress_edit.html'
2016-03-01 11:23:03 -05:00
def alter_obj(self, obj, request, url_args, url_kwargs):
2020-06-24 09:52:22 -04:00
if 'interface' in request.GET:
try:
2020-06-24 09:52:22 -04:00
obj.assigned_object = Interface.objects.get(pk=request.GET['interface'])
except (ValueError, Interface.DoesNotExist):
pass
2020-06-24 09:52:22 -04:00
elif 'vminterface' in request.GET:
try:
obj.assigned_object = VMInterface.objects.get(pk=request.GET['vminterface'])
except (ValueError, VMInterface.DoesNotExist):
pass
return obj
2016-03-01 11:23:03 -05:00
# TODO: Standardize or remove this view
2020-11-11 16:07:38 -05:00
class IPAddressAssignView(generic.ObjectView):
"""
Search for IPAddresses to be assigned to an Interface.
"""
queryset = IPAddress.objects.all()
def dispatch(self, request, *args, **kwargs):
# Redirect user if an interface has not been provided
2020-09-04 16:09:05 -04:00
if 'interface' not in request.GET and 'vminterface' not in request.GET:
return redirect('ipam:ipaddress_add')
return super().dispatch(request, *args, **kwargs)
def get(self, request):
form = forms.IPAddressAssignForm()
return render(request, 'ipam/ipaddress_assign.html', {
'form': form,
'return_url': request.GET.get('return_url', ''),
})
def post(self, request):
form = forms.IPAddressAssignForm(request.POST)
table = None
if form.is_valid():
2020-06-22 14:46:25 -04:00
addresses = self.queryset.prefetch_related('vrf', 'tenant')
2020-01-09 16:26:11 +00:00
# Limit to 100 results
2021-04-29 16:38:56 -04:00
addresses = filtersets.IPAddressFilterSet(request.POST, addresses).qs[:100]
2020-01-09 16:26:11 +00:00
table = tables.IPAddressAssignTable(addresses)
return render(request, 'ipam/ipaddress_assign.html', {
'form': form,
'table': table,
2020-09-04 16:09:05 -04:00
'return_url': request.GET.get('return_url'),
})
2020-11-11 16:07:38 -05:00
class IPAddressDeleteView(generic.ObjectDeleteView):
queryset = IPAddress.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressBulkCreateView(generic.BulkCreateView):
queryset = IPAddress.objects.all()
form = forms.IPAddressBulkCreateForm
model_form = forms.IPAddressBulkAddForm
pattern_target = 'address'
template_name = 'ipam/ipaddress_bulk_add.html'
2020-11-11 16:07:38 -05:00
class IPAddressBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = IPAddress.objects.all()
model_form = forms.IPAddressCSVForm
2016-05-18 16:20:30 -04:00
table = tables.IPAddressTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressBulkEditView(generic.BulkEditView):
2020-06-22 14:46:25 -04:00
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.IPAddressFilterSet
table = tables.IPAddressTable
2016-05-18 16:20:30 -04:00
form = forms.IPAddressBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class IPAddressBulkDeleteView(generic.BulkDeleteView):
2020-06-22 14:46:25 -04:00
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
2021-04-29 16:38:56 -04:00
filterset = filtersets.IPAddressFilterSet
table = tables.IPAddressTable
2016-03-01 11:23:03 -05:00
2016-07-15 13:26:54 -04:00
#
# VLAN groups
#
2020-11-11 16:07:38 -05:00
class VLANGroupListView(generic.ObjectListView):
2021-03-15 20:35:18 -04:00
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANGroupFilterSet
filterset_form = forms.VLANGroupFilterForm
2016-07-15 13:26:54 -04:00
table = tables.VLANGroupTable
class VLANGroupView(generic.ObjectView):
queryset = VLANGroup.objects.all()
def get_extra_context(self, request, instance):
vlans = VLAN.objects.restrict(request.user, 'view').filter(group=instance).prefetch_related(
Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user))
).order_by('vid')
vlans_count = vlans.count()
vlans = add_available_vlans(instance, vlans)
vlans_table = tables.VLANDetailTable(vlans)
if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'):
vlans_table.columns.show('pk')
vlans_table.columns.hide('site')
vlans_table.columns.hide('group')
paginate_table(vlans_table, request)
# Compile permissions list for rendering the object table
permissions = {
'add': request.user.has_perm('ipam.add_vlan'),
'change': request.user.has_perm('ipam.change_vlan'),
'delete': request.user.has_perm('ipam.delete_vlan'),
}
return {
'vlans_count': vlans_count,
'vlans_table': vlans_table,
'permissions': permissions,
}
2020-11-11 16:07:38 -05:00
class VLANGroupEditView(generic.ObjectEditView):
queryset = VLANGroup.objects.all()
model_form = forms.VLANGroupForm
template_name = 'ipam/vlangroup_edit.html'
2016-07-15 13:26:54 -04:00
2020-11-11 16:07:38 -05:00
class VLANGroupDeleteView(generic.ObjectDeleteView):
queryset = VLANGroup.objects.all()
2020-11-11 16:07:38 -05:00
class VLANGroupBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = VLANGroup.objects.all()
model_form = forms.VLANGroupCSVForm
table = tables.VLANGroupTable
class VLANGroupBulkEditView(generic.BulkEditView):
2021-03-15 20:58:23 -04:00
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANGroupFilterSet
table = tables.VLANGroupTable
form = forms.VLANGroupBulkEditForm
2020-11-11 16:07:38 -05:00
class VLANGroupBulkDeleteView(generic.BulkDeleteView):
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANGroupFilterSet
table = tables.VLANGroupTable
2016-07-15 13:26:54 -04:00
2016-03-01 11:23:03 -05:00
#
# VLANs
#
2020-11-11 16:07:38 -05:00
class VLANListView(generic.ObjectListView):
queryset = VLAN.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANFilterSet
filterset_form = forms.VLANFilterForm
table = tables.VLANDetailTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANView(generic.ObjectView):
queryset = VLAN.objects.prefetch_related('site__region', 'tenant__group', 'role')
2016-03-01 11:23:03 -05:00
def get_extra_context(self, request, instance):
prefixes = Prefix.objects.restrict(request.user, 'view').filter(vlan=instance).prefetch_related(
2020-06-01 11:43:49 -04:00
'vrf', 'site', 'role'
)
prefix_table = tables.PrefixTable(list(prefixes), orderable=False)
prefix_table.exclude = ('vlan',)
return {
'prefix_table': prefix_table,
}
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANInterfacesView(generic.ObjectView):
queryset = VLAN.objects.all()
template_name = 'ipam/vlan/interfaces.html'
def get_extra_context(self, request, instance):
interfaces = instance.get_interfaces().prefetch_related('device')
members_table = tables.VLANDevicesTable(interfaces)
paginate_table(members_table, request)
return {
'members_table': members_table,
'active_tab': 'interfaces',
}
2020-11-11 16:07:38 -05:00
class VLANVMInterfacesView(generic.ObjectView):
queryset = VLAN.objects.all()
template_name = 'ipam/vlan/vminterfaces.html'
def get_extra_context(self, request, instance):
interfaces = instance.get_vminterfaces().prefetch_related('virtual_machine')
members_table = tables.VLANVirtualMachinesTable(interfaces)
paginate_table(members_table, request)
return {
'members_table': members_table,
'active_tab': 'vminterfaces',
}
2020-11-11 16:07:38 -05:00
class VLANEditView(generic.ObjectEditView):
queryset = VLAN.objects.all()
model_form = forms.VLANForm
2021-03-11 11:07:27 -05:00
template_name = 'ipam/vlan_edit.html'
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANDeleteView(generic.ObjectDeleteView):
queryset = VLAN.objects.all()
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = VLAN.objects.all()
model_form = forms.VLANCSVForm
2016-05-18 16:20:30 -04:00
table = tables.VLANTable
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANBulkEditView(generic.BulkEditView):
queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role')
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANFilterSet
table = tables.VLANTable
2016-05-18 16:20:30 -04:00
form = forms.VLANBulkEditForm
2016-03-01 11:23:03 -05:00
2020-11-11 16:07:38 -05:00
class VLANBulkDeleteView(generic.BulkDeleteView):
queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role')
2021-04-29 16:38:56 -04:00
filterset = filtersets.VLANFilterSet
table = tables.VLANTable
#
# Services
#
2020-11-11 16:07:38 -05:00
class ServiceListView(generic.ObjectListView):
queryset = Service.objects.all()
2021-04-29 16:38:56 -04:00
filterset = filtersets.ServiceFilterSet
filterset_form = forms.ServiceFilterForm
table = tables.ServiceTable
action_buttons = ('import', 'export')
2020-11-11 16:07:38 -05:00
class ServiceView(generic.ObjectView):
queryset = Service.objects.prefetch_related('ipaddresses')
2020-11-11 16:07:38 -05:00
class ServiceEditView(generic.ObjectEditView):
queryset = Service.objects.prefetch_related('ipaddresses')
model_form = forms.ServiceForm
template_name = 'ipam/service_edit.html'
def alter_obj(self, obj, request, url_args, url_kwargs):
if 'device' in url_kwargs:
obj.device = get_object_or_404(
Device.objects.restrict(request.user),
pk=url_kwargs['device']
)
2017-08-31 12:50:35 -04:00
elif 'virtualmachine' in url_kwargs:
obj.virtual_machine = get_object_or_404(
VirtualMachine.objects.restrict(request.user),
pk=url_kwargs['virtualmachine']
)
return obj
2020-11-11 16:07:38 -05:00
class ServiceBulkImportView(generic.BulkImportView):
2020-05-21 11:58:27 -04:00
queryset = Service.objects.all()
model_form = forms.ServiceCSVForm
table = tables.ServiceTable
2020-11-11 16:07:38 -05:00
class ServiceDeleteView(generic.ObjectDeleteView):
queryset = Service.objects.all()
2020-11-11 16:07:38 -05:00
class ServiceBulkEditView(generic.BulkEditView):
queryset = Service.objects.prefetch_related('device', 'virtual_machine')
2021-04-29 16:38:56 -04:00
filterset = filtersets.ServiceFilterSet
table = tables.ServiceTable
form = forms.ServiceBulkEditForm
2020-11-11 16:07:38 -05:00
class ServiceBulkDeleteView(generic.BulkDeleteView):
queryset = Service.objects.prefetch_related('device', 'virtual_machine')
2021-04-29 16:38:56 -04:00
filterset = filtersets.ServiceFilterSet
table = tables.ServiceTable