From 09b771507f0d41c4be38fe852da1d944b4bffbac Mon Sep 17 00:00:00 2001 From: "mika.busch" Date: Wed, 13 Nov 2024 17:17:57 +0100 Subject: [PATCH] Closes #17686: Abillity to select disk divider --- netbox/netbox/configuration_example.py | 5 ++++ netbox/netbox/settings.py | 2 ++ netbox/templates/virtualization/cluster.html | 4 +-- .../templates/virtualization/virtualdisk.html | 2 +- .../virtualization/virtualmachine.html | 4 +-- netbox/utilities/templatetags/helpers.py | 30 ++++++++++++++----- .../migrations/0040_convert_disk_size.py | 6 ++-- .../virtualization/tables/virtualmachines.py | 6 ++-- 8 files changed, 41 insertions(+), 18 deletions(-) diff --git a/netbox/netbox/configuration_example.py b/netbox/netbox/configuration_example.py index 84ead53390f..b383960fd21 100644 --- a/netbox/netbox/configuration_example.py +++ b/netbox/netbox/configuration_example.py @@ -221,6 +221,11 @@ # database access.) Note that the user as which NetBox runs must have read and write permissions to this path. SESSION_FILE_PATH = None +# By default the memory and disk sizes are displayed using base 10 (e.g. 1000 MB = 1 GB). +# If you would like to use base 2 (e.g. 1024 MB = 1 GB) set this to 1024. +DISK_UNIT_DIVISOR = 1024 +RAM_UNIT_DIVISOR = 1024 + # By default, uploaded media is stored on the local filesystem. Using Django-storages is also supported. Provide the # class path of the storage driver in STORAGE_BACKEND and any configuration options in STORAGE_CONFIG. For example: # STORAGE_BACKEND = 'storages.backends.s3boto3.S3Boto3Storage' diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index a8ac68d4dc2..7fb358ac42e 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -179,6 +179,8 @@ STORAGE_CONFIG = getattr(configuration, 'STORAGE_CONFIG', {}) TIME_ZONE = getattr(configuration, 'TIME_ZONE', 'UTC') TRANSLATION_ENABLED = getattr(configuration, 'TRANSLATION_ENABLED', True) +DISK_UNIT_DIVISOR = getattr(configuration, 'DISK_UNIT_DIVISOR', 1000) +RAM_UNIT_DIVISOR = getattr(configuration, 'MEMORY_UNIT_DIVISOR', 1000) # Load any dynamic configuration parameters which have been hard-coded in the configuration file for param in CONFIG_PARAMS: diff --git a/netbox/templates/virtualization/cluster.html b/netbox/templates/virtualization/cluster.html index d79d8075c32..01ef1e96cbc 100644 --- a/netbox/templates/virtualization/cluster.html +++ b/netbox/templates/virtualization/cluster.html @@ -59,7 +59,7 @@

{% trans "Allocated Resources" %}

{% trans "Memory" %} {% if memory_sum %} - {{ memory_sum|humanize_megabytes }} + {{ memory_sum|humanize_ram_megabytes }} {% else %} {{ ''|placeholder }} {% endif %} @@ -69,7 +69,7 @@

{% trans "Allocated Resources" %}

{% trans "Disk Space" %} {% if disk_sum %} - {{ disk_sum|humanize_megabytes }} + {{ disk_sum|humanize_disk_megabytes }} {% else %} {{ ''|placeholder }} {% endif %} diff --git a/netbox/templates/virtualization/virtualdisk.html b/netbox/templates/virtualization/virtualdisk.html index 3284d166832..805d779a9fc 100644 --- a/netbox/templates/virtualization/virtualdisk.html +++ b/netbox/templates/virtualization/virtualdisk.html @@ -29,7 +29,7 @@

{% trans "Virtual Disk" %}

{% trans "Size" %} {% if object.size %} - {{ object.size|humanize_megabytes }} + {{ object.size|humanize_disk_megabytes }} {% else %} {{ ''|placeholder }} {% endif %} diff --git a/netbox/templates/virtualization/virtualmachine.html b/netbox/templates/virtualization/virtualmachine.html index 2bff5187080..37a42b1d46e 100644 --- a/netbox/templates/virtualization/virtualmachine.html +++ b/netbox/templates/virtualization/virtualmachine.html @@ -129,7 +129,7 @@

{% trans "Resources" %}

{% trans "Memory" %} {% if object.memory %} - {{ object.memory|humanize_megabytes }} + {{ object.memory|humanize_ram_megabytes }} {% else %} {{ ''|placeholder }} {% endif %} @@ -141,7 +141,7 @@

