diff options
-rw-r--r-- | cloudinit/config/cc_mounts.py | 43 | ||||
-rw-r--r-- | cloudinit/util.py | 29 |
2 files changed, 59 insertions, 13 deletions
diff --git a/cloudinit/config/cc_mounts.py b/cloudinit/config/cc_mounts.py index 7af73c71..b9aa9a12 100644 --- a/cloudinit/config/cc_mounts.py +++ b/cloudinit/config/cc_mounts.py @@ -128,6 +128,7 @@ def setup_swapfile(fname, size=None, maxsize=None): size: the size to create. set to "auto" for recommended maxsize: the maximum size """ + print("fname: %s, size: %s maxsize: %s" % (fname, size, maxsize)) tdir = os.path.dirname(fname) if str(size).lower() == "auto": try: @@ -161,6 +162,32 @@ def setup_swapfile(fname, size=None, maxsize=None): return fname, size +def handle_swapcfg(swapcfg): + """handle the swap config, calling setup_swap if necessary. + return None or (filename, size) + """ + fname = swapcfg.get('filename', '/swap.img') + size = swapcfg.get('size', 0) + maxsize = swapcfg.get('maxsize', 0) + + if not (size and fname): + LOG.debug("no need to setup swap") + return + + try: + if isinstance(size, str) and size != "auto": + size = util.human2bytes(size) + if isinstance(maxsize, str): + maxsize = util.human2bytes(maxsize) + return setup_swapfile(fname=fname, size=size, maxsize=maxsize) + + except Exception as e: + LOG.warn("failed to setup swap: %s", e) + + return None + + + def handle(_name, cfg, cloud, log, _args): # fs_spec, fs_file, fs_vfstype, fs_mntops, fs-freq, fs_passno defvals = [None, None, "auto", "defaults,nobootwait", "0", "2"] @@ -248,19 +275,9 @@ def handle(_name, cfg, cloud, log, _args): else: actlist.append(x) - swapcfg = cfg.get('swap', {}) - swapfile = swapcfg.get('filename', '/swap.img') - if swapcfg.get('size') and swapfile: - try: - sret = setup_swapfile(fpath=swapfile, - size=swapcfg.get('size'), - maxsize=swapcfg.get('maxsize')) - if sret is not None: - actlist.append([sret[0], "none", "swap", "sw", "0", "0"]) - except Exception as e: - log.warn("failed to setup swap: %s", e) - else: - log.debug("no swap to setup") + swapret = handle_swapcfg(cfg.get('swap')) + if swapret: + actlist.append([swapret[0], "none", "swap", "sw", "0", "0"]) if len(actlist) == 0: log.debug("No modifications to fstab needed.") diff --git a/cloudinit/util.py b/cloudinit/util.py index 349d0155..f236d0bf 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -1978,3 +1978,32 @@ def read_meminfo(meminfo="/proc/meminfo", raw=False): ret[kmap[key]] = int(value) * mpliers[unit] return ret + + +def human2bytes(size): + """Convert human string or integer to size in bytes + 10M => 10485760 + .5G => 536870912 + """ + size_in = size + if size.endswith("B"): + size = size[:-1] + + mpliers = {'B': 1, 'K': 2 ** 10, 'M': 2 ** 20, 'G': 2 ** 30, 'T': 2 ** 40} + + num = size + mplier = 'B' + for m in mpliers: + if size.endswith(m): + mplier = m + num = size[0:-len(m)] + + try: + num = float(num) + except ValueError: + raise ValueError("'%s' is not valid input." % size_in) + + if num < 0: + raise ValueError("'%s': cannot be negative" % size_in) + + return int(num * mpliers[mplier]) |