From 38409231bfe1dbdec1bf9583e9e13ea0cfb0ea66 Mon Sep 17 00:00:00 2001 From: Bruno Goncalves Date: Jun 05 2020 10:06:36 +0000 Subject: [PATCH 1/2] don't remove tempfile when process ends It is possible to 1st provision the VM and leave it running to only after run the playbook like example below, so tempfile can't be removed until qemu process finishes TEST_DEBUG=1 TEST_SUBJECTS=/test_subject.qcow2 ansible-inventory --inventory=/usr/share/ansible/inventory/standard-inventory-qcow2 --list --yaml | tee pipeline_inventory.yaml ansible-playbook --inventory=pipeline_inventory.yaml --extra-vars ansible_python_interpreter=/usr/bin/python3 --tags classic tests.yml --- diff --git a/inventory/standard-inventory-qcow2 b/inventory/standard-inventory-qcow2 index a22ecc8..776f34f 100755 --- a/inventory/standard-inventory-qcow2 +++ b/inventory/standard-inventory-qcow2 @@ -105,13 +105,12 @@ class AdditionalDrives(object): size = int(drive.get('size', 2 * 1024 ** 3)) # default size: 2G path = drive.get('path', None) path = str(path) if path is not None else None - drive_file = tempfile.NamedTemporaryFile(dir=path) + drive_file = tempfile.NamedTemporaryFile(dir=path, delete=False) drive_file.truncate(size) cls._tempfiles.append(drive_file) logger.info("Created temporary sparse file '%s'.", drive_file.name) # translate data into qemu command options result += ["-drive", "file=%s,media=disk,if=virtio" % drive_file.name] - atexit.register(cls.cleanup) return result @classmethod @@ -569,6 +568,7 @@ def inv_host(image): # Kill the qemu process try: os.kill(proc.pid, signal.SIGTERM) + AdditionalDrives.cleanup() except OSError: pass shutil.rmtree(directory) From f05885c2bc1f7f3e3759d6517b73aa6551ad2e05 Mon Sep 17 00:00:00 2001 From: Bruno Goncalves Date: Jun 05 2020 14:27:41 +0000 Subject: [PATCH 2/2] add support to usb mass storage devices on qemu inventory https://www.linux-kvm.org/page/USB --- diff --git a/README.md b/README.md index 5010777..ad87a9f 100644 --- a/README.md +++ b/README.md @@ -58,10 +58,14 @@ standard-inventory-qcow2: m: 3G net_nic: model: e1000 - drive: - - size: 11000000000 - path: /home/vader - - size: 2000000000 + drive: + - size: 11000000000 + path: /home/vader + - size: 2000000000 + usb_drive: + - path: /tmp + - size: 2000000000 + path: /tmp standard-inventory-docker: dumb_option: dumb_parameter @@ -77,8 +81,15 @@ standard-inventory-docker: * `drive` - has to contain dict of additional drive(s) * `drive.size` - allows to specify additional drive with size in bytes (default size: 2G) -* `drive.path` - allows to specify additional drive with custom path to its backing file +* `drive.path` - allows to specify additional drive with custom directory path to its backing file + Filename for image will be auto-generated. (default path: /tmp) +* `usb_drive` - has to contain dict of additional usb drive(s) +* `usb_drive.size` - allows to specify additional usb drive with size in bytes + (default size: 1G) +* `usb_drive.path` - allows to specify additional usb drive with custom directory path to its backing file + Filename for image will be auto-generated. + (default path: /tmp) You can open a RFE ticket to extend supported parameters according to https://qemu.weilnetz.de/doc/qemu-doc.html diff --git a/inventory/standard-inventory-qcow2 b/inventory/standard-inventory-qcow2 index 776f34f..b9f1d48 100755 --- a/inventory/standard-inventory-qcow2 +++ b/inventory/standard-inventory-qcow2 @@ -16,7 +16,6 @@ import errno import shlex import signal import socket -import atexit import shutil import random import logging @@ -98,8 +97,8 @@ class AdditionalDrives(object): list of str qemu -drive options """ - drives = fmf_get(['qemu', 'drive'], list()) result = [] + drives = fmf_get(['qemu', 'drive'], list()) for drive in drives: # create temporary sparse file size = int(drive.get('size', 2 * 1024 ** 3)) # default size: 2G @@ -111,6 +110,26 @@ class AdditionalDrives(object): logger.info("Created temporary sparse file '%s'.", drive_file.name) # translate data into qemu command options result += ["-drive", "file=%s,media=disk,if=virtio" % drive_file.name] + + usb_drives = fmf_get(['qemu', 'usb_drive'], list()) + if usb_drives: + # there is at least 1 usb device, enable usb hub + result += ["-usb"] + usb_id = 0 + for usb_drive in usb_drives: + usb_id += 1 + # create temporary sparse file + size = int(usb_drive.get('size', 1 * 1024 ** 3)) # default size: 1G + path = usb_drive.get('path', None) + path = str(path) if path is not None else None + usb_drive_file = tempfile.NamedTemporaryFile(dir=path, suffix='.img', prefix='usb_storage', delete=False) + usb_drive_file.truncate(size) + cls._tempfiles.append(usb_drive_file) + logger.info("Created temporary sparse file '%s'.", usb_drive_file.name) + # translate data into qemu command options + result += ["-drive", "id=str_usb_storage_%s,file=%s,if=none" % (usb_id, usb_drive_file.name), + "-device", "usb-storage,drive=str_usb_storage_%s" % usb_id] + return result @classmethod