diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 674fa5b8f..46925d3eb 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -25,6 +25,7 @@ from utilities.views import ( BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, ComponentCreateView, ComponentDeleteView, ComponentEditView, ObjectDeleteView, ObjectEditView, ObjectListView, ) +from virtualization.models import VirtualMachine from . import filters, forms, tables from .constants import CONNECTION_STATUS_CONNECTED from .models import ( @@ -134,6 +135,7 @@ class SiteView(View): 'prefix_count': Prefix.objects.filter(site=site).count(), 'vlan_count': VLAN.objects.filter(site=site).count(), 'circuit_count': Circuit.objects.filter(terminations__site=site).count(), + 'vm_count': VirtualMachine.objects.filter(cluster__site=site).count(), } rack_groups = RackGroup.objects.filter(site=site).annotate(rack_count=Count('racks')) topology_maps = TopologyMap.objects.filter(site=site) diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index 228eec4c8..efc98c3d0 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -211,6 +211,10 @@

{{ stats.circuit_count }}

Circuits

+
+

{{ stats.vm_count }}

+

Virtual Machines

+
diff --git a/netbox/virtualization/filters.py b/netbox/virtualization/filters.py index ac5b2436c..1563e57a8 100644 --- a/netbox/virtualization/filters.py +++ b/netbox/virtualization/filters.py @@ -88,6 +88,17 @@ class VirtualMachineFilter(CustomFieldFilterSet): queryset=Cluster.objects.all(), label='Cluster (ID)', ) + site_id = django_filters.ModelMultipleChoiceFilter( + name='cluster__site', + queryset=Site.objects.all(), + label='Site (ID)', + ) + site = django_filters.ModelMultipleChoiceFilter( + name='cluster__site__slug', + queryset=Site.objects.all(), + to_field_name='slug', + label='Site (slug)', + ) role_id = django_filters.ModelMultipleChoiceFilter( queryset=DeviceRole.objects.all(), label='Role (ID)', diff --git a/netbox/virtualization/forms.py b/netbox/virtualization/forms.py index 01d8b5765..50e2816f1 100644 --- a/netbox/virtualization/forms.py +++ b/netbox/virtualization/forms.py @@ -344,6 +344,11 @@ class VirtualMachineFilterForm(BootstrapMixin, CustomFieldFilterForm): queryset=Cluster.objects.annotate(filter_count=Count('virtual_machines')), label='Cluster' ) + site = FilterChoiceField( + queryset=Site.objects.annotate(filter_count=Count('clusters__virtual_machines')), + to_field_name='slug', + null_option=(0, 'None') + ) role = FilterChoiceField( queryset=DeviceRole.objects.filter(vm_role=True).annotate(filter_count=Count('virtual_machines')), to_field_name='slug',