2021-11-01 16:14:44 -04:00
|
|
|
from django.contrib.contenttypes.models import ContentType
|
2020-11-25 15:49:18 -05:00
|
|
|
from django.db.models import Prefetch
|
2019-09-29 01:15:46 -04:00
|
|
|
from django.db.models.expressions import RawSQL
|
2017-11-10 11:58:59 -05:00
|
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
2021-11-02 13:06:58 -04:00
|
|
|
from django.urls import reverse
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2022-05-14 12:01:49 +02:00
|
|
|
from circuits.models import Provider, Circuit
|
2022-03-30 17:17:36 -04:00
|
|
|
from circuits.tables import ProviderTable
|
2021-12-14 15:31:42 -05:00
|
|
|
from dcim.filtersets import InterfaceFilterSet
|
2022-06-06 16:28:33 +02:00
|
|
|
from dcim.models import Interface, Site, Device
|
2021-10-24 23:42:47 -05:00
|
|
|
from dcim.tables import SiteTable
|
2020-11-11 16:07:38 -05:00
|
|
|
from netbox.views import generic
|
2020-12-17 14:47:49 -05:00
|
|
|
from utilities.utils import count_related
|
2021-12-14 15:31:42 -05:00
|
|
|
from virtualization.filtersets import VMInterfaceFilterSet
|
2022-06-06 16:28:33 +02:00
|
|
|
from virtualization.models import VMInterface, VirtualMachine
|
2021-04-29 16:38:56 -04:00
|
|
|
from . import filtersets, forms, tables
|
2020-01-24 14:21:59 -05:00
|
|
|
from .constants import *
|
2021-07-16 09:15:19 -04:00
|
|
|
from .models import *
|
2021-10-24 23:42:47 -05:00
|
|
|
from .models import ASN
|
2022-06-27 23:24:50 -05:00
|
|
|
from .tables.l2vpn import L2VPNTable, L2VPNTerminationTable
|
2021-12-21 11:09:30 -05:00
|
|
|
from .utils import add_requested_prefixes, add_available_ipaddresses, add_available_vlans
|
2018-08-02 05:59:00 +10:00
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# VRFs
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VRFListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = VRF.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VRFFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
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):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = VRF.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
prefix_count = Prefix.objects.restrict(request.user, 'view').filter(vrf=instance).count()
|
2021-03-08 15:57:17 -05:00
|
|
|
ipaddress_count = IPAddress.objects.restrict(request.user, 'view').filter(vrf=instance).count()
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-09-24 12:09:28 -04:00
|
|
|
import_targets_table = tables.RouteTargetTable(
|
2020-11-19 15:59:11 -05:00
|
|
|
instance.import_targets.prefetch_related('tenant'),
|
2020-09-24 12:09:28 -04:00
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
export_targets_table = tables.RouteTargetTable(
|
2020-11-19 15:59:11 -05:00
|
|
|
instance.export_targets.prefetch_related('tenant'),
|
2020-09-24 12:09:28 -04:00
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2019-01-31 10:06:08 -05:00
|
|
|
'prefix_count': prefix_count,
|
2021-03-08 15:57:17 -05:00
|
|
|
'ipaddress_count': ipaddress_count,
|
2020-09-24 12:09:28 -04:00
|
|
|
'import_targets_table': import_targets_table,
|
|
|
|
'export_targets_table': export_targets_table,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VRFEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = VRF.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.VRFForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VRFDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
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()
|
2017-06-02 16:07:11 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = VRF.objects.prefetch_related('tenant')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VRFFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = VRF.objects.prefetch_related('tenant')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VRFFilterSet
|
2017-07-13 17:39:28 -04:00
|
|
|
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):
|
2020-10-30 16:52:40 -04:00
|
|
|
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()
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-09-24 12:09:28 -04:00
|
|
|
importing_vrfs_table = tables.VRFTable(
|
2020-11-19 15:59:11 -05:00
|
|
|
instance.importing_vrfs.prefetch_related('tenant'),
|
2020-09-24 12:09:28 -04:00
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
exporting_vrfs_table = tables.VRFTable(
|
2020-11-19 15:59:11 -05:00
|
|
|
instance.exporting_vrfs.prefetch_related('tenant'),
|
2020-09-24 12:09:28 -04:00
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-09-24 12:09:28 -04:00
|
|
|
'importing_vrfs_table': importing_vrfs_table,
|
|
|
|
'exporting_vrfs_table': exporting_vrfs_table,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
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()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RouteTargetForm
|
2020-09-24 11:25:52 -04:00
|
|
|
|
|
|
|
|
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):
|
2020-11-25 15:49:18 -05:00
|
|
|
queryset = RIR.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
aggregate_count=count_related(Aggregate, 'rir')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RIRFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.RIRFilterForm
|
2020-10-20 13:16:35 -04:00
|
|
|
table = tables.RIRTable
|
2016-05-16 13:04:45 -04:00
|
|
|
|
|
|
|
|
2021-03-26 14:44:43 -04:00
|
|
|
class RIRView(generic.ObjectView):
|
|
|
|
queryset = RIR.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2022-04-18 08:43:46 -04:00
|
|
|
aggregates = Aggregate.objects.restrict(request.user, 'view').filter(rir=instance).annotate(
|
|
|
|
child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
|
2021-03-26 14:44:43 -04:00
|
|
|
)
|
2022-05-04 15:46:13 -04:00
|
|
|
aggregates_table = tables.AggregateTable(aggregates, user=request.user, exclude=('rir', 'utilization'))
|
2022-02-09 14:10:54 -05:00
|
|
|
aggregates_table.configure(request)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
|
|
|
return {
|
|
|
|
'aggregates_table': aggregates_table,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RIREditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = RIR.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RIRForm
|
2016-05-16 13:04:45 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RIRDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
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()
|
2017-10-09 15:42:06 -04:00
|
|
|
model_form = forms.RIRCSVForm
|
|
|
|
table = tables.RIRTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
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
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.RIRTable
|
|
|
|
form = forms.RIRBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RIRBulkDeleteView(generic.BulkDeleteView):
|
2020-11-25 15:49:18 -05:00
|
|
|
queryset = RIR.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
aggregate_count=count_related(Aggregate, 'rir')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RIRFilterSet
|
2017-07-13 17:39:28 -04:00
|
|
|
table = tables.RIRTable
|
2016-05-16 13:04:45 -04:00
|
|
|
|
|
|
|
|
2021-10-24 23:42:47 -05:00
|
|
|
#
|
|
|
|
# ASNs
|
|
|
|
#
|
|
|
|
|
|
|
|
class ASNListView(generic.ObjectListView):
|
|
|
|
queryset = ASN.objects.annotate(
|
|
|
|
site_count=count_related(Site, 'asns'),
|
2022-03-30 17:17:36 -04:00
|
|
|
provider_count=count_related(Provider, 'asns')
|
2021-10-24 23:42:47 -05:00
|
|
|
)
|
|
|
|
filterset = filtersets.ASNFilterSet
|
|
|
|
filterset_form = forms.ASNFilterForm
|
|
|
|
table = tables.ASNTable
|
|
|
|
|
|
|
|
|
|
|
|
class ASNView(generic.ObjectView):
|
|
|
|
queryset = ASN.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
2022-03-30 17:17:36 -04:00
|
|
|
# Gather assigned Sites
|
2021-11-04 16:16:59 -04:00
|
|
|
sites = instance.sites.restrict(request.user, 'view')
|
2022-05-04 15:46:13 -04:00
|
|
|
sites_table = SiteTable(sites, user=request.user)
|
2022-02-09 14:10:54 -05:00
|
|
|
sites_table.configure(request)
|
2021-10-24 23:42:47 -05:00
|
|
|
|
2022-03-30 17:17:36 -04:00
|
|
|
# Gather assigned Providers
|
2022-05-14 12:01:49 +02:00
|
|
|
providers = instance.providers.restrict(request.user, 'view').annotate(
|
|
|
|
count_circuits=count_related(Circuit, 'provider')
|
|
|
|
)
|
2022-05-04 15:46:13 -04:00
|
|
|
providers_table = ProviderTable(providers, user=request.user)
|
2022-03-30 17:17:36 -04:00
|
|
|
providers_table.configure(request)
|
|
|
|
|
2021-10-24 23:42:47 -05:00
|
|
|
return {
|
2021-11-04 16:16:59 -04:00
|
|
|
'sites_table': sites_table,
|
2022-03-30 17:17:36 -04:00
|
|
|
'sites_count': sites.count(),
|
|
|
|
'providers_table': providers_table,
|
|
|
|
'providers_count': providers.count(),
|
2021-10-24 23:42:47 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class ASNEditView(generic.ObjectEditView):
|
|
|
|
queryset = ASN.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ASNForm
|
2021-10-24 23:42:47 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ASNDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = ASN.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ASNBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = ASN.objects.all()
|
|
|
|
model_form = forms.ASNCSVForm
|
|
|
|
table = tables.ASNTable
|
|
|
|
|
|
|
|
|
|
|
|
class ASNBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = ASN.objects.annotate(
|
|
|
|
site_count=count_related(Site, 'asns')
|
|
|
|
)
|
|
|
|
filterset = filtersets.ASNFilterSet
|
|
|
|
table = tables.ASNTable
|
|
|
|
form = forms.ASNBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class ASNBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = ASN.objects.annotate(
|
|
|
|
site_count=count_related(Site, 'asns')
|
|
|
|
)
|
|
|
|
filterset = filtersets.ASNFilterSet
|
|
|
|
table = tables.ASNTable
|
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# Aggregates
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class AggregateListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = Aggregate.objects.annotate(
|
2019-09-29 01:38:17 -04:00
|
|
|
child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ())
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.AggregateFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.AggregateFilterForm
|
2021-09-17 13:55:32 -04:00
|
|
|
table = tables.AggregateTable
|
2016-05-26 15:35:48 -04:00
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class AggregateView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Aggregate.objects.all()
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-01-02 09:16:18 +00:00
|
|
|
|
2021-12-14 16:38:25 -05:00
|
|
|
class AggregatePrefixesView(generic.ObjectChildrenView):
|
|
|
|
queryset = Aggregate.objects.all()
|
|
|
|
child_model = Prefix
|
|
|
|
table = tables.PrefixTable
|
|
|
|
filterset = filtersets.PrefixFilterSet
|
|
|
|
template_name = 'ipam/aggregate/prefixes.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2021-12-14 16:38:25 -05:00
|
|
|
def get_children(self, request, parent):
|
|
|
|
return Prefix.objects.restrict(request.user, 'view').filter(
|
|
|
|
prefix__net_contained_or_equal=str(parent.prefix)
|
2022-07-10 17:17:56 +02:00
|
|
|
).prefetch_related('site', 'role', 'tenant', 'tenant__group', 'vlan')
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2021-12-14 16:38:25 -05:00
|
|
|
def prep_table_data(self, request, queryset, parent):
|
|
|
|
# Determine whether to show assigned prefixes, available prefixes, or both
|
2021-12-13 12:15:43 -05:00
|
|
|
show_available = bool(request.GET.get('show_available', 'true') == 'true')
|
|
|
|
show_assigned = bool(request.GET.get('show_assigned', 'true') == 'true')
|
2017-02-17 16:34:09 -05:00
|
|
|
|
2021-12-14 16:38:25 -05:00
|
|
|
return add_requested_prefixes(parent.prefix, queryset, show_available, show_assigned)
|
2017-02-17 16:34:09 -05:00
|
|
|
|
2021-12-14 16:38:25 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2021-10-01 16:21:16 -04:00
|
|
|
'bulk_querystring': f'within={instance.prefix}',
|
2021-12-14 16:38:25 -05:00
|
|
|
'active_tab': 'prefixes',
|
2021-12-30 12:00:37 -05:00
|
|
|
'first_available_prefix': instance.get_first_available_prefix(),
|
2021-12-14 16:38:25 -05:00
|
|
|
'show_available': bool(request.GET.get('show_available', 'true') == 'true'),
|
|
|
|
'show_assigned': bool(request.GET.get('show_assigned', 'true') == 'true'),
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class AggregateEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Aggregate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.AggregateForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class AggregateDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
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()
|
2017-06-02 16:07:11 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Aggregate.objects.prefetch_related('rir')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.AggregateFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Aggregate.objects.prefetch_related('rir')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.AggregateFilterSet
|
2017-07-13 17:39:28 -04:00
|
|
|
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):
|
2020-07-10 15:38:54 -04:00
|
|
|
queryset = Role.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
prefix_count=count_related(Prefix, 'role'),
|
2022-02-01 16:47:29 -05:00
|
|
|
iprange_count=count_related(IPRange, 'role'),
|
2020-12-17 14:47:49 -05:00
|
|
|
vlan_count=count_related(VLAN, 'role')
|
2020-07-10 15:38:54 -04:00
|
|
|
)
|
2021-09-16 16:04:46 -04:00
|
|
|
filterset = filtersets.RoleFilterSet
|
|
|
|
filterset_form = forms.RoleFilterForm
|
2016-05-18 16:20:30 -04:00
|
|
|
table = tables.RoleTable
|
2016-05-17 15:04:16 -04:00
|
|
|
|
|
|
|
|
2021-03-26 14:44:43 -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
|
|
|
|
)
|
|
|
|
|
2022-05-04 15:46:13 -04:00
|
|
|
prefixes_table = tables.PrefixTable(prefixes, user=request.user, exclude=('role', 'utilization'))
|
2022-02-09 14:10:54 -05:00
|
|
|
prefixes_table.configure(request)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
|
|
|
return {
|
|
|
|
'prefixes_table': prefixes_table,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RoleEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Role.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.RoleForm
|
2016-05-17 15:04:16 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RoleDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
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()
|
2017-10-09 15:42:06 -04:00
|
|
|
model_form = forms.RoleCSVForm
|
|
|
|
table = tables.RoleTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class RoleBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = Role.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.RoleFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.RoleTable
|
|
|
|
form = forms.RoleBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class RoleBulkDeleteView(generic.BulkDeleteView):
|
2018-07-20 21:18:10 -04:00
|
|
|
queryset = Role.objects.all()
|
2017-07-13 17:39:28 -04:00
|
|
|
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
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.PrefixFilterForm
|
2021-09-17 13:55:32 -04:00
|
|
|
table = tables.PrefixTable
|
2016-03-04 11:25:20 -05:00
|
|
|
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):
|
2020-05-20 13:35:54 -04:00
|
|
|
queryset = Prefix.objects.prefetch_related('vrf', 'site__region', 'tenant__group', 'vlan__group', 'role')
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2017-05-18 17:00:57 -04:00
|
|
|
try:
|
2020-06-01 11:43:49 -04:00
|
|
|
aggregate = Aggregate.objects.restrict(request.user, 'view').get(
|
2020-11-19 15:59:11 -05:00
|
|
|
prefix__net_contains_or_equals=str(instance.prefix)
|
2020-06-01 11:43:49 -04:00
|
|
|
)
|
2017-05-18 17:00:57 -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(
|
2020-11-19 15:59:11 -05:00
|
|
|
Q(vrf=instance.vrf) | Q(vrf__isnull=True)
|
2017-05-18 17:00:57 -04:00
|
|
|
).filter(
|
2020-11-19 15:59:11 -05:00
|
|
|
prefix__net_contains=str(instance.prefix)
|
2019-08-19 01:53:39 -04:00
|
|
|
).prefetch_related(
|
2021-12-29 09:59:25 -05:00
|
|
|
'site', 'role', 'tenant'
|
2021-05-24 16:51:05 -04:00
|
|
|
)
|
2021-09-17 13:55:32 -04:00
|
|
|
parent_prefix_table = tables.PrefixTable(
|
|
|
|
list(parent_prefixes),
|
|
|
|
exclude=('vrf', 'utilization'),
|
|
|
|
orderable=False
|
|
|
|
)
|
2017-05-18 17:00:57 -04:00
|
|
|
|
|
|
|
# Duplicate prefixes table
|
2020-06-01 11:43:49 -04:00
|
|
|
duplicate_prefixes = Prefix.objects.restrict(request.user, 'view').filter(
|
2020-11-19 15:59:11 -05:00
|
|
|
vrf=instance.vrf, prefix=str(instance.prefix)
|
2017-05-18 17:00:57 -04:00
|
|
|
).exclude(
|
2020-11-19 15:59:11 -05:00
|
|
|
pk=instance.pk
|
2019-08-19 01:53:39 -04:00
|
|
|
).prefetch_related(
|
2017-05-18 17:00:57 -04:00
|
|
|
'site', 'role'
|
|
|
|
)
|
2021-09-17 13:55:32 -04:00
|
|
|
duplicate_prefix_table = tables.PrefixTable(
|
|
|
|
list(duplicate_prefixes),
|
|
|
|
exclude=('vrf', 'utilization'),
|
|
|
|
orderable=False
|
|
|
|
)
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2017-12-20 14:01:37 -05:00
|
|
|
'aggregate': aggregate,
|
|
|
|
'parent_prefix_table': parent_prefix_table,
|
|
|
|
'duplicate_prefix_table': duplicate_prefix_table,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2017-12-20 14:01:37 -05:00
|
|
|
|
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
class PrefixPrefixesView(generic.ObjectChildrenView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Prefix.objects.all()
|
2021-12-14 13:33:53 -05:00
|
|
|
child_model = Prefix
|
|
|
|
table = tables.PrefixTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.PrefixFilterSet
|
2021-03-29 16:43:29 -04:00
|
|
|
template_name = 'ipam/prefix/prefixes.html'
|
2017-12-20 14:01:37 -05:00
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
def get_children(self, request, parent):
|
2021-12-30 12:43:37 -05:00
|
|
|
return parent.get_child_prefixes().restrict(request.user, 'view').prefetch_related(
|
2022-07-10 17:17:56 +02:00
|
|
|
'site', 'vrf', 'vlan', 'role', 'tenant', 'tenant__group'
|
2021-12-30 12:43:37 -05:00
|
|
|
)
|
2017-12-20 14:01:37 -05:00
|
|
|
|
2021-12-14 15:42:28 -05:00
|
|
|
def prep_table_data(self, request, queryset, parent):
|
|
|
|
# Determine whether to show assigned prefixes, available prefixes, or both
|
2021-12-13 12:15:43 -05:00
|
|
|
show_available = bool(request.GET.get('show_available', 'true') == 'true')
|
|
|
|
show_assigned = bool(request.GET.get('show_assigned', 'true') == 'true')
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2021-12-14 15:42:28 -05:00
|
|
|
return add_requested_prefixes(parent.prefix, queryset, show_available, show_assigned)
|
2021-09-01 11:06:50 -04:00
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2021-12-14 13:33:53 -05:00
|
|
|
'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&within={instance.prefix}",
|
2018-06-14 13:14:35 -04:00
|
|
|
'active_tab': 'prefixes',
|
2021-08-31 11:15:41 -04:00
|
|
|
'first_available_prefix': instance.get_first_available_prefix(),
|
2021-12-14 13:33:53 -05:00
|
|
|
'show_available': bool(request.GET.get('show_available', 'true') == 'true'),
|
|
|
|
'show_assigned': bool(request.GET.get('show_assigned', 'true') == 'true'),
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2017-05-18 17:00:57 -04:00
|
|
|
|
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
class PrefixIPRangesView(generic.ObjectChildrenView):
|
2021-08-10 16:26:14 -04:00
|
|
|
queryset = Prefix.objects.all()
|
2021-12-14 13:33:53 -05:00
|
|
|
child_model = IPRange
|
|
|
|
table = tables.IPRangeTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.IPRangeFilterSet
|
2021-08-10 16:26:14 -04:00
|
|
|
template_name = 'ipam/prefix/ip_ranges.html'
|
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
def get_children(self, request, parent):
|
2021-12-30 12:43:37 -05:00
|
|
|
return parent.get_child_ranges().restrict(request.user, 'view').prefetch_related(
|
2022-07-10 17:17:56 +02:00
|
|
|
'vrf', 'role', 'tenant', 'tenant__group',
|
2021-12-30 12:43:37 -05:00
|
|
|
)
|
2021-09-01 10:24:35 +02:00
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2021-08-10 16:26:14 -04:00
|
|
|
return {
|
2021-12-14 13:33:53 -05:00
|
|
|
'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&parent={instance.prefix}",
|
2021-08-10 16:26:14 -04:00
|
|
|
'active_tab': 'ip-ranges',
|
2021-12-15 11:03:38 -05:00
|
|
|
'first_available_ip': instance.get_first_available_ip(),
|
2021-08-10 16:26:14 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
class PrefixIPAddressesView(generic.ObjectChildrenView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = Prefix.objects.all()
|
2021-12-14 13:33:53 -05:00
|
|
|
child_model = IPAddress
|
|
|
|
table = tables.IPAddressTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.IPAddressFilterSet
|
2021-03-29 16:43:29 -04:00
|
|
|
template_name = 'ipam/prefix/ip_addresses.html'
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
def get_children(self, request, parent):
|
2022-01-04 09:15:25 -05:00
|
|
|
return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant')
|
2021-08-31 16:03:22 -07:00
|
|
|
|
2021-12-21 11:09:30 -05:00
|
|
|
def prep_table_data(self, request, queryset, parent):
|
|
|
|
show_available = bool(request.GET.get('show_available', 'true') == 'true')
|
|
|
|
if show_available:
|
|
|
|
return add_available_ipaddresses(parent.prefix, queryset, parent.is_pool)
|
|
|
|
|
|
|
|
return queryset
|
|
|
|
|
2021-12-14 13:33:53 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2021-12-14 13:33:53 -05:00
|
|
|
'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&parent={instance.prefix}",
|
2018-06-14 13:14:35 -04:00
|
|
|
'active_tab': 'ip-addresses',
|
2021-08-31 11:15:41 -04:00
|
|
|
'first_available_ip': instance.get_first_available_ip(),
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PrefixEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = Prefix.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.PrefixForm
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PrefixDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = Prefix.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class PrefixBulkImportView(generic.BulkImportView):
|
2020-05-21 11:49:50 -04:00
|
|
|
queryset = Prefix.objects.all()
|
2017-06-02 16:07:11 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PrefixFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Prefix.objects.prefetch_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.PrefixFilterSet
|
2017-07-13 17:39:28 -04:00
|
|
|
table = tables.PrefixTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2021-07-16 09:15:19 -04:00
|
|
|
#
|
|
|
|
# IP Ranges
|
|
|
|
#
|
|
|
|
|
|
|
|
class IPRangeListView(generic.ObjectListView):
|
|
|
|
queryset = IPRange.objects.all()
|
|
|
|
filterset = filtersets.IPRangeFilterSet
|
|
|
|
filterset_form = forms.IPRangeFilterForm
|
|
|
|
table = tables.IPRangeTable
|
|
|
|
|
|
|
|
|
|
|
|
class IPRangeView(generic.ObjectView):
|
|
|
|
queryset = IPRange.objects.all()
|
|
|
|
|
|
|
|
|
2021-12-14 13:55:09 -05:00
|
|
|
class IPRangeIPAddressesView(generic.ObjectChildrenView):
|
2021-07-16 09:15:19 -04:00
|
|
|
queryset = IPRange.objects.all()
|
2021-12-14 13:55:09 -05:00
|
|
|
child_model = IPAddress
|
|
|
|
table = tables.IPAddressTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = filtersets.IPAddressFilterSet
|
2021-07-16 09:15:19 -04:00
|
|
|
template_name = 'ipam/iprange/ip_addresses.html'
|
|
|
|
|
2021-12-14 13:55:09 -05:00
|
|
|
def get_children(self, request, parent):
|
2022-07-11 12:45:53 -04:00
|
|
|
return parent.get_child_ips().restrict(request.user, 'view')
|
2021-07-16 09:15:19 -04:00
|
|
|
|
2021-12-14 13:55:09 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2021-07-16 09:15:19 -04:00
|
|
|
return {
|
|
|
|
'active_tab': 'ip-addresses',
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class IPRangeEditView(generic.ObjectEditView):
|
|
|
|
queryset = IPRange.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.IPRangeForm
|
2021-07-16 09:15:19 -04:00
|
|
|
|
|
|
|
|
|
|
|
class IPRangeDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = IPRange.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class IPRangeBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = IPRange.objects.all()
|
|
|
|
model_form = forms.IPRangeCSVForm
|
|
|
|
table = tables.IPRangeTable
|
|
|
|
|
|
|
|
|
|
|
|
class IPRangeBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = IPRange.objects.prefetch_related('vrf', 'tenant')
|
|
|
|
filterset = filtersets.IPRangeFilterSet
|
|
|
|
table = tables.IPRangeTable
|
|
|
|
form = forms.IPRangeBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class IPRangeBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = IPRange.objects.prefetch_related('vrf', 'tenant')
|
|
|
|
filterset = filtersets.IPRangeFilterSet
|
|
|
|
table = tables.IPRangeTable
|
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# IP addresses
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class IPAddressListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = IPAddress.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.IPAddressFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.IPAddressFilterForm
|
2021-09-17 13:55:32 -04:00
|
|
|
table = tables.IPAddressTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class IPAddressView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = IPAddress.objects.prefetch_related('vrf__tenant', 'tenant')
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
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(
|
2020-11-19 15:59:11 -05:00
|
|
|
vrf=instance.vrf,
|
2021-06-04 16:46:02 +02:00
|
|
|
prefix__net_contains_or_equals=str(instance.address.ip)
|
2020-06-23 16:39:43 -04:00
|
|
|
).prefetch_related(
|
|
|
|
'site', 'role'
|
|
|
|
)
|
2021-09-17 13:55:32 -04:00
|
|
|
parent_prefixes_table = tables.PrefixTable(
|
|
|
|
list(parent_prefixes),
|
|
|
|
exclude=('vrf', 'utilization'),
|
|
|
|
orderable=False
|
|
|
|
)
|
2020-06-23 16:39:43 -04:00
|
|
|
|
|
|
|
# Duplicate IPs table
|
|
|
|
duplicate_ips = IPAddress.objects.restrict(request.user, 'view').filter(
|
2020-11-19 15:59:11 -05:00
|
|
|
vrf=instance.vrf,
|
|
|
|
address=str(instance.address)
|
2020-06-23 16:39:43 -04:00
|
|
|
).exclude(
|
2020-11-19 15:59:11 -05:00
|
|
|
pk=instance.pk
|
2020-06-23 16:39:43 -04:00
|
|
|
).prefetch_related(
|
|
|
|
'nat_inside'
|
|
|
|
)
|
|
|
|
# Exclude anycast IPs if this IP is anycast
|
2020-11-19 15:59:11 -05:00
|
|
|
if instance.role == IPAddressRoleChoices.ROLE_ANYCAST:
|
2020-06-23 16:39:43 -04:00
|
|
|
duplicate_ips = duplicate_ips.exclude(role=IPAddressRoleChoices.ROLE_ANYCAST)
|
2020-10-02 10:40:05 -04:00
|
|
|
# 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(
|
2020-11-19 15:59:11 -05:00
|
|
|
address=str(instance.address)
|
2020-06-23 16:39:43 -04:00
|
|
|
).filter(
|
2020-11-19 15:59:11 -05:00
|
|
|
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)
|
2022-02-09 14:10:54 -05:00
|
|
|
related_ips_table.configure(request)
|
2020-06-23 16:39:43 -04:00
|
|
|
|
2022-06-06 16:28:33 +02:00
|
|
|
# Find services belonging to the IP
|
|
|
|
service_filter = Q(ipaddresses=instance)
|
|
|
|
|
|
|
|
# Find services listening on all IPs on the assigned device/vm
|
2022-06-23 14:11:59 -04:00
|
|
|
try:
|
|
|
|
if instance.assigned_object and instance.assigned_object.parent_object:
|
|
|
|
parent_object = instance.assigned_object.parent_object
|
|
|
|
|
|
|
|
if isinstance(parent_object, VirtualMachine):
|
|
|
|
service_filter |= (Q(virtual_machine=parent_object) & Q(ipaddresses=None))
|
|
|
|
elif isinstance(parent_object, Device):
|
|
|
|
service_filter |= (Q(device=parent_object) & Q(ipaddresses=None))
|
|
|
|
except AttributeError:
|
|
|
|
pass
|
2022-06-06 16:28:33 +02:00
|
|
|
|
|
|
|
services = Service.objects.restrict(request.user, 'view').filter(service_filter)
|
2022-05-13 09:40:24 -05:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-06-23 16:39:43 -04:00
|
|
|
'parent_prefixes_table': parent_prefixes_table,
|
|
|
|
'duplicate_ips_table': duplicate_ips_table,
|
2020-10-02 10:40:05 -04:00
|
|
|
'more_duplicate_ips': duplicate_ips.count() > 10,
|
2020-06-23 16:39:43 -04:00
|
|
|
'related_ips_table': related_ips_table,
|
2022-05-13 09:40:24 -05:00
|
|
|
'services': services,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class IPAddressEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = IPAddress.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.IPAddressForm
|
2016-05-09 13:10:37 -04:00
|
|
|
template_name = 'ipam/ipaddress_edit.html'
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2021-12-14 11:28:13 -05:00
|
|
|
def alter_object(self, obj, request, url_args, url_kwargs):
|
2017-08-29 15:26:35 -04:00
|
|
|
|
2020-06-24 09:52:22 -04:00
|
|
|
if 'interface' in request.GET:
|
2017-08-29 15:26:35 -04:00
|
|
|
try:
|
2020-06-24 09:52:22 -04:00
|
|
|
obj.assigned_object = Interface.objects.get(pk=request.GET['interface'])
|
2017-08-29 15:26:35 -04:00
|
|
|
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
|
|
|
|
|
2021-11-11 14:05:35 -05:00
|
|
|
elif 'fhrpgroup' in request.GET:
|
|
|
|
try:
|
|
|
|
obj.assigned_object = FHRPGroup.objects.get(pk=request.GET['fhrpgroup'])
|
|
|
|
except (ValueError, FHRPGroup.DoesNotExist):
|
|
|
|
pass
|
|
|
|
|
2017-08-29 15:26:35 -04:00
|
|
|
return obj
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
# TODO: Standardize or remove this view
|
2020-11-11 16:07:38 -05:00
|
|
|
class IPAddressAssignView(generic.ObjectView):
|
2017-11-10 11:58:59 -05:00
|
|
|
"""
|
|
|
|
Search for IPAddresses to be assigned to an Interface.
|
|
|
|
"""
|
2020-05-22 09:51:57 -04:00
|
|
|
queryset = IPAddress.objects.all()
|
2017-11-10 11:58:59 -05:00
|
|
|
|
|
|
|
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:
|
2017-11-10 11:58:59 -05:00
|
|
|
return redirect('ipam:ipaddress_add')
|
|
|
|
|
2018-11-27 10:52:24 -05:00
|
|
|
return super().dispatch(request, *args, **kwargs)
|
2017-11-10 11:58:59 -05:00
|
|
|
|
|
|
|
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)
|
2017-11-10 11:58:59 -05:00
|
|
|
|
|
|
|
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'),
|
2017-11-10 11:58:59 -05:00
|
|
|
})
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class IPAddressDeleteView(generic.ObjectDeleteView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = IPAddress.objects.all()
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class IPAddressBulkCreateView(generic.BulkCreateView):
|
2020-06-22 15:58:47 -04:00
|
|
|
queryset = IPAddress.objects.all()
|
2017-09-12 13:54:44 -04:00
|
|
|
form = forms.IPAddressBulkCreateForm
|
2017-05-12 12:00:26 -04:00
|
|
|
model_form = forms.IPAddressBulkAddForm
|
|
|
|
pattern_target = 'address'
|
2016-12-20 15:39:22 -05:00
|
|
|
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()
|
2017-06-02 16:07:11 -04:00
|
|
|
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
|
2017-07-13 16:31:47 -04:00
|
|
|
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
|
2017-07-13 17:39:28 -04:00
|
|
|
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(
|
2020-12-17 14:47:49 -05:00
|
|
|
vlan_count=count_related(VLAN, 'group')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VLANGroupFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.VLANGroupFilterForm
|
2016-07-15 13:26:54 -04:00
|
|
|
table = tables.VLANGroupTable
|
|
|
|
|
|
|
|
|
2021-03-26 14:44:43 -04:00
|
|
|
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))
|
2021-05-04 09:36:01 -04:00
|
|
|
).order_by('vid')
|
2021-03-26 14:44:43 -04:00
|
|
|
vlans_count = vlans.count()
|
2021-06-22 14:16:16 -04:00
|
|
|
vlans = add_available_vlans(vlans, vlan_group=instance)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
2022-05-04 15:46:13 -04:00
|
|
|
vlans_table = tables.VLANTable(vlans, user=request.user, exclude=('group',))
|
2021-03-26 14:44:43 -04:00
|
|
|
if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'):
|
|
|
|
vlans_table.columns.show('pk')
|
2022-02-09 14:10:54 -05:00
|
|
|
vlans_table.configure(request)
|
2021-03-26 14:44:43 -04:00
|
|
|
|
2021-04-29 08:43:46 -04:00
|
|
|
# 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'),
|
|
|
|
}
|
|
|
|
|
2021-03-26 14:44:43 -04:00
|
|
|
return {
|
|
|
|
'vlans_count': vlans_count,
|
|
|
|
'vlans_table': vlans_table,
|
2021-04-29 08:43:46 -04:00
|
|
|
'permissions': permissions,
|
2021-03-26 14:44:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VLANGroupEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = VLANGroup.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.VLANGroupForm
|
2016-07-15 13:26:54 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VLANGroupDeleteView(generic.ObjectDeleteView):
|
2020-07-01 12:08:26 -04:00
|
|
|
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()
|
2017-10-09 15:42:06 -04:00
|
|
|
model_form = forms.VLANGroupCSVForm
|
|
|
|
table = tables.VLANGroupTable
|
|
|
|
|
|
|
|
|
2021-03-12 16:14:42 -05:00
|
|
|
class VLANGroupBulkEditView(generic.BulkEditView):
|
2021-03-15 20:58:23 -04:00
|
|
|
queryset = VLANGroup.objects.annotate(
|
2021-03-12 16:14:42 -05:00
|
|
|
vlan_count=count_related(VLAN, 'group')
|
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VLANGroupFilterSet
|
2021-03-12 16:14:42 -05:00
|
|
|
table = tables.VLANGroupTable
|
|
|
|
form = forms.VLANGroupBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VLANGroupBulkDeleteView(generic.BulkDeleteView):
|
2021-03-15 16:25:44 -04:00
|
|
|
queryset = VLANGroup.objects.annotate(
|
2020-12-17 14:47:49 -05:00
|
|
|
vlan_count=count_related(VLAN, 'group')
|
2020-11-25 15:49:18 -05:00
|
|
|
)
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VLANGroupFilterSet
|
2017-07-13 17:39:28 -04:00
|
|
|
table = tables.VLANGroupTable
|
2016-07-15 13:26:54 -04:00
|
|
|
|
|
|
|
|
2021-11-01 16:14:44 -04:00
|
|
|
#
|
|
|
|
# FHRP groups
|
|
|
|
#
|
|
|
|
|
|
|
|
class FHRPGroupListView(generic.ObjectListView):
|
|
|
|
queryset = FHRPGroup.objects.annotate(
|
|
|
|
member_count=count_related(FHRPGroupAssignment, 'group')
|
|
|
|
)
|
|
|
|
filterset = filtersets.FHRPGroupFilterSet
|
|
|
|
filterset_form = forms.FHRPGroupFilterForm
|
|
|
|
table = tables.FHRPGroupTable
|
|
|
|
|
|
|
|
|
|
|
|
class FHRPGroupView(generic.ObjectView):
|
|
|
|
queryset = FHRPGroup.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
# Get assigned IP addresses
|
|
|
|
ipaddress_table = tables.AssignedIPAddressesTable(
|
|
|
|
data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'),
|
|
|
|
orderable=False
|
|
|
|
)
|
|
|
|
|
2021-11-02 09:05:56 -04:00
|
|
|
# Get assigned interfaces
|
|
|
|
members_table = tables.FHRPGroupAssignmentTable(
|
|
|
|
data=FHRPGroupAssignment.objects.restrict(request.user, 'view').filter(group=instance),
|
|
|
|
orderable=False
|
2021-11-01 16:14:44 -04:00
|
|
|
)
|
|
|
|
members_table.columns.hide('group')
|
|
|
|
|
|
|
|
return {
|
|
|
|
'ipaddress_table': ipaddress_table,
|
|
|
|
'members_table': members_table,
|
|
|
|
'member_count': FHRPGroupAssignment.objects.filter(group=instance).count(),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class FHRPGroupEditView(generic.ObjectEditView):
|
|
|
|
queryset = FHRPGroup.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.FHRPGroupForm
|
2021-11-02 13:32:41 -04:00
|
|
|
template_name = 'ipam/fhrpgroup_edit.html'
|
2021-11-01 16:14:44 -04:00
|
|
|
|
2021-11-02 13:06:58 -04:00
|
|
|
def get_return_url(self, request, obj=None):
|
|
|
|
return_url = super().get_return_url(request, obj)
|
|
|
|
|
|
|
|
# If we're redirecting the user to the FHRPGroupAssignment creation form,
|
|
|
|
# initialize the group field with the FHRPGroup we just saved.
|
|
|
|
if return_url.startswith(reverse('ipam:fhrpgroupassignment_add')):
|
|
|
|
return_url += f'&group={obj.pk}'
|
|
|
|
|
|
|
|
return return_url
|
|
|
|
|
2021-11-01 16:14:44 -04:00
|
|
|
|
|
|
|
class FHRPGroupDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = FHRPGroup.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class FHRPGroupBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = FHRPGroup.objects.all()
|
|
|
|
model_form = forms.FHRPGroupCSVForm
|
|
|
|
table = tables.FHRPGroupTable
|
|
|
|
|
|
|
|
|
|
|
|
class FHRPGroupBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = FHRPGroup.objects.all()
|
|
|
|
filterset = filtersets.FHRPGroupFilterSet
|
|
|
|
table = tables.FHRPGroupTable
|
|
|
|
form = forms.FHRPGroupBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class FHRPGroupBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = FHRPGroup.objects.all()
|
|
|
|
filterset = filtersets.FHRPGroupFilterSet
|
|
|
|
table = tables.FHRPGroupTable
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
# FHRP group assignments
|
|
|
|
#
|
|
|
|
|
|
|
|
class FHRPGroupAssignmentEditView(generic.ObjectEditView):
|
|
|
|
queryset = FHRPGroupAssignment.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.FHRPGroupAssignmentForm
|
2021-11-02 13:32:41 -04:00
|
|
|
template_name = 'ipam/fhrpgroupassignment_edit.html'
|
2021-11-01 16:14:44 -04:00
|
|
|
|
2021-12-14 11:28:13 -05:00
|
|
|
def alter_object(self, instance, request, args, kwargs):
|
2021-11-01 16:14:44 -04:00
|
|
|
if not instance.pk:
|
2021-11-02 15:10:02 -04:00
|
|
|
# Assign the interface based on URL kwargs
|
2021-11-09 17:08:28 -05:00
|
|
|
content_type = get_object_or_404(ContentType, pk=request.GET.get('interface_type'))
|
2021-11-02 15:10:02 -04:00
|
|
|
instance.interface = get_object_or_404(content_type.model_class(), pk=request.GET.get('interface_id'))
|
2021-11-01 16:14:44 -04:00
|
|
|
return instance
|
|
|
|
|
|
|
|
|
|
|
|
class FHRPGroupAssignmentDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = FHRPGroupAssignment.objects.all()
|
|
|
|
|
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
#
|
|
|
|
# VLANs
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VLANListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = VLAN.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VLANFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.VLANFilterForm
|
2021-09-17 13:55:32 -04:00
|
|
|
table = tables.VLANTable
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VLANView(generic.ObjectView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = VLAN.objects.prefetch_related('site__region', 'tenant__group', 'role')
|
2016-03-01 11:23:03 -05:00
|
|
|
|
2020-11-19 15:59:11 -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'
|
|
|
|
)
|
2021-09-17 13:55:32 -04:00
|
|
|
prefix_table = tables.PrefixTable(list(prefixes), exclude=('vlan', 'utilization'), orderable=False)
|
2017-05-18 17:00:57 -04:00
|
|
|
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2017-05-18 17:00:57 -04:00
|
|
|
'prefix_table': prefix_table,
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2016-03-01 11:23:03 -05:00
|
|
|
|
|
|
|
|
2021-12-14 14:03:44 -05:00
|
|
|
class VLANInterfacesView(generic.ObjectChildrenView):
|
2020-05-21 15:39:07 -04:00
|
|
|
queryset = VLAN.objects.all()
|
2021-12-14 14:03:44 -05:00
|
|
|
child_model = Interface
|
|
|
|
table = tables.VLANDevicesTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = InterfaceFilterSet
|
2021-03-29 16:43:29 -04:00
|
|
|
template_name = 'ipam/vlan/interfaces.html'
|
2018-03-15 15:33:13 -04:00
|
|
|
|
2021-12-14 14:03:44 -05:00
|
|
|
def get_children(self, request, parent):
|
|
|
|
return parent.get_interfaces().restrict(request.user, 'view')
|
2020-09-23 11:48:32 -04:00
|
|
|
|
2021-12-14 14:03:44 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-09-23 11:48:32 -04:00
|
|
|
'active_tab': 'interfaces',
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2020-09-23 11:48:32 -04:00
|
|
|
|
2018-03-15 15:33:13 -04:00
|
|
|
|
2021-12-14 14:03:44 -05:00
|
|
|
class VLANVMInterfacesView(generic.ObjectChildrenView):
|
2020-09-23 11:48:32 -04:00
|
|
|
queryset = VLAN.objects.all()
|
2021-12-14 14:03:44 -05:00
|
|
|
child_model = VMInterface
|
|
|
|
table = tables.VLANVirtualMachinesTable
|
2021-12-14 15:31:42 -05:00
|
|
|
filterset = VMInterfaceFilterSet
|
2021-03-29 16:43:29 -04:00
|
|
|
template_name = 'ipam/vlan/vminterfaces.html'
|
2020-09-23 11:48:32 -04:00
|
|
|
|
2021-12-14 14:03:44 -05:00
|
|
|
def get_children(self, request, parent):
|
|
|
|
return parent.get_vminterfaces().restrict(request.user, 'view')
|
2018-03-15 15:33:13 -04:00
|
|
|
|
2021-12-14 14:03:44 -05:00
|
|
|
def get_extra_context(self, request, instance):
|
2020-11-19 15:59:11 -05:00
|
|
|
return {
|
2020-09-23 11:48:32 -04:00
|
|
|
'active_tab': 'vminterfaces',
|
2020-11-19 15:59:11 -05:00
|
|
|
}
|
2018-03-15 15:33:13 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class VLANEditView(generic.ObjectEditView):
|
2020-05-11 12:37:22 -04:00
|
|
|
queryset = VLAN.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
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):
|
2020-05-11 12:47:01 -04:00
|
|
|
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()
|
2017-06-02 16:07:11 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VLANFilterSet
|
2017-07-13 16:31:47 -04:00
|
|
|
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):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = VLAN.objects.prefetch_related('site', 'group', 'tenant', 'role')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.VLANFilterSet
|
2017-07-13 17:39:28 -04:00
|
|
|
table = tables.VLANTable
|
2016-12-15 15:32:58 -05:00
|
|
|
|
|
|
|
|
2022-01-12 16:42:28 -05:00
|
|
|
#
|
|
|
|
# Service templates
|
|
|
|
#
|
|
|
|
|
|
|
|
class ServiceTemplateListView(generic.ObjectListView):
|
|
|
|
queryset = ServiceTemplate.objects.all()
|
|
|
|
filterset = filtersets.ServiceTemplateFilterSet
|
|
|
|
filterset_form = forms.ServiceTemplateFilterForm
|
|
|
|
table = tables.ServiceTemplateTable
|
|
|
|
|
|
|
|
|
|
|
|
class ServiceTemplateView(generic.ObjectView):
|
|
|
|
queryset = ServiceTemplate.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ServiceTemplateEditView(generic.ObjectEditView):
|
|
|
|
queryset = ServiceTemplate.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ServiceTemplateForm
|
2022-01-12 16:42:28 -05:00
|
|
|
|
|
|
|
|
|
|
|
class ServiceTemplateDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = ServiceTemplate.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class ServiceTemplateBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = ServiceTemplate.objects.all()
|
|
|
|
model_form = forms.ServiceTemplateCSVForm
|
|
|
|
table = tables.ServiceTemplateTable
|
|
|
|
|
|
|
|
|
|
|
|
class ServiceTemplateBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = ServiceTemplate.objects.all()
|
|
|
|
filterset = filtersets.ServiceTemplateFilterSet
|
|
|
|
table = tables.ServiceTemplateTable
|
|
|
|
form = forms.ServiceTemplateBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class ServiceTemplateBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = ServiceTemplate.objects.all()
|
|
|
|
filterset = filtersets.ServiceTemplateFilterSet
|
|
|
|
table = tables.ServiceTemplateTable
|
|
|
|
|
|
|
|
|
2016-12-15 15:32:58 -05:00
|
|
|
#
|
|
|
|
# Services
|
|
|
|
#
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ServiceListView(generic.ObjectListView):
|
2020-10-30 16:52:40 -04:00
|
|
|
queryset = Service.objects.all()
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ServiceFilterSet
|
2020-01-09 20:57:13 -05:00
|
|
|
filterset_form = forms.ServiceFilterForm
|
2018-06-21 15:55:27 -04:00
|
|
|
table = tables.ServiceTable
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ServiceView(generic.ObjectView):
|
2020-07-23 12:48:03 -04:00
|
|
|
queryset = Service.objects.prefetch_related('ipaddresses')
|
2018-06-21 15:55:27 -04:00
|
|
|
|
|
|
|
|
2022-01-13 10:32:42 -05:00
|
|
|
class ServiceCreateView(generic.ObjectEditView):
|
|
|
|
queryset = Service.objects.all()
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ServiceCreateForm
|
2022-01-13 10:32:42 -05:00
|
|
|
template_name = 'ipam/service_create.html'
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ServiceEditView(generic.ObjectEditView):
|
2020-07-23 12:48:03 -04:00
|
|
|
queryset = Service.objects.prefetch_related('ipaddresses')
|
2022-03-21 10:22:30 -04:00
|
|
|
form = forms.ServiceForm
|
2016-12-15 15:32:58 -05:00
|
|
|
template_name = 'ipam/service_edit.html'
|
|
|
|
|
|
|
|
|
2022-01-12 16:42:28 -05:00
|
|
|
class ServiceDeleteView(generic.ObjectDeleteView):
|
2020-05-21 11:58:27 -04:00
|
|
|
queryset = Service.objects.all()
|
2020-03-06 16:33:43 -05:00
|
|
|
|
|
|
|
|
2022-01-12 16:42:28 -05:00
|
|
|
class ServiceBulkImportView(generic.BulkImportView):
|
2020-05-11 12:47:01 -04:00
|
|
|
queryset = Service.objects.all()
|
2022-01-12 16:42:28 -05:00
|
|
|
model_form = forms.ServiceCSVForm
|
|
|
|
table = tables.ServiceTable
|
2018-06-21 15:55:27 -04:00
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ServiceBulkEditView(generic.BulkEditView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Service.objects.prefetch_related('device', 'virtual_machine')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ServiceFilterSet
|
2018-06-21 15:55:27 -04:00
|
|
|
table = tables.ServiceTable
|
|
|
|
form = forms.ServiceBulkEditForm
|
|
|
|
|
|
|
|
|
2020-11-11 16:07:38 -05:00
|
|
|
class ServiceBulkDeleteView(generic.BulkDeleteView):
|
2019-08-19 01:53:39 -04:00
|
|
|
queryset = Service.objects.prefetch_related('device', 'virtual_machine')
|
2021-04-29 16:38:56 -04:00
|
|
|
filterset = filtersets.ServiceFilterSet
|
2018-06-21 15:55:27 -04:00
|
|
|
table = tables.ServiceTable
|
2022-06-27 23:24:50 -05:00
|
|
|
|
|
|
|
|
|
|
|
# L2VPN
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNListView(generic.ObjectListView):
|
|
|
|
queryset = L2VPN.objects.all()
|
|
|
|
table = L2VPNTable
|
|
|
|
filterset = filtersets.L2VPNFilterSet
|
|
|
|
filterset_form = forms.L2VPNFilterForm
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNView(generic.ObjectView):
|
|
|
|
queryset = L2VPN.objects.all()
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
|
|
terminations = L2VPNTermination.objects.restrict(request.user, 'view').filter(l2vpn=instance)
|
|
|
|
terminations_table = tables.L2VPNTerminationTable(terminations, user=request.user, exclude=('l2vpn', ))
|
|
|
|
terminations_table.configure(request)
|
|
|
|
|
|
|
|
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 {
|
|
|
|
'terminations_table': terminations_table,
|
|
|
|
'import_targets_table': import_targets_table,
|
|
|
|
'export_targets_table': export_targets_table,
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNEditView(generic.ObjectEditView):
|
|
|
|
queryset = L2VPN.objects.all()
|
|
|
|
form = forms.L2VPNForm
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = L2VPN.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = L2VPN.objects.all()
|
|
|
|
model_form = forms.L2VPNCSVForm
|
|
|
|
table = tables.L2VPNTable
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNBulkEditView(generic.BulkEditView):
|
|
|
|
queryset = L2VPN.objects.all()
|
|
|
|
filterset = filtersets.L2VPNFilterSet
|
|
|
|
table = tables.L2VPNTable
|
|
|
|
form = forms.L2VPNBulkEditForm
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = L2VPN.objects.all()
|
|
|
|
filterset = filtersets.L2VPNFilterSet
|
|
|
|
table = tables.L2VPNTable
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNTerminationListView(generic.ObjectListView):
|
|
|
|
queryset = L2VPNTermination.objects.all()
|
|
|
|
table = L2VPNTerminationTable
|
|
|
|
filterset = filtersets.L2VPNTerminationFilterSet
|
|
|
|
filterset_form = forms.L2VPNTerminationFilterForm
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNTerminationView(generic.ObjectView):
|
|
|
|
queryset = L2VPNTermination.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNTerminationEditView(generic.ObjectEditView):
|
|
|
|
queryset = L2VPNTermination.objects.all()
|
|
|
|
form = forms.L2VPNTerminationForm
|
|
|
|
template_name = 'ipam/l2vpntermination_edit.html'
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNTerminationDeleteView(generic.ObjectDeleteView):
|
|
|
|
queryset = L2VPNTermination.objects.all()
|
|
|
|
|
|
|
|
|
|
|
|
class L2VPNTerminationBulkImportView(generic.BulkImportView):
|
|
|
|
queryset = L2VPNTermination.objects.all()
|
|
|
|
model_form = forms.L2VPNTerminationCSVForm
|
|
|
|
table = tables.L2VPNTerminationTable
|
|
|
|
|
|
|
|
|
2022-06-29 16:01:20 -05:00
|
|
|
class L2VPNTerminationBulkEditView(generic.BulkEditView):
|
2022-06-27 23:24:50 -05:00
|
|
|
queryset = L2VPNTermination.objects.all()
|
|
|
|
filterset = filtersets.L2VPNTerminationFilterSet
|
|
|
|
table = tables.L2VPNTerminationTable
|
2022-06-29 16:01:20 -05:00
|
|
|
form = forms.L2VPNTerminationBulkEditForm
|
2018-06-21 15:55:27 -04:00
|
|
|
|
|
|
|
|
2022-06-29 16:01:20 -05:00
|
|
|
class L2VPNTerminationBulkDeleteView(generic.BulkDeleteView):
|
|
|
|
queryset = L2VPNTermination.objects.all()
|
|
|
|
filterset = filtersets.L2VPNTerminationFilterSet
|
|
|
|
table = tables.L2VPNTerminationTable
|