From fbe388b26ad611c21b4abcad63c0acee8d8988ac Mon Sep 17 00:00:00 2001 From: Cole Robinson Date: Fri, 14 Jun 2019 11:24:10 -0400 Subject: [PATCH] virt-install: Warn if mem less than OS recommended And if mem is abnormally low, like it appears user tried to specify GiB not MiB --- tests/clitest.py | 3 ++- virt-install | 18 ++++++++++++++++++ virtinst/osdict.py | 14 ++++++++++++-- 3 files changed, 32 insertions(+), 3 deletions(-) diff --git a/tests/clitest.py b/tests/clitest.py index 937d39cd..8f1ee5bc 100644 --- a/tests/clitest.py +++ b/tests/clitest.py @@ -795,7 +795,8 @@ c.add_invalid("--features smm=on --machine pc") # smm=on doesn't work for machi c = vinst.add_category("nodisk-install", "--nographics --noautoconsole --nodisks") c.add_valid("--hvm --cdrom %(EXISTIMG1)s") # Simple cdrom install -c.add_valid("--os-variant winxp --cdrom %(EXISTIMG1)s") # Windows (2 stage) install +c.add_valid("--pxe --ram 16", grep="Requested memory 16 MiB is abnormally low") # catch low memory error +c.add_valid("--os-variant winxp --ram 32 --cdrom %(EXISTIMG1)s", grep="32 MiB is less than the recommended 64 MiB") # Windows. Catch memory warning c.add_valid("--pxe --virt-type test") # Explicit virt-type c.add_valid("--arch i686 --pxe") # Explicitly fullvirt + arch c.add_valid("--location location=%(TREEDIR)s") # Directory tree URL install diff --git a/virt-install b/virt-install index 779c1ec1..5493426d 100755 --- a/virt-install +++ b/virt-install @@ -339,6 +339,23 @@ def _show_nographics_warnings(options, guest, installer): return +def _show_memory_warnings(guest): + if not guest.currentMemory: + return + + res = guest.osinfo.get_recommended_resources() + rammb = guest.currentMemory // 1024 + minram = (res.get_minimum_ram(guest.os.arch) or 0) + if minram: + if (minram // 1024) > guest.currentMemory: + logging.warning(_("Requested memory %s MiB is less than the " + "recommended %s MiB for OS %s"), rammb, + minram // (1024 * 1024), guest.osinfo.name) + elif rammb < 17: + logging.warning(_("Requested memory %s MiB is abnormally low. " + "Were you trying to specify GiB?"), rammb) + + def show_warnings(options, guest, installer, osdata): if options.pxe and not supports_pxe(guest): logging.warning(_("The guest's network configuration does not support " @@ -353,6 +370,7 @@ def show_warnings(options, guest, installer, osdata): logging.warning(_("No operating system detected, VM performance may " "suffer. Specify an OS with --os-variant for optimal results.")) + _show_memory_warnings(guest) _show_nographics_warnings(options, guest, installer) diff --git a/virtinst/osdict.py b/virtinst/osdict.py index 79616d29..c24a0445 100644 --- a/virtinst/osdict.py +++ b/virtinst/osdict.py @@ -307,6 +307,11 @@ class _OsResources: if checkarch in resources and key in resources[checkarch]: return resources[checkarch][key] + def _get_minimum_key(self, key, arch): + val = self._get_key(self._minimum, key, arch) + if val and val > 0: + return val + def _get_recommended_key(self, key, arch): val = self._get_key(self._recommended, key, arch) if val and val > 0: @@ -314,11 +319,16 @@ class _OsResources: # If we are looking for a recommended value, but the OS # DB only has minimum resources tracked, double the minimum # value as an approximation at a 'recommended' value - val = self._get_key(self._minimum, key, arch) - if val and val > 0: + val = self._get_minimum_key(key, arch) + if val: + logging.debug("No recommended value found for key='%s', " + "using minimum=%s * 2", key, val) return val * 2 return None + def get_minimum_ram(self, arch): + return self._get_minimum_key("ram", arch) + def get_recommended_ram(self, arch): return self._get_recommended_key("ram", arch)