scripts/qemu.py: support adding a console with the default serial device

The set_console() utility function either adds a device based on the
explicitly given device type, or adds a known good type of device
based on the machine type.

But, for a number of machine types, it may be impossible or
inconvenient to add the devices by means of "-device" command line
options, and then it may better to just use the "-serial" option and
let QEMU itself, based on the machine type, set the device
accordingly.

To achieve that, the behavior of set_console() now flags the intention
to add a console device on launch(), and if no explicit device type is
given the "-serial" option is going to be added to the QEMU command
line, instead of raising exceptions.

Based on testing with different machine types, the CONSOLE_DEV_TYPES
is not necessary anymore, so it's being removed, as is the logic to
use it.

Signed-off-by: Cleber Rosa <crosa@redhat.com>
Reviewed-by: Cornelia Huck <cohuck@redhat.com>
Message-Id: <20190312171824.5134-13-crosa@redhat.com>
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
Cleber Rosa 2019-03-12 13:18:16 -04:00 committed by Eduardo Habkost
parent 0d1d74e5e5
commit 123990adbf

View file

@ -41,17 +41,6 @@ def kvm_available(target_arch=None):
return os.access("/dev/kvm", os.R_OK | os.W_OK) return os.access("/dev/kvm", os.R_OK | os.W_OK)
#: Maps machine types to the preferred console device types
CONSOLE_DEV_TYPES = {
r'^clipper$': 'isa-serial',
r'^malta': 'isa-serial',
r'^(pc.*|q35.*|isapc)$': 'isa-serial',
r'^(40p|powernv|prep)$': 'isa-serial',
r'^pseries.*': 'spapr-vty',
r'^s390-ccw-virtio.*': 'sclpconsole',
}
class QEMUMachineError(Exception): class QEMUMachineError(Exception):
""" """
Exception called when an error in QEMUMachine happens. Exception called when an error in QEMUMachine happens.
@ -130,6 +119,7 @@ class QEMUMachine(object):
self._temp_dir = None self._temp_dir = None
self._launched = False self._launched = False
self._machine = None self._machine = None
self._console_set = False
self._console_device_type = None self._console_device_type = None
self._console_address = None self._console_address = None
self._console_socket = None self._console_socket = None
@ -248,13 +238,17 @@ class QEMUMachine(object):
'-display', 'none', '-vga', 'none'] '-display', 'none', '-vga', 'none']
if self._machine is not None: if self._machine is not None:
args.extend(['-machine', self._machine]) args.extend(['-machine', self._machine])
if self._console_device_type is not None: if self._console_set:
self._console_address = os.path.join(self._temp_dir, self._console_address = os.path.join(self._temp_dir,
self._name + "-console.sock") self._name + "-console.sock")
chardev = ('socket,id=console,path=%s,server,nowait' % chardev = ('socket,id=console,path=%s,server,nowait' %
self._console_address) self._console_address)
device = '%s,chardev=console' % self._console_device_type args.extend(['-chardev', chardev])
args.extend(['-chardev', chardev, '-device', device]) if self._console_device_type is None:
args.extend(['-serial', 'chardev:console'])
else:
device = '%s,chardev=console' % self._console_device_type
args.extend(['-device', device])
return args return args
def _pre_launch(self): def _pre_launch(self):
@ -480,30 +474,20 @@ class QEMUMachine(object):
line. line.
This is a convenience method that will either use the provided This is a convenience method that will either use the provided
device type, of if not given, it will used the device type set device type, or default to a "-serial chardev:console" command
on CONSOLE_DEV_TYPES. line argument.
The actual setting of command line arguments will be be done at The actual setting of command line arguments will be be done at
machine launch time, as it depends on the temporary directory machine launch time, as it depends on the temporary directory
to be created. to be created.
@param device_type: the device type, such as "isa-serial" @param device_type: the device type, such as "isa-serial". If
@raises: QEMUMachineAddDeviceError if the device type is not given None is given (the default value) a "-serial
and can not be determined. chardev:console" command line argument will
be used instead, resorting to the machine's
default device type.
""" """
if device_type is None: self._console_set = True
if self._machine is None:
raise QEMUMachineAddDeviceError("Can not add a console device:"
" QEMU instance without a "
"defined machine type")
for regex, device in CONSOLE_DEV_TYPES.items():
if re.match(regex, self._machine):
device_type = device
break
if device_type is None:
raise QEMUMachineAddDeviceError("Can not add a console device:"
" no matching console device "
"type definition")
self._console_device_type = device_type self._console_device_type = device_type
@property @property