|
|
@@ -2,14 +2,23 @@ import django_tables2 as tables
|
|
|
from django.utils.safestring import mark_safe
|
|
|
from django_tables2.utils import Accessor
|
|
|
|
|
|
-from dcim.models import Interface
|
|
|
from tenancy.tables import TenantColumn
|
|
|
from utilities.tables import (
|
|
|
- BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn,
|
|
|
+ BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn,
|
|
|
ToggleColumn, UtilizationColumn,
|
|
|
)
|
|
|
-from virtualization.models import VMInterface
|
|
|
-from .models import *
|
|
|
+from ipam.models import *
|
|
|
+
|
|
|
+__all__ = (
|
|
|
+ 'AggregateTable',
|
|
|
+ 'InterfaceIPAddressTable',
|
|
|
+ 'IPAddressAssignTable',
|
|
|
+ 'IPAddressTable',
|
|
|
+ 'IPRangeTable',
|
|
|
+ 'PrefixTable',
|
|
|
+ 'RIRTable',
|
|
|
+ 'RoleTable',
|
|
|
+)
|
|
|
|
|
|
AVAILABLE_LABEL = mark_safe('<span class="badge bg-success">Available</span>')
|
|
|
|
|
|
@@ -66,114 +75,6 @@ VRF_LINK = """
|
|
|
{% endif %}
|
|
|
"""
|
|
|
|
|
|
-VRF_TARGETS = """
|
|
|
-{% for rt in value.all %}
|
|
|
- <a href="{{ rt.get_absolute_url }}">{{ rt }}</a>{% if not forloop.last %}<br />{% endif %}
|
|
|
-{% empty %}
|
|
|
- —
|
|
|
-{% endfor %}
|
|
|
-"""
|
|
|
-
|
|
|
-VLAN_LINK = """
|
|
|
-{% if record.pk %}
|
|
|
- <a href="{{ record.get_absolute_url }}">{{ record.vid }}</a>
|
|
|
-{% elif perms.ipam.add_vlan %}
|
|
|
- <a href="{% url 'ipam:vlan_add' %}?vid={{ record.vid }}{% if record.vlan_group %}&group={{ record.vlan_group.pk }}{% endif %}" class="btn btn-sm btn-success">{{ record.available }} VLAN{{ record.available|pluralize }} available</a>
|
|
|
-{% else %}
|
|
|
- {{ record.available }} VLAN{{ record.available|pluralize }} available
|
|
|
-{% endif %}
|
|
|
-"""
|
|
|
-
|
|
|
-VLAN_PREFIXES = """
|
|
|
-{% for prefix in record.prefixes.all %}
|
|
|
- <a href="{% url 'ipam:prefix' pk=prefix.pk %}">{{ prefix }}</a>{% if not forloop.last %}<br />{% endif %}
|
|
|
-{% empty %}
|
|
|
- —
|
|
|
-{% endfor %}
|
|
|
-"""
|
|
|
-
|
|
|
-VLAN_ROLE_LINK = """
|
|
|
-{% if record.role %}
|
|
|
- <a href="{% url 'ipam:vlan_list' %}?role={{ record.role.slug }}">{{ record.role }}</a>
|
|
|
-{% else %}
|
|
|
- —
|
|
|
-{% endif %}
|
|
|
-"""
|
|
|
-
|
|
|
-VLANGROUP_ADD_VLAN = """
|
|
|
-{% with next_vid=record.get_next_available_vid %}
|
|
|
- {% if next_vid and perms.ipam.add_vlan %}
|
|
|
- <a href="{% url 'ipam:vlan_add' %}?group={{ record.pk }}&vid={{ next_vid }}" title="Add VLAN" class="btn btn-sm btn-success">
|
|
|
- <i class="mdi mdi-plus-thick" aria-hidden="true"></i>
|
|
|
- </a>
|
|
|
- {% endif %}
|
|
|
-{% endwith %}
|
|
|
-"""
|
|
|
-
|
|
|
-VLAN_MEMBER_TAGGED = """
|
|
|
-{% if record.untagged_vlan_id == object.pk %}
|
|
|
- <span class="text-danger"><i class="mdi mdi-close-thick"></i></span>
|
|
|
-{% else %}
|
|
|
- <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
|
|
|
-{% endif %}
|
|
|
-"""
|
|
|
-
|
|
|
-
|
|
|
-#
|
|
|
-# VRFs
|
|
|
-#
|
|
|
-
|
|
|
-class VRFTable(BaseTable):
|
|
|
- pk = ToggleColumn()
|
|
|
- name = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- rd = tables.Column(
|
|
|
- verbose_name='RD'
|
|
|
- )
|
|
|
- tenant = TenantColumn()
|
|
|
- enforce_unique = BooleanColumn(
|
|
|
- verbose_name='Unique'
|
|
|
- )
|
|
|
- import_targets = tables.TemplateColumn(
|
|
|
- template_code=VRF_TARGETS,
|
|
|
- orderable=False
|
|
|
- )
|
|
|
- export_targets = tables.TemplateColumn(
|
|
|
- template_code=VRF_TARGETS,
|
|
|
- orderable=False
|
|
|
- )
|
|
|
- tags = TagColumn(
|
|
|
- url_name='ipam:vrf_list'
|
|
|
- )
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = VRF
|
|
|
- fields = (
|
|
|
- 'pk', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tags',
|
|
|
- )
|
|
|
- default_columns = ('pk', 'name', 'rd', 'tenant', 'description')
|
|
|
-
|
|
|
-
|
|
|
-#
|
|
|
-# Route targets
|
|
|
-#
|
|
|
-
|
|
|
-class RouteTargetTable(BaseTable):
|
|
|
- pk = ToggleColumn()
|
|
|
- name = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- tenant = TenantColumn()
|
|
|
- tags = TagColumn(
|
|
|
- url_name='ipam:vrf_list'
|
|
|
- )
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = RouteTarget
|
|
|
- fields = ('pk', 'name', 'tenant', 'description', 'tags')
|
|
|
- default_columns = ('pk', 'name', 'tenant', 'description')
|
|
|
-
|
|
|
|
|
|
#
|
|
|
# RIRs
|
|
|
@@ -215,13 +116,6 @@ class AggregateTable(BaseTable):
|
|
|
format="Y-m-d",
|
|
|
verbose_name='Added'
|
|
|
)
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = Aggregate
|
|
|
- fields = ('pk', 'prefix', 'rir', 'tenant', 'date_added', 'description')
|
|
|
-
|
|
|
-
|
|
|
-class AggregateDetailTable(AggregateTable):
|
|
|
child_count = tables.Column(
|
|
|
verbose_name='Prefixes'
|
|
|
)
|
|
|
@@ -233,7 +127,8 @@ class AggregateDetailTable(AggregateTable):
|
|
|
url_name='ipam:aggregate_list'
|
|
|
)
|
|
|
|
|
|
- class Meta(AggregateTable.Meta):
|
|
|
+ class Meta(BaseTable.Meta):
|
|
|
+ model = Aggregate
|
|
|
fields = ('pk', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description', 'tags')
|
|
|
default_columns = ('pk', 'prefix', 'rir', 'tenant', 'child_count', 'utilization', 'date_added', 'description')
|
|
|
|
|
|
@@ -332,20 +227,6 @@ class PrefixTable(BaseTable):
|
|
|
mark_utilized = BooleanColumn(
|
|
|
verbose_name='Marked Utilized'
|
|
|
)
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = Prefix
|
|
|
- fields = (
|
|
|
- 'pk', 'prefix', 'prefix_flat', 'status', 'depth', 'children', 'vrf', 'tenant', 'site', 'vlan', 'role',
|
|
|
- 'is_pool', 'mark_utilized', 'description',
|
|
|
- )
|
|
|
- default_columns = ('pk', 'prefix', 'status', 'vrf', 'tenant', 'site', 'vlan', 'role', 'description')
|
|
|
- row_attrs = {
|
|
|
- 'class': lambda record: 'success' if not record.pk else '',
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-class PrefixDetailTable(PrefixTable):
|
|
|
utilization = PrefixUtilizationColumn(
|
|
|
accessor='get_utilization',
|
|
|
orderable=False
|
|
|
@@ -354,7 +235,8 @@ class PrefixDetailTable(PrefixTable):
|
|
|
url_name='ipam:prefix_list'
|
|
|
)
|
|
|
|
|
|
- class Meta(PrefixTable.Meta):
|
|
|
+ class Meta(BaseTable.Meta):
|
|
|
+ model = Prefix
|
|
|
fields = (
|
|
|
'pk', 'prefix', 'prefix_flat', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan', 'role',
|
|
|
'is_pool', 'mark_utilized', 'description', 'tags',
|
|
|
@@ -362,6 +244,9 @@ class PrefixDetailTable(PrefixTable):
|
|
|
default_columns = (
|
|
|
'pk', 'prefix', 'status', 'children', 'vrf', 'utilization', 'tenant', 'site', 'vlan', 'role', 'description',
|
|
|
)
|
|
|
+ row_attrs = {
|
|
|
+ 'class': lambda record: 'success' if not record.pk else '',
|
|
|
+ }
|
|
|
|
|
|
|
|
|
#
|
|
|
@@ -427,25 +312,11 @@ class IPAddressTable(BaseTable):
|
|
|
orderable=False,
|
|
|
verbose_name='Device/VM'
|
|
|
)
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = IPAddress
|
|
|
- fields = (
|
|
|
- 'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'assigned_object', 'assigned_object_parent', 'dns_name',
|
|
|
- 'description',
|
|
|
- )
|
|
|
- row_attrs = {
|
|
|
- 'class': lambda record: 'success' if not isinstance(record, IPAddress) else '',
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-class IPAddressDetailTable(IPAddressTable):
|
|
|
nat_inside = tables.Column(
|
|
|
linkify=True,
|
|
|
orderable=False,
|
|
|
verbose_name='NAT (Inside)'
|
|
|
)
|
|
|
- tenant = TenantColumn()
|
|
|
assigned = BooleanColumn(
|
|
|
accessor='assigned_object_id',
|
|
|
verbose_name='Assigned'
|
|
|
@@ -454,14 +325,18 @@ class IPAddressDetailTable(IPAddressTable):
|
|
|
url_name='ipam:ipaddress_list'
|
|
|
)
|
|
|
|
|
|
- class Meta(IPAddressTable.Meta):
|
|
|
+ class Meta(BaseTable.Meta):
|
|
|
+ model = IPAddress
|
|
|
fields = (
|
|
|
- 'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'assigned', 'dns_name',
|
|
|
- 'description', 'tags',
|
|
|
+ 'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'assigned', 'dns_name', 'description',
|
|
|
+ 'tags',
|
|
|
)
|
|
|
default_columns = (
|
|
|
'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'assigned', 'dns_name', 'description',
|
|
|
)
|
|
|
+ row_attrs = {
|
|
|
+ 'class': lambda record: 'success' if not isinstance(record, IPAddress) else '',
|
|
|
+ }
|
|
|
|
|
|
|
|
|
class IPAddressAssignTable(BaseTable):
|
|
|
@@ -501,173 +376,3 @@ class InterfaceIPAddressTable(BaseTable):
|
|
|
class Meta(BaseTable.Meta):
|
|
|
model = IPAddress
|
|
|
fields = ('address', 'vrf', 'status', 'role', 'tenant', 'description')
|
|
|
-
|
|
|
-
|
|
|
-#
|
|
|
-# VLAN groups
|
|
|
-#
|
|
|
-
|
|
|
-class VLANGroupTable(BaseTable):
|
|
|
- pk = ToggleColumn()
|
|
|
- name = tables.Column(linkify=True)
|
|
|
- scope_type = ContentTypeColumn()
|
|
|
- scope = tables.Column(
|
|
|
- linkify=True,
|
|
|
- orderable=False
|
|
|
- )
|
|
|
- vlan_count = LinkedCountColumn(
|
|
|
- viewname='ipam:vlan_list',
|
|
|
- url_params={'group_id': 'pk'},
|
|
|
- verbose_name='VLANs'
|
|
|
- )
|
|
|
- actions = ButtonsColumn(
|
|
|
- model=VLANGroup,
|
|
|
- prepend_template=VLANGROUP_ADD_VLAN
|
|
|
- )
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = VLANGroup
|
|
|
- fields = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'slug', 'description', 'actions')
|
|
|
- default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description', 'actions')
|
|
|
-
|
|
|
-
|
|
|
-#
|
|
|
-# VLANs
|
|
|
-#
|
|
|
-
|
|
|
-class VLANTable(BaseTable):
|
|
|
- pk = ToggleColumn()
|
|
|
- vid = tables.TemplateColumn(
|
|
|
- template_code=VLAN_LINK,
|
|
|
- verbose_name='ID'
|
|
|
- )
|
|
|
- site = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- group = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- tenant = TenantColumn()
|
|
|
- status = ChoiceFieldColumn(
|
|
|
- default=AVAILABLE_LABEL
|
|
|
- )
|
|
|
- role = tables.TemplateColumn(
|
|
|
- template_code=VLAN_ROLE_LINK
|
|
|
- )
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = VLAN
|
|
|
- fields = ('pk', 'vid', 'name', 'site', 'group', 'tenant', 'status', 'role', 'description')
|
|
|
- row_attrs = {
|
|
|
- 'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-class VLANDetailTable(VLANTable):
|
|
|
- prefixes = tables.TemplateColumn(
|
|
|
- template_code=VLAN_PREFIXES,
|
|
|
- orderable=False,
|
|
|
- verbose_name='Prefixes'
|
|
|
- )
|
|
|
- tenant = TenantColumn()
|
|
|
- tags = TagColumn(
|
|
|
- url_name='ipam:vlan_list'
|
|
|
- )
|
|
|
-
|
|
|
- class Meta(VLANTable.Meta):
|
|
|
- fields = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags')
|
|
|
- default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description')
|
|
|
-
|
|
|
-
|
|
|
-class VLANMembersTable(BaseTable):
|
|
|
- """
|
|
|
- Base table for Interface and VMInterface assignments
|
|
|
- """
|
|
|
- name = tables.Column(
|
|
|
- linkify=True,
|
|
|
- verbose_name='Interface'
|
|
|
- )
|
|
|
- tagged = tables.TemplateColumn(
|
|
|
- template_code=VLAN_MEMBER_TAGGED,
|
|
|
- orderable=False
|
|
|
- )
|
|
|
-
|
|
|
-
|
|
|
-class VLANDevicesTable(VLANMembersTable):
|
|
|
- device = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- actions = ButtonsColumn(Interface, buttons=['edit'])
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = Interface
|
|
|
- fields = ('device', 'name', 'tagged', 'actions')
|
|
|
-
|
|
|
-
|
|
|
-class VLANVirtualMachinesTable(VLANMembersTable):
|
|
|
- virtual_machine = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- actions = ButtonsColumn(VMInterface, buttons=['edit'])
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = VMInterface
|
|
|
- fields = ('virtual_machine', 'name', 'tagged', 'actions')
|
|
|
-
|
|
|
-
|
|
|
-class InterfaceVLANTable(BaseTable):
|
|
|
- """
|
|
|
- List VLANs assigned to a specific Interface.
|
|
|
- """
|
|
|
- vid = tables.Column(
|
|
|
- linkify=True,
|
|
|
- verbose_name='ID'
|
|
|
- )
|
|
|
- tagged = BooleanColumn()
|
|
|
- site = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- group = tables.Column(
|
|
|
- accessor=Accessor('group__name'),
|
|
|
- verbose_name='Group'
|
|
|
- )
|
|
|
- tenant = TenantColumn()
|
|
|
- status = ChoiceFieldColumn()
|
|
|
- role = tables.TemplateColumn(
|
|
|
- template_code=VLAN_ROLE_LINK
|
|
|
- )
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = VLAN
|
|
|
- fields = ('vid', 'tagged', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description')
|
|
|
-
|
|
|
- def __init__(self, interface, *args, **kwargs):
|
|
|
- self.interface = interface
|
|
|
- super().__init__(*args, **kwargs)
|
|
|
-
|
|
|
-
|
|
|
-#
|
|
|
-# Services
|
|
|
-#
|
|
|
-
|
|
|
-class ServiceTable(BaseTable):
|
|
|
- pk = ToggleColumn()
|
|
|
- name = tables.Column(
|
|
|
- linkify=True
|
|
|
- )
|
|
|
- parent = tables.Column(
|
|
|
- linkify=True,
|
|
|
- order_by=('device', 'virtual_machine')
|
|
|
- )
|
|
|
- ports = tables.TemplateColumn(
|
|
|
- template_code='{{ record.port_list }}',
|
|
|
- verbose_name='Ports'
|
|
|
- )
|
|
|
- tags = TagColumn(
|
|
|
- url_name='ipam:service_list'
|
|
|
- )
|
|
|
-
|
|
|
- class Meta(BaseTable.Meta):
|
|
|
- model = Service
|
|
|
- fields = ('pk', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags')
|
|
|
- default_columns = ('pk', 'name', 'parent', 'protocol', 'ports', 'description')
|