From 58c9c3f238e71c69b5b4a760c47a1788cd657ea9 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Thu, 21 May 2020 14:43:25 +0100 Subject: [PATCH] hardware: Raise useful error for invalid mempage size The 'hw:mem_page_size' extra spec allows you to specify values in three ways: via a relative size alias (large, small, any), via exact byte values, and via an SI/IEC/mixed representation (e.g. 2MB, 1GB). Currently, attempting to use an invalid variant of the latter, such as '2M', will raise a rather confusing error message: Invalid memory page size '0' Correct this so we instead see something like so: Invalid memory page size '2M' Changes: nova/virt/hardware.py NOTE(stephenfin): We need to drop use of 'raise...from', which is Python 3-only syntax. The net effect of this change is uglier (but still valid) tracebacks. Change-Id: I3af99f03514904da09f7b71f430b43bf75e8be67 Signed-off-by: Stephen Finucane Closes-Bug: #1879964 (cherry picked from commit f76d09b19d5b7530b7e4e9fc255835f6aff5db6a) (cherry picked from commit eedc0b5ff319b3cce42dba4c4720bcb98798e064) --- nova/tests/unit/virt/test_hardware.py | 12 ++++++++++-- nova/virt/hardware.py | 18 ++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/nova/tests/unit/virt/test_hardware.py b/nova/tests/unit/virt/test_hardware.py index eb015d735669..9201177fe27c 100644 --- a/nova/tests/unit/virt/test_hardware.py +++ b/nova/tests/unit/virt/test_hardware.py @@ -2429,15 +2429,23 @@ class VirtMemoryPagesTestCase(test.NoDBTestCase): spec={"hw:mem_page_size": "2048"})) def test_get_requested_mempages_pagesize_from_flavor_invalid(self): - self.assertRaises( + ex = self.assertRaises( exception.MemoryPageSizeInvalid, self._test_get_requested_mempages_pagesize, {"hw:mem_page_size": "foo"}) + self.assertIn("foo", str(ex)) - self.assertRaises( + ex = self.assertRaises( exception.MemoryPageSizeInvalid, self._test_get_requested_mempages_pagesize, {"hw:mem_page_size": "-42"}) + self.assertIn("-42", str(ex)) + + ex = self.assertRaises( + exception.MemoryPageSizeInvalid, + self._test_get_requested_mempages_pagesize, + {"hw:mem_page_size": "2M"}) + self.assertIn("2M", str(ex)) def test_get_requested_mempages_pagesizes_from_flavor_suffix_sweep(self): self.assertEqual( diff --git a/nova/virt/hardware.py b/nova/virt/hardware.py index 65852c948251..4a275b6beb0c 100644 --- a/nova/virt/hardware.py +++ b/nova/virt/hardware.py @@ -1341,21 +1341,15 @@ def _get_numa_pagesize_constraint(flavor, image_meta): return MEMPAGES_LARGE elif request == "small": return MEMPAGES_SMALL - else: - try: - request = int(request) - except ValueError: - try: - request = strutils.string_to_bytes( - request, return_int=True) / units.Ki - except ValueError: - request = 0 + elif request.isdigit(): + return int(request) - if request <= 0: + try: + return strutils.string_to_bytes( + request, return_int=True) / units.Ki + except ValueError: raise exception.MemoryPageSizeInvalid(pagesize=request) - return request - flavor_request, image_request = _get_flavor_image_meta( 'mem_page_size', flavor, image_meta)