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