diff --git a/lib/mcpu.py b/lib/mcpu.py index 26512bc88c3d842e21b747012b1b78536fbc101a..4ba5926b9a4c2848c57a5eba42e11313af58f5fe 100644 --- a/lib/mcpu.py +++ b/lib/mcpu.py @@ -51,6 +51,7 @@ class Processor(object): opcodes.OpMasterFailover: cmdlib.LUMasterFailover, opcodes.OpDumpClusterConfig: cmdlib.LUDumpClusterConfig, opcodes.OpRenameCluster: cmdlib.LURenameCluster, + opcodes.OpVerifyDisks: cmdlib.LUVerifyDisks, # node lu opcodes.OpAddNode: cmdlib.LUAddNode, opcodes.OpQueryNodes: cmdlib.LUQueryNodes, diff --git a/scripts/gnt-cluster b/scripts/gnt-cluster index d96f58c694dde6391a2bbe73d797391631e71ab1..424b239d77fc64920db8c994999c4318daf49b48 100755 --- a/scripts/gnt-cluster +++ b/scripts/gnt-cluster @@ -26,6 +26,7 @@ import pprint from ganeti.cli import * from ganeti import opcodes from ganeti import constants +from ganeti import errors def InitCluster(opts, args): @@ -181,6 +182,39 @@ def VerifyCluster(opts, args): return result +def VerifyDisks(opts, args): + """Verify integrity of cluster disks. + + Args: + opts - class with options as members + + """ + op = opcodes.OpVerifyDisks() + result = SubmitOpCode(op) + if not isinstance(result, tuple) or len(result) != 2: + raise errors.ProgrammerError("Unknown result type for OpVerifyDisks") + + nodes, instances = result + if nodes: + print "Nodes unreachable or with bad data:" + for name in nodes: + print "\t%s" % name + retcode = constants.EXIT_SUCCESS + if instances: + for iname in instances: + op = opcodes.OpActivateInstanceDisks(instance_name=iname) + try: + print "Activating disks for instance '%s'" % iname + SubmitOpCode(op) + except errors.GenericError, err: + nret, msg = FormatError(err) + retcode |= nret + print >>sys.stderr, ("Error activating disks for instance %s: %s" % + (iname, msg)) + + return retcode + + def MasterFailover(opts, args): """Failover the master node. @@ -263,6 +297,8 @@ commands = { "Renames the cluster"), 'verify': (VerifyCluster, ARGS_NONE, [DEBUG_OPT], "", "Does a check on the cluster configuration"), + 'verify-disks': (VerifyDisks, ARGS_NONE, [DEBUG_OPT], + "", "Does a check on the cluster disk status"), 'masterfailover': (MasterFailover, ARGS_NONE, [DEBUG_OPT], "", "Makes the current node the master"), 'version': (ShowClusterVersion, ARGS_NONE, [DEBUG_OPT],