From 85cd57d1c5b7f1e046f831b9b1caa341b688cfb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Herv=C3=A9=20Beraud?= Date: Mon, 24 Feb 2020 20:15:48 +0100 Subject: Fix regex to correctly recognize scientific notation with QemuImgInfo qemu 4.1.0 output shifts to scientific notation at 1000mb, breaking oslo.utils. Problem here is that the qemu-img output shifts to scientific notation: 999 => 999 MiB 1000 => 1e+03 MiB The regex in python-oslo-utils does not cover this. This issue is likely regexp parsing "disk size: 1e+03 MiB" value. These changes fix that. Change-Id: I4c016865890135023ceb497de18d75ccebd5961a Closes-Bug: 1864529 (cherry picked from commit ebf8368501500767fd4e6e13602bb88950a4484b) --- oslo_utils/imageutils.py | 5 ++++- oslo_utils/tests/test_imageutils.py | 2 ++ .../image-utils-handle-scientific-notation-6f65d46e9c8c8f8c.yaml | 5 +++++ 3 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 releasenotes/notes/image-utils-handle-scientific-notation-6f65d46e9c8c8f8c.yaml diff --git a/oslo_utils/imageutils.py b/oslo_utils/imageutils.py index 14d7b5c..e4d62a1 100644 --- a/oslo_utils/imageutils.py +++ b/oslo_utils/imageutils.py @@ -44,7 +44,8 @@ class QemuImgInfo(object): BACKING_FILE_RE = re.compile((r"^(.*?)\s*\(actual\s+path\s*:" r"\s+(.*?)\)\s*$"), re.I) TOP_LEVEL_RE = re.compile(r"^([\w\d\s\_\-]+):(.*)$") - SIZE_RE = re.compile(r"(\d*\.?\d+)\s*(\w+)?(\s*\(\s*(\d+)\s+bytes\s*\))?", + SIZE_RE = re.compile(r"([0-9]+[eE][-+][0-9]+|\d*\.?\d+)" + "\s*(\w+)?(\s*\(\s*(\d+)\s+bytes\s*\))?", re.I) def __init__(self, cmd_output=None, format='human'): @@ -100,6 +101,8 @@ class QemuImgInfo(object): if not real_size: raise ValueError(_('Invalid input value "%s".') % details) magnitude = real_size.group(1) + if "e" in magnitude.lower(): + magnitude = format(float(real_size.group(1)), '.0f') unit_of_measure = real_size.group(2) bytes_info = real_size.group(3) if bytes_info: diff --git a/oslo_utils/tests/test_imageutils.py b/oslo_utils/tests/test_imageutils.py index de262e0..d4def44 100644 --- a/oslo_utils/tests/test_imageutils.py +++ b/oslo_utils/tests/test_imageutils.py @@ -69,6 +69,8 @@ class ImageUtilsRawTestCase(test_base.BaseTestCase): exp_disk_size=3328599655)), ('unavailable', dict(disk_size='unavailable', exp_disk_size=0)), + ('1e+03 MiB', dict(disk_size='1e+03 MiB', + exp_disk_size=1048576000)), ] _garbage_before_snapshot = [ diff --git a/releasenotes/notes/image-utils-handle-scientific-notation-6f65d46e9c8c8f8c.yaml b/releasenotes/notes/image-utils-handle-scientific-notation-6f65d46e9c8c8f8c.yaml new file mode 100644 index 0000000..9577fd8 --- /dev/null +++ b/releasenotes/notes/image-utils-handle-scientific-notation-6f65d46e9c8c8f8c.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + qemu 4.1.0 output shifts to scientific notation at 1000mb, + breaking oslo.utils. ``QemuImgInfo`` is now fixed to support this notation. -- cgit v1.2.1