Currently, virt-install automatically creates memballoon device. This patch adds the option to disable memballoon device. Disable memballoon device: --memballoon none Enable memballoon device with model virtio: --memballoon virtio Signed-off-by: Eiichi Tsukata <devel@xxxxxxxxxxxx> --- AUTHORS | 1 + man/en/virt-install.pod.in | 17 ++++++++ tests/clitest.py | 6 +++ tests/xmlconfig-xml/boot-many-devices.xml | 1 + tests/xmlconfig.py | 7 +++ virt-install | 1 + virtinst/Guest.py | 3 +- virtinst/VirtualDevice.py | 4 +- virtinst/VirtualMemballoon.py | 58 +++++++++++++++++++++++++++++ virtinst/__init__.py | 3 +- virtinst/cli.py | 34 +++++++++++++++++ 11 files changed, 132 insertions(+), 3 deletions(-) create mode 100644 virtinst/VirtualMemballoon.py diff --git a/AUTHORS b/AUTHORS index 5f9fed2..341b10f 100644 --- a/AUTHORS +++ b/AUTHORS @@ -60,6 +60,7 @@ Patches also received from Li Zhang <zhlcindy-at-linux-dot-vnet-dot-ibm-dot-com> Deepak C Shetty <deepakcs-at-linux-dot-vnet-dot-ibm-dot-com> Wanlong Gao <gaowanlong-at-cn-dot-fujitsu-dot-com> + Eiichi Tsukata <devel-at-etsukata-dot-com> ...send patches and get your name here... diff --git a/man/en/virt-install.pod.in b/man/en/virt-install.pod.in index ee991ab..460d95e 100644 --- a/man/en/virt-install.pod.in +++ b/man/en/virt-install.pod.in @@ -1142,6 +1142,23 @@ Add a USB device redirected via a dedicated Spice channel. =back +=item --memballoon MODEL + +Attach a virtual memory balloon device to the guest. If the memballoon device +needs to be explicitly disabled, MODEL='none' is used. + +MODEL is the type of memballoon device provided. The value can be 'virtio', +'xen' or 'none'. +Some examples: + +Use the recommended settings: + +--memballoon virtio + +Do not use memballoon device: + +--memballoon none + =head2 Miscellaneous Options =over 2 diff --git a/tests/clitest.py b/tests/clitest.py index abeabbe..c320453 100644 --- a/tests/clitest.py +++ b/tests/clitest.py @@ -567,6 +567,10 @@ args_dict = { "--hvm --pxe --filesystem template_name,/,type=template", # no networks "--hvm --nodisks --nonetworks --cdrom %(EXISTIMG1)s", + # --memballoon use virtio + "--hvm --nodisks --pxe --memballoon virtio", + # --memballoon disabled + "--hvm --nodisks --pxe --memballoon none", ], "invalid": [ @@ -586,6 +590,8 @@ args_dict = { "--paravirt --import --disk path=virt-install --print-step 2", # 2 stage install with --print-xml "--hvm --nodisks --pxe --print-xml", + # Busted --memballoon + "--hvm --nodisks --pxe --memballoon foobar", ], "compare": [ diff --git a/tests/xmlconfig-xml/boot-many-devices.xml b/tests/xmlconfig-xml/boot-many-devices.xml index 043e291..9a6f91d 100644 --- a/tests/xmlconfig-xml/boot-many-devices.xml +++ b/tests/xmlconfig-xml/boot-many-devices.xml @@ -93,6 +93,7 @@ </source> </hostdev> <watchdog model='ib700' action='none'/> + <memballoon model='virtio'/> </devices> <seclabel type='static' model='selinux'> <label>foolabel</label> diff --git a/tests/xmlconfig.py b/tests/xmlconfig.py index 1dd447d..c95d4e7 100644 --- a/tests/xmlconfig.py +++ b/tests/xmlconfig.py @@ -31,6 +31,7 @@ from virtinst import VirtualVideoDevice from virtinst import VirtualController from virtinst import VirtualWatchdog from virtinst import VirtualInputDevice +from virtinst import VirtualMemballoon import utils _testconn = utils.open_testdriver() @@ -772,11 +773,17 @@ class TestXMLConfig(unittest.TestCase): g.add_device(vdev3) g.add_device(vdev4) + # Watchdog Devices wdev2 = VirtualWatchdog(g.conn) wdev2.model = "ib700" wdev2.action = "none" g.add_device(wdev2) + # Memballoon Devices + mdev1 = VirtualMemballoon(g.conn) + mdev1.model = "virtio" + g.add_device(mdev1) + # Check keymap autoconfig gdev1 = virtinst.VirtualGraphics(conn=g.conn, type="vnc") self.assertTrue(gdev1.keymap != None) diff --git a/virt-install b/virt-install index 1540dac..2e1770e 100755 --- a/virt-install +++ b/virt-install @@ -492,6 +492,7 @@ def build_guest_instance(conn, options): # Non-default devices cli.get_controller(guest, options.controller) cli.get_redirdev(guest, options.redirdev) + cli.get_memballoon(guest, options.memballoon) if not options.nonetworks: get_networks(guest, options) get_graphics(guest, options) diff --git a/virtinst/Guest.py b/virtinst/Guest.py index cd529aa..93e407f 100644 --- a/virtinst/Guest.py +++ b/virtinst/Guest.py @@ -782,7 +782,8 @@ class Guest(XMLBuilderDomain.XMLBuilderDomain): "controller": virtinst.VirtualController, "filesystem": virtinst.VirtualFilesystem, "smartcard" : virtinst.VirtualSmartCardDevice, - "redirdev" : virtinst.VirtualRedirDevice, + "redirdev" : virtinst.VirtualRedirDevice, + "memballoon": virtinst.VirtualMemballoon, } # Hand off all child element parsing to relevant classes diff --git a/virtinst/VirtualDevice.py b/virtinst/VirtualDevice.py index 95b43fb..ce987fe 100644 --- a/virtinst/VirtualDevice.py +++ b/virtinst/VirtualDevice.py @@ -44,6 +44,7 @@ class VirtualDevice(XMLBuilderDomain): VIRTUAL_DEV_FILESYSTEM = "filesystem" VIRTUAL_DEV_SMARTCARD = "smartcard" VIRTUAL_DEV_REDIRDEV = "redirdev" + VIRTUAL_DEV_MEMBALLOON = "memballoon" # Ordering in this list is important: it will be the order the # Guest class outputs XML. So changing this may upset the test suite @@ -62,7 +63,8 @@ class VirtualDevice(XMLBuilderDomain): VIRTUAL_DEV_HOSTDEV, VIRTUAL_DEV_WATCHDOG, VIRTUAL_DEV_SMARTCARD, - VIRTUAL_DEV_REDIRDEV] + VIRTUAL_DEV_REDIRDEV, + VIRTUAL_DEV_MEMBALLOON] # General device type (disk, interface, etc.) _virtual_device_type = None diff --git a/virtinst/VirtualMemballoon.py b/virtinst/VirtualMemballoon.py new file mode 100644 index 0000000..7bb09aa --- /dev/null +++ b/virtinst/VirtualMemballoon.py @@ -0,0 +1,58 @@ +# +# Copyright 2012 +# Eiichi Tsukata <devel@xxxxxxxxxxxx> +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +# MA 02110-1301 USA. + +import VirtualDevice +from virtinst import _gettext as _ +from XMLBuilderDomain import _xml_property + +class VirtualMemballoon(VirtualDevice.VirtualDevice): + + _virtual_device_type = VirtualDevice.VirtualDevice.VIRTUAL_DEV_MEMBALLOON + + MODEL_DEFAULT = "virtio" + MODELS = [ "xen", "none", MODEL_DEFAULT ] + + def __init__(self, model=MODEL_DEFAULT, + conn=None, parsexml=None, parsexmlnode=None, caps=None): + VirtualDevice.VirtualDevice.__init__(self, conn, parsexml, + parsexmlnode, caps) + + self._model = None + + if self._is_parse(): + return + + self.model = model + + def get_model(self): + return self._model + def set_model(self, new_model): + if type(new_model) != str: + raise ValueError(_("'model' must be a string, " + " was '%s'." % type(new_model))) + if not self.MODELS.count(new_model): + raise ValueError(_("Unsupported memballoon model '%s'" % new_model)) + self._model = new_model + model = _xml_property(get_model, set_model, + xpath="./@model") + + def _get_xml_config(self): + xml = " <memballoon model='%s'" % self.model + xml += "/>" + return xml diff --git a/virtinst/__init__.py b/virtinst/__init__.py index efa4d0d..a392b9a 100644 --- a/virtinst/__init__.py +++ b/virtinst/__init__.py @@ -51,6 +51,7 @@ from VirtualWatchdog import VirtualWatchdog from VirtualFilesystem import VirtualFilesystem from VirtualSmartCardDevice import VirtualSmartCardDevice from VirtualRedirDevice import VirtualRedirDevice +from VirtualMemballoon import VirtualMemballoon from FullVirtGuest import FullVirtGuest from ParaVirtGuest import ParaVirtGuest from DistroInstaller import DistroInstaller @@ -82,4 +83,4 @@ __all__ = ["Guest", "XenGuest", "VirtualNetworkInterface", "VirtualHostDevicePCI", "VirtualCharDevice", "VirtualInputDevice", "VirtualController", "VirtualWatchdog", "VirtualFilesystem", "VirtualSmartCardDevice", - "VirtualHostDeviceUSBRedir"] + "VirtualHostDeviceUSBRedir", "VirtualMemballoon"] diff --git a/virtinst/cli.py b/virtinst/cli.py index 9063df6..d846209 100644 --- a/virtinst/cli.py +++ b/virtinst/cli.py @@ -1018,6 +1018,16 @@ def get_redirdev(guest, sc_opts): if dev: guest.add_device(dev) +def get_memballoon(guest, sc_opts): + for sc in listify(sc_opts): + try: + dev = parse_memballoon(guest, sc) + except Exception, e: + fail(_("Error in memballoon device parameters: %s") % str(e)) + + if dev: + guest.add_device(dev) + ############################# # Common CLI option/group # ############################# @@ -1113,6 +1123,9 @@ def add_device_options(devg): devg.add_option("", "--redirdev", dest="redirdev", action="append", help=_("Configure a guest redirection device. Ex:\n" "--redirdev usb,type=tcp,server=192.168.1.1:4000")) + devg.add_option("", "--memballoon", dest="memballoon", action="append", + help=_("Configure a guest memballoon device. Ex:\n" + "--memballoon medel=virtio")) def add_gfx_option(devg): devg.add_option("", "--graphics", dest="graphics", action="append", @@ -1831,6 +1844,27 @@ def parse_watchdog(guest, optstring, dev=None): return dev +######################## +# --memballoon parsing # +######################## + +def parse_memballoon(guest, optstring, dev=None): + if optstring is None: + return None + + # Peel the mode off the front + opts = parse_optstr(optstring, remove_first="model") + model = get_opt_param(opts, "model") + + if not dev: + dev = virtinst.VirtualMemballoon(model=model, + conn=guest.conn) + + if opts: + raise ValueError(_("Unknown options %s") % opts.keys()) + + return dev + ###################################################### # --serial, --parallel, --channel, --console parsing # -- 1.7.7.6