Skip to content

Commit

Permalink
feat: add LogicalInterface model
Browse files Browse the repository at this point in the history
  • Loading branch information
djothi committed Sep 5, 2023
1 parent adcdbfd commit 80f8140
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 0 deletions.
36 changes: 36 additions & 0 deletions netbox_cmdb/netbox_cmdb/migrations/0037_logicalinterface.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('ipam', '0060_alter_l2vpn_slug'),
('netbox_cmdb', '0036_deviceinterface'),
]

operations = [
migrations.CreateModel(
name='LogicalInterface',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)),
('created', models.DateTimeField(auto_now_add=True, null=True)),
('last_updated', models.DateTimeField(auto_now=True, null=True)),
('index', models.PositiveSmallIntegerField()),
('mtu', models.PositiveIntegerField(blank=True, null=True)),
('type', models.CharField(default=None, max_length=2)),
('mode', models.CharField(blank=True, default=None, max_length=20, null=True)),
('description', models.CharField(blank=True, max_length=100, null=True)),
('ipv4_address', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_ipv4_address', to='ipam.ipaddress')),
('ipv6_address', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_ipv6_address', to='ipam.ipaddress')),
('native_vlan', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_native_vlan', to='netbox_cmdb.vlan')),
('parent_interface', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s', to='netbox_cmdb.deviceinterface')),
('tagged_vlans', models.ManyToManyField(blank=True, default=None, related_name='%(class)s_tagged_vlans', to='netbox_cmdb.vlan')),
('untagged_vlan', models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_untagged_vlan', to='netbox_cmdb.vlan')),
('vrf', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='%(class)s_vrf', to='netbox_cmdb.vrf')),
],
options={
'unique_together': {('index', 'parent_interface')},
},
),
]
81 changes: 81 additions & 0 deletions netbox_cmdb/netbox_cmdb/models/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,17 @@
("fc", "FireCode"),
]

LOGICAL_INTERFACE_TYPE_CHOICES = [
("l1", "L1"),
("l2", "L2"),
("l3", "L3"),
]
LOGICAL_INTERFACE_MODE_CHOICES = [
(None, "None"),
("access", "Access"),
("tagged", "Tagged"),
]


class DeviceInterface(ChangeLoggedModel):
"""A device interface configuration."""
Expand Down Expand Up @@ -40,3 +51,73 @@ def __str__(self):

class Meta:
unique_together = ("device", "name")


class LogicalInterface(ChangeLoggedModel):
"""A logical interface configuration."""

index = models.PositiveSmallIntegerField()
parent_interface = models.ForeignKey(
to="DeviceInterface",
related_name="%(class)s",
on_delete=models.CASCADE,
blank=True,
null=True,
)
mtu = models.PositiveIntegerField(blank=True, null=True)
type = models.CharField(
choices=LOGICAL_INTERFACE_TYPE_CHOICES,
max_length=2,
default=None,
)
vrf = models.ForeignKey(
to="VRF", related_name="%(class)s_vrf", on_delete=models.CASCADE, blank=True, null=True
)
ipv4_address = models.ForeignKey(
to="ipam.IPAddress",
related_name="%(class)s_ipv4_address",
on_delete=models.CASCADE,
blank=True,
null=True,
)
ipv6_address = models.ForeignKey(
to="ipam.IPAddress",
related_name="%(class)s_ipv6_address",
on_delete=models.CASCADE,
blank=True,
null=True,
)
mode = models.CharField(
choices=LOGICAL_INTERFACE_MODE_CHOICES,
blank=True,
null=True,
default=None,
max_length=20,
help_text="Interface mode (802.1Q)",
)
untagged_vlan = models.ForeignKey(
to="VLAN",
related_name="%(class)s_untagged_vlan",
on_delete=models.CASCADE,
blank=True,
null=True,
default=None,
)
tagged_vlans = models.ManyToManyField(
to="VLAN", related_name="%(class)s_tagged_vlans", blank=True, default=None
)
native_vlan = models.ForeignKey(
to="VLAN",
related_name="%(class)s_native_vlan",
on_delete=models.CASCADE,
blank=True,
null=True,
default=None,
)
description = models.CharField(max_length=100, blank=True, null=True)

def __str__(self):
return f"{self.parent_interface.name}--{self.index}"

class Meta:
unique_together = ("index", "parent_interface")

0 comments on commit 80f8140

Please sign in to comment.