@@ -31,10 +31,10 @@ class FullVirtGuest(Guest.XenGuest):
3131 "rhel3" : { "label" : "Red Hat Enterprise Linux 3" , "distro" : "rhel" }, \
3232 "rhel4" : { "label" : "Red Hat Enterprise Linux 4" , "distro" : "rhel" }, \
3333 "rhel5" : { "label" : "Red Hat Enterprise Linux 5" , "distro" : "rhel" }, \
34- "centos5" : { "label" : "Cent OS 5" , "distro" : "centos" }, \
3534 "fedora5" : { "label" : "Fedora Core 5" , "distro" : "fedora" }, \
3635 "fedora6" : { "label" : "Fedora Core 6" , "distro" : "fedora" }, \
3736 "fedora7" : { "label" : "Fedora 7" , "distro" : "fedora" }, \
37+ "fedora8" : { "label" : "Fedora 7" , "distro" : "fedora" }, \
3838 "sles10" : { "label" : "Suse Linux Enterprise Server" , "distro" : "suse" }, \
3939 "generic24" : { "label" : "Generic 2.4.x kernel" }, \
4040 "generic26" : { "label" : "Generic 2.6.x kernel" }, \
@@ -165,7 +165,8 @@ def _get_features_xml(self):
165165 features = self .os_features ()
166166 if features :
167167 ret += " "
168- for (k , v ) in features .items ():
168+ for k in sorted (features .keys ()):
169+ v = features [k ]
169170 if v :
170171 ret += "<%s/>" % (k ,)
171172 ret += "\n "
@@ -233,40 +234,49 @@ def _get_disk_xml(self, install = True):
233234 for i in range (4 ):
234235 n = "%s%c" % (self .disknode , ord ('a' ) + i )
235236 nodes [n ] = None
236- cdroms = []
237- hds = []
237+
238+ # First assign CDROM device nodes, since they're scarce resource
239+ cdnode = self .disknode + "c"
238240 for d in self .disks :
239- if d .device == Guest .VirtualDisk .DEVICE_CDROM :
240- cdroms .append (d )
241+ if d .device != Guest .VirtualDisk .DEVICE_CDROM :
242+ continue
243+
244+ if d .target :
245+ if d .target != cdnode :
246+ raise ValueError , "The CDROM must be device %s" % cdnode
241247 else :
242- hds . append ( d )
248+ d . target = cdnode
243249
244- # CDROM gets special treatment
245- cdnode = self .disknode + "c"
246- if len (cdroms ) > 1 :
247- raise ValueError , _ ("Can only use one CDROM" )
248- elif len (cdroms ) == 1 :
249- cdrom = cdroms [0 ]
250- cdrom_path = cdrom .path
251- # Libvirt can't handle QEMU having an empty disk path
252- if cdrom .transient and not install and self .type == "xen" :
253- cdrom .path = None
254- if cdrom .target and cdrom .target != cdnode :
255- raise ValueError , "The CDROM must be device %s" % cdnode
256- ret += cdrom .get_xml_config (cdnode )
257- cdrom .path = cdrom_path
258- nodes [cdnode ] = True
259-
260- # Normal disks
261- for d in hds :
262- target = d .target
263- if target is None :
264- for t in sorted (nodes .keys ()):
265- if nodes [t ] is None :
266- target = t
250+ if nodes [d .target ] != None :
251+ raise ValueError , "The CDROM device %s is already used" % d .target
252+ nodes [d .target ] = d
253+
254+ # Now assign regular disk node with remainder
255+ for d in self .disks :
256+ if d .device == Guest .VirtualDisk .DEVICE_CDROM :
257+ continue
258+
259+ if d .target is None : # Auto-assign disk
260+ for n in sorted (nodes .keys ()):
261+ if nodes [n ] is None :
262+ d .target = n
263+ nodes [d .target ] = d
267264 break
268- if target is None or nodes [target ] is not None :
269- raise ValueError , _ ("Can't use more than 4 disks on a HVM guest" )
270- nodes [target ] = True
271- ret += d .get_xml_config (target )
265+ else :
266+ if nodes [d .target ] != None : # Verify pre-assigned
267+ raise ValueError , "The disk device %s is already used" % d .target
268+ nodes [d .target ] = d
269+
270+ for d in self .disks :
271+ saved_path = None
272+ if d .device == Guest .VirtualDisk .DEVICE_CDROM and d .transient and not install :
273+ # XXX hack. libvirt can't currently handle QEMU having an empty disk path
274+ if self .type == "xen" :
275+ saved_path = d .path
276+ d .path = None
277+
278+ ret += d .get_xml_config (d .target )
279+ if saved_path != None :
280+ d .path = saved_path
281+
272282 return ret
0 commit comments