From 43d5594826c851e2df42ed19b2861b70d77c4283 Mon Sep 17 00:00:00 2001 From: Andrei Stepanov Date: Jun 25 2018 14:53:44 +0000 Subject: Add fmf to standard-inventory-qcow2 provisioner. Signed-off-by: Andrei Stepanov --- diff --git a/inventory/standard-inventory-qcow2 b/inventory/standard-inventory-qcow2 index b0ff4be..289a4c4 100755 --- a/inventory/standard-inventory-qcow2 +++ b/inventory/standard-inventory-qcow2 @@ -4,6 +4,7 @@ import argparse import errno import json import os +import fmf import shutil import shlex import signal @@ -142,6 +143,59 @@ def write_debug_inventory(file_, host_vars): return inventory +class FmfMetadataTree(object): + """This is aux class to hold one copy FMF tree. fmf.Tree(path) could be + very resource consuming when walking through big project with many + directories. + + """ + tree = None + """fmf.Tree() object.""" + path = None + """Metadata tree is created for this path.""" + def get(self, path="."): + if self.path != path or self.tree is None: + FmfMetadataTree.path = path + FmfMetadataTree.tree = fmf.Tree(path) + return self.tree + + +def fmf_get(path, default=None): + """Return parameter from FMF at desired path or default. + + Parameters + ---------- + path: dict + List of strings. Strings form a path for looking parameter. + default: str + Function ignores this parameter. + + Returns + ------- + str + Found parameter in FMF or `default`. + + """ + tree = FmfMetadataTree().get() + path.insert(0, 'standard-inventory-qcow2') + value = default + for provision in tree.prune(names=[".*/provision$"]): + value = provision.data + for node in path: + try: + value = value[node] + except (KeyError, TypeError): + value = default + break + try: + diagnose = distutils.util.strtobool(os.getenv("TEST_DEBUG", "0")) + except ValueError: + diagnose = 0 + if diagnose: + sys.stderr.write("DIAGNOSE: fmf_get() for {}: {}\n".format(str(path), str(value))) + return value + + def start_qemu(image, cloudinit, artifacts, portrange=(2222, 5555)): for _ in range(10): port = random.randint(*portrange) @@ -166,12 +220,15 @@ def start_qemu(image, cloudinit, artifacts, portrange=(2222, 5555)): log_guest = os.path.join(artifacts, "{0}.guest.log".format(os.path.basename(image))) # Log from qemu itself. log_qemu = log_guest.replace(".guest.log", ".qemu.log") + # Parameters from FMF: + param_m = fmf_get(['qemu', 'm'], 1024) + param_net_nic_model = fmf_get(['qemu', 'net_nic', 'model'], 'virtio') # Use -cpu host and -smp by default. # virtio-rng-pci: https://wiki.qemu.org/Features/VirtIORNG qemu_cmd = ["/usr/bin/qemu-system-x86_64", "-cpu", "host", "-smp", get_qemu_smp_arg(), - "-m", "1024", image, "-enable-kvm", "-snapshot", "-cdrom", cloudinit, - "-net", "nic,model=virtio", "-net", "user,hostfwd=tcp:127.0.0.3:{0}-:22".format(port), + "-m", param_m, image, "-enable-kvm", "-snapshot", "-cdrom", cloudinit, + "-net", "nic,model=%s" % param_net_nic_model, "-net", "user,hostfwd=tcp:127.0.0.3:{0}-:22".format(port), "-device", "virtio-rng-pci", "-rtc", "base=utc", "-device", "isa-serial,chardev=pts2", "-chardev", "file,id=pts2,path=" + log_guest, "-display", "none"]