|
7 | 7 | from circuits.models import Provider, Circuit |
8 | 8 | from circuits.tables import ProviderTable |
9 | 9 | from dcim.filtersets import InterfaceFilterSet |
10 | | -from dcim.models import Interface, Site |
| 10 | +from dcim.models import Interface, Site, Device |
11 | 11 | from dcim.tables import SiteTable |
12 | 12 | from netbox.views import generic |
13 | 13 | from utilities.utils import count_related |
14 | 14 | from virtualization.filtersets import VMInterfaceFilterSet |
15 | | -from virtualization.models import VMInterface |
| 15 | +from virtualization.models import VMInterface, VirtualMachine |
16 | 16 | from . import filtersets, forms, tables |
17 | 17 | from .constants import * |
18 | 18 | from .models import * |
@@ -676,7 +676,19 @@ def get_extra_context(self, request, instance): |
676 | 676 | related_ips_table = tables.IPAddressTable(related_ips, orderable=False) |
677 | 677 | related_ips_table.configure(request) |
678 | 678 |
|
679 | | - services = Service.objects.restrict(request.user, 'view').filter(ipaddresses=instance) |
| 679 | + # Find services belonging to the IP |
| 680 | + service_filter = Q(ipaddresses=instance) |
| 681 | + |
| 682 | + # Find services listening on all IPs on the assigned device/vm |
| 683 | + if instance.assigned_object and instance.assigned_object.parent_object: |
| 684 | + parent_object = instance.assigned_object.parent_object |
| 685 | + |
| 686 | + if isinstance(parent_object, VirtualMachine): |
| 687 | + service_filter |= (Q(virtual_machine=parent_object) & Q(ipaddresses=None)) |
| 688 | + elif isinstance(parent_object, Device): |
| 689 | + service_filter |= (Q(device=parent_object) & Q(ipaddresses=None)) |
| 690 | + |
| 691 | + services = Service.objects.restrict(request.user, 'view').filter(service_filter) |
680 | 692 |
|
681 | 693 | return { |
682 | 694 | 'parent_prefixes_table': parent_prefixes_table, |
|
0 commit comments