Interface related changes

* Add filter fields to filterset for Interface filter
* Add form field to filterset form for Interface filter
* Add VDC display to interface detail template
This commit is contained in:
Daniel Sheppard 2022-11-02 09:23:57 -05:00
parent 0d3b85936e
commit a33b2a64bf
4 changed files with 37 additions and 1 deletions

View File

@ -1367,6 +1367,23 @@ class InterfaceFilterSet(
to_field_name='rd', to_field_name='rd',
label='VRF (RD)', label='VRF (RD)',
) )
vdc_id = django_filters.ModelMultipleChoiceFilter(
field_name='vdcs',
queryset=VirtualDeviceContext.objects.all(),
label='Virtual Device Context',
)
vdc_identifier = django_filters.ModelMultipleChoiceFilter(
field_name='vdcs__identifier',
queryset=VirtualDeviceContext.objects.all(),
to_field_name='identifier',
label='Virtual Device Context (Identifier)',
)
vdc = django_filters.ModelMultipleChoiceFilter(
field_name='vdcs__name',
queryset=VirtualDeviceContext.objects.all(),
to_field_name='name',
label='Virtual Device Context',
)
class Meta: class Meta:
model = Interface model = Interface

View File

@ -1107,9 +1107,18 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm):
('Addressing', ('vrf_id', 'mac_address', 'wwn')), ('Addressing', ('vrf_id', 'mac_address', 'wwn')),
('PoE', ('poe_mode', 'poe_type')), ('PoE', ('poe_mode', 'poe_type')),
('Wireless', ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')), ('Wireless', ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')),
('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'virtual_chassis_id', 'device_id')), ('Device', ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', 'virtual_chassis_id',
'device_id', 'vdc_id')),
('Connection', ('cabled', 'connected', 'occupied')), ('Connection', ('cabled', 'connected', 'occupied')),
) )
vdc_id = DynamicModelMultipleChoiceField(
queryset=VirtualDeviceContext.objects.all(),
required=False,
query_params={
'device_id': '$device_id',
},
label=_('Virtual Device Context')
)
kind = MultipleChoiceField( kind = MultipleChoiceField(
choices=InterfaceKindChoices, choices=InterfaceKindChoices,
required=False required=False

View File

@ -2441,6 +2441,14 @@ class InterfaceView(generic.ObjectView):
queryset = Interface.objects.all() queryset = Interface.objects.all()
def get_extra_context(self, request, instance): def get_extra_context(self, request, instance):
# Get assigned VDC's
vdc_table = tables.VirtualDeviceContextTable(
data=instance.vdcs.restrict(request.user, 'view').prefetch_related('device'),
exclude=('tenant', 'tenant_group', 'primary_ip', 'primary_ip4', 'primary_ip6', 'comments', 'tags',
'created', 'last_updated', 'actions', ),
orderable=False
)
# Get assigned IP addresses # Get assigned IP addresses
ipaddress_table = AssignedIPAddressesTable( ipaddress_table = AssignedIPAddressesTable(
data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'), data=instance.ip_addresses.restrict(request.user, 'view').prefetch_related('vrf', 'tenant'),
@ -2478,6 +2486,7 @@ class InterfaceView(generic.ObjectView):
) )
return { return {
'vdc_table': vdc_table,
'ipaddress_table': ipaddress_table, 'ipaddress_table': ipaddress_table,
'bridge_interfaces_table': bridge_interfaces_tables, 'bridge_interfaces_table': bridge_interfaces_tables,
'child_interfaces_table': child_interfaces_tables, 'child_interfaces_table': child_interfaces_tables,

View File

@ -116,6 +116,7 @@
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
{% include 'inc/panel_table.html' with table=vdc_table heading="Virtual Device Contexts" %}
<div class="card"> <div class="card">
<h5 class="card-header">Addressing</h5> <h5 class="card-header">Addressing</h5>
<div class="card-body"> <div class="card-body">