X-Git-Url: https://code.grnet.gr/git/ganeti-local/blobdiff_plain/483be60dfc27bbef7d86dfcde319d72ec61454ee..2afd577f31466a474255287abaafcad977143170:/lib/client/gnt_group.py diff --git a/lib/client/gnt_group.py b/lib/client/gnt_group.py index 545f0d2..9395875 100644 --- a/lib/client/gnt_group.py +++ b/lib/client/gnt_group.py @@ -1,7 +1,7 @@ # # -# Copyright (C) 2010 Google Inc. +# Copyright (C) 2010, 2011 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 @@ -25,22 +25,13 @@ # W0614: Unused import %s from wildcard import (since we need cli) from ganeti.cli import * -from ganeti import compat +from ganeti import constants from ganeti import opcodes from ganeti import utils #: default list of fields for L{ListGroups} -_LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt"] - - -#: headers (and full field list) for L{ListGroups} -_LIST_HEADERS = { - "name": "Group", "uuid": "UUID", - "node_cnt": "Nodes", "node_list": "NodeList", - "pinst_cnt": "Instances", "pinst_list": "InstanceList", - "ctime": "CTime", "mtime": "MTime", "serial_no": "SerialNo", -} +_LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt", "alloc_policy", "ndparams"] def AddGroup(opts, args): @@ -54,10 +45,43 @@ def AddGroup(opts, args): """ (group_name,) = args - op = opcodes.OpAddGroup(group_name=group_name, ndparams=opts.ndparams) + op = opcodes.OpGroupAdd(group_name=group_name, ndparams=opts.ndparams, + alloc_policy=opts.alloc_policy) + SubmitOpCode(op, opts=opts) + + +def AssignNodes(opts, args): + """Assign nodes to a group. + + @param opts: the command line options selected by the user + @type args: list + @param args: args[0]: group to assign nodes to; args[1:]: nodes to assign + @rtype: int + @return: the desired exit code + + """ + group_name = args[0] + node_names = args[1:] + + op = opcodes.OpGroupAssignNodes(group_name=group_name, nodes=node_names, + force=opts.force) SubmitOpCode(op, opts=opts) +def _FmtDict(data): + """Format dict data into command-line format. + + @param data: The input dict to be formatted + @return: The formatted dict + + """ + if not data: + return "(empty)" + + return utils.CommaJoin(["%s=%s" % (key, value) + for key, value in data.items()]) + + def ListGroups(opts, args): """List node groups and their properties. @@ -69,38 +93,59 @@ def ListGroups(opts, args): """ desired_fields = ParseFields(opts.output, _LIST_DEF_FIELDS) + fmtoverride = { + "node_list": (",".join, False), + "pinst_list": (",".join, False), + "ndparams": (_FmtDict, False), + } + + return GenericList(constants.QR_GROUP, desired_fields, args, None, + opts.separator, not opts.no_headers, + format_override=fmtoverride, verbose=opts.verbose) - output = GetClient().QueryGroups(args, desired_fields, opts.do_locking) - if opts.no_headers: - headers = None - else: - headers = _LIST_HEADERS +def ListGroupFields(opts, args): + """List node fields. - int_type_fields = frozenset(["node_cnt", "pinst_cnt", "serial_no"]) - list_type_fields = frozenset(["node_list", "pinst_list"]) - date_type_fields = frozenset(["mtime", "ctime"]) + @param opts: the command line options selected by the user + @type args: list + @param args: fields to list, or empty for all + @rtype: int + @return: the desired exit code + + """ + return GenericListFields(constants.QR_GROUP, args, opts.separator, + not opts.no_headers) - for row in output: - for idx, field in enumerate(desired_fields): - val = row[idx] - if field in list_type_fields: - val = ",".join(val) - elif opts.roman_integers and field in int_type_fields: - val = compat.TryToRoman(val) - elif field in date_type_fields: - val = utils.FormatTime(val) - elif val is None: - val = "?" +def SetGroupParams(opts, args): + """Modifies a node group's parameters. + + @param opts: the command line options selected by the user + @type args: list + @param args: should contain only one element, the node group name + + @rtype: int + @return: the desired exit code + + """ + all_changes = { + "ndparams": opts.ndparams, + "alloc_policy": opts.alloc_policy, + } - row[idx] = str(val) + if all_changes.values().count(None) == len(all_changes): + ToStderr("Please give at least one of the parameters.") + return 1 - data = GenerateTable(separator=opts.separator, headers=headers, - fields=desired_fields, data=output) + op = opcodes.OpGroupSetParams(group_name=args[0], # pylint: disable-msg=W0142 + **all_changes) + result = SubmitOrSend(op, opts) - for line in data: - ToStdout(line) + if result: + ToStdout("Modified node group %s", args[0]) + for param, data in result: + ToStdout(" - %-5s -> %s", param, data) return 0 @@ -116,7 +161,7 @@ def RemoveGroup(opts, args): """ (group_name,) = args - op = opcodes.OpRemoveGroup(group_name=group_name) + op = opcodes.OpGroupRemove(group_name=group_name) SubmitOpCode(op, opts=opts) @@ -130,29 +175,39 @@ def RenameGroup(opts, args): @return: the desired exit code """ - old_name, new_name = args - op = opcodes.OpRenameGroup(old_name=old_name, new_name=new_name) + group_name, new_name = args + op = opcodes.OpGroupRename(group_name=group_name, new_name=new_name) SubmitOpCode(op, opts=opts) commands = { "add": ( - AddGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT, NODE_PARAMS_OPT], + AddGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT], "", "Add a new node group to the cluster"), + "assign-nodes": ( + AssignNodes, ARGS_ONE_GROUP + ARGS_MANY_NODES, [DRY_RUN_OPT, FORCE_OPT], + " ...", "Assign nodes to a group"), "list": ( ListGroups, ARGS_MANY_GROUPS, - [NOHDR_OPT, SEP_OPT, FIELDS_OPT, SYNC_OPT, ROMAN_OPT], + [NOHDR_OPT, SEP_OPT, FIELDS_OPT, VERBOSE_OPT], "[...]", - "Lists the node groups in the cluster. The available fields are (see" - " the man page for details): %s. The default list is (in order): %s." % - (utils.CommaJoin(_LIST_HEADERS), utils.CommaJoin(_LIST_DEF_FIELDS))), + "Lists the node groups in the cluster. The available fields can be shown" + " using the \"list-fields\" command (see the man page for details)." + " The default list is (in order): %s." % utils.CommaJoin(_LIST_DEF_FIELDS)), + "list-fields": ( + ListGroupFields, [ArgUnknown()], [NOHDR_OPT, SEP_OPT], "[fields...]", + "Lists all available fields for node groups"), + "modify": ( + SetGroupParams, ARGS_ONE_GROUP, + [DRY_RUN_OPT, SUBMIT_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT], + "", "Alters the parameters of a node group"), "remove": ( RemoveGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT], - "[--dry-run] ", + "[--dry-run] ", "Remove an (empty) node group from the cluster"), "rename": ( RenameGroup, [ArgGroup(min=2, max=2)], [DRY_RUN_OPT], - "[--dry-run] ", "Rename a node group"), + "[--dry-run] ", "Rename a node group"), }