diff --git a/scripts/wk/hw/diags.py b/scripts/wk/hw/diags.py index 8958856a..47656bf3 100644 --- a/scripts/wk/hw/diags.py +++ b/scripts/wk/hw/diags.py @@ -1055,12 +1055,6 @@ def show_results(state) -> None: std.print_report(state.system.generate_cpu_ram_report()) std.print_standard(' ') - # Drop Disk Utilization reports (only needed for OST) - for test_group in state.test_groups: - if test_group.name == 'Disk Utilization': - for test in test_group.test_objects: - test.report = [] - # Disk Tests disk_tests_enabled = [ group.name for group in state.test_groups if 'Disk' in group.name diff --git a/scripts/wk/hw/volumes.py b/scripts/wk/hw/volumes.py index 6beefd60..707f1f15 100644 --- a/scripts/wk/hw/volumes.py +++ b/scripts/wk/hw/volumes.py @@ -2,116 +2,76 @@ # vim: sts=2 sw=2 ts=2 import logging +import re from wk import os as wk_os -from wk.cfg.hw import VOLUME_FAILURE_THRESHOLD, VOLUME_SIZE_THRESHOLD -from wk.std import PLATFORM, GenericError, bytes_to_string +from wk.cfg.hw import ( + VOLUME_FAILURE_THRESHOLD, + VOLUME_WARNING_THRESHOLD, + VOLUME_SIZE_THRESHOLD, + ) +from wk.std import PLATFORM, bytes_to_string, color_string # STATIC VARIABLES LOG = logging.getLogger(__name__) -DEV_INFO = '{dev}... {size}... {filesystem}' -MOUNT_INFO = '... Mounted on {mountpoint}... ({used} used, {free} free) {msg}' # Functions -def add_child_dev_line(test_obj, child) -> None: - """Add child device line to test report.""" - dev_info = DEV_INFO.format( - dev=child['name'], - size=bytes_to_string(child['size']), - filesystem=child['fstype'], - ) - vol_full = False +def add_dev_line(test_obj, details) -> None: + """Add device line to test report.""" + # TODO: Replace bytes_to_string with wk.hw.disk version ? + if details is test_obj.dev: + details = details.raw_details + filesystem = details['fstype'] + report_line = re.sub(r"^/dev/", " ", details['name']) + label = details['label'] + if label: + label = f', "{color_string(label, "CYAN")}"' + report_line += f' ({filesystem}{label if label else ""})' # Bail early - if not child['mountpoint']: - test_obj.report.append(dev_info) + if not filesystem: + # Skip devices without a filesystem + return + if not details['mountpoint']: + # Under Linux the volume needs to be mounted to get used space return # Get sizes percent_used = -1 - size = child['size'] - try: - if PLATFORM == 'Darwin': - size = child['TotalSize'] - free = child['FreeSpace'] - used = size - free - elif PLATFORM == 'Linux': - free = int(child['fsavail']) - used = int(child['fsused']) - if free == 0: - raise GenericError('Most likely a false positive.') - percent_used = (used / size) * 100 - except (GenericError, TypeError): - # Bail early - test_obj.report.append(f'{dev_info}... Mounted on {child["mountpoint"]}') + size = details['size'] + if PLATFORM == 'Darwin': + size = details['TotalSize'] + free = details['FreeSpace'] + used = size - free + elif PLATFORM == 'Linux': + free = int(details['fsavail']) if details['fsavail'] else -1 + used = int(details['fsused']) if details['fsused'] else -1 + percent_used = (used / size) * 100 + + # Bail early + if used < 0: + # Only include "real" devices return # Check for failures if (percent_used >= VOLUME_FAILURE_THRESHOLD - and size >= VOLUME_SIZE_THRESHOLD * 1024**3): + and size >= VOLUME_SIZE_THRESHOLD * 1024**3): test_obj.failed = True - vol_full = True - # Mount / Size info - mount_size_info = MOUNT_INFO.format( - mountpoint=child['mountpoint'], - used=bytes_to_string(used), - free=bytes_to_string(free), - msg=f'[{percent_used:0.0f}% full]' if vol_full else '', - ) + # Build and color size_line if needed + color = None + if test_obj.failed: + color = 'RED' + elif percent_used >= VOLUME_WARNING_THRESHOLD: + color = 'YELLOW' + size_line = f'{bytes_to_string(size)}' + size_line += f' ({bytes_to_string(used)} used, {percent_used:0.0f}% full)' + size_line = color_string(size_line, color) # Done - test_obj.report.append(f'{dev_info}{mount_size_info}') - - -def add_root_dev_line(test_obj) -> None: - """Add root device line to test report.""" - dev = test_obj.dev - dev_info= DEV_INFO.format( - dev=dev.name, - size=bytes_to_string(dev.size), - filesystem=dev.filesystem, - ) - vol_full = False - - # Get sizes - percent_used = -1 - size = dev.size - try: - if PLATFORM == 'Darwin': - size = dev.raw_details['TotalSize'] - free = dev.raw_details['FreeSpace'] - used = size - free - elif PLATFORM == 'Linux': - free = int(dev.raw_details['fsavail']) - used = int(dev.raw_details['fsused']) - if free == 0: - raise GenericError('Most likely a false positive.') - percent_used = (used / size) * 100 - except (GenericError, TypeError): - # Bail early - test_obj.report.append( - f'{dev_info}... Mounted on {dev.raw_details["mountpoint"]}', - ) - return - - # Check for failures - if percent_used >= VOLUME_FAILURE_THRESHOLD: - test_obj.failed = True - vol_full = True - - # Mount / Size info - mount_size_info = MOUNT_INFO.format( - mountpoint=dev.raw_details['mountpoint'], - used=bytes_to_string(used), - free=bytes_to_string(free), - msg=f'[{percent_used:0.0f}% full]' if vol_full else '', - ) - - # Done - test_obj.report.append(f'{dev_info}{mount_size_info}') + test_obj.report.append(f'{report_line} {size_line}') def check_volume_utilization(test_obj) -> None: @@ -120,14 +80,12 @@ def check_volume_utilization(test_obj) -> None: # Mount all volumes (read only if possible) mount_all_volumes(test_obj.dev) - - # Add root dev to report - add_root_dev_line(test_obj) - - # Add children dev.update_details(skip_children=False) - for child in dev.children: - add_child_dev_line(test_obj, child) + + # Build report + test_obj.report.append(color_string('Disk Utilization', 'BLUE')) + for _d in (dev, *dev.children): + add_dev_line(test_obj, _d) # Update test object if test_obj.failed: