Convert values based on different values based on one specified
unit.

Signed-off-by: Yiqiao Pu <[email protected]>
---
 virttest/utils_misc.py |   43 +++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/virttest/utils_misc.py b/virttest/utils_misc.py
index d525a6c..af58091 100644
--- a/virttest/utils_misc.py
+++ b/virttest/utils_misc.py
@@ -1359,3 +1359,46 @@ def signal_program(program_name, sig=signal.SIGTERM, 
pid_files_dir=None):
     pid = get_pid_from_file(program_name, pid_files_dir)
     if pid:
         utils.signal_pid(pid, sig)
+
+
+def standard_value(value_str, standard_unit="M", base="1024"):
+    """
+    return the value based on the standard unit given
+
+    @param value_str: a string include the data and unit
+    @param standard_unit: the unit of the result based
+    @param base: the base between two adjacent unit. Normally could be 1024
+                 or 1000
+    """
+    def _get_unit_index(unit_list, unit_value):
+        for i in unit_list:
+            stand_unit = re.findall("[\s\d](%s)" % i, str(unit_value), re.I)
+            if stand_unit:
+                return unit_list.index(stand_unit[0].upper())
+        return -1
+
+    unit_list = ['B', 'K', 'M', 'G', 'T']
+    try:
+        data = float(re.findall("[\d\.]+",value_str)[0])
+    except IndexError:
+        logging.warn("The format is not right. Please check %s"
+                     " has both data and unit." % value_str)
+        return ""
+
+    unit_index = _get_unit_index(unit_list, value_str)
+    stand_index = _get_unit_index(unit_list, " %s" % standard_unit)
+
+    if unit_index < 0 or stand_index < 0:
+        logging.warn("Unknown unit. Please check your value '%s' and standard"
+                     " unit '%s'" % (value_str, standard_unit))
+        return ""
+
+    if unit_index > stand_index:
+        multiple = float(base)
+    else:
+        multiple = float(1) / float(base)
+
+    for _ in range(abs(unit_index - stand_index)):
+        data *= multiple
+
+    return str(data)
-- 
1.7.7.6

_______________________________________________
Virt-test-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-test-devel

Reply via email to