From b976cf758177716cdafc61f98fbc66e7f4cdb18d Mon Sep 17 00:00:00 2001 From: ArfiArfath21 <76872284+ArfiArfath21@users.noreply.github.com> Date: Fri, 16 Oct 2026 23:47:35 +0530 Subject: [PATCH] fix(utils): reject mi, ni and ui as quantity suffixes parse_quantity and format_quantity only rejected 'ki' among the binary suffixes, so 'mi', 'ni' and 'ui' were accepted as base-1024 negative exponents (e.g. parse_quantity('1mi') == 1/1024). Binary suffixes are limited to Ki, Mi, Gi, Ti, Pi and Ei. --- kubernetes/e2e_test/test_utils.py | 9 +++++++++ kubernetes/utils/quantity.py | 9 ++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/kubernetes/e2e_test/test_utils.py b/kubernetes/e2e_test/test_utils.py index 702ddee8cc..ff9ebb35da 100644 --- a/kubernetes/e2e_test/test_utils.py +++ b/kubernetes/e2e_test/test_utils.py @@ -688,6 +688,11 @@ def test_parse_quantity(self): self.assertRaises( ValueError, lambda: quantity.parse_quantity("1000ki") ) + # "m", "n" and "u" are base 1000 only; there is no mi, ni or ui + for invalid in ("1mi", "1ni", "1ui"): + self.assertRaises( + ValueError, lambda: quantity.parse_quantity(invalid) + ) self.assertRaises(ValueError, lambda: quantity.parse_quantity("1000foo")) self.assertRaises(ValueError, lambda: quantity.parse_quantity("foo")) self.assertRaises( @@ -732,6 +737,10 @@ def test_format_quantity(self): self.assertRaises( ValueError, lambda: quantity.format_quantity(Decimal(1_000), "ki") ) + for invalid in ("mi", "ni", "ui"): + self.assertRaises( + ValueError, lambda: quantity.format_quantity(Decimal(1_000), invalid) + ) self.assertRaises( ValueError, lambda: quantity.format_quantity(Decimal(1_000), "foo") ) diff --git a/kubernetes/utils/quantity.py b/kubernetes/utils/quantity.py index f01befa65d..009f6b486e 100644 --- a/kubernetes/utils/quantity.py +++ b/kubernetes/utils/quantity.py @@ -26,6 +26,9 @@ "E": 6, } +# Only these prefixes exist in base 1024 (Ki, Mi, Gi, Ti, Pi, Ei). +_BINARY_PREFIXES = "KMGTPE" + def parse_quantity(quantity): """ @@ -74,8 +77,8 @@ def parse_quantity(quantity): else: raise ValueError("{} has unknown suffix".format(quantity)) - # handle SI inconsistency - if suffix == "ki": + # handle SI inconsistency: "ki", "mi", "ni" and "ui" are not valid binary suffixes + if base == 1024 and suffix[0] not in _BINARY_PREFIXES: raise ValueError("{} has unknown suffix".format(quantity)) if suffix[0] not in _EXPONENTS: @@ -133,7 +136,7 @@ def format_quantity(quantity_value, suffix, quantize=None) -> str: else: raise ValueError(f"{quantity_value} has unknown suffix") - if suffix == "ki": + if base == 1024 and suffix[0] not in _BINARY_PREFIXES: raise ValueError(f"{quantity_value} has unknown suffix") if suffix[0] not in _EXPONENTS: