#
#
-# Copyright (C) 2010, 2011, 2012 Google Inc.
+# Copyright (C) 2010, 2011, 2012, 2013 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
# W0401: Wildcard import ganeti.cli
# W0614: Unused import %s from wildcard import (since we need cli)
+from cStringIO import StringIO
+
from ganeti.cli import *
from ganeti import constants
-from ganeti import objects
from ganeti import opcodes
from ganeti import utils
+from ganeti import compat
#: default list of fields for L{ListGroups}
_LIST_DEF_FIELDS = ["name", "node_cnt", "pinst_cnt", "alloc_policy", "ndparams"]
-
-_ENV_OVERRIDE = frozenset(["list"])
+_ENV_OVERRIDE = compat.UniqueFrozenset(["list"])
def AddGroup(opts, args):
@return: the desired exit code
"""
- ipolicy = \
- objects.CreateIPolicyFromOpts(ispecs_mem_size=opts.ispecs_mem_size,
- ispecs_cpu_count=opts.ispecs_cpu_count,
- ispecs_disk_count=opts.ispecs_disk_count,
- ispecs_disk_size=opts.ispecs_disk_size,
- ispecs_nic_count=opts.ispecs_nic_count,
- group_ipolicy=True)
+ ipolicy = CreateIPolicyFromOpts(
+ minmax_ispecs=opts.ipolicy_bounds_specs,
+ ipolicy_vcpu_ratio=opts.ipolicy_vcpu_ratio,
+ ipolicy_spindle_ratio=opts.ipolicy_spindle_ratio,
+ ipolicy_disk_templates=opts.ipolicy_disk_templates,
+ group_ipolicy=True)
(group_name,) = args
diskparams = dict(opts.diskparams)
diskparams=diskparams, ipolicy=ipolicy,
hv_state=hv_state,
disk_state=disk_state)
- SubmitOpCode(op, opts=opts)
+ SubmitOrSend(op, opts)
def AssignNodes(opts, args):
op = opcodes.OpGroupAssignNodes(group_name=group_name, nodes=node_names,
force=opts.force)
- SubmitOpCode(op, opts=opts)
+ SubmitOrSend(op, opts)
def _FmtDict(data):
"ndparams": (_FmtDict, False),
}
+ cl = GetClient(query=True)
+
return GenericList(constants.QR_GROUP, desired_fields, args, None,
opts.separator, not opts.no_headers,
format_override=fmtoverride, verbose=opts.verbose,
- force_filter=opts.force_filter)
+ force_filter=opts.force_filter, cl=cl)
def ListGroupFields(opts, args):
@return: the desired exit code
"""
+ cl = GetClient(query=True)
+
return GenericListFields(constants.QR_GROUP, args, opts.separator,
- not opts.no_headers)
+ not opts.no_headers, cl=cl)
def SetGroupParams(opts, args):
"""
allmods = [opts.ndparams, opts.alloc_policy, opts.diskparams, opts.hv_state,
- opts.disk_state, opts.ispecs_mem_size, opts.ispecs_cpu_count,
- opts.ispecs_disk_count, opts.ispecs_disk_size,
- opts.ispecs_nic_count, opts.diskparams]
+ opts.disk_state, opts.ipolicy_bounds_specs,
+ opts.ipolicy_vcpu_ratio, opts.ipolicy_spindle_ratio,
+ opts.diskparams, opts.ipolicy_disk_templates]
if allmods.count(None) == len(allmods):
ToStderr("Please give at least one of the parameters.")
return 1
diskparams = dict(opts.diskparams)
- # set the default values
- to_ipolicy = [
- opts.ispecs_mem_size,
- opts.ispecs_cpu_count,
- opts.ispecs_disk_count,
- opts.ispecs_disk_size,
- opts.ispecs_nic_count,
- ]
- for ispec in to_ipolicy:
- for param in ispec:
- if isinstance(ispec[param], basestring):
- if ispec[param].lower() == "default":
- ispec[param] = constants.VALUE_DEFAULT
# create ipolicy object
- ipolicy = objects.CreateIPolicyFromOpts(\
- ispecs_mem_size=opts.ispecs_mem_size,
- ispecs_cpu_count=opts.ispecs_cpu_count,
- ispecs_disk_count=opts.ispecs_disk_count,
- ispecs_disk_size=opts.ispecs_disk_size,
- ispecs_nic_count=opts.ispecs_nic_count,
+ ipolicy = CreateIPolicyFromOpts(
+ minmax_ispecs=opts.ipolicy_bounds_specs,
ipolicy_disk_templates=opts.ipolicy_disk_templates,
+ ipolicy_vcpu_ratio=opts.ipolicy_vcpu_ratio,
+ ipolicy_spindle_ratio=opts.ipolicy_spindle_ratio,
group_ipolicy=True,
allowed_values=[constants.VALUE_DEFAULT])
"""
(group_name,) = args
op = opcodes.OpGroupRemove(group_name=group_name)
- SubmitOpCode(op, opts=opts)
+ SubmitOrSend(op, opts)
def RenameGroup(opts, args):
"""
group_name, new_name = args
op = opcodes.OpGroupRename(group_name=group_name, new_name=new_name)
- SubmitOpCode(op, opts=opts)
+ SubmitOrSend(op, opts)
def EvacuateGroup(opts, args):
iallocator=opts.iallocator,
target_groups=opts.to,
early_release=opts.early_release)
- result = SubmitOpCode(op, cl=cl, opts=opts)
+ result = SubmitOrSend(op, opts, cl=cl)
# Keep track of submitted jobs
jex = JobExecutor(cl=cl, opts=opts)
return rcode
+
+def _FormatGroupInfo(group):
+ (name, ndparams, custom_ndparams, diskparams, custom_diskparams,
+ ipolicy, custom_ipolicy) = group
+ return [
+ ("Node group", name),
+ ("Node parameters", FormatParamsDictInfo(custom_ndparams, ndparams)),
+ ("Disk parameters", FormatParamsDictInfo(custom_diskparams, diskparams)),
+ ("Instance policy", FormatPolicyInfo(custom_ipolicy, ipolicy, False)),
+ ]
+
+
+def GroupInfo(_, args):
+ """Shows info about node group.
+
+ """
+ cl = GetClient(query=True)
+ selected_fields = ["name",
+ "ndparams", "custom_ndparams",
+ "diskparams", "custom_diskparams",
+ "ipolicy", "custom_ipolicy"]
+ result = cl.QueryGroups(names=args, fields=selected_fields,
+ use_locking=False)
+
+ PrintGenericInfo([
+ _FormatGroupInfo(group) for group in result
+ ])
+
+
+def _GetCreateCommand(group):
+ (name, ipolicy) = group
+ buf = StringIO()
+ buf.write("gnt-group add")
+ PrintIPolicyCommand(buf, ipolicy, True)
+ buf.write(" ")
+ buf.write(name)
+ return buf.getvalue()
+
+
+def ShowCreateCommand(opts, args):
+ """Shows the command that can be used to re-create a node group.
+
+ Currently it works only for ipolicy specs.
+
+ """
+ cl = GetClient(query=True)
+ selected_fields = ["name"]
+ if opts.include_defaults:
+ selected_fields += ["ipolicy"]
+ else:
+ selected_fields += ["custom_ipolicy"]
+ result = cl.QueryGroups(names=args, fields=selected_fields,
+ use_locking=False)
+
+ for group in result:
+ ToStdout(_GetCreateCommand(group))
+
+
commands = {
"add": (
AddGroup, ARGS_ONE_GROUP,
[DRY_RUN_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT, DISK_PARAMS_OPT,
- HV_STATE_OPT, DISK_STATE_OPT] + INSTANCE_POLICY_OPTS,
+ HV_STATE_OPT, DISK_STATE_OPT, PRIORITY_OPT]
+ + SUBMIT_OPTS + INSTANCE_POLICY_OPTS,
"<group_name>", "Add a new node group to the cluster"),
"assign-nodes": (
- AssignNodes, ARGS_ONE_GROUP + ARGS_MANY_NODES, [DRY_RUN_OPT, FORCE_OPT],
+ AssignNodes, ARGS_ONE_GROUP + ARGS_MANY_NODES,
+ [DRY_RUN_OPT, FORCE_OPT, PRIORITY_OPT] + SUBMIT_OPTS,
"<group_name> <node>...", "Assign nodes to a group"),
"list": (
ListGroups, ARGS_MANY_GROUPS,
"Lists all available fields for node groups"),
"modify": (
SetGroupParams, ARGS_ONE_GROUP,
- [DRY_RUN_OPT, SUBMIT_OPT, ALLOC_POLICY_OPT, NODE_PARAMS_OPT, HV_STATE_OPT,
- DISK_STATE_OPT, DISK_PARAMS_OPT] + INSTANCE_POLICY_OPTS,
+ [DRY_RUN_OPT] + SUBMIT_OPTS + [ALLOC_POLICY_OPT, NODE_PARAMS_OPT,
+ HV_STATE_OPT, DISK_STATE_OPT, DISK_PARAMS_OPT, PRIORITY_OPT]
+ + INSTANCE_POLICY_OPTS,
"<group_name>", "Alters the parameters of a node group"),
"remove": (
- RemoveGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT],
+ RemoveGroup, ARGS_ONE_GROUP, [DRY_RUN_OPT, PRIORITY_OPT] + SUBMIT_OPTS,
"[--dry-run] <group-name>",
"Remove an (empty) node group from the cluster"),
"rename": (
- RenameGroup, [ArgGroup(min=2, max=2)], [DRY_RUN_OPT],
+ RenameGroup, [ArgGroup(min=2, max=2)],
+ [DRY_RUN_OPT] + SUBMIT_OPTS + [PRIORITY_OPT],
"[--dry-run] <group-name> <new-name>", "Rename a node group"),
"evacuate": (
EvacuateGroup, [ArgGroup(min=1, max=1)],
- [TO_GROUP_OPT, IALLOCATOR_OPT, EARLY_RELEASE_OPT],
+ [TO_GROUP_OPT, IALLOCATOR_OPT, EARLY_RELEASE_OPT] + SUBMIT_OPTS,
"[-I <iallocator>] [--to <group>]",
"Evacuate all instances within a group"),
"list-tags": (
- ListTags, ARGS_ONE_GROUP, [PRIORITY_OPT],
- "<instance_name>", "List the tags of the given instance"),
+ ListTags, ARGS_ONE_GROUP, [],
+ "<group_name>", "List the tags of the given group"),
"add-tags": (
AddTags, [ArgGroup(min=1, max=1), ArgUnknown()],
- [TAG_SRC_OPT, PRIORITY_OPT],
- "<instance_name> tag...", "Add tags to the given instance"),
+ [TAG_SRC_OPT, PRIORITY_OPT] + SUBMIT_OPTS,
+ "<group_name> tag...", "Add tags to the given group"),
"remove-tags": (
RemoveTags, [ArgGroup(min=1, max=1), ArgUnknown()],
- [TAG_SRC_OPT, PRIORITY_OPT],
- "<instance_name> tag...", "Remove tags from given instance"),
+ [TAG_SRC_OPT, PRIORITY_OPT] + SUBMIT_OPTS,
+ "<group_name> tag...", "Remove tags from the given group"),
+ "info": (
+ GroupInfo, ARGS_MANY_GROUPS, [], "[<group_name>...]",
+ "Show group information"),
+ "show-ispecs-cmd": (
+ ShowCreateCommand, ARGS_MANY_GROUPS, [INCLUDEDEFAULTS_OPT],
+ "[--include-defaults] [<group_name>...]",
+ "Show the command line to re-create a group"),
}