diff --git a/netbox/netbox/utils.py b/netbox/netbox/utils.py index f27d1b5f7..27f67744b 100644 --- a/netbox/netbox/utils.py +++ b/netbox/netbox/utils.py @@ -24,3 +24,21 @@ def register_data_backend(): return cls return _wrapper + + +def convert_byte_size(value, unit="mega"): + """ + Convert a size value to unit. + """ + factors = { + "kilo": 1024, + "mega": 1024 ** 2, + "giga": 1024 ** 3, + "tera": 1024 ** 4, + } + if value: + if len(str(value)) < 6: + return value + value_converted = float(value) / factors[unit] + return value_converted + return 0 diff --git a/netbox/templates/virtualization/cluster.html b/netbox/templates/virtualization/cluster.html index 264a275e9..d74ead0fa 100644 --- a/netbox/templates/virtualization/cluster.html +++ b/netbox/templates/virtualization/cluster.html @@ -59,9 +59,9 @@ {% trans "Memory" %} {% if memory_sum %} - {{ memory_sum|humanize_megabytes }} + {{ memory_sum }} {% trans "MB" context "Abbreviation for megabyte" %} {% else %} - {{ ''|placeholder }} + {{ ''|placeholder }} {% endif %} diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 1ddd2c92d..775561e95 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -16,6 +16,7 @@ from extras.views import ObjectConfigContextView from ipam.models import IPAddress from ipam.tables import InterfaceVLANTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS +from netbox.utils import convert_byte_size from netbox.views import generic from tenancy.views import ObjectContactsView from utilities.query import count_related @@ -172,7 +173,17 @@ class ClusterView(generic.ObjectView): queryset = Cluster.objects.all() def get_extra_context(self, request, instance): - return instance.virtual_machines.aggregate(vcpus_sum=Sum('vcpus'), memory_sum=Sum('memory'), disk_sum=Sum('disk')) + vm_memory = [convert_byte_size(item.memory, 'mega') for item in instance.virtual_machines.all() if item.memory] + vm_disk = [convert_byte_size(item.disk, 'giga') for item in instance.virtual_machines.all() if item.disk] + + memory_sum = sum(vm_memory) + disk_sum = sum(vm_disk) + + extra_content = instance.virtual_machines.aggregate(vcpus_sum=Sum('vcpus')) + extra_content['memory_sum'] = f"{memory_sum:.0f}" + extra_content['disk_sum'] = f"{disk_sum:.0f}" + + return extra_content @register_model_view(Cluster, 'virtualmachines', path='virtual-machines')