From 19d7f90acdbd52e2aef1039ca2db6be348249d09 Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Wed, 22 Oct 2008 14:08:58 +0000
Subject: [PATCH] LUExportInstance: snapshot all disks

Rather than just snapshotting the "sda" disk, we'll snapshot all of the
instance disks. If we can't snapshot a disk for any reason we'll log an
error and proceed anyway: in this case the resulting export will miss a
disk. This also changes all the warning messages to self.LogWarning().

Reviewed-by: iustinp
---
 lib/backend.py | 13 +++++++------
 lib/cmdlib.py  | 46 ++++++++++++++++++++++++----------------------
 2 files changed, 31 insertions(+), 28 deletions(-)

diff --git a/lib/backend.py b/lib/backend.py
index 026c84dfe..6aa8c8362 100644
--- a/lib/backend.py
+++ b/lib/backend.py
@@ -1436,12 +1436,13 @@ def FinalizeExport(instance, snap_disks):
 
   disk_count = 0
   for disk_count, disk in enumerate(snap_disks):
-    config.set(constants.INISECT_INS, 'disk%d_ivname' % disk_count,
-               ('%s' % disk.iv_name))
-    config.set(constants.INISECT_INS, 'disk%d_dump' % disk_count,
-               ('%s' % disk.physical_id[1]))
-    config.set(constants.INISECT_INS, 'disk%d_size' % disk_count,
-               ('%d' % disk.size))
+    if disk:
+      config.set(constants.INISECT_INS, 'disk%d_ivname' % disk_count,
+                 ('%s' % disk.iv_name))
+      config.set(constants.INISECT_INS, 'disk%d_dump' % disk_count,
+                 ('%s' % disk.physical_id[1]))
+      config.set(constants.INISECT_INS, 'disk%d_size' % disk_count,
+                 ('%d' % disk.size))
   config.set(constants.INISECT_INS, 'disk_count' , '%d' % disk_count)
 
   cff = os.path.join(destdir, constants.EXPORT_CONF_FILE)
diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index df387c0f8..1bb63f214 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -4874,19 +4874,19 @@ class LUExportInstance(LogicalUnit):
 
     try:
       for disk in instance.disks:
-        if disk.iv_name == "sda":
-          # new_dev_name will be a snapshot of an lvm leaf of the one we passed
-          new_dev_name = self.rpc.call_blockdev_snapshot(src_node, disk)
+        # new_dev_name will be a snapshot of an lvm leaf of the one we passed
+        new_dev_name = self.rpc.call_blockdev_snapshot(src_node, disk)
 
-          if not new_dev_name:
-            logging.error("Could not snapshot block device %s on node %s",
+        if not new_dev_name:
+          self.LogWarning("Could not snapshot block device %s on node %s",
                           disk.logical_id[1], src_node)
-          else:
-            new_dev = objects.Disk(dev_type=constants.LD_LV, size=disk.size,
-                                      logical_id=(vgname, new_dev_name),
-                                      physical_id=(vgname, new_dev_name),
-                                      iv_name=disk.iv_name)
-            snap_disks.append(new_dev)
+          snap_disks.append(False)
+        else:
+          new_dev = objects.Disk(dev_type=constants.LD_LV, size=disk.size,
+                                 logical_id=(vgname, new_dev_name),
+                                 physical_id=(vgname, new_dev_name),
+                                 iv_name=disk.iv_name)
+          snap_disks.append(new_dev)
 
     finally:
       if self.op.shutdown and instance.status == "up":
@@ -4898,17 +4898,19 @@ class LUExportInstance(LogicalUnit):
 
     cluster_name = self.cfg.GetClusterName()
     for dev in snap_disks:
-      if not self.rpc.call_snapshot_export(src_node, dev, dst_node.name,
-                                      instance, cluster_name):
-        logging.error("Could not export block device %s from node %s to"
-                      " node %s", dev.logical_id[1], src_node, dst_node.name)
-      if not self.rpc.call_blockdev_remove(src_node, dev):
-        logging.error("Could not remove snapshot block device %s from node"
-                      " %s", dev.logical_id[1], src_node)
+      if dev:
+        if not self.rpc.call_snapshot_export(src_node, dev, dst_node.name,
+                                             instance, cluster_name):
+          self.LogWarning("Could not export block device %s from node %s to"
+                          " node %s", dev.logical_id[1], src_node,
+                          dst_node.name)
+        if not self.rpc.call_blockdev_remove(src_node, dev):
+          self.LogWarning("Could not remove snapshot block device %s from node"
+                          " %s", dev.logical_id[1], src_node)
 
     if not self.rpc.call_finalize_export(dst_node.name, instance, snap_disks):
-      logging.error("Could not finalize export for instance %s on node %s",
-                    instance.name, dst_node.name)
+      self.LogWarning("Could not finalize export for instance %s on node %s",
+                      instance.name, dst_node.name)
 
     nodelist = self.cfg.GetNodeList()
     nodelist.remove(dst_node.name)
@@ -4921,8 +4923,8 @@ class LUExportInstance(LogicalUnit):
       for node in exportlist:
         if instance.name in exportlist[node]:
           if not self.rpc.call_export_remove(node, instance.name):
-            logging.error("Could not remove older export for instance %s"
-                          " on node %s", instance.name, node)
+            self.LogWarning("Could not remove older export for instance %s"
+                            " on node %s", instance.name, node)
 
 
 class LURemoveExport(NoHooksLU):
-- 
GitLab