| |
@@ -16,7 +16,6 @@
|
| |
import shlex
|
| |
import signal
|
| |
import socket
|
| |
- import atexit
|
| |
import shutil
|
| |
import random
|
| |
import logging
|
| |
@@ -98,20 +97,39 @@
|
| |
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 @@
|
| |
# Kill the qemu process
|
| |
try:
|
| |
os.kill(proc.pid, signal.SIGTERM)
|
| |
+ AdditionalDrives.cleanup()
|
| |
except OSError:
|
| |
pass
|
| |
shutil.rmtree(directory)
|
| |
add support to usb mass storage devices on qemu inventory
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