From a6451e373180f814e887c403157fc42cac683534 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 26 Jun 2026 04:29:28 -0700 Subject: [PATCH] Fix disk._parse_numbers SI suffix multipliers off by 10x postPrefixes used "10E3" (=10000) instead of "1E3" (=1000), causing all values with K/M/G/T/P/E/Z/Y suffixes to be inflated by a factor of 10. Fix multipliers and add pytest parametrized tests. Fixes: #65490 --- changelog/65543.fixed.md | 1 + salt/modules/disk.py | 16 ++++++++-------- tests/pytests/unit/modules/test_disk.py | 22 ++++++++++++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 changelog/65543.fixed.md diff --git a/changelog/65543.fixed.md b/changelog/65543.fixed.md new file mode 100644 index 000000000000..5a614773b296 --- /dev/null +++ b/changelog/65543.fixed.md @@ -0,0 +1 @@ +Fixed ``disk._parse_numbers`` incorrectly multiplying SI suffix values by a factor of 10 (``10E3`` should be ``1E3``). diff --git a/salt/modules/disk.py b/salt/modules/disk.py index baa5cbd4008e..895e8ecdb3f8 100644 --- a/salt/modules/disk.py +++ b/salt/modules/disk.py @@ -40,14 +40,14 @@ def _parse_numbers(text): try: postPrefixes = { - "K": "10E3", - "M": "10E6", - "G": "10E9", - "T": "10E12", - "P": "10E15", - "E": "10E18", - "Z": "10E21", - "Y": "10E24", + "K": "1e3", + "M": "1e6", + "G": "1e9", + "T": "1e12", + "P": "1e15", + "E": "1e18", + "Z": "1e21", + "Y": "1e24", } if text[-1] in postPrefixes: v = decimal.Decimal(text[:-1]) diff --git a/tests/pytests/unit/modules/test_disk.py b/tests/pytests/unit/modules/test_disk.py index b7a73226ac99..5c7e4a22bf39 100644 --- a/tests/pytests/unit/modules/test_disk.py +++ b/tests/pytests/unit/modules/test_disk.py @@ -2,6 +2,8 @@ :codeauthor: Jayesh Kariya """ +import decimal + import pytest import salt.modules.disk as disk @@ -395,3 +397,23 @@ def test_format__fat(): mock.assert_any_call( ["mkfs", "-t", "fat", "-F", 12, device], ignore_retcode=True ) + + +@pytest.mark.parametrize( + "text,expected", + [ + ("42", decimal.Decimal("42")), + ("1K", decimal.Decimal("1000")), + ("1.5K", decimal.Decimal("1500")), + ("2.5M", decimal.Decimal("2500000")), + ("1G", decimal.Decimal("1000000000")), + ("1T", decimal.Decimal("1000000000000")), + ], +) +def test_parse_numbers(text, expected): + """ + Test that _parse_numbers correctly parses numeric strings with SI suffixes. + Fixes issue #65490 where postPrefixes used 10E3 instead of 1E3, causing + values to be inflated by a factor of 10. + """ + assert disk._parse_numbers(text) == expected