X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/4b7735f913d2c5ca556098f5a33f849e667f4f16..a800110611f9fd0b9b94ac09fb8e933f6701cd26:/scripts/gnt-cluster?ds=inline diff --git a/scripts/gnt-cluster b/scripts/gnt-cluster index 53cb6a3..9a17b96 100755 --- a/scripts/gnt-cluster +++ b/scripts/gnt-cluster @@ -60,21 +60,16 @@ def InitCluster(opts, args): if hvlist is not None: hvlist = hvlist.split(",") else: - hvlist = [constants.DEFAULT_ENABLED_HYPERVISOR] + hvlist = [opts.default_hypervisor] # avoid an impossible situation - if opts.default_hypervisor in hvlist: - default_hypervisor = opts.default_hypervisor - else: - default_hypervisor = hvlist[0] + if opts.default_hypervisor not in hvlist: + ToStderr("The default hypervisor requested (%s) is not" + " within the enabled hypervisor list (%s)" % + (opts.default_hypervisor, hvlist)) + return 1 - hvparams = opts.hvparams - if hvparams: - # a list of (name, dict) we can pass directly to dict() - hvparams = dict(opts.hvparams) - else: - # otherwise init as empty dict - hvparams = {} + hvparams = dict(opts.hvparams) beparams = opts.beparams # check for invalid parameters @@ -87,17 +82,7 @@ def InitCluster(opts, args): for parameter in constants.BES_PARAMETERS: if parameter not in beparams: beparams[parameter] = constants.BEC_DEFAULTS[parameter] - - # type wrangling - try: - beparams[constants.BE_VCPUS] = int(beparams[constants.BE_VCPUS]) - except ValueError: - ToStderr("%s must be an integer", constants.BE_VCPUS) - return 1 - - if not isinstance(beparams[constants.BE_MEMORY], int): - beparams[constants.BE_MEMORY] = utils.ParseUnit( - beparams[constants.BE_MEMORY]) + utils.ForceDictType(beparams, constants.BES_PARAMETER_TYPES) # prepare hvparams dict for hv in constants.HYPER_TYPES: @@ -106,6 +91,7 @@ def InitCluster(opts, args): for parameter in constants.HVC_DEFAULTS[hv]: if parameter not in hvparams[hv]: hvparams[hv][parameter] = constants.HVC_DEFAULTS[hv][parameter] + utils.ForceDictType(hvparams[hv], constants.HVS_PARAMETER_TYPES) for hv in hvlist: if hv not in constants.HYPER_TYPES: @@ -120,9 +106,11 @@ def InitCluster(opts, args): master_netdev=opts.master_netdev, file_storage_dir=opts.file_storage_dir, enabled_hypervisors=hvlist, - default_hypervisor=default_hypervisor, + default_hypervisor=opts.default_hypervisor, hvparams=hvparams, - beparams=beparams) + beparams=beparams, + candidate_pool_size=opts.candidate_pool_size, + ) return 0 @@ -174,6 +162,21 @@ def RenameCluster(opts, args): return 0 +def RedistributeConfig(opts, args): + """Forces push of the cluster configuration. + + @param opts: the command line options selected by the user + @type args: list + @param args: empty list + @rtype: int + @return: the desired exit code + + """ + op = opcodes.OpRedistributeConfig() + SubmitOrSend(op, opts) + return 0 + + def ShowClusterVersion(opts, args): """Write version of ganeti software to the standard output. @@ -184,8 +187,8 @@ def ShowClusterVersion(opts, args): @return: the desired exit code """ - op = opcodes.OpQueryClusterInfo() - result = SubmitOpCode(op) + cl = GetClient() + result = cl.QueryClusterInfo() ToStdout("Software version: %s", result["software_version"]) ToStdout("Internode protocol: %s", result["protocol_version"]) ToStdout("Configuration format: %s", result["config_version"]) @@ -204,7 +207,8 @@ def ShowClusterMaster(opts, args): @return: the desired exit code """ - ToStdout("%s", GetClient().QueryConfigValues(["master_node"])[0]) + master = bootstrap.GetMaster() + ToStdout(master) return 0 @@ -218,8 +222,8 @@ def ShowClusterConfig(opts, args): @return: the desired exit code """ - op = opcodes.OpQueryClusterInfo() - result = SubmitOpCode(op) + cl = GetClient() + result = cl.QueryClusterInfo() ToStdout("Cluster name: %s", result["name"]) @@ -239,6 +243,10 @@ def ShowClusterConfig(opts, args): ToStdout("Cluster parameters:") ToStdout(" - candidate pool size: %s", result["candidate_pool_size"]) + ToStdout(" - master netdev: %s", result["master_netdev"]) + ToStdout(" - default bridge: %s", result["default_bridge"]) + ToStdout(" - lvm volume group: %s", result["volume_group_name"]) + ToStdout(" - file storage path: %s", result["file_storage_dir"]) ToStdout("Default instance parameters:") for gr_name, gr_dict in result["beparams"].items(): @@ -270,8 +278,8 @@ def ClusterCopyFile(opts, args): cluster_name = cl.QueryConfigValues(["cluster_name"])[0] - op = opcodes.OpQueryNodes(output_fields=["name"], names=opts.nodes) - results = [row[0] for row in SubmitOpCode(op, cl=cl) if row[0] != myname] + results = GetOnlineNodes(nodes=opts.nodes, cl=cl) + results = [name for name in results if name != myname] srun = ssh.SshRunner(cluster_name=cluster_name) for node in results: @@ -294,8 +302,8 @@ def RunClusterCommand(opts, args): cl = GetClient() command = " ".join(args) - op = opcodes.OpQueryNodes(output_fields=["name"], names=opts.nodes) - nodes = [row[0] for row in SubmitOpCode(op, cl=cl)] + + nodes = GetOnlineNodes(nodes=opts.nodes, cl=cl) cluster_name, master_node = cl.QueryConfigValues(["cluster_name", "master_node"]) @@ -363,7 +371,7 @@ def VerifyDisks(opts, args): if nlvm: for node, text in nlvm.iteritems(): ToStdout("Error on node %s: LVM error: %s", - node, text[-400:].encode('string_escape')) + node, utils.SafeEncode(text[-400:])) retcode |= 1 ToStdout("You need to fix these nodes first before fixing instances") @@ -464,12 +472,13 @@ def SetClusterParams(opts, args): if hvlist is not None: hvlist = hvlist.split(",") - hvparams = opts.hvparams - if hvparams: - # a list of (name, dict) we can pass directly to dict() - hvparams = dict(opts.hvparams) + # a list of (name, dict) we can pass directly to dict() (or []) + hvparams = dict(opts.hvparams) + for hv, hv_params in hvparams.iteritems(): + utils.ForceDictType(hv_params, constants.HVS_PARAMETER_TYPES) beparams = opts.beparams + utils.ForceDictType(beparams, constants.BES_PARAMETER_TYPES) op = opcodes.OpSetClusterParams(vg_name=opts.vg_name, enabled_hypervisors=hvlist, @@ -502,6 +511,9 @@ def QueueOps(opts, args): else: val = "unset" ToStdout("The drain flag is %s" % val) + else: + raise errors.OpPrereqError("Command '%s' is not valid." % command) + return 0 # this is an option common to more than one command, so we declare @@ -523,7 +535,7 @@ commands = { help="Specify the mac prefix for the instance IP" " addresses, in the format XX:XX:XX", metavar="PREFIX", - default="aa:00:00",), + default=constants.DEFAULT_MAC_PREFIX,), make_option("-g", "--vg-name", dest="vg_name", help="Specify the volume group name " " (cluster-wide) for disk allocation [xenvg]", @@ -569,6 +581,10 @@ commands = { keyval_option("-B", "--backend-parameters", dest="beparams", type="keyval", default={}, help="Backend parameters"), + make_option("-C", "--candidate-pool-size", + default=constants.MASTER_POOL_SIZE_DEFAULT, + help="Set the candidate pool size", + dest="candidate_pool_size", type="int"), ], "[opts...] ", "Initialises a new cluster configuration"), @@ -582,6 +598,10 @@ commands = { 'rename': (RenameCluster, ARGS_ONE, [DEBUG_OPT, FORCE_OPT], "", "Renames the cluster"), + 'redist-conf': (RedistributeConfig, ARGS_NONE, [DEBUG_OPT, SUBMIT_OPT], + "", + "Forces a push of the configuration file and ssconf files" + " to the nodes in the cluster"), 'verify': (VerifyCluster, ARGS_NONE, [DEBUG_OPT, make_option("--no-nplus1-mem", dest="skip_nplusone_mem", help="Skip N+1 memory redundancy tests",