Skip to content

Commit 7154d4a

Browse files
authored
Closes #20953: Show interfaces bridged to an interface in the UI (#21010)
1 parent da64c56 commit 7154d4a

File tree

3 files changed

+28
-15
lines changed

3 files changed

+28
-15
lines changed

netbox/dcim/api/serializers_/device_components.py

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from django.utils.translation import gettext as _
21
from django.contrib.contenttypes.models import ContentType
2+
from django.utils.translation import gettext as _
33
from drf_spectacular.utils import extend_schema_field
44
from rest_framework import serializers
55

@@ -183,6 +183,7 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect
183183
type = ChoiceField(choices=InterfaceTypeChoices)
184184
parent = NestedInterfaceSerializer(required=False, allow_null=True)
185185
bridge = NestedInterfaceSerializer(required=False, allow_null=True)
186+
bridge_interfaces = NestedInterfaceSerializer(many=True, read_only=True)
186187
lag = NestedInterfaceSerializer(required=False, allow_null=True)
187188
mode = ChoiceField(choices=InterfaceModeChoices, required=False, allow_blank=True)
188189
duplex = ChoiceField(choices=InterfaceDuplexChoices, required=False, allow_blank=True, allow_null=True)
@@ -222,13 +223,13 @@ class Meta:
222223
model = Interface
223224
fields = [
224225
'id', 'url', 'display_url', 'display', 'device', 'vdcs', 'module', 'name', 'label', 'type', 'enabled',
225-
'parent', 'bridge', 'lag', 'mtu', 'mac_address', 'primary_mac_address', 'mac_addresses', 'speed', 'duplex',
226-
'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'poe_mode', 'poe_type',
227-
'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan',
228-
'vlan_translation_policy', 'mark_connected', 'cable', 'cable_end', 'wireless_link', 'link_peers',
229-
'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', 'connected_endpoints',
230-
'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created',
231-
'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied',
226+
'parent', 'bridge', 'bridge_interfaces', 'lag', 'mtu', 'mac_address', 'primary_mac_address',
227+
'mac_addresses', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel',
228+
'poe_mode', 'poe_type', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'untagged_vlan',
229+
'tagged_vlans', 'qinq_svlan', 'vlan_translation_policy', 'mark_connected', 'cable', 'cable_end',
230+
'wireless_link', 'link_peers', 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination',
231+
'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields',
232+
'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied',
232233
]
233234
brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied')
234235

netbox/dcim/views.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from circuits.models import Circuit, CircuitTermination
1515
from extras.views import ObjectConfigContextView, ObjectRenderConfigView
16-
from ipam.models import ASN, IPAddress, Prefix, VLANGroup, VLAN
16+
from ipam.models import ASN, IPAddress, Prefix, VLAN, VLANGroup
1717
from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable
1818
from netbox.object_actions import *
1919
from netbox.views import generic
@@ -2900,6 +2900,7 @@ def get_extra_context(self, request, instance):
29002900

29012901
return {
29022902
'vdc_table': vdc_table,
2903+
'bridge_interfaces': bridge_interfaces,
29032904
'bridge_interfaces_table': bridge_interfaces_table,
29042905
'child_interfaces_table': child_interfaces_table,
29052906
'vlan_table': vlan_table,

netbox/templates/dcim/interface.html

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,19 @@ <h2 class="card-header">{% trans "Related Interfaces" %}</h2>
112112
<th scope="row">{% trans "Bridge" %}</th>
113113
<td>{{ object.bridge|linkify|placeholder }}</td>
114114
</tr>
115+
<tr>
116+
<th scope="row">{% trans "Bridged Interfaces" %}</th>
117+
<td>
118+
{% if bridge_interfaces %}
119+
{% for interface in bridge_interfaces %}
120+
{{ interface|linkify }}
121+
{% if not forloop.last %}<br />{% endif %}
122+
{% endfor %}
123+
{% else %}
124+
{{ ''|placeholder }}
125+
{% endif %}
126+
</td>
127+
</tr>
115128
<tr>
116129
<th scope="row">{% trans "LAG" %}</th>
117130
<td>{{ object.lag|linkify|placeholder }}</td>
@@ -435,13 +448,11 @@ <h2 class="card-header">
435448
</div>
436449
</div>
437450
{% endif %}
438-
{% if object.is_bridge %}
439-
<div class="row mb-3">
440-
<div class="col col-md-12">
441-
{% include 'inc/panel_table.html' with table=bridge_interfaces_table heading="Bridge Interfaces" %}
442-
</div>
451+
<div class="row mb-3">
452+
<div class="col col-md-12">
453+
{% include 'inc/panel_table.html' with table=bridge_interfaces_table heading="Bridged Interfaces" %}
443454
</div>
444-
{% endif %}
455+
</div>
445456
<div class="row mb-3">
446457
<div class="col col-md-12">
447458
{% include 'inc/panel_table.html' with table=child_interfaces_table heading="Child Interfaces" %}

0 commit comments

Comments
 (0)