diff --git a/lib/cmdlib.py b/lib/cmdlib.py index 2da4fbcb2b356214a970ce511058ff93bc6d9388..c628a6e6595cbb11740ad5f63486c96514dc60a2 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 27285293f9c39cbe826b8ba484d86404f8a756b7..d13ff79ca1fd9284d035ae067c1ebefc228b3d72 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 ..."""