gen_config_lib: Add storage_size_num filter 35/52435/1
authorAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Thu, 22 Feb 2018 00:31:50 +0000 (01:31 +0100)
committerAlexandru Avadanii <Alexandru.Avadanii@enea.com>
Thu, 22 Feb 2018 00:48:39 +0000 (01:48 +0100)
New filter for converting PDF disk_capacity strings into a numeric
only string (to bypass scientific notation), parsable as float.

Change-Id: I779bec7db03ef1b3ce1bfd6ca239a3e7b4021eb2
Signed-off-by: Alexandru Avadanii <Alexandru.Avadanii@enea.com>
config/utils/gen_config_lib.py

index e75387f..1e7229b 100644 (file)
@@ -18,6 +18,7 @@ def load_custom_filters(environment):
     # TODO deprecate ipaddr_index and netmask for the better ipnet ones
     filter_list = {
         'dpkg_arch': filter_dpkg_arch,
+        'storage_size_num': filter_storage_size_num,
         'ipnet_hostaddr': filter_ipnet_hostaddr,
         'ipnet_hostmin': filter_ipnet_hostmin,
         'ipnet_hostmax': filter_ipnet_hostmax,
@@ -52,6 +53,24 @@ def filter_dpkg_arch(arch, to_dpkg=True):
         return arch_dpkg_table[arch]
 
 
+def filter_storage_size_num(size_str):
+    """Convert human-readable size string to a string convertible to float"""
+
+    # pattern: '^[1-9][\d\.]*[MGT]B?$', multiplier=1000 (not KiB)
+    if size_str.endswith('B'):
+        size_str = size_str[:-1]
+    try:
+        size_num = 1000000
+        for multiplier in ['M', 'G', 'T']:
+            if size_str.endswith(multiplier):
+                return '{:.2f}'.format(size_num * float(size_str[:-1]))
+            size_num = size_num * 1000
+        return '{:.2f}'.format(float(size_str))
+    except ValueError as ex:
+        logging.error(size_str + " is not a valid size string")
+        raise
+
+
 def filter_ipnet_hostaddr(network_cidr, index):
     """Return the host IP address on given index from an IP network"""
     try: