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'

Change-Id: I3af99f03514904da09f7b71f430b43bf75e8be67
Signed-off-by: Stephen Finucane <stephenfin@redhat.com>
Closes-Bug: #1879964
(cherry picked from commit f76d09b19d)
This commit is contained in:
Stephen Finucane 2020-05-21 14:43:25 +01:00 committed by sunhao
parent 5cacfaab82
commit eedc0b5ff3
2 changed files with 17 additions and 15 deletions

View File

@ -2431,15 +2431,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(

View File

@ -1343,20 +1343,14 @@ 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:
raise exception.MemoryPageSizeInvalid(pagesize=request)
return request
try:
return strutils.string_to_bytes(
request, return_int=True) / units.Ki
except ValueError:
raise exception.MemoryPageSizeInvalid(pagesize=request) from None
flavor_request, image_request = _get_flavor_image_meta(
'mem_page_size', flavor, image_meta)