From 9026e93535e07b75aca2696c89ebb471a5ef540a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20Nussbaumer?= <rn@google.com>
Date: Tue, 15 Mar 2011 09:23:23 +0100
Subject: [PATCH] TLReplaceDisks: Add check if disks are activated
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Previously we failed later with a rather useless error message. This
patch fixes this and tells the user to activate-disks if replace-disks
is in the need of activated disks rather than abort with a cryptic error
message.

Signed-off-by: RenΓ© Nussbaumer <rn@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 lib/cmdlib.py     | 28 ++++++++++++++++++++++++++++
 qa/qa_instance.py |  7 +++++++
 2 files changed, 35 insertions(+)

diff --git a/lib/cmdlib.py b/lib/cmdlib.py
index 2da4fbcb2..c628a6e65 100644
--- a/lib/cmdlib.py
+++ b/lib/cmdlib.py
@@ -8358,6 +8358,30 @@ class TLReplaceDisks(Tasklet):
     return _FindFaultyInstanceDisks(self.cfg, self.rpc, self.instance,
                                     node_name, True)
 
+  def _CheckDisksActivated(self, instance):
+    """Checks if the instance disks are activated.
+
+    @param instance: The instance to check disks
+    @return: True if they are activated, False otherwise
+
+    """
+    nodes = instance.all_nodes
+
+    for idx, dev in enumerate(instance.disks):
+      for node in nodes:
+        self.lu.LogInfo("Checking disk/%d on %s", idx, node)
+        self.cfg.SetDiskID(dev, node)
+
+        result = self.rpc.call_blockdev_find(node, dev)
+
+        if result.offline:
+          continue
+        elif result.fail_msg or not result.payload:
+          return False
+
+    return True
+
+
   def CheckPrereq(self):
     """Check prerequisites.
 
@@ -8421,6 +8445,10 @@ class TLReplaceDisks(Tasklet):
                                  errors.ECODE_INVAL)
 
     if self.mode == constants.REPLACE_DISK_AUTO:
+      if not self._CheckDisksActivated(instance):
+        raise errors.OpPrereqError("Please run activate-disks on instance %s"
+                                   " first" % self.instance_name,
+                                   errors.ECODE_STATE)
       faulty_primary = self._FindFaultyDisks(instance.primary_node)
       faulty_secondary = self._FindFaultyDisks(secondary_node)
 
diff --git a/qa/qa_instance.py b/qa/qa_instance.py
index 27285293f..d13ff79ca 100644
--- a/qa/qa_instance.py
+++ b/qa/qa_instance.py
@@ -263,6 +263,13 @@ def TestReplaceDisks(instance, pnode, snode, othernode):
     ]:
     AssertCommand(buildcmd(data))
 
+  AssertCommand(buildcmd(["-a"]))
+  AssertCommand(["gnt-instance", "stop", instance["name"]])
+  AssertCommand(buildcmd(["-a"]), fail=True)
+  AssertCommand(["gnt-instance", "activate-disks", instance["name"]])
+  AssertCommand(buildcmd(["-a"]))
+  AssertCommand(["gnt-instance", "start", instance["name"]])
+
 
 def TestInstanceExport(instance, node):
   """gnt-backup export -n ..."""
-- 
GitLab