cli: Expose default console handling through _AutoconsoleData

Rework all console queries to go through that object API

Signed-off-by: Cole Robinson <crobinso@redhat.com>
This commit is contained in:
Cole Robinson 2019-11-24 18:10:56 -05:00
parent 44c519200c
commit 85a33caa76
3 changed files with 77 additions and 63 deletions

View File

@ -78,9 +78,8 @@ def parse_args():
#######################
def start_convert(guest, installer, options):
autoconsole = cli.parse_autoconsole(options.autoconsole)
if autoconsole.is_default():
conscb = cli.get_console_cb(guest)
autoconsole = cli.parse_autoconsole(options, guest)
conscb = autoconsole.get_console_cb()
print_stdout(_("Creating guest '%s'.") % guest.name)
domain = installer.start_install(guest)
cli.connect_console(guest, domain, conscb, True, False)

View File

@ -263,7 +263,7 @@ def convert_wait_zero(options):
# Historical back compat, --wait 0 is identical to --noautoconsole
if options.wait == 0:
log.warning("Treating --wait 0 as --noautoconsole")
options.autoconsole = False
options.autoconsole = "none"
options.wait = None
@ -319,13 +319,11 @@ def validate_required_options(options, guest, installer):
fail(msg)
def show_console_warnings(options, guest, installer):
if guest.devices.graphics:
def show_console_warnings(installer, autoconsole):
if not installer.cdrom:
return
if not options.autoconsole:
if not autoconsole.is_text():
return
if installer.cdrom:
log.warning(_("CDROM media does not print to the text console "
"by default, so you likely will not see text install output. "
"You might want to use --location.") + " " +
@ -633,13 +631,12 @@ class WaitHandler:
def start_install(guest, installer, options):
show_console_warnings(options, guest, installer)
autoconsole = cli.parse_autoconsole(options.autoconsole)
autoconsole = cli.parse_autoconsole(options, guest)
show_console_warnings(installer, autoconsole)
conscb = autoconsole.get_console_cb()
conscb = None
if autoconsole.is_default():
conscb = cli.get_console_cb(guest)
if not conscb and options.wait is None:
conscb = autoconsole.get_console_cb()
if autoconsole.is_default() and not conscb and options.wait is None:
# If there isn't any console to actually connect up,
# default to --wait -1 to get similarish behavior
log.warning(_("No console to launch for the guest, "

View File

@ -393,8 +393,6 @@ def _gfx_console(guest, domain):
if guest.has_gl() or guest.has_listen_none():
args.append("--attach")
log.debug("Launching virt-viewer for graphics type '%s'",
guest.devices.graphics[0].type)
return _run_console(domain, args)
@ -403,7 +401,6 @@ def _txt_console(guest, domain):
"--connect", guest.conn.uri,
"console", guest.name]
log.debug("Connecting to text console")
return _run_console(domain, args)
@ -430,33 +427,6 @@ def connect_console(guest, domain, consolecb, wait, destroy_on_exit):
domain.destroy()
def get_console_cb(guest):
gdevs = guest.devices.graphics
if not gdevs:
return _txt_console
gtype = gdevs[0].type
if gtype not in ["default",
DeviceGraphics.TYPE_VNC,
DeviceGraphics.TYPE_SPICE]:
log.debug("No viewer to launch for graphics type '%s'", gtype)
return
if not HAS_VIRTVIEWER and not in_testsuite(): # pragma: no cover
log.warning(_("Unable to connect to graphical console: "
"virt-viewer not installed. Please install "
"the 'virt-viewer' package."))
return None
if (not os.environ.get("DISPLAY", "") and
not in_testsuite()): # pragma: no cover
log.warning(_("Graphics requested but DISPLAY is not set. "
"Not running virt-viewer."))
return None
return _gfx_console
def get_meter():
import virtinst.progress
quiet = (get_global_state().quiet or in_testsuite())
@ -563,8 +533,8 @@ def add_misc_options(grp, prompt=False, replace=False,
default=False, help=argparse.SUPPRESS)
if noautoconsole:
grp.add_argument("--noautoconsole", action="store_false",
dest="autoconsole", default=True,
grp.add_argument("--noautoconsole", action="store_const",
dest="autoconsole", const="none", default="default",
help=_("Don't automatically try to connect to the guest console"))
if noreboot:
@ -1726,18 +1696,66 @@ def parse_os_variant(optstr):
# --noautoconsole parsing #
###########################
def _determine_default_autoconsole_type(guest):
"""
Determine the default console for the passed guest config
:returns: 'text', 'graphical', or None
"""
gdevs = guest.devices.graphics
if not gdevs:
return "text"
gtype = gdevs[0].type
if gtype not in ["default",
DeviceGraphics.TYPE_VNC,
DeviceGraphics.TYPE_SPICE]:
log.debug("No viewer to launch for graphics type '%s'", gtype)
return None
if not HAS_VIRTVIEWER and not in_testsuite(): # pragma: no cover
log.warning(_("Unable to connect to graphical console: "
"virt-viewer not installed. Please install "
"the 'virt-viewer' package."))
return None
if (not os.environ.get("DISPLAY", "") and
not in_testsuite()): # pragma: no cover
log.warning(_("Graphics requested but DISPLAY is not set. "
"Not running virt-viewer."))
return None
return "graphical"
class _AutoconsoleData(object):
def __init__(self, autoconsole):
def __init__(self, autoconsole, guest):
self._autoconsole = autoconsole
if self._autoconsole not in ["none", "default", "text", "graphical"]:
fail(_("Unknown autoconsole type '%s'") % self._autoconsole)
def is_none(self):
return self._autoconsole is False
self._is_default = self._autoconsole == "default"
if self._is_default:
default = _determine_default_autoconsole_type(guest)
self._autoconsole = default or "none"
def is_text(self):
return self._autoconsole == "text"
def is_graphical(self):
return self._autoconsole == "graphical"
def is_default(self):
return self._autoconsole is True
return self._is_default
def get_console_cb(self):
if self.is_graphical():
return _gfx_console
if self.is_text():
return _txt_console
return None
def parse_autoconsole(optstr):
return _AutoconsoleData(optstr)
def parse_autoconsole(options, guest):
return _AutoconsoleData(options.autoconsole, guest)
######################