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 @@
Circuits
+
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',