{% trans "Resources" %}

{% if object.disk %} - {{ object.disk|humanize_megabytes }} + {{ object.disk|humanize_disk_megabytes }} {% else %} {{ ''|placeholder }} {% endif %} diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index 3595c066695..a5717147915 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -8,6 +8,7 @@ from core.models import ObjectType from utilities.forms import get_selected_values, TableConfigForm from utilities.views import get_viewname +from netbox.settings import DISK_UNIT_DIVISOR, RAM_UNIT_DIVISOR __all__ = ( 'applied_filters', @@ -15,7 +16,8 @@ 'divide', 'get_item', 'get_key', - 'humanize_megabytes', + 'humanize_disk_megabytes', + 'humanize_ram_megabytes', 'humanize_speed', 'icon_from_status', 'kg_to_pounds', @@ -83,18 +85,16 @@ def humanize_speed(speed): else: return '{} Kbps'.format(speed) - -@register.filter() -def humanize_megabytes(mb): +def _humanize_megabytes(mb, divisor=1000): """ Express a number of megabytes in the most suitable unit (e.g. gigabytes, terabytes, etc.). """ if not mb: return "" - PB_SIZE = 1000000000 - TB_SIZE = 1000000 - GB_SIZE = 1000 + PB_SIZE = divisor**3 + TB_SIZE = divisor**2 + GB_SIZE = divisor if mb >= PB_SIZE: return f"{mb / PB_SIZE:.2f} PB" @@ -104,6 +104,22 @@ def humanize_megabytes(mb): return f"{mb / GB_SIZE:.2f} GB" return f"{mb} MB" +@register.filter() +def humanize_disk_megabytes(mb): + """ + Express a number of megabytes in the most suitable unit (e.g. gigabytes, terabytes, etc.). + Use the DISK_UNIT_DIVISOR setting to determine the divisor. Default is 1000. + """ + return _humanize_megabytes(mb, DISK_UNIT_DIVISOR) + +@register.filter() +def humanize_ram_megabytes(mb): + """ + Express a number of megabytes in the most suitable unit (e.g. gigabytes, terabytes, etc.). + Use the RAM_UNIT_DIVISOR setting to determine the divisor. Default is 1000. + """ + return _humanize_megabytes(mb, RAM_UNIT_DIVISOR) + @register.filter() def divide(x, y): diff --git a/netbox/virtualization/migrations/0040_convert_disk_size.py b/netbox/virtualization/migrations/0040_convert_disk_size.py index 6471a09082c..14d044239f7 100644 --- a/netbox/virtualization/migrations/0040_convert_disk_size.py +++ b/netbox/virtualization/migrations/0040_convert_disk_size.py @@ -1,13 +1,13 @@ from django.db import migrations from django.db.models import F, Sum - +from netbox.settings import DISK_UNIT_DIVISOR def convert_disk_size(apps, schema_editor): VirtualMachine = apps.get_model('virtualization', 'VirtualMachine') - VirtualMachine.objects.filter(disk__isnull=False).update(disk=F('disk') * 1000) + VirtualMachine.objects.filter(disk__isnull=False).update(disk=F('disk') * DISK_UNIT_DIVISOR) VirtualDisk = apps.get_model('virtualization', 'VirtualDisk') - VirtualDisk.objects.filter(size__isnull=False).update(size=F('size') * 1000) + VirtualDisk.objects.filter(size__isnull=False).update(size=F('size') * DISK_UNIT_DIVISOR) # Recalculate disk size on all VMs with virtual disks id_list = VirtualDisk.objects.values_list('virtual_machine_id').distinct() diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 8a2a26bb931..0282d4ecfd8 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -4,7 +4,7 @@ from dcim.tables.devices import BaseInterfaceTable from netbox.tables import NetBoxTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin -from utilities.templatetags.helpers import humanize_megabytes +from utilities.templatetags.helpers import humanize_disk_megabytes from virtualization.models import VirtualDisk, VirtualMachine, VMInterface __all__ = ( @@ -123,7 +123,7 @@ class Meta(NetBoxTable.Meta): ) def render_disk(self, value): - return humanize_megabytes(value) + return humanize_disk_megabytes(value) # @@ -212,7 +212,7 @@ class Meta(NetBoxTable.Meta): } def render_size(self, value): - return humanize_megabytes(value) + return humanize_disk_megabytes(value) class VirtualMachineVirtualDiskTable(VirtualDiskTable):