X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/f38ea60275b7c2dd99954fff8568145421aef288..b44bd844c54573e7801fc1ef6b4f8007f193555d:/scripts/gnt-cluster diff --git a/scripts/gnt-cluster b/scripts/gnt-cluster index d5c2c19..4887bc1 100755 --- a/scripts/gnt-cluster +++ b/scripts/gnt-cluster @@ -1,7 +1,7 @@ #!/usr/bin/python # -# Copyright (C) 2006, 2007 Google Inc. +# Copyright (C) 2006, 2007, 2010 Google Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,6 +42,11 @@ from ganeti import objects from ganeti import uidpool from ganeti import compat +PREALLOC_WIPE_DISKS_OPT = cli_option("--prealloc-wipe-disks", default=False, + action="store_true", + dest="prealloc_wipe_disks", + help=("Wipe disks prior to instance" + " creation")) @UsesRPC def InitCluster(opts, args): @@ -105,6 +110,12 @@ def InitCluster(opts, args): if uid_pool is not None: uid_pool = uidpool.ParseUidPool(uid_pool) + try: + primary_ip_version = int(opts.primary_ip_version) + except (ValueError, TypeError), err: + ToStderr("Invalid primary ip version value: %s" % str(err)) + return 1 + bootstrap.InitCluster(cluster_name=args[0], secondary_ip=opts.secondary_ip, vg_name=vg_name, @@ -122,6 +133,8 @@ def InitCluster(opts, args): drbd_helper=drbd_helper, uid_pool=uid_pool, default_iallocator=opts.default_iallocator, + primary_ip_version=primary_ip_version, + prealloc_wipe_disks=opts.prealloc_wipe_disks, ) op = opcodes.OpPostInitCluster() SubmitOpCode(op, opts=opts) @@ -162,17 +175,26 @@ def RenameCluster(opts, args): @return: the desired exit code """ - name = args[0] + cl = GetClient() + + (cluster_name, ) = cl.QueryConfigValues(["cluster_name"]) + + new_name = args[0] if not opts.force: - usertext = ("This will rename the cluster to '%s'. If you are connected" - " over the network to the cluster name, the operation is very" - " dangerous as the IP address will be removed from the node" - " and the change may not go through. Continue?") % name + usertext = ("This will rename the cluster from '%s' to '%s'. If you are" + " connected over the network to the cluster name, the" + " operation is very dangerous as the IP address will be" + " removed from the node and the change may not go through." + " Continue?") % (cluster_name, new_name) if not AskUser(usertext): return 1 - op = opcodes.OpRenameCluster(name=name) - SubmitOpCode(op, opts=opts) + op = opcodes.OpRenameCluster(name=new_name) + result = SubmitOpCode(op, opts=opts, cl=cl) + + if result: + ToStdout("Cluster renamed from '%s' to '%s'", cluster_name, result) + return 0 @@ -309,6 +331,8 @@ def ShowClusterConfig(opts, args): uidpool.FormatUidPool(result["uid_pool"], roman=opts.roman_integers)) ToStdout(" - default instance allocator: %s", result["default_iallocator"]) + ToStdout(" - primary ip version: %d", result["primary_ip_version"]) + ToStdout(" - preallocation wipe disks: %s", result["prealloc_wipe_disks"]) ToStdout("Default instance parameters:") _PrintGroupedParams(result["beparams"], roman=opts.roman_integers) @@ -419,8 +443,10 @@ def VerifyDisks(opts, args): @return: the desired exit code """ + cl = GetClient() + op = opcodes.OpVerifyDisks() - result = SubmitOpCode(op, opts=opts) + result = SubmitOpCode(op, opts=opts, cl=cl) if not isinstance(result, (list, tuple)) or len(result) != 3: raise errors.ProgrammerError("Unknown result type for OpVerifyDisks") @@ -442,13 +468,15 @@ def VerifyDisks(opts, args): op = opcodes.OpActivateInstanceDisks(instance_name=iname) try: ToStdout("Activating disks for instance '%s'", iname) - SubmitOpCode(op, opts=opts) + SubmitOpCode(op, opts=opts, cl=cl) except errors.GenericError, err: nret, msg = FormatError(err) retcode |= nret ToStderr("Error activating disks for instance %s: %s", iname, msg) if missing: + (vg_name, ) = cl.QueryConfigValues(["volume_group_name"]) + for iname, ival in missing.iteritems(): all_missing = compat.all(x[0] in bad_nodes for x in ival) if all_missing: @@ -459,11 +487,12 @@ def VerifyDisks(opts, args): ival.sort() for node, vol in ival: if node in bad_nodes: - ToStdout("\tbroken node %s /dev/xenvg/%s", node, vol) + ToStdout("\tbroken node %s /dev/%s/%s", node, vg_name, vol) else: - ToStdout("\t%s /dev/xenvg/%s", node, vol) + ToStdout("\t%s /dev/%s/%s", node, vg_name, vol) + ToStdout("You need to run replace_disks for all the above" - " instances, if this message persist after fixing nodes.") + " instances, if this message persist after fixing nodes.") retcode |= 1 return retcode @@ -509,6 +538,24 @@ def MasterFailover(opts, args): return bootstrap.MasterFailover(no_voting=opts.no_voting) +def MasterPing(opts, args): + """Checks if the master is alive. + + @param opts: the command line options selected by the user + @type args: list + @param args: should be an empty list + @rtype: int + @return: the desired exit code + + """ + try: + cl = GetClient() + cl.QueryClusterInfo() + return 0 + except Exception: # pylint: disable-msg=W0703 + return 1 + + def SearchTags(opts, args): """Searches the tags on all the cluster. @@ -822,33 +869,37 @@ commands = { NOLVM_STORAGE_OPT, NOMODIFY_ETCHOSTS_OPT, NOMODIFY_SSH_SETUP_OPT, SECONDARY_IP_OPT, VG_NAME_OPT, MAINTAIN_NODE_HEALTH_OPT, UIDPOOL_OPT, DRBD_HELPER_OPT, NODRBD_STORAGE_OPT, - DEFAULT_IALLOCATOR_OPT], + DEFAULT_IALLOCATOR_OPT, PRIMARY_IP_VERSION_OPT, PREALLOC_WIPE_DISKS_OPT], "[opts...] ", "Initialises a new cluster configuration"), 'destroy': ( DestroyCluster, ARGS_NONE, [YES_DOIT_OPT], "", "Destroy cluster"), 'rename': ( RenameCluster, [ArgHost(min=1, max=1)], - [FORCE_OPT], + [FORCE_OPT, DRY_RUN_OPT], "", "Renames the cluster"), 'redist-conf': ( - RedistributeConfig, ARGS_NONE, [SUBMIT_OPT], + RedistributeConfig, ARGS_NONE, [SUBMIT_OPT, DRY_RUN_OPT, PRIORITY_OPT], "", "Forces a push of the configuration file and ssconf files" " to the nodes in the cluster"), 'verify': ( VerifyCluster, ARGS_NONE, - [VERBOSE_OPT, DEBUG_SIMERR_OPT, ERROR_CODES_OPT, NONPLUS1_OPT], + [VERBOSE_OPT, DEBUG_SIMERR_OPT, ERROR_CODES_OPT, NONPLUS1_OPT, + DRY_RUN_OPT, PRIORITY_OPT], "", "Does a check on the cluster configuration"), 'verify-disks': ( - VerifyDisks, ARGS_NONE, [], + VerifyDisks, ARGS_NONE, [PRIORITY_OPT], "", "Does a check on the cluster disk status"), 'repair-disk-sizes': ( - RepairDiskSizes, ARGS_MANY_INSTANCES, [], + RepairDiskSizes, ARGS_MANY_INSTANCES, [DRY_RUN_OPT, PRIORITY_OPT], "", "Updates mismatches in recorded disk sizes"), - 'masterfailover': ( + 'master-failover': ( MasterFailover, ARGS_NONE, [NOVOTING_OPT], "", "Makes the current node the master"), + 'master-ping': ( + MasterPing, ARGS_NONE, [], + "", "Checks if the master is alive"), 'version': ( ShowClusterVersion, ARGS_NONE, [], "", "Shows the cluster version"), @@ -869,14 +920,14 @@ commands = { 'list-tags': ( ListTags, ARGS_NONE, [], "", "List the tags of the cluster"), 'add-tags': ( - AddTags, [ArgUnknown()], [TAG_SRC_OPT], + AddTags, [ArgUnknown()], [TAG_SRC_OPT, PRIORITY_OPT], "tag...", "Add tags to the cluster"), 'remove-tags': ( - RemoveTags, [ArgUnknown()], [TAG_SRC_OPT], + RemoveTags, [ArgUnknown()], [TAG_SRC_OPT, PRIORITY_OPT], "tag...", "Remove tags from the cluster"), 'search-tags': ( - SearchTags, [ArgUnknown(min=1, max=1)], - [], "", "Searches the tags on all objects on" + SearchTags, [ArgUnknown(min=1, max=1)], [PRIORITY_OPT], "", + "Searches the tags on all objects on" " the cluster for a given pattern (regex)"), 'queue': ( QueueOps, @@ -893,7 +944,8 @@ commands = { [BACKEND_OPT, CP_SIZE_OPT, ENABLED_HV_OPT, HVLIST_OPT, NIC_PARAMS_OPT, NOLVM_STORAGE_OPT, VG_NAME_OPT, MAINTAIN_NODE_HEALTH_OPT, UIDPOOL_OPT, ADD_UIDS_OPT, REMOVE_UIDS_OPT, DRBD_HELPER_OPT, - NODRBD_STORAGE_OPT, DEFAULT_IALLOCATOR_OPT, RESERVED_LVS_OPT], + NODRBD_STORAGE_OPT, DEFAULT_IALLOCATOR_OPT, RESERVED_LVS_OPT, + DRY_RUN_OPT, PRIORITY_OPT], "[opts...]", "Alters the parameters of the cluster"), "renew-crypto": ( @@ -906,5 +958,12 @@ commands = { } +#: dictionary with aliases for commands +aliases = { + 'masterfailover': 'master-failover', +} + + if __name__ == '__main__': - sys.exit(GenericMain(commands, override={"tag_type": constants.TAG_CLUSTER})) + sys.exit(GenericMain(commands, override={"tag_type": constants.TAG_CLUSTER}, + aliases=aliases))