From 6c4302b0a7a919afd15aeb87e9625da9c5079db8 Mon Sep 17 00:00:00 2001 From: Martin Kletzander Date: Wed, 12 Feb 2014 15:46:35 +0100 Subject: [PATCH] disk: generate target controller-wise Add an optional parameter to generate_target() that controls what controller the disk should reside in (using libvirt's rules to create addresses). Signed-off-by: Martin Kletzander --- virtinst/devicedisk.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/virtinst/devicedisk.py b/virtinst/devicedisk.py index e69a0e92..28c55ba1 100644 --- a/virtinst/devicedisk.py +++ b/virtinst/devicedisk.py @@ -902,14 +902,18 @@ class VirtualDisk(VirtualDevice): return _return(pref) return _return("sd") - def generate_target(self, skip_targets): + def generate_target(self, skip_targets, pref_ctrl=None): """ Generate target device ('hda', 'sdb', etc..) for disk, excluding - any targets in 'skip_targets'. Sets self.target, and returns the - generated value + any targets in 'skip_targets'. If given the 'pref_ctrl' + parameter, it tries to select the target so that the disk is + mapped onto that controller. + Sets self.target, and returns the generated value. @param skip_targets: list of targets to exclude @type skip_targets: C{list} + @param pref_ctrl: preferred controller to connect the disk to + @type pref_ctrl: C{int} @raise ValueError: can't determine target type, no targets available @returns generated target @rtype C{str} @@ -921,7 +925,13 @@ class VirtualDisk(VirtualDevice): def get_target(): first_found = None - for i in range(1, maxnode + 1): + ran = range(1, maxnode + 1) + if pref_ctrl: + # We assume narrow SCSI bus and libvirt assigning 7 + # (0-6, 7-13, etc.) devices per controller + ran = range(pref_ctrl * 7, (pref_ctrl + 1) * 7) + + for i in ran: gen_t = prefix + self.num_to_target(i) if gen_t in skip_targets: skip_targets.remove(gen_t) @@ -937,7 +947,14 @@ class VirtualDisk(VirtualDevice): if ret: self.target = ret return ret - raise ValueError(_("Only %s disks of type '%s' are supported" - % (maxnode, prefix))) + + if pref_ctrl: + # This basically means that we either chose full + # controller or didn't add any + raise ValueError(_("Controller number %d for disk of type %s has " + "no empty slot to use" % (pref_ctrl, prefix))) + else: + raise ValueError(_("Only %s disks of type '%s' are supported" + % (maxnode, prefix))) VirtualDisk.register_type()