[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[virt-tools-list] [PATCH] virt-install: avoid disk name collisions



When specifying multiple disks in pool without giving a name:

virt-install \
  --disk=pool=test,bus=virtio,size=3.0,sparse=false
  --disk=pool=test,bus=virtio,size=3.0,sparse=false
  ...

virt-install creates the names before hand which leads to name
collisions later on. Avoid this by filling in a collision list
with the image basenames.

This is overly cautions but better than running into a name collision
during the vm install.
---
 virt-install    |    4 +++-
 virtinst/cli.py |   10 ++++++----
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/virt-install b/virt-install
index cb42d56..12e65db 100755
--- a/virt-install
+++ b/virt-install
@@ -134,7 +134,9 @@ def get_disk(diskopts, size, sparse, guest, is_file_path):
         if is_file_path:
             path = diskopts
         else:
-            dev, size = cli.parse_disk(guest, diskopts)
+            collidelist = [os.path.basename(disk.path) for disk in guest.disks]
+            dev, size = cli.parse_disk(guest, diskopts,
+                                       collidelist=collidelist)
             path = dev.path
             sparse = dev.sparse
 
diff --git a/virtinst/cli.py b/virtinst/cli.py
index c5b9b17..feb01ec 100644
--- a/virtinst/cli.py
+++ b/virtinst/cli.py
@@ -1476,7 +1476,7 @@ def parse_security(guest, security):
 # --disk parsing #
 ##################
 
-def _parse_disk_source(guest, path, pool, vol, size, fmt, sparse):
+def _parse_disk_source(guest, path, pool, vol, size, fmt, sparse, collidelist=None):
     abspath = None
     volinst = None
     volobj = None
@@ -1500,7 +1500,8 @@ def _parse_disk_source(guest, path, pool, vol, size, fmt, sparse):
         vname = virtinst.Storage.StorageVolume.find_free_name(conn=guest.conn,
                                                               pool_name=pool,
                                                               name=guest.name,
-                                                              suffix=".img")
+                                                              suffix=".img",
+                                                              collidelist=collidelist)
         volinst = vc(pool_name=pool, name=vname, conn=guest.conn,
                      allocation=0, capacity=(size and
                                              size * 1024 * 1024 * 1024))
@@ -1528,7 +1529,7 @@ def _parse_disk_source(guest, path, pool, vol, size, fmt, sparse):
 
     return abspath, volinst, volobj
 
-def parse_disk(guest, optstr, dev=None):
+def parse_disk(guest, optstr, dev=None, collidelist=None):
     """
     helper to properly parse --disk options
     """
@@ -1594,7 +1595,8 @@ def parse_disk(guest, optstr, dev=None):
     device = opt_get("device")
 
     abspath, volinst, volobj = _parse_disk_source(guest, path, pool, vol,
-                                                  size, fmt, sparse)
+                                                  size, fmt, sparse,
+                                                  collidelist)
 
     if not dev:
         # Build a stub device that should always validate cleanly
-- 
1.7.10.4


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]