[et-mgmt-tools] [PATCH] Check the making domain's disk sources
Tatsuro Enokura
fj7716hz at aa.jp.fujitsu.com
Thu Mar 15 08:45:26 UTC 2007
Hi,
The virt-install command specify the Domain's disk sources.
But the virt-install command doesn't check that the disk sources are
conflicted among the other domains.
The attached patch resolve this issue in the following way:
1) Count that the making domian's disk src is already use
the exists domain's disk source.
2) if count > 0, print confirmation message.
3) if type yes then leave disk source as it is,
else ask disk source again.
I am making a patch for virt-manager about this issue.
Signed-off-by: Tatsuro Enokura <fj7716hz at aa.jp.fujitsu.com>
Thanks,
Tatsuro Enokura.
--------------------------------------------------------------------
diff -r 057e8c1b54df virt-install
--- a/virt-install Wed Mar 14 16:11:43 2007 -0400
+++ b/virt-install Thu Mar 15 16:31:43 2007 +0900
@@ -103,7 +103,7 @@ def get_keymap(keymap, guest):
except ValueError, e:
print "ERROR: ", e
-def get_disk(disk, size, sparse, guest, hvm):
+def get_disk(disk, size, sparse, guest, hvm, conn):
# FIXME: need to handle a list of disks at some point
while 1:
msg = "What would you like to use as the disk (path)?"
@@ -121,6 +121,57 @@ def get_disk(disk, size, sparse, guest,
print "ERROR: ", e
size = None
+ # disk src confilct check
+ vms = []
+ # get working domain's name
+ ids = conn.listDomainsID();
+ for id in ids:
+ vm = conn.lookupByID(id)
+ vms.append(vm)
+ # get defined domain
+ names = conn.listDefinedDomains()
+ for name in names:
+ vm = conn.lookupByName(name)
+ vms.append(vm)
+
+ count = 0
+ for vm in vms:
+ doc = None
+ try:
+ doc = libxml2.parseDoc(vm.XMLDesc(0))
+ except:
+ continue
+ ctx = doc.xpathNewContext()
+ try:
+ try:
+ count +=
ctx.xpathEval("count(/domain/devices/disk/source[@dev='%s'])" % disk)
+ except:
+ continue
+ finally:
+ if ctx is not None:
+ ctx.xpathFreeContext()
+ if doc is not None:
+ doc.freeDoc()
+ if count > 0:
+ # confilct disk src
+ while 1:
+ retryFlg = False
+ warnmsg = "Disk %s is already in use by another guest!"
% disk
+ res = prompt_for_input(warnmsg + " Do you really want
to use the disk (yes or no)? ")
+ try:
+ if yes_or_no(res) is True:
+ break
+ else:
+ retryFlg = True
+ break
+ except ValueError, e:
+ print "ERROR: ", e
+ continue
+ if retryFlg is True:
+ # disk data clear, ask agein
+ disk = None
+ continue
+
try:
d = virtinst.VirtualDisk(disk, size, sparse = sparse)
if d.type == virtinst.VirtualDisk.TYPE_FILE and not(hvm)
and virtinst.util.is_blktap_capable():
@@ -133,7 +184,7 @@ def get_disk(disk, size, sparse, guest,
guest.disks.append(d)
break
-def get_disks(disk, size, sparse, guest, hvm):
+def get_disks(disk, size, sparse, guest, hvm, conn):
# ensure we have equal length lists
if (type(disk) == type(size) == list):
if len(disk) != len(size):
@@ -145,13 +196,13 @@ def get_disks(disk, size, sparse, guest,
disk = [ None ] * len(size)
if (type(disk) == list):
- map(lambda d, s: get_disk(d, s, sparse, guest, hvm),
+ map(lambda d, s: get_disk(d, s, sparse, guest, hvm, conn),
disk, size)
elif (type(size) == list):
- map(lambda d, s: get_disk(d, s, sparse, guest, hvm),
+ map(lambda d, s: get_disk(d, s, sparse, guest, hvm, conn),
disk, size)
else:
- get_disk(disk, size, sparse, guest, hvm)
+ get_disk(disk, size, sparse, guest, hvm, conn)
def get_network(mac, bridge, guest):
if mac == "RANDOM":
@@ -461,7 +512,7 @@ def main():
# set up disks
get_disks(options.diskfile, options.disksize, options.sparse,
- guest, hvm)
+ guest, hvm, conn)
# set up network information
get_networks(options.mac, options.bridge, guest)
--------------------------------------------------------------------
More information about the et-mgmt-tools
mailing list