Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

17686 config option for disk divider #18011

Open
wants to merge 8 commits into
base: main
Choose a base branch
from
5 changes: 5 additions & 0 deletions netbox/netbox/configuration_example.py
Original file line number Diff line number Diff line change
Expand Up @@ -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_BASE_UNIT = 1024
RAM_BASE_UNIT = 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'
Expand Down
6 changes: 6 additions & 0 deletions netbox/netbox/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,12 @@
STORAGE_CONFIG = getattr(configuration, 'STORAGE_CONFIG', {})
TIME_ZONE = getattr(configuration, 'TIME_ZONE', 'UTC')
TRANSLATION_ENABLED = getattr(configuration, 'TRANSLATION_ENABLED', True)
DISK_BASE_UNIT = getattr(configuration, 'DISK_BASE_UNIT', 1000)
if DISK_BASE_UNIT not in [1000, 1024]:
raise ImproperlyConfigured(f"DISK_BASE_UNIT must be 1000 or 1024 (found {DISK_BASE_UNIT})")
RAM_BASE_UNIT = getattr(configuration, 'MEMORY_UNIT_DIVISOR', 1000)
if RAM_BASE_UNIT not in [1000, 1024]:
raise ImproperlyConfigured(f"RAM_BASE_UNIT must be 1000 or 1024 (found {RAM_BASE_UNIT})")

# Load any dynamic configuration parameters which have been hard-coded in the configuration file
for param in CONFIG_PARAMS:
Expand Down
4 changes: 2 additions & 2 deletions netbox/templates/virtualization/cluster.html
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ <h2 class="card-header">{% trans "Allocated Resources" %}</h2>
<th scope="row"><i class="mdi mdi-chip"></i> {% trans "Memory" %}</th>
<td>
{% if memory_sum %}
<span title={{ memory_sum }}>{{ memory_sum|humanize_megabytes }}</span>
<span title={{ memory_sum }}>{{ memory_sum|humanize_ram_megabytes }}</span>
{% else %}
{{ ''|placeholder }}
{% endif %}
Expand All @@ -73,7 +73,7 @@ <h2 class="card-header">{% trans "Allocated Resources" %}</h2>
<th scope="row"><i class="mdi mdi-harddisk"></i> {% trans "Disk Space" %}</th>
<td>
{% if disk_sum %}
{{ disk_sum|humanize_megabytes }}
{{ disk_sum|humanize_disk_megabytes }}
{% else %}
{{ ''|placeholder }}
{% endif %}
Expand Down
2 changes: 1 addition & 1 deletion netbox/templates/virtualization/virtualdisk.html
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ <h2 class="card-header">{% trans "Virtual Disk" %}</h2>
<th scope="row"><i class="mdi mdi-harddisk"></i> {% trans "Size" %}</th>
<td>
{% if object.size %}
{{ object.size|humanize_megabytes }}
{{ object.size|humanize_disk_megabytes }}
{% else %}
{{ ''|placeholder }}
{% endif %}
Expand Down
4 changes: 2 additions & 2 deletions netbox/templates/virtualization/virtualmachine.html
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ <h2 class="card-header">{% trans "Resources" %}</h2>
<th scope="row"><i class="mdi mdi-chip"></i> {% trans "Memory" %}</th>
<td>
{% if object.memory %}
<span title={{ object.memory }}>{{ object.memory|humanize_megabytes }}</span>
<span title={{ object.memory }}>{{ object.memory|humanize_ram_megabytes }}</span>
{% else %}
{{ ''|placeholder }}
{% endif %}
Expand All @@ -141,7 +141,7 @@ <h2 class="card-header">{% trans "Resources" %}</h2>
</th>
<td>
{% if object.disk %}
{{ object.disk|humanize_megabytes }}
{{ object.disk|humanize_disk_megabytes }}
{% else %}
{{ ''|placeholder }}
{% endif %}
Expand Down
31 changes: 25 additions & 6 deletions netbox/utilities/templatetags/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@
from core.models import ObjectType
from utilities.forms import get_selected_values, TableConfigForm
from utilities.views import get_viewname
from netbox.settings import DISK_BASE_UNIT, RAM_BASE_UNIT

__all__ = (
'applied_filters',
'as_range',
'divide',
'get_item',
'get_key',
'humanize_megabytes',
'humanize_disk_megabytes',
'humanize_ram_megabytes',
'humanize_speed',
'icon_from_status',
'kg_to_pounds',
Expand Down Expand Up @@ -84,17 +86,16 @@ def humanize_speed(speed):
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"
Expand All @@ -105,6 +106,24 @@ def humanize_megabytes(mb):
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_BASE_UNIT setting to determine the divisor. Default is 1000.
"""
return _humanize_megabytes(mb, DISK_BASE_UNIT)


@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_BASE_UNIT setting to determine the divisor. Default is 1000.
"""
return _humanize_megabytes(mb, RAM_BASE_UNIT)


@register.filter()
def divide(x, y):
"""
Expand Down
5 changes: 3 additions & 2 deletions netbox/virtualization/migrations/0040_convert_disk_size.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from django.db import migrations
from django.db.models import F, Sum
from netbox.settings import DISK_BASE_UNIT


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_BASE_UNIT)

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_BASE_UNIT)

# Recalculate disk size on all VMs with virtual disks
id_list = VirtualDisk.objects.values_list('virtual_machine_id').distinct()
Expand Down
6 changes: 3 additions & 3 deletions netbox/virtualization/tables/virtualmachines.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
from .template_code import *

Expand Down Expand Up @@ -93,7 +93,7 @@ class Meta(NetBoxTable.Meta):
)

def render_disk(self, value):
return humanize_megabytes(value)
return humanize_disk_megabytes(value)


#
Expand Down Expand Up @@ -183,7 +183,7 @@ class Meta(NetBoxTable.Meta):
}

def render_size(self, value):
return humanize_megabytes(value)
return humanize_disk_megabytes(value)


class VirtualMachineVirtualDiskTable(VirtualDiskTable):
Expand Down