From 6267038cc9214a182151c32f40c69b3c126f7d65 Mon Sep 17 00:00:00 2001 From: Andrei Stepanov Date: Jun 05 2020 14:29:02 +0000 Subject: Merge #386 `add support to usb mass storage devices on qemu inventory` --- 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 a22ecc8..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,20 +97,39 @@ 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 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) + + 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 @@ -569,6 +587,7 @@ def inv_host(image): # Kill the qemu process try: os.kill(proc.pid, signal.SIGTERM) + AdditionalDrives.cleanup() except OSError: pass shutil.rmtree(directory)