References: jsc#SLE-6262, fate#327048: KVM: Boot Configuration Override (virt-manager) Subject: guest: Add reorder_boot_order method From: Marc Hartmayer mhartmay@linux.ibm.com Tue Feb 26 10:56:37 2019 +0100 Date: Wed Mar 6 13:15:38 2019 -0500: Git: c9d070da4c3d31c3c504f52dbff775483ebf5e35 Add `reorder_boot_order` method to Guest class. It sets the boot order of the passed `dev` to `boot_index` and adapts all other boot indices of the guest accordingly. Signed-off-by: Marc Hartmayer Reviewed-by: Boris Fiuczynski Index: virt-manager-2.1.0/virtinst/guest.py =================================================================== --- virt-manager-2.1.0.orig/virtinst/guest.py +++ virt-manager-2.1.0/virtinst/guest.py @@ -257,6 +257,40 @@ class Guest(XMLBuilder): return self.__osinfo osinfo = property(_get_osinfo) + def reorder_boot_order(self, dev, boot_index): + """Sets boot order of `dev` to `boot_index` + + Sets the boot order for device `dev` to value `boot_index` and + adjusts all other boot indices accordingly. Additionally the + boot order defined in the 'os' node of a domain definition is + disabled since they are mutually exclusive in libvirt. + + """ + # unset legacy boot order + self.os.bootorder = [] + + # Sort the bootable devices by boot order + devs_sorted = sorted([device for device in self.get_bootable_devices() + if device.boot.order is not None], + key=lambda device: device.boot.order) + + # set new boot order + dev.boot.order = boot_index + + next_boot_index = None + for device in devs_sorted: + if device is dev: + continue + + if device.boot.order in [next_boot_index, boot_index]: + next_boot_index = device.boot.order + 1 + device.boot.order = next_boot_index + continue + + if next_boot_index is not None: + # we found a hole so we can stop here + break + def set_os_name(self, name): obj = OSDB.lookup_os(name) if obj is None